Cleaned up code generator for config file parsing.
This commit is contained in:
parent
9ea85ad1ac
commit
571abddd98
@ -1,241 +1,270 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use XML::Twig;
|
use XML::DOM;
|
||||||
|
|
||||||
sub write_c_header(@);
|
sub write_c_header(@);
|
||||||
sub write_c_impl_defaults(@);
|
sub write_sql_dump(@);
|
||||||
sub write_c_impl_apply(@);
|
|
||||||
sub write_c_impl_free(@);
|
|
||||||
sub write_c_impl_dump(@);
|
|
||||||
sub get_data($);
|
sub get_data($);
|
||||||
|
|
||||||
|
my $dump_to_sql = 0;
|
||||||
|
|
||||||
# initialize parser and read the file
|
# initialize parser and read the file
|
||||||
my $input = "./config.xml";
|
my $input = "./config.xml";
|
||||||
my $parser = XML::Twig->new();
|
my $parser = new XML::DOM::Parser;
|
||||||
my $tree = $parser->parsefile($input) || die "Unable to parse XML file.";
|
my $tree = $parser->parsefile($input) || die "Unable to parse XML file.";
|
||||||
|
|
||||||
# Write header file
|
# Get data
|
||||||
open GENHEAD, ">gen_config.h" || die "Unable to write header file";
|
my $nodes = $tree->getElementsByTagName("option");
|
||||||
print GENHEAD "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\nstruct hub_config\n{\n";
|
my @options = ();
|
||||||
foreach my $p ($tree->root->children("option"))
|
for (my $i = 0; $i < $nodes->getLength; $i++)
|
||||||
{
|
{
|
||||||
write_c_header(get_data($p));
|
my @data = get_data($nodes->item($i));
|
||||||
|
push @options, \@data;
|
||||||
}
|
}
|
||||||
print GENHEAD "};\n\n";
|
|
||||||
|
|
||||||
# Write c source file
|
write_c_header(@options);
|
||||||
open GENIMPL, ">gen_config.c" || die "Unable to write source file";
|
write_sql_dump(@options) if ($dump_to_sql);
|
||||||
print GENIMPL "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
|
||||||
|
|
||||||
# The defaults function
|
my $config_defaults = "void config_defaults(struct hub_config* config)\n{\n";
|
||||||
print GENIMPL "void config_defaults(struct hub_config* config)\n{\n";
|
my $config_apply = "static int apply_config(struct hub_config* config, char* key, char* data, int line_count)\n{\n\tint max = 0;\n\tint min = 0;\n\n";
|
||||||
foreach my $p ($tree->root->children("option"))
|
my $config_free = "void free_config(struct hub_config* config)\n{\n";
|
||||||
|
my $config_dump = "void dump_config(struct hub_config* config, int ignore_defaults)\n{\n";
|
||||||
|
|
||||||
|
foreach my $option (@options)
|
||||||
{
|
{
|
||||||
write_c_impl_defaults(get_data($p));
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check) = @$option;
|
||||||
}
|
my $string = ($type =~ /(string|file|message)/);
|
||||||
print GENIMPL "}\n\n";
|
my $min = undef;
|
||||||
|
my $max = undef;
|
||||||
|
my $regexp = undef;
|
||||||
|
|
||||||
# apply function
|
if (defined $check)
|
||||||
print GENIMPL "static int apply_config(struct hub_config* config, char* key, char* data, int line_count)\n{\n\tint max = 0;\n\tint min = 0;\n\n";
|
|
||||||
|
|
||||||
foreach my $p ($tree->root->children("option"))
|
|
||||||
{
|
|
||||||
write_c_impl_apply(get_data($p));
|
|
||||||
}
|
|
||||||
print GENIMPL "\t/* Still here -- unknown directive */\n";
|
|
||||||
print GENIMPL "\tLOG_ERROR(\"Unknown configuration directive: '%s'\", key);\n";
|
|
||||||
print GENIMPL "\t\treturn -1;\n";
|
|
||||||
print GENIMPL "}\n\n";
|
|
||||||
|
|
||||||
# free function (for strings)
|
|
||||||
print GENIMPL "void free_config(struct hub_config* config)\n{\n";
|
|
||||||
foreach my $p ($tree->root->children("option"))
|
|
||||||
{
|
|
||||||
write_c_impl_free(get_data($p));
|
|
||||||
}
|
|
||||||
print GENIMPL "}\n\n";
|
|
||||||
|
|
||||||
# dump function
|
|
||||||
print GENIMPL "void dump_config(struct hub_config* config, int ignore_defaults)\n{\n";
|
|
||||||
foreach my $p ($tree->root->children("option"))
|
|
||||||
{
|
|
||||||
write_c_impl_dump(get_data($p));
|
|
||||||
}
|
|
||||||
print GENIMPL "}\n\n";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sub write_c_header(@)
|
|
||||||
{
|
|
||||||
my @output = @_;
|
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
|
||||||
|
|
||||||
print GENHEAD "\t";
|
|
||||||
print GENHEAD "int " if ($type eq "int");
|
|
||||||
print GENHEAD "int " if ($type eq "boolean");
|
|
||||||
print GENHEAD "char*" if ($type =~ /(string|file|message)/);
|
|
||||||
print GENHEAD " " . $name . ";";
|
|
||||||
|
|
||||||
my $comment = "";
|
|
||||||
if ($type eq "message")
|
|
||||||
{
|
{
|
||||||
$comment = "\"" . $default . "\"";
|
$min = $check->getAttribute("min");
|
||||||
}
|
$max = $check->getAttribute("max");
|
||||||
elsif (defined $short && length $short > 0)
|
$regexp = $check->getAttribute("regexp");
|
||||||
{
|
|
||||||
$comment = $short;
|
$max = undef if ($max eq "");
|
||||||
$comment .= " (default: " . $default . ")" if (defined $default);
|
$min = undef if ($min eq "");
|
||||||
|
$regexp = undef if ($regexp eq "");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length $comment > 0)
|
$config_defaults .= "\tconfig->$name = ";
|
||||||
{
|
$config_defaults .= "hub_strdup(\"" if ($string);
|
||||||
my $pad = "";
|
$config_defaults .= $default;
|
||||||
for (my $i = length $name; $i < 32; $i++)
|
$config_defaults .= "\")" if ($string);
|
||||||
{
|
$config_defaults .= ";\n";
|
||||||
$pad .= " ";
|
|
||||||
}
|
|
||||||
$comment = $pad . "/*<<< " . $comment . " */";
|
|
||||||
}
|
|
||||||
|
|
||||||
print GENHEAD $comment . "\n";
|
$config_apply .= "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
|
||||||
}
|
|
||||||
|
|
||||||
sub write_c_impl_defaults(@)
|
|
||||||
{
|
|
||||||
my @output = @_;
|
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
|
||||||
my $prefix = "";
|
|
||||||
my $suffix = "";
|
|
||||||
|
|
||||||
print GENIMPL "\tconfig->$name = ";
|
|
||||||
if ($type =~ /(string|file|message)/)
|
|
||||||
{
|
|
||||||
$prefix = "hub_strdup(\"";
|
|
||||||
$suffix = "\")"
|
|
||||||
}
|
|
||||||
print GENIMPL $prefix . $default . $suffix . ";\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub write_c_impl_apply(@)
|
|
||||||
{
|
|
||||||
my @output = @_;
|
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $p) = @output;
|
|
||||||
|
|
||||||
my $min;
|
|
||||||
my $max;
|
|
||||||
my $regexp;
|
|
||||||
|
|
||||||
if (defined $p)
|
|
||||||
{
|
|
||||||
$min = $p->att("min");
|
|
||||||
$max = $p->att("max");
|
|
||||||
$regexp = $p->att("regexp");
|
|
||||||
|
|
||||||
print "'check' is defined for option $name";
|
|
||||||
print ", min=$min" if (defined $min);
|
|
||||||
print ", max=$max" if (defined $max);
|
|
||||||
print ", regexp=\"$regexp\"" if (defined $regexp);
|
|
||||||
print "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
print GENIMPL "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
|
|
||||||
|
|
||||||
if ($type eq "int")
|
if ($type eq "int")
|
||||||
{
|
{
|
||||||
if (defined $min)
|
$config_apply .= "\t\tmin = $min;\n" if (defined $min);
|
||||||
{
|
$config_apply .= "\t\tmax = $max;\n" if (defined $max);
|
||||||
print GENIMPL "\t\tmin = $min;\n"
|
$config_apply .= "\t\tif (!apply_integer(key, data, &config->$name, ";
|
||||||
}
|
if (defined $min) { $config_apply .= "&min"; } else { $config_apply .= "0"; }
|
||||||
if (defined $max)
|
$config_apply .= ", ";
|
||||||
{
|
if (defined $max) { $config_apply .= "&max"; } else { $config_apply .= "0"; }
|
||||||
print GENIMPL "\t\tmax = $max;\n"
|
$config_apply .= "))\n";
|
||||||
}
|
|
||||||
|
|
||||||
print GENIMPL "\t\tif (!apply_integer(key, data, &config->$name, ";
|
|
||||||
|
|
||||||
if (defined $min)
|
|
||||||
{
|
|
||||||
print GENIMPL "&min";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
print GENIMPL "0";
|
|
||||||
}
|
|
||||||
|
|
||||||
print GENIMPL ", ";
|
|
||||||
|
|
||||||
if (defined $max)
|
|
||||||
{
|
|
||||||
print GENIMPL "&max";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
print GENIMPL "0";
|
|
||||||
}
|
|
||||||
|
|
||||||
print GENIMPL "))\n";
|
|
||||||
}
|
}
|
||||||
elsif ($type eq "boolean")
|
elsif ($type eq "boolean")
|
||||||
{
|
{
|
||||||
print GENIMPL "\t\tif (!apply_boolean(key, data, &config->$name))\n";
|
$config_apply .= "\t\tif (!apply_boolean(key, data, &config->$name))\n";
|
||||||
}
|
}
|
||||||
elsif ($type =~ /(string|file|message)/)
|
elsif ($string)
|
||||||
{
|
{
|
||||||
print GENIMPL "\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
|
$config_apply .="\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
print GENIMPL "\t\t{\n" .
|
$config_apply .= "\t\t{\n" .
|
||||||
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" .
|
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" .
|
||||||
"\t\t\treturn -1;\n" .
|
"\t\t\treturn -1;\n" .
|
||||||
"\t\t}\n" .
|
"\t\t}\n" .
|
||||||
"\t\treturn 0;\n" .
|
"\t\treturn 0;\n" .
|
||||||
"\t}\n\n";
|
"\t}\n\n";
|
||||||
}
|
|
||||||
|
|
||||||
sub write_c_impl_free(@)
|
$config_free .= "\thub_free(config->" . $name . ");\n\n" if ($string);
|
||||||
{
|
|
||||||
my @output = @_;
|
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
|
||||||
|
|
||||||
if ($type =~ /(string|file|message)/)
|
|
||||||
{
|
|
||||||
print GENIMPL "\thub_free(config->" . $name . ");\n\n"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub write_c_impl_dump(@)
|
my $out = "%s";
|
||||||
{
|
|
||||||
my @output = @_;
|
|
||||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @output;
|
|
||||||
my $out;
|
|
||||||
my $val = "config->$name";
|
my $val = "config->$name";
|
||||||
my $test = "config->$name != $default";
|
my $test = "config->$name != $default";
|
||||||
|
|
||||||
if ($type eq "int")
|
$out = "%d" if ($type eq "int");
|
||||||
{
|
$val = "config->$name ? \"yes\" : \"no\"" if ($type eq "boolean");
|
||||||
$out = "%d";
|
|
||||||
}
|
if ($string)
|
||||||
elsif ($type eq "boolean")
|
|
||||||
{
|
|
||||||
$out = "%s";
|
|
||||||
$val = "config->$name ? \"yes\" : \"no\"";
|
|
||||||
}
|
|
||||||
elsif ($type =~ /(string|file|message)/)
|
|
||||||
{
|
{
|
||||||
$out = "\\\"%s\\\"";
|
$out = "\\\"%s\\\"";
|
||||||
$test = "strcmp(config->$name, \"$default\") != 0";
|
$test = "strcmp(config->$name, \"$default\") != 0";
|
||||||
}
|
}
|
||||||
|
|
||||||
print GENIMPL "\tif (!ignore_defaults || $test)\n";
|
$config_dump .= "\tif (!ignore_defaults || $test)\n";
|
||||||
print GENIMPL "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n\n";
|
$config_dump .= "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$config_apply .= "\t/* Still here -- unknown directive */\n";
|
||||||
|
$config_apply .= "\tLOG_ERROR(\"Unknown configuration directive: '%s'\", key);\n";
|
||||||
|
$config_apply .= "\treturn -1;\n";
|
||||||
|
$config_apply .= "}\n\n";
|
||||||
|
$config_defaults .= "}\n\n";
|
||||||
|
$config_free .= "}\n\n";
|
||||||
|
$config_dump .= "}\n\n";
|
||||||
|
|
||||||
|
open GENIMPL, ">gen_config.c" || die "Unable to write source file";
|
||||||
|
print GENIMPL "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
||||||
|
print GENIMPL $config_defaults;
|
||||||
|
print GENIMPL $config_apply;
|
||||||
|
print GENIMPL $config_free;
|
||||||
|
print GENIMPL $config_dump;
|
||||||
|
|
||||||
|
|
||||||
sub get_data($)
|
sub get_data($)
|
||||||
{
|
{
|
||||||
my $p = shift;
|
my $p = shift;
|
||||||
my $check = $p->first_child_matches("check");
|
|
||||||
my @data = ($p->att("type"), $p->att("name"), $p->att("default"), $p->att("advanced"), $p->children_text("short"), $p->children_text("description"), $p->children_text("since"), $p->children_text("example"), $check);
|
my $short = "";
|
||||||
|
my $example = "";
|
||||||
|
my $description = "";
|
||||||
|
my $since = "";
|
||||||
|
|
||||||
|
$short = $p->getElementsByTagName("short")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("short")->getLength());
|
||||||
|
$since = $p->getElementsByTagName("since")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("since")->getLength());
|
||||||
|
$example = $p->getElementsByTagName("example")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("example")->getLength());
|
||||||
|
$description = $p->getElementsByTagName("description")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("description")->getLength());
|
||||||
|
my $check = $p->getElementsByTagName("check")->item(0);
|
||||||
|
|
||||||
|
my @data = (
|
||||||
|
$p->getAttribute("type"),
|
||||||
|
$p->getAttribute("name"),
|
||||||
|
$p->getAttribute("default"),
|
||||||
|
$p->getAttribute("advanced"),
|
||||||
|
$short,
|
||||||
|
$description,
|
||||||
|
$since,
|
||||||
|
$example,
|
||||||
|
$check
|
||||||
|
);
|
||||||
return @data;
|
return @data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Write header file
|
||||||
|
sub write_c_header(@)
|
||||||
|
{
|
||||||
|
my @data = @_;
|
||||||
|
|
||||||
|
open GENHEAD, ">gen_config.h" || die "Unable to write header file";
|
||||||
|
print GENHEAD "/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */\n\n";
|
||||||
|
print GENHEAD "struct hub_config\n{\n";
|
||||||
|
|
||||||
|
foreach my $option (@data)
|
||||||
|
{
|
||||||
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @$option;
|
||||||
|
|
||||||
|
my $string = ($type =~ /(string|file|message)/);
|
||||||
|
|
||||||
|
print GENHEAD "\t";
|
||||||
|
print GENHEAD "int " if ($type eq "int");
|
||||||
|
print GENHEAD "int " if ($type eq "boolean");
|
||||||
|
print GENHEAD "char*" if ($string);
|
||||||
|
print GENHEAD " " . $name . ";";
|
||||||
|
|
||||||
|
my $comment = "";
|
||||||
|
if ($type eq "message")
|
||||||
|
{
|
||||||
|
$comment = "\"" . $default . "\"";
|
||||||
|
}
|
||||||
|
elsif (defined $short && length $short > 0)
|
||||||
|
{
|
||||||
|
$comment = $short;
|
||||||
|
if (defined $default)
|
||||||
|
{
|
||||||
|
$comment .= " (default: ";
|
||||||
|
$comment .= "\"" if ($string);
|
||||||
|
$comment .= $default;
|
||||||
|
$comment .= "\"" if ($string);
|
||||||
|
$comment .= ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length $comment > 0)
|
||||||
|
{
|
||||||
|
my $pad = "";
|
||||||
|
for (my $i = length $name; $i < 32; $i++)
|
||||||
|
{
|
||||||
|
$pad .= " ";
|
||||||
|
}
|
||||||
|
$comment = $pad . "/*<<< " . $comment . " */";
|
||||||
|
}
|
||||||
|
print GENHEAD $comment . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print GENHEAD "};\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub write_sql_dump(@)
|
||||||
|
{
|
||||||
|
my @data = @_;
|
||||||
|
|
||||||
|
# Write SQL dump code
|
||||||
|
open GENSQL, ">gen_config.sql" || die "Unable to write SQL dump";
|
||||||
|
print GENSQL "START TRANSACTION;\n\n
|
||||||
|
DROP TABLE uhub_config IF EXISTS;\n\n
|
||||||
|
CREATE TABLE uhub_config (
|
||||||
|
name VARCHAR(32) UNIQUE NOT NULL,
|
||||||
|
defaultValue TINYTEXT NOT NULL,
|
||||||
|
description LONGTEXT NOT NULL,
|
||||||
|
type TINYTEXT NOT NULL,
|
||||||
|
advanced BOOLEAN,
|
||||||
|
example LONGTEXT,
|
||||||
|
since TINYTEXT
|
||||||
|
);\n\n";
|
||||||
|
|
||||||
|
foreach my $option (@data)
|
||||||
|
{
|
||||||
|
my ($type, $name, $default, $advanced, $short, $desc, $since, $example) = @$option;
|
||||||
|
|
||||||
|
if ($type =~ /(string|file|message)/ )
|
||||||
|
{
|
||||||
|
$default = "\\\"$default\\\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
$desc =~ s/\"/\\\"/g;
|
||||||
|
$type =~ s/^int$/integer/;
|
||||||
|
|
||||||
|
my $stmt = "INSERT INTO uhub_config VALUES(";
|
||||||
|
$stmt .= "\"$name\", ";
|
||||||
|
$stmt .= "\"$default\", ";
|
||||||
|
$stmt .= "\"$desc\", ";
|
||||||
|
$stmt .= "\"$type\", ";
|
||||||
|
|
||||||
|
if (defined $example)
|
||||||
|
{
|
||||||
|
my $example_str = $example;
|
||||||
|
$example_str =~ s/\\/\\\\/g;
|
||||||
|
$example_str =~ s/\"/\\\"/g;
|
||||||
|
$stmt .= "\"$example_str\", ";
|
||||||
|
} else {
|
||||||
|
$stmt .= "NULL, ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $since) {
|
||||||
|
$stmt .= "\"$since\", ";
|
||||||
|
} else {
|
||||||
|
$stmt .= "NULL, ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $advanced) {
|
||||||
|
$stmt .= "\"$advanced\"";
|
||||||
|
} else {
|
||||||
|
$stmt .= "NULL";
|
||||||
|
}
|
||||||
|
|
||||||
|
$stmt .= ");\n";
|
||||||
|
|
||||||
|
print GENSQL $stmt;
|
||||||
|
}
|
||||||
|
print GENSQL "\n\nCOMMIT;\n\n";
|
||||||
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<check min="1" max="65535" />
|
<check min="1" max="65535" />
|
||||||
<since>0.1.0</since>
|
<since>0.1.0</since>
|
||||||
<short>Server port to bind to</short>
|
<short>Server port to bind to</short>
|
||||||
<description><![CDATA[This is specifies the port number the hub should listen on.]]></description>
|
<description><![CDATA[This specifies the port number the hub should listen on.]]></description>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option name="server_bind_addr" type="string" default="any">
|
<option name="server_bind_addr" type="string" default="any">
|
||||||
@ -409,7 +409,7 @@
|
|||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option name="tls_require" type="boolean" default="0">
|
<option name="tls_require" type="boolean" default="0">
|
||||||
<short>If SSL/TLS enabled, should it be required (default: 0)</short>
|
<short>If SSL/TLS enabled, should it be required</short>
|
||||||
<description><![CDATA[
|
<description><![CDATA[
|
||||||
If TLS/SSL support is enabled it can either be optional or mandatory.
|
If TLS/SSL support is enabled it can either be optional or mandatory.
|
||||||
If this option is disabled then SSL/TLS is not required to enter the hub, however it is possible to enter either with or without.
|
If this option is disabled then SSL/TLS is not required to enter the hub, however it is possible to enter either with or without.
|
||||||
@ -590,7 +590,7 @@
|
|||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option name="msg_error_no_memory" type="message" default="No memory">
|
<option name="msg_error_no_memory" type="message" default="No memory">
|
||||||
<description><![CDATA[]]></description>
|
<description><![CDATA[Hub has no more memory]]></description>
|
||||||
<since>0.2.0</since>
|
<since>0.2.0</since>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
@ -102,7 +102,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "server_port"))
|
if (!strcmp(key, "server_port"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->server_port, 0, 0))
|
min = 1;
|
||||||
|
max = 65535;
|
||||||
|
if (!apply_integer(key, data, &config->server_port, &min, &max))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -122,7 +124,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "server_listen_backlog"))
|
if (!strcmp(key, "server_listen_backlog"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->server_listen_backlog, 0, 0))
|
min = 5;
|
||||||
|
if (!apply_integer(key, data, &config->server_listen_backlog, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -244,7 +247,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_recv_buffer"))
|
if (!strcmp(key, "max_recv_buffer"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->max_recv_buffer, 0, 0))
|
min = 1024;
|
||||||
|
max = 1048576;
|
||||||
|
if (!apply_integer(key, data, &config->max_recv_buffer, &min, &max))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -254,7 +259,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_send_buffer"))
|
if (!strcmp(key, "max_send_buffer"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->max_send_buffer, 0, 0))
|
min = 2048;
|
||||||
|
if (!apply_integer(key, data, &config->max_send_buffer, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -264,7 +270,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_send_buffer_soft"))
|
if (!strcmp(key, "max_send_buffer_soft"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->max_send_buffer_soft, 0, 0))
|
min = 1024;
|
||||||
|
if (!apply_integer(key, data, &config->max_send_buffer_soft, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -284,7 +291,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_chat_history"))
|
if (!strcmp(key, "max_chat_history"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->max_chat_history, 0, 0))
|
min = 0;
|
||||||
|
max = 250;
|
||||||
|
if (!apply_integer(key, data, &config->max_chat_history, &min, &max))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -294,7 +303,9 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "max_logout_log"))
|
if (!strcmp(key, "max_logout_log"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->max_logout_log, 0, 0))
|
min = 0;
|
||||||
|
max = 2000;
|
||||||
|
if (!apply_integer(key, data, &config->max_logout_log, &min, &max))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -304,7 +315,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs_user"))
|
if (!strcmp(key, "limit_max_hubs_user"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs_user, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_max_hubs_user, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -314,7 +326,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs_reg"))
|
if (!strcmp(key, "limit_max_hubs_reg"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs_reg, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_max_hubs_reg, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -324,7 +337,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs_op"))
|
if (!strcmp(key, "limit_max_hubs_op"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs_op, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_max_hubs_op, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -334,7 +348,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_hubs"))
|
if (!strcmp(key, "limit_max_hubs"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_max_hubs, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_max_hubs, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -344,7 +359,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_hubs_user"))
|
if (!strcmp(key, "limit_min_hubs_user"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_min_hubs_user, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_min_hubs_user, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -354,7 +370,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_hubs_reg"))
|
if (!strcmp(key, "limit_min_hubs_reg"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_min_hubs_reg, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_min_hubs_reg, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -364,7 +381,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_hubs_op"))
|
if (!strcmp(key, "limit_min_hubs_op"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_min_hubs_op, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_min_hubs_op, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -385,7 +403,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_share"))
|
if (!strcmp(key, "limit_max_share"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_max_share, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_max_share, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -395,7 +414,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_min_slots"))
|
if (!strcmp(key, "limit_min_slots"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_min_slots, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_min_slots, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -405,7 +425,8 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
if (!strcmp(key, "limit_max_slots"))
|
if (!strcmp(key, "limit_max_slots"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->limit_max_slots, 0, 0))
|
min = 0;
|
||||||
|
if (!apply_integer(key, data, &config->limit_max_slots, &min, 0))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Configuration parse error on line %d", line_count);
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
return -1;
|
return -1;
|
||||||
@ -907,7 +928,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
|||||||
|
|
||||||
/* Still here -- unknown directive */
|
/* Still here -- unknown directive */
|
||||||
LOG_ERROR("Unknown configuration directive: '%s'", key);
|
LOG_ERROR("Unknown configuration directive: '%s'", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_config(struct hub_config* config)
|
void free_config(struct hub_config* config)
|
||||||
|
@ -4,9 +4,9 @@ struct hub_config
|
|||||||
{
|
{
|
||||||
int hub_enabled; /*<<< Is server enabled (default: 1) */
|
int hub_enabled; /*<<< Is server enabled (default: 1) */
|
||||||
int server_port; /*<<< Server port to bind to (default: 1511) */
|
int server_port; /*<<< Server port to bind to (default: 1511) */
|
||||||
char* server_bind_addr; /*<<< Server bind address (default: any) */
|
char* server_bind_addr; /*<<< Server bind address (default: "any") */
|
||||||
int server_listen_backlog; /*<<< Server listen backlog (default: 50) */
|
int server_listen_backlog; /*<<< Server listen backlog (default: 50) */
|
||||||
char* server_alt_ports; /*<<< Comma separated list of alternative ports to listen to (default: ) */
|
char* server_alt_ports; /*<<< Comma separated list of alternative ports to listen to (default: "") */
|
||||||
int show_banner; /*<<< Show banner on connect (default: 1) */
|
int show_banner; /*<<< Show banner on connect (default: 1) */
|
||||||
int show_banner_sys_info; /*<<< Show banner on connect (default: 1) */
|
int show_banner_sys_info; /*<<< Show banner on connect (default: 1) */
|
||||||
int max_users; /*<<< Maximum number of users allowed on the hub (default: 500) */
|
int max_users; /*<<< Maximum number of users allowed on the hub (default: 500) */
|
||||||
@ -14,9 +14,9 @@ struct hub_config
|
|||||||
int register_self; /*<<< Allow users to register themselves on the hub. (default: 0) */
|
int register_self; /*<<< Allow users to register themselves on the hub. (default: 0) */
|
||||||
int obsolete_clients; /*<<< Support obsolete clients using a ADC protocol prior to 1.0 (default: 0) */
|
int obsolete_clients; /*<<< Support obsolete clients using a ADC protocol prior to 1.0 (default: 0) */
|
||||||
int chat_is_privileged; /*<<< Allow chat for operators and above only (default: 0) */
|
int chat_is_privileged; /*<<< Allow chat for operators and above only (default: 0) */
|
||||||
char* hub_name; /*<<< Name of hub (default: uhub) */
|
char* hub_name; /*<<< Name of hub (default: "uhub") */
|
||||||
char* hub_description; /*<<< Short hub description, topic or subject. (default: no description) */
|
char* hub_description; /*<<< Short hub description, topic or subject. (default: "no description") */
|
||||||
char* redirect_addr; /*<<< A common hub redirect address. (default: ) */
|
char* redirect_addr; /*<<< A common hub redirect address. (default: "") */
|
||||||
int max_recv_buffer; /*<<< Max read buffer before parse, per user (default: 4096) */
|
int max_recv_buffer; /*<<< Max read buffer before parse, per user (default: 4096) */
|
||||||
int max_send_buffer; /*<<< Max send buffer before disconnect, per user (default: 131072) */
|
int max_send_buffer; /*<<< Max send buffer before disconnect, per user (default: 131072) */
|
||||||
int max_send_buffer_soft; /*<<< Max send buffer before message drops, per user (default: 98304) */
|
int max_send_buffer_soft; /*<<< Max send buffer before message drops, per user (default: 98304) */
|
||||||
@ -41,12 +41,12 @@ struct hub_config
|
|||||||
int flood_ctl_update; /*<<< Max updates allowed in time interval (default: 0) */
|
int flood_ctl_update; /*<<< Max updates allowed in time interval (default: 0) */
|
||||||
int flood_ctl_extras; /*<<< Max extra messages allowed in time interval (default: 0) */
|
int flood_ctl_extras; /*<<< Max extra messages allowed in time interval (default: 0) */
|
||||||
int tls_enable; /*<<< Enable SSL/TLS support (default: 0) */
|
int tls_enable; /*<<< Enable SSL/TLS support (default: 0) */
|
||||||
int tls_require; /*<<< If SSL/TLS enabled, should it be required (default: 0) (default: 0) */
|
int tls_require; /*<<< If SSL/TLS enabled, should it be required (default: 0) */
|
||||||
char* tls_require_redirect_addr; /*<<< A redirect address in case a client connects using "adc://" when "adcs://" is required. (default: ) */
|
char* tls_require_redirect_addr; /*<<< A redirect address in case a client connects using "adc://" when "adcs://" is required. (default: "") */
|
||||||
char* tls_certificate; /*<<< Certificate file (default: ) */
|
char* tls_certificate; /*<<< Certificate file (default: "") */
|
||||||
char* tls_private_key; /*<<< Private key file (default: ) */
|
char* tls_private_key; /*<<< Private key file (default: "") */
|
||||||
char* file_acl; /*<<< File containing access control lists (default: ) */
|
char* file_acl; /*<<< File containing access control lists (default: "") */
|
||||||
char* file_plugins; /*<<< Plugin configuration file (default: ) */
|
char* file_plugins; /*<<< Plugin configuration file (default: "") */
|
||||||
char* msg_hub_full; /*<<< "Hub is full" */
|
char* msg_hub_full; /*<<< "Hub is full" */
|
||||||
char* msg_hub_disabled; /*<<< "Hub is disabled" */
|
char* msg_hub_disabled; /*<<< "Hub is disabled" */
|
||||||
char* msg_hub_registered_users_only; /*<<< "Hub is for registered users only" */
|
char* msg_hub_registered_users_only; /*<<< "Hub is for registered users only" */
|
||||||
|
Loading…
Reference in New Issue
Block a user