Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -26,20 +26,20 @@
|
||||
static int check_cmd_bool(const char* cmd, struct linked_list* list, char* line, int line_count)
|
||||
{
|
||||
char* data;
|
||||
|
||||
|
||||
if (!strncmp(line, cmd, strlen(cmd)))
|
||||
{
|
||||
data = &line[strlen(cmd)];
|
||||
data[0] = '\0';
|
||||
data++;
|
||||
|
||||
|
||||
data = strip_white_space(data);
|
||||
if (!*data)
|
||||
{
|
||||
LOG_FATAL("ACL parse error on line %d", line_count);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
list_append(list, hub_strdup(data));
|
||||
LOG_DEBUG("ACL: Deny access for: '%s' (%s)", data, cmd);
|
||||
return 1;
|
||||
@@ -190,18 +190,18 @@ int acl_initialize(struct hub_config* config, struct acl_handle* handle)
|
||||
{
|
||||
int ret;
|
||||
memset(handle, 0, sizeof(struct acl_handle));
|
||||
|
||||
|
||||
handle->users = list_create();
|
||||
handle->users_denied = list_create();
|
||||
handle->users_banned = list_create();
|
||||
handle->cids = list_create();
|
||||
handle->networks = list_create();
|
||||
handle->nat_override = list_create();
|
||||
|
||||
|
||||
if (!handle->users || !handle->cids || !handle->networks || !handle->users_denied || !handle->users_banned || !handle->nat_override)
|
||||
{
|
||||
LOG_FATAL("acl_initialize: Out of memory");
|
||||
|
||||
|
||||
list_destroy(handle->users);
|
||||
list_destroy(handle->users_denied);
|
||||
list_destroy(handle->users_banned);
|
||||
@@ -210,11 +210,11 @@ int acl_initialize(struct hub_config* config, struct acl_handle* handle)
|
||||
list_destroy(handle->nat_override);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (config)
|
||||
{
|
||||
if (!*config->file_acl) return 0;
|
||||
|
||||
|
||||
ret = file_read_lines(config->file_acl, handle, &acl_parse_line);
|
||||
if (ret == -1)
|
||||
return -1;
|
||||
@@ -249,26 +249,26 @@ int acl_shutdown(struct acl_handle* handle)
|
||||
list_clear(handle->users, &acl_free_access_info);
|
||||
list_destroy(handle->users);
|
||||
}
|
||||
|
||||
|
||||
if (handle->users_denied)
|
||||
{
|
||||
list_clear(handle->users_denied, &hub_free);
|
||||
list_destroy(handle->users_denied);
|
||||
}
|
||||
|
||||
|
||||
if (handle->users_banned)
|
||||
{
|
||||
list_clear(handle->users_banned, &hub_free);
|
||||
list_destroy(handle->users_banned);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (handle->cids)
|
||||
{
|
||||
list_clear(handle->cids, &hub_free);
|
||||
list_destroy(handle->cids);
|
||||
}
|
||||
|
||||
|
||||
if (handle->networks)
|
||||
{
|
||||
list_clear(handle->networks, &acl_free_ip_info);
|
||||
@@ -330,13 +330,11 @@ struct auth_info* acl_get_access_info(struct hub_info* hub, const char* name)
|
||||
}
|
||||
|
||||
#define STR_LIST_CONTAINS(LIST, STR) \
|
||||
str = (char*) list_get_first(LIST); \
|
||||
while (str) \
|
||||
LIST_FOREACH(char*, str, LIST, \
|
||||
{ \
|
||||
if (strcasecmp(str, STR) == 0) \
|
||||
return 1; \
|
||||
str = (char*) list_get_next(LIST); \
|
||||
} \
|
||||
}); \
|
||||
return 0
|
||||
|
||||
int acl_is_cid_banned(struct acl_handle* handle, const char* data)
|
||||
@@ -400,34 +398,28 @@ int acl_user_unban_cid(struct acl_handle* handle, const char* cid)
|
||||
int acl_is_ip_banned(struct acl_handle* handle, const char* ip_address)
|
||||
{
|
||||
struct ip_addr_encap raw;
|
||||
struct ip_range* info = (struct ip_range*) list_get_first(handle->networks);
|
||||
struct ip_range* info;
|
||||
|
||||
ip_convert_to_binary(ip_address, &raw);
|
||||
|
||||
while (info)
|
||||
LIST_FOREACH(struct ip_range*, info, handle->networks,
|
||||
{
|
||||
if (ip_in_range(&raw, info))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
info = (struct ip_range*) list_get_next(handle->networks);
|
||||
}
|
||||
});
|
||||
return 0;
|
||||
}
|
||||
|
||||
int acl_is_ip_nat_override(struct acl_handle* handle, const char* ip_address)
|
||||
{
|
||||
struct ip_addr_encap raw;
|
||||
struct ip_range* info = (struct ip_range*) list_get_first(handle->nat_override);
|
||||
struct ip_range* info;
|
||||
|
||||
ip_convert_to_binary(ip_address, &raw);
|
||||
|
||||
while (info)
|
||||
LIST_FOREACH(struct ip_range*, info, handle->nat_override,
|
||||
{
|
||||
if (ip_in_range(&raw, info))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
info = (struct ip_range*) list_get_next(handle->nat_override);
|
||||
}
|
||||
});
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -476,10 +468,10 @@ int acl_password_verify(struct hub_info* hub, struct hub_user* user, const char*
|
||||
base32_decode(challenge, (unsigned char*) raw_challenge, MAX_CID_LEN);
|
||||
|
||||
password_len = strlen(access->password);
|
||||
|
||||
|
||||
memcpy(&buf[0], access->password, password_len);
|
||||
memcpy(&buf[password_len], raw_challenge, TIGERSIZE);
|
||||
|
||||
|
||||
tiger((uint64_t*) buf, TIGERSIZE+password_len, (uint64_t*) tiger_res);
|
||||
base32_encode((unsigned char*) tiger_res, TIGERSIZE, password_calc);
|
||||
password_calc[MAX_CID_LEN] = 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -26,7 +26,7 @@ static void hub_command_args_free(struct hub_command* cmd)
|
||||
if (!cmd->args)
|
||||
return;
|
||||
|
||||
for (data = (struct hub_command_arg_data*) list_get_first(cmd->args); data; data = (struct hub_command_arg_data*) list_get_next(cmd->args))
|
||||
LIST_FOREACH(struct hub_command_arg_data*, data, cmd->args,
|
||||
{
|
||||
switch (data->type)
|
||||
{
|
||||
@@ -39,7 +39,7 @@ static void hub_command_args_free(struct hub_command* cmd)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
list_clear(cmd->args, hub_free);
|
||||
list_destroy(cmd->args);
|
||||
@@ -77,8 +77,7 @@ static enum command_parse_status command_extract_arguments(struct hub_info* hub,
|
||||
if (greedy)
|
||||
{
|
||||
size = 1;
|
||||
for (tmp = (char*) list_get_first(tokens); tmp; tmp = (char*) list_get_next(tokens))
|
||||
size += (strlen(tmp) + 1);
|
||||
LIST_FOREACH(char*, tmp, tokens, { size += (strlen(tmp) + 1); });
|
||||
token = hub_malloc_zero(size);
|
||||
|
||||
while ((tmp = list_get_first(tokens)))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -98,14 +98,14 @@ struct command_handle* command_handler_lookup(struct command_base* cbase, const
|
||||
struct command_handle* handler = NULL;
|
||||
size_t prefix_len = strlen(prefix);
|
||||
|
||||
for (handler = (struct command_handle*) list_get_first(cbase->handlers); handler; handler = (struct command_handle*) list_get_next(cbase->handlers))
|
||||
LIST_FOREACH(struct command_handle*, handler, cbase->handlers,
|
||||
{
|
||||
if (prefix_len != handler->length)
|
||||
continue;
|
||||
|
||||
if (!memcmp(prefix, handler->prefix, handler->length))
|
||||
return handler;
|
||||
}
|
||||
});
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -292,7 +292,7 @@ static int command_help(struct command_base* cbase, struct hub_user* user, struc
|
||||
{
|
||||
cbuf_append(buf, "Available commands:\n");
|
||||
|
||||
for (command = (struct command_handle*) list_get_first(cbase->handlers); command; command = (struct command_handle*) list_get_next(cbase->handlers))
|
||||
LIST_FOREACH(struct command_handle*, command, cbase->handlers,
|
||||
{
|
||||
if (command_is_available(command, user->credentials))
|
||||
{
|
||||
@@ -301,7 +301,7 @@ static int command_help(struct command_base* cbase, struct hub_user* user, struc
|
||||
cbuf_append(buf, " ");
|
||||
cbuf_append_format(buf, " - %s\n", command->description);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -432,12 +432,10 @@ static int command_whoip(struct command_base* cbase, struct hub_user* user, stru
|
||||
buf = cbuf_create(128 + ((MAX_NICK_LEN + INET6_ADDRSTRLEN + 5) * ret));
|
||||
cbuf_append_format(buf, "*** %s: Found %d match%s:\n", cmd->prefix, ret, ((ret != 1) ? "es" : ""));
|
||||
|
||||
u = (struct hub_user*) list_get_first(users);
|
||||
while (u)
|
||||
LIST_FOREACH(struct hub_user*, u, users,
|
||||
{
|
||||
cbuf_append_format(buf, "%s (%s)\n", u->id.nick, user_get_address(u));
|
||||
u = (struct hub_user*) list_get_next(users);
|
||||
}
|
||||
});
|
||||
cbuf_append(buf, "\n");
|
||||
|
||||
send_message(cbase, user, buf);
|
||||
@@ -462,8 +460,7 @@ static int command_broadcast(struct command_base* cbase, struct hub_user* user,
|
||||
memcpy(from_sid, sid_to_string(user->id.sid), sizeof(from_sid));
|
||||
memcpy(pm_flag + 2, from_sid, sizeof(from_sid));
|
||||
|
||||
target = (struct hub_user*) list_get_first(cbase->hub->users->list);
|
||||
while (target)
|
||||
LIST_FOREACH(struct hub_user*, target, cbase->hub->users->list,
|
||||
{
|
||||
if (target != user)
|
||||
{
|
||||
@@ -480,8 +477,7 @@ static int command_broadcast(struct command_base* cbase, struct hub_user* user,
|
||||
route_to_user(cbase->hub, target, command);
|
||||
adc_msg_free(command);
|
||||
}
|
||||
target = (struct hub_user*) list_get_next(cbase->hub->users->list);
|
||||
}
|
||||
});
|
||||
|
||||
cbuf_append_format(buf, "*** %s: Delivered to " PRINTF_SIZE_T " user%s", cmd->prefix, recipients, (recipients != 1 ? "s" : ""));
|
||||
send_message(cbase, user, buf);
|
||||
@@ -513,8 +509,7 @@ static int command_log(struct command_base* cbase, struct hub_user* user, struct
|
||||
command_status(cbase, user, cmd, buf);
|
||||
|
||||
buf = cbuf_create(MAX_HELP_LINE);
|
||||
log = (struct hub_logout_info*) list_get_first(messages);
|
||||
while (log)
|
||||
LIST_FOREACH(struct hub_logout_info*, log, messages,
|
||||
{
|
||||
const char* address = ip_convert_to_string(&log->addr);
|
||||
int show = 0;
|
||||
@@ -538,8 +533,7 @@ static int command_log(struct command_base* cbase, struct hub_user* user, struct
|
||||
send_message(cbase, user, buf);
|
||||
buf = cbuf_create(MAX_HELP_LINE);
|
||||
}
|
||||
log = (struct hub_logout_info*) list_get_next(messages);
|
||||
}
|
||||
});
|
||||
|
||||
if (search_len)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -76,7 +76,7 @@ static int config_parse_line(char* line, int line_count, void* ptr_data)
|
||||
struct hub_config* config = (struct hub_config*) ptr_data;
|
||||
|
||||
strip_off_ini_line_comments(line, line_count);
|
||||
|
||||
|
||||
if (!*line) return 0;
|
||||
|
||||
LOG_DUMP("config_parse_line(): '%s'", line);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,289 +0,0 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
use strict;
|
||||
use XML::DOM;
|
||||
|
||||
sub write_c_header(@);
|
||||
sub write_sql_dump(@);
|
||||
sub get_data($);
|
||||
|
||||
my $dump_to_sql = 0;
|
||||
|
||||
# initialize parser and read the file
|
||||
my $input = "./config.xml";
|
||||
my $parser = new XML::DOM::Parser;
|
||||
my $tree = $parser->parsefile($input) || die "Unable to parse XML file.";
|
||||
|
||||
# Get data
|
||||
my $nodes = $tree->getElementsByTagName("option");
|
||||
my @options = ();
|
||||
for (my $i = 0; $i < $nodes->getLength; $i++)
|
||||
{
|
||||
my @data = get_data($nodes->item($i));
|
||||
push @options, \@data;
|
||||
}
|
||||
|
||||
write_c_header(@options);
|
||||
write_sql_dump(@options) if ($dump_to_sql);
|
||||
|
||||
my $config_defaults = "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";
|
||||
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)
|
||||
{
|
||||
my ($type, $name, $default, $advanced, $short, $desc, $since, $example, $check, $ifdef) = @$option;
|
||||
my $string = ($type =~ /(string|file|message)/);
|
||||
my $min = undef;
|
||||
my $max = undef;
|
||||
my $regexp = undef;
|
||||
|
||||
if (defined $check)
|
||||
{
|
||||
$min = $check->getAttribute("min");
|
||||
$max = $check->getAttribute("max");
|
||||
$regexp = $check->getAttribute("regexp");
|
||||
|
||||
$max = undef if ($max eq "");
|
||||
$min = undef if ($min eq "");
|
||||
$regexp = undef if ($regexp eq "");
|
||||
}
|
||||
|
||||
$config_defaults .= "#ifdef $ifdef\n" if ($ifdef ne "");
|
||||
$config_defaults .= "\tconfig->$name = ";
|
||||
$config_defaults .= "hub_strdup(\"" if ($string);
|
||||
$config_defaults .= $default;
|
||||
$config_defaults .= "\")" if ($string);
|
||||
$config_defaults .= ";\n";
|
||||
$config_defaults .= "#endif /* $ifdef */\n" if ($ifdef ne "");
|
||||
|
||||
$config_apply .= "#ifdef $ifdef\n" if ($ifdef ne "");
|
||||
$config_apply .= "\tif (!strcmp(key, \"" . $name . "\"))\n\t{\n";
|
||||
|
||||
if ($type eq "int")
|
||||
{
|
||||
$config_apply .= "\t\tmin = $min;\n" if (defined $min);
|
||||
$config_apply .= "\t\tmax = $max;\n" if (defined $max);
|
||||
$config_apply .= "\t\tif (!apply_integer(key, data, &config->$name, ";
|
||||
if (defined $min) { $config_apply .= "&min"; } else { $config_apply .= "0"; }
|
||||
$config_apply .= ", ";
|
||||
if (defined $max) { $config_apply .= "&max"; } else { $config_apply .= "0"; }
|
||||
$config_apply .= "))\n";
|
||||
}
|
||||
elsif ($type eq "boolean")
|
||||
{
|
||||
$config_apply .= "\t\tif (!apply_boolean(key, data, &config->$name))\n";
|
||||
}
|
||||
elsif ($string)
|
||||
{
|
||||
$config_apply .="\t\tif (!apply_string(key, data, &config->$name, (char*) \"\"))\n";
|
||||
}
|
||||
|
||||
$config_apply .= "\t\t{\n" .
|
||||
"\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n" .
|
||||
"\t\t\treturn -1;\n" .
|
||||
"\t\t}\n" .
|
||||
"\t\treturn 0;\n" .
|
||||
"\t}\n";
|
||||
$config_apply .= "#endif /* $ifdef */\n" if ($ifdef ne "");
|
||||
$config_apply .= "\n";
|
||||
|
||||
if ($string)
|
||||
{
|
||||
$config_free .= "#ifdef $ifdef\n" if ($ifdef ne "");
|
||||
$config_free .= "\thub_free(config->" . $name . ");\n";
|
||||
$config_free .= "#endif /* $ifdef */\n" if ($ifdef ne "");
|
||||
$config_free .= "\n";
|
||||
}
|
||||
|
||||
my $out = "%s";
|
||||
my $val = "config->$name";
|
||||
my $test = "config->$name != $default";
|
||||
|
||||
$out = "%d" if ($type eq "int");
|
||||
$val = "config->$name ? \"yes\" : \"no\"" if ($type eq "boolean");
|
||||
|
||||
if ($string)
|
||||
{
|
||||
$out = "\\\"%s\\\"";
|
||||
$test = "strcmp(config->$name, \"$default\") != 0";
|
||||
}
|
||||
|
||||
$config_dump .= "#ifdef $ifdef\n" if ($ifdef ne "");
|
||||
$config_dump .= "\tif (!ignore_defaults || $test)\n";
|
||||
$config_dump .= "\t\tfprintf(stdout, \"$name = $out\\n\", $val);\n";
|
||||
$config_dump .= "#endif /* $ifdef */\n" if ($ifdef ne "");
|
||||
$config_dump .= "\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($)
|
||||
{
|
||||
my $p = shift;
|
||||
|
||||
my $short = "";
|
||||
my $example = "";
|
||||
my $description = "";
|
||||
my $since = "";
|
||||
my $ifdef = "";
|
||||
|
||||
$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);
|
||||
$ifdef = $p->getElementsByTagName("ifdef")->item(0)->getFirstChild()->getData() if ($p->getElementsByTagName("ifdef")->getLength());
|
||||
|
||||
my @data = (
|
||||
$p->getAttribute("type"),
|
||||
$p->getAttribute("name"),
|
||||
$p->getAttribute("default"),
|
||||
$p->getAttribute("advanced"),
|
||||
$short,
|
||||
$description,
|
||||
$since,
|
||||
$example,
|
||||
$check,
|
||||
$ifdef
|
||||
);
|
||||
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, $check, $ifdef) = @$option;
|
||||
|
||||
my $string = ($type =~ /(string|file|message)/);
|
||||
|
||||
print GENHEAD "#ifdef $ifdef\n" if ($ifdef ne "");
|
||||
|
||||
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 "#endif /* $ifdef */\n" if ($ifdef ne "");
|
||||
}
|
||||
|
||||
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, $check, $ifdef) = @$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";
|
||||
}
|
||||
255
src/core/config.py
Executable file
255
src/core/config.py
Executable file
@@ -0,0 +1,255 @@
|
||||
#!/usr/bin/env python
|
||||
"""
|
||||
uhub - A tiny ADC p2p connection hub
|
||||
Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
"""
|
||||
|
||||
from xml.dom import minidom, Node
|
||||
from datetime import datetime
|
||||
import argparse
|
||||
|
||||
class OptionParseError(Exception):
|
||||
pass
|
||||
|
||||
class Option(object):
|
||||
def _get(self, node, name):
|
||||
self.__dict__[name] = None
|
||||
if (node.getElementsByTagName(name)):
|
||||
self.__dict__[name] = node.getElementsByTagName(name)[0].firstChild.nodeValue
|
||||
|
||||
def _attr(self, node, name, required = False):
|
||||
try:
|
||||
return node.attributes[name].value
|
||||
except Exception:
|
||||
pass
|
||||
if (required):
|
||||
raise OptionParseError("Option %s is required but not found!" % name)
|
||||
return None
|
||||
|
||||
def __init__(self, node):
|
||||
self.otype = self._attr(node, 'type', True)
|
||||
|
||||
# Verify that the type is known
|
||||
if not self.otype in ["int", "boolean", "string", "message", "file"]:
|
||||
raise OptionParseError("Option %s has unknown type" % self.name)
|
||||
|
||||
self.name = self._attr(node, 'name', True)
|
||||
self.default = self._attr(node, 'default', True)
|
||||
self.advanced = self._attr(node, 'advanced', False)
|
||||
self.is_string = self.otype in ["string", "message", "file"]
|
||||
|
||||
self._get(node, "short");
|
||||
self._get(node, "description");
|
||||
self._get(node, "syntax");
|
||||
self._get(node, "since");
|
||||
self._get(node, "example");
|
||||
|
||||
check = node.getElementsByTagName("check")
|
||||
if (check):
|
||||
check = node.getElementsByTagName("check")[0]
|
||||
self.check_min = self._attr(check, 'min', False)
|
||||
self.check_max = self._attr(check, 'max', False)
|
||||
self.check_regexp = self._attr(check, 'regexp', False)
|
||||
else:
|
||||
self.check_min = None
|
||||
self.check_max = None
|
||||
self.check_regexp = None
|
||||
|
||||
|
||||
def c_type(self):
|
||||
if self.otype == "boolean":
|
||||
return "int"
|
||||
elif self.is_string:
|
||||
return "char*"
|
||||
else:
|
||||
return self.otype
|
||||
|
||||
def sql_type(self):
|
||||
if self.otype == "int":
|
||||
return "integer"
|
||||
return self.otype
|
||||
|
||||
def c_comment(self):
|
||||
comment = ""
|
||||
if (self.otype == "message"):
|
||||
comment = self.formatted_default()
|
||||
elif len(self.short):
|
||||
comment = "%s (default: %s)" % (self.short, self.formatted_default())
|
||||
return comment
|
||||
|
||||
def formatted_default(self):
|
||||
if self.is_string:
|
||||
return "\"%s\"" % self.default
|
||||
return self.default
|
||||
|
||||
class SourceGenerator(object):
|
||||
def __init__(self, filename, cppStyle = True):
|
||||
print "Generating %s..." % filename
|
||||
self.f = open(filename, 'w');
|
||||
|
||||
def write_header(self, Comment = True):
|
||||
if Comment:
|
||||
s = "/*\n * uhub - A tiny ADC p2p connection hub\n"
|
||||
s += " * Copyright (C) 2007-%s, Jan Vidar Krey\n *\n" % datetime.now().strftime("%Y")
|
||||
s += " * THIS FILE IS AUTOGENERATED - DO NOT MODIFY\n"
|
||||
s += " * Created %s, by config.py\n */\n\n" % datetime.now().strftime("%Y-%m-%d %H:%M")
|
||||
self.f.write(s)
|
||||
|
||||
class CHeaderGenerator(SourceGenerator):
|
||||
def __init__(self, filename):
|
||||
super(CHeaderGenerator, self).__init__(filename)
|
||||
|
||||
def _write_declaration(self, option):
|
||||
comment = ' ' * (32 - len(option.name)) + "/*<<< %s */" % option.c_comment()
|
||||
ptype = option.c_type() + (5 - len(option.c_type())) * ' '
|
||||
self.f.write("\t%(type)s %(name)s;%(comment)s\n" % {
|
||||
"type": ptype,
|
||||
"name": option.name,
|
||||
"comment": comment})
|
||||
|
||||
def write(self, options):
|
||||
self.write_header()
|
||||
self.f.write("struct hub_config\n{\n")
|
||||
for option in options:
|
||||
self._write_declaration(option)
|
||||
self.f.write("};\n\n")
|
||||
|
||||
class CSourceGenerator(SourceGenerator):
|
||||
def __init__(self, filename):
|
||||
super(CSourceGenerator, self).__init__(filename)
|
||||
|
||||
def _write_default_impl(self, option):
|
||||
s = "\tconfig->%s = " % option.name
|
||||
if option.is_string:
|
||||
s += "hub_strdup(%s);\n" % option.formatted_default()
|
||||
else:
|
||||
s += option.formatted_default() + ";\n"
|
||||
self.f.write(s)
|
||||
|
||||
def _write_apply_impl(self, option):
|
||||
s = "\tif (!strcmp(key, \"%s\"))\n\t{\n" % option.name
|
||||
if option.otype == "int":
|
||||
s_min = "0"
|
||||
s_max = "0"
|
||||
if (option.check_min):
|
||||
s += "\t\tmin = %s;\n" % option.check_min
|
||||
s_min = "&min"
|
||||
if (option.check_max):
|
||||
s += "\t\tmax = %s;\n" % option.check_max
|
||||
s_max = "&max"
|
||||
s+= "\t\tif (!apply_integer(key, data, &config->%s, %s, %s))\n" % (option.name, s_min, s_max)
|
||||
elif option.otype == "boolean":
|
||||
s += "\t\tif (!apply_boolean(key, data, &config->%s))\n" % option.name
|
||||
elif option.is_string:
|
||||
s += "\t\tif (!apply_string(key, data, &config->%s, (char*) \"\"))\n" % option.name
|
||||
s += "\t\t{\n\t\t\tLOG_ERROR(\"Configuration parse error on line %d\", line_count);\n\t\t\treturn -1;\n\t\t}\n\t\treturn 0;\n\t}\n\n"
|
||||
self.f.write(s)
|
||||
|
||||
def _write_free_impl(self, option):
|
||||
if option.is_string:
|
||||
self.f.write("\thub_free(config->%s);\n\n" % option.name)
|
||||
|
||||
def _write_dump_impl(self, option):
|
||||
s = ""
|
||||
fmt = "%s"
|
||||
val = "config->%s" % option.name
|
||||
test = "config->%s != %s" % (option.name, option.default)
|
||||
|
||||
if (option.otype == "int"):
|
||||
fmt = "%d"
|
||||
elif (option.otype == "boolean"):
|
||||
val = "config->%s ? \"yes\" : \"no\"" % option.name
|
||||
elif (option.is_string):
|
||||
fmt = "\\\"%s\\\"";
|
||||
test = "strcmp(config->%s, %s) != 0" % (option.name, option.formatted_default())
|
||||
|
||||
s += "\tif (!ignore_defaults || %s)\n" % test;
|
||||
s += "\t\tfprintf(stdout, \"%s = %s\\n\", %s);\n\n" % (option.name, fmt, val)
|
||||
self.f.write(s)
|
||||
|
||||
def write(self, options):
|
||||
self.write_header()
|
||||
self.f.write("void config_defaults(struct hub_config* config)\n{\n")
|
||||
for option in options:
|
||||
self._write_default_impl(option)
|
||||
self.f.write("}\n\n")
|
||||
self.f.write("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")
|
||||
for option in options:
|
||||
self._write_apply_impl(option)
|
||||
self.f.write("\t/* Still here -- unknown directive */\n\tLOG_ERROR(\"Unknown configuration directive: '%s'\", key);\n\treturn -1;\n}\n\n")
|
||||
self.f.write("void free_config(struct hub_config* config)\n{\n")
|
||||
for option in options:
|
||||
self._write_free_impl(option)
|
||||
self.f.write("}\n\n")
|
||||
self.f.write("void dump_config(struct hub_config* config, int ignore_defaults)\n{\n")
|
||||
for option in options:
|
||||
self._write_dump_impl(option)
|
||||
self.f.write("}\n\n")
|
||||
|
||||
class SqlWebsiteDocsGenerator(SourceGenerator):
|
||||
def __init__(self, filename, sqlite_support = False):
|
||||
self.sqlite_support = sqlite_support
|
||||
super(SqlWebsiteDocsGenerator, self).__init__(filename)
|
||||
|
||||
def _sql_escape(self, s):
|
||||
if self.sqlite_support:
|
||||
return s.replace("\"", "\"\"")
|
||||
return s.replace("\"", "\\\"")
|
||||
|
||||
|
||||
def _write_or_null(self, s):
|
||||
if (not s or len(s) == 0):
|
||||
return "NULL"
|
||||
return "\"%s\"" % self._sql_escape(s)
|
||||
|
||||
def write(self, options):
|
||||
self.write_header(False)
|
||||
table = "uhub_config"
|
||||
|
||||
s = ""
|
||||
if not self.sqlite_support:
|
||||
s += "START TRANSACTION;\n\nDROP TABLE %(table)s IF EXISTS;" % { "table": table }
|
||||
s += "\n\nCREATE TABLE %(table)s (\n\tname VARCHAR(32) UNIQUE NOT NULL,\n\tdefaultValue TINYTEXT NOT NULL,\n\tdescription LONGTEXT NOT NULL,\n\ttype TINYTEXT NOT NULL,\n\tadvanced BOOLEAN,\n\texample LONGTEXT,\n\tsince TINYTEXT\n);\n\n" % { "table": table }
|
||||
self.f.write(s)
|
||||
|
||||
for option in options:
|
||||
s = "INSERT INTO %(table)s VALUES(\"%(name)s\", \"%(default)s\", \"%(description)s\", \"%(type)s\", %(example)s, %(since)s, %(advanced)s);\n" % {
|
||||
"table": table,
|
||||
"name": self._sql_escape(option.name),
|
||||
"default": self._sql_escape(option.formatted_default()),
|
||||
"description": self._sql_escape(option.description),
|
||||
"type": option.sql_type(),
|
||||
"example": self._write_or_null(option.example),
|
||||
"since": self._write_or_null(option.since),
|
||||
"advanced": self._write_or_null(option.example),
|
||||
}
|
||||
self.f.write(s)
|
||||
|
||||
if not self.sqlite_support:
|
||||
self.f.write("\n\nCOMMIT;\n\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
# parser = argparse.ArgumentParser(description = "Configuration file parser and source generator")
|
||||
# parser.add_argument("--in", nargs=1, type=argparse.FileType('r'), default="config.xml", help="Input file (config.xml)", required = True)
|
||||
# parser.add_argument("--c-decl", nargs=1, type=argparse.FileType('w'), default="gen_config.h", help="Output file for C declarations (gen_config.h)")
|
||||
# parser.add_argument("--c-impl", nargs=1, type=argparse.FileType('w'), default="gen_config.c", help="Output file for C implementation (gen_config.c)")
|
||||
# parser.add_argument("--doc-sql", nargs=1, type=argparse.FileType('w'), help="Output file for SQL documentation")
|
||||
# args = parser.parse_args()
|
||||
|
||||
xmldoc = minidom.parse("./config.xml")
|
||||
opt_tags = xmldoc.getElementsByTagName('option')
|
||||
options = []
|
||||
for option in opt_tags:
|
||||
opt = Option(option)
|
||||
options.append(opt)
|
||||
|
||||
header = CHeaderGenerator("./gen_config.h");
|
||||
header.write(options);
|
||||
|
||||
source = CSourceGenerator("./gen_config.c");
|
||||
source.write(options);
|
||||
|
||||
#sql = SqlWebsiteDocsGenerator("./gen_config.sql", True);
|
||||
#sql.write(options);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -32,20 +32,20 @@ int event_queue_initialize(struct event_queue** queue, event_queue_callback call
|
||||
*queue = (struct event_queue*) hub_malloc_zero(sizeof(struct event_queue));
|
||||
if (!(*queue))
|
||||
return -1;
|
||||
|
||||
|
||||
(*queue)->q1 = list_create();
|
||||
(*queue)->q2 = list_create();
|
||||
|
||||
|
||||
if (!(*queue)->q1 || !(*queue)->q2)
|
||||
{
|
||||
list_destroy((*queue)->q1);
|
||||
list_destroy((*queue)->q2);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
(*queue)->callback = callback;
|
||||
(*queue)->callback_data = ptr;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -73,35 +73,27 @@ int event_queue_process(struct event_queue* queue)
|
||||
struct event_data* data;
|
||||
if (queue->locked)
|
||||
return 0;
|
||||
|
||||
|
||||
/* lock primary queue, and handle the primary queue messages. */
|
||||
queue->locked = 1;
|
||||
|
||||
data = (struct event_data*) list_get_first(queue->q1);
|
||||
while (data)
|
||||
|
||||
LIST_FOREACH(struct event_data*, data, queue->q1,
|
||||
{
|
||||
#ifdef EQ_DEBUG
|
||||
eq_debug("EXEC", data);
|
||||
#endif
|
||||
queue->callback(queue->callback_data, data);
|
||||
data = (struct event_data*) list_get_next(queue->q1);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
list_clear(queue->q1, event_queue_cleanup_callback);
|
||||
uhub_assert(list_size(queue->q1) == 0);
|
||||
|
||||
|
||||
/* unlock queue */
|
||||
queue->locked = 0;
|
||||
|
||||
|
||||
/* transfer from secondary queue to the primary queue. */
|
||||
data = (struct event_data*) list_get_first(queue->q2);
|
||||
while (data)
|
||||
{
|
||||
list_remove(queue->q2, data);
|
||||
list_append(queue->q1, data);
|
||||
data = (struct event_data*) list_get_first(queue->q2);
|
||||
}
|
||||
|
||||
list_append_list(queue->q1, queue->q2);
|
||||
|
||||
/* if more events exist, schedule it */
|
||||
if (list_size(queue->q1))
|
||||
{
|
||||
@@ -114,18 +106,18 @@ void event_queue_post(struct event_queue* queue, struct event_data* message)
|
||||
{
|
||||
struct linked_list* q = (!queue->locked) ? queue->q1 : queue->q2;
|
||||
struct event_data* data;
|
||||
|
||||
|
||||
data = (struct event_data*) hub_malloc(sizeof(struct event_data));
|
||||
if (data)
|
||||
{
|
||||
data->id = message->id;
|
||||
data->ptr = message->ptr;
|
||||
data->flags = message->flags;
|
||||
|
||||
|
||||
#ifdef EQ_DEBUG
|
||||
eq_debug("POST", data);
|
||||
#endif
|
||||
|
||||
|
||||
list_append(q, data);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* THIS FILE IS AUTOGENERATED - DO NOT MODIFY
|
||||
* Created 2013-04-22 21:57, by config.py
|
||||
*/
|
||||
|
||||
void config_defaults(struct hub_config* config)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
/* THIS FILE IS AUTOGENERATED - DO NOT CHANGE IT! */
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* THIS FILE IS AUTOGENERATED - DO NOT MODIFY
|
||||
* Created 2013-04-22 21:57, by config.py
|
||||
*/
|
||||
|
||||
struct hub_config
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -1320,9 +1320,7 @@ void hub_logout_log(struct hub_info* hub, struct hub_user* user)
|
||||
list_append(hub->logout_info, loginfo);
|
||||
while (list_size(hub->logout_info) > (size_t) hub->config->max_logout_log)
|
||||
{
|
||||
struct hub_logout_info* entry = list_get_first(hub->logout_info);
|
||||
list_remove(hub->logout_info, entry);
|
||||
hub_free(entry);
|
||||
list_remove_first(hub->logout_info, hub_free);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -55,7 +55,7 @@ enum status_message
|
||||
|
||||
status_msg_proto_no_common_hash = -50, /* No common hash algorithms */
|
||||
status_msg_proto_obsolete_adc0 = -51, /* Client is using an obsolete protocol version */
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -109,14 +109,14 @@ static int check_cid(struct hub_info* hub, struct hub_user* user, struct adc_mes
|
||||
hub_free(pid);
|
||||
return status_msg_inf_error_cid_invalid;
|
||||
}
|
||||
|
||||
|
||||
if (strlen(pid) != MAX_CID_LEN)
|
||||
{
|
||||
hub_free(cid);
|
||||
hub_free(pid);
|
||||
return status_msg_inf_error_pid_invalid;
|
||||
}
|
||||
|
||||
|
||||
for (pos = 0; pos < MAX_CID_LEN; pos++)
|
||||
{
|
||||
if (!is_valid_base32_char(cid[pos]))
|
||||
@@ -133,18 +133,18 @@ static int check_cid(struct hub_info* hub, struct hub_user* user, struct adc_mes
|
||||
return status_msg_inf_error_pid_invalid;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!check_hash_tiger(cid, pid))
|
||||
{
|
||||
hub_free(cid);
|
||||
hub_free(pid);
|
||||
return status_msg_inf_error_cid_invalid;
|
||||
}
|
||||
|
||||
|
||||
/* Set the cid in the user object */
|
||||
memcpy(user->id.cid, cid, MAX_CID_LEN);
|
||||
user->id.cid[MAX_CID_LEN] = 0;
|
||||
|
||||
|
||||
hub_free(cid);
|
||||
hub_free(pid);
|
||||
return 0;
|
||||
@@ -154,7 +154,7 @@ static int check_cid(struct hub_info* hub, struct hub_user* user, struct adc_mes
|
||||
static int check_required_login_flags(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd)
|
||||
{
|
||||
int num = 0;
|
||||
|
||||
|
||||
num = adc_msg_has_named_argument(cmd, ADC_INF_FLAG_CLIENT_ID);
|
||||
if (num != 1)
|
||||
{
|
||||
@@ -162,7 +162,7 @@ static int check_required_login_flags(struct hub_info* hub, struct hub_user* use
|
||||
return status_msg_inf_error_cid_missing;
|
||||
return status_msg_inf_error_cid_invalid;
|
||||
}
|
||||
|
||||
|
||||
num = adc_msg_has_named_argument(cmd, ADC_INF_FLAG_PRIVATE_ID);
|
||||
if (num != 1)
|
||||
{
|
||||
@@ -190,7 +190,7 @@ static int check_required_login_flags(struct hub_info* hub, struct hub_user* use
|
||||
static int check_network(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd)
|
||||
{
|
||||
const char* address = user_get_address(user);
|
||||
|
||||
|
||||
/* Check for NAT override address */
|
||||
if (acl_is_ip_nat_override(hub->acl, address))
|
||||
{
|
||||
@@ -236,12 +236,12 @@ static int nick_length_ok(const char* nick)
|
||||
{
|
||||
return nick_invalid_short;
|
||||
}
|
||||
|
||||
|
||||
if (length > MAX_NICK_LEN)
|
||||
{
|
||||
return nick_invalid_long;
|
||||
}
|
||||
|
||||
|
||||
return nick_ok;
|
||||
}
|
||||
|
||||
@@ -249,16 +249,16 @@ static int nick_length_ok(const char* nick)
|
||||
static int nick_bad_characters(const char* nick)
|
||||
{
|
||||
const char* tmp;
|
||||
|
||||
|
||||
/* Nick must not start with a space */
|
||||
if (nick[0] == ' ')
|
||||
return nick_invalid_spaces;
|
||||
|
||||
|
||||
/* Check for ASCII values below 32 */
|
||||
for (tmp = nick; *tmp; tmp++)
|
||||
if ((*tmp < 32) && (*tmp > 0))
|
||||
return nick_invalid_bad_ascii;
|
||||
|
||||
|
||||
return nick_ok;
|
||||
}
|
||||
|
||||
@@ -286,7 +286,7 @@ static int check_nick(struct hub_info* hub, struct hub_user* user, struct adc_me
|
||||
nick = adc_msg_unescape(tmp);
|
||||
free(tmp); tmp = 0;
|
||||
if (!nick) return 0;
|
||||
|
||||
|
||||
status = nick_length_ok(nick);
|
||||
if (status != nick_ok)
|
||||
{
|
||||
@@ -295,7 +295,7 @@ static int check_nick(struct hub_info* hub, struct hub_user* user, struct adc_me
|
||||
return status_msg_inf_error_nick_short;
|
||||
return status_msg_inf_error_nick_long;
|
||||
}
|
||||
|
||||
|
||||
status = nick_bad_characters(nick);
|
||||
if (status != nick_ok)
|
||||
{
|
||||
@@ -304,20 +304,20 @@ static int check_nick(struct hub_info* hub, struct hub_user* user, struct adc_me
|
||||
return status_msg_inf_error_nick_spaces;
|
||||
return status_msg_inf_error_nick_bad_chars;
|
||||
}
|
||||
|
||||
|
||||
status = nick_is_utf8(nick);
|
||||
if (status != nick_ok)
|
||||
{
|
||||
hub_free(nick);
|
||||
return status_msg_inf_error_nick_not_utf8;
|
||||
}
|
||||
|
||||
|
||||
if (user_is_connecting(user))
|
||||
{
|
||||
memcpy(user->id.nick, nick, strlen(nick));
|
||||
user->id.nick[strlen(nick)] = 0;
|
||||
}
|
||||
|
||||
|
||||
hub_free(nick);
|
||||
return 0;
|
||||
}
|
||||
@@ -327,12 +327,12 @@ static int check_logged_in(struct hub_info* hub, struct hub_user* user, struct a
|
||||
{
|
||||
struct hub_user* lookup1 = uman_get_user_by_nick(hub->users, user->id.nick);
|
||||
struct hub_user* lookup2 = uman_get_user_by_cid(hub->users, user->id.cid);
|
||||
|
||||
|
||||
if (lookup1 == user)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (lookup1 || lookup2)
|
||||
{
|
||||
if (lookup1 == lookup2)
|
||||
@@ -368,7 +368,7 @@ static int check_user_agent(struct hub_info* hub, struct hub_user* user, struct
|
||||
{
|
||||
char* ua_encoded = 0;
|
||||
char* ua = 0;
|
||||
|
||||
|
||||
/* Get client user agent version */
|
||||
ua_encoded = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_USER_AGENT);
|
||||
if (ua_encoded)
|
||||
@@ -391,7 +391,7 @@ static int check_acl(struct hub_info* hub, struct hub_user* user, struct adc_mes
|
||||
{
|
||||
return status_msg_ban_permanently;
|
||||
}
|
||||
|
||||
|
||||
if (acl_is_user_banned(hub->acl, user->id.nick))
|
||||
{
|
||||
return status_msg_ban_permanently;
|
||||
@@ -401,7 +401,7 @@ static int check_acl(struct hub_info* hub, struct hub_user* user, struct adc_mes
|
||||
{
|
||||
return status_msg_inf_error_nick_restricted;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -470,7 +470,7 @@ static int check_limits(struct hub_info* hub, struct hub_user* user, struct adc_
|
||||
hub_free(arg);
|
||||
arg = 0;
|
||||
}
|
||||
|
||||
|
||||
arg = adc_msg_get_named_argument(cmd, ADC_INF_FLAG_UPLOAD_SLOTS);
|
||||
if (arg)
|
||||
{
|
||||
@@ -534,7 +534,7 @@ static int set_credentials(struct hub_info* hub, struct hub_user* user, struct a
|
||||
{
|
||||
int ret = 0;
|
||||
struct auth_info* info = acl_get_access_info(hub, user->id.nick);
|
||||
|
||||
|
||||
if (info)
|
||||
{
|
||||
user->credentials = info->credentials;
|
||||
@@ -550,11 +550,11 @@ static int set_credentials(struct hub_info* hub, struct hub_user* user, struct a
|
||||
{
|
||||
case auth_cred_none:
|
||||
break;
|
||||
|
||||
|
||||
case auth_cred_bot:
|
||||
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_BOT);
|
||||
break;
|
||||
|
||||
|
||||
case auth_cred_guest:
|
||||
/* Nothing to be added to the info message */
|
||||
break;
|
||||
@@ -566,7 +566,7 @@ static int set_credentials(struct hub_info* hub, struct hub_user* user, struct a
|
||||
case auth_cred_operator:
|
||||
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_OPERATOR);
|
||||
break;
|
||||
|
||||
|
||||
case auth_cred_super:
|
||||
adc_msg_add_argument(cmd, ADC_INF_FLAG_CLIENT_TYPE ADC_CLIENT_TYPE_SUPER_USER);
|
||||
break;
|
||||
@@ -578,7 +578,7 @@ static int set_credentials(struct hub_info* hub, struct hub_user* user, struct a
|
||||
case auth_cred_link:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -611,10 +611,10 @@ static int hub_handle_info_common(struct hub_user* user, struct adc_message* cmd
|
||||
{
|
||||
/* Remove server restricted flags */
|
||||
remove_server_restricted_flags(cmd);
|
||||
|
||||
|
||||
/* Update/set the feature cast flags. */
|
||||
set_feature_cast_supports(user, cmd);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -635,7 +635,7 @@ static int hub_handle_info_low_bandwidth(struct hub_info* hub, struct hub_user*
|
||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_DESCRIPTION);
|
||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_EMAIL);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -680,20 +680,20 @@ int hub_handle_info_login(struct hub_info* hub, struct hub_user* user, struct ad
|
||||
{
|
||||
return status_msg_hub_full;
|
||||
}
|
||||
|
||||
|
||||
if (check_registered_users_only(hub, user))
|
||||
{
|
||||
return status_msg_hub_registered_users_only;
|
||||
}
|
||||
|
||||
|
||||
INF_CHECK(check_limits, hub, user, cmd);
|
||||
|
||||
|
||||
/* strip off stuff if low_bandwidth_mode is enabled */
|
||||
hub_handle_info_low_bandwidth(hub, user, cmd);
|
||||
|
||||
|
||||
/* Set initial user info */
|
||||
user_set_info(user, cmd);
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -72,7 +72,7 @@ size_t ioq_recv_set(struct ioq_recv* q, void* buf, size_t bufsize)
|
||||
q->buf = 0;
|
||||
q->size = 0;
|
||||
}
|
||||
|
||||
|
||||
if (!bufsize)
|
||||
{
|
||||
return 0;
|
||||
@@ -130,7 +130,7 @@ void ioq_send_add(struct ioq_send* q, struct adc_message* msg_)
|
||||
q->size += msg->length;
|
||||
}
|
||||
|
||||
void ioq_send_remove(struct ioq_send* q, struct adc_message* msg)
|
||||
static void ioq_send_remove(struct ioq_send* q, struct adc_message* msg)
|
||||
{
|
||||
#ifdef DEBUG_SENDQ
|
||||
debug_msg("ioq_send_remove", msg);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2012, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -19,6 +19,10 @@
|
||||
|
||||
#include "uhub.h"
|
||||
|
||||
#ifdef SYSTEMD
|
||||
#include <systemd/sd-daemon.h>
|
||||
#endif
|
||||
|
||||
static int arg_verbose = 5;
|
||||
static int arg_fork = 0;
|
||||
static int arg_check_config = 0;
|
||||
@@ -83,7 +87,7 @@ void setup_signal_handlers(struct hub_info* hub)
|
||||
act.sa_mask = sig_set;
|
||||
act.sa_flags = SA_ONSTACK | SA_RESTART;
|
||||
act.sa_handler = hub_handle_signal;
|
||||
|
||||
|
||||
for (i = 0; signals[i]; i++)
|
||||
{
|
||||
if (sigaction(signals[i], &act, 0) != 0)
|
||||
@@ -120,7 +124,7 @@ int main_loop()
|
||||
hub_log_initialize(arg_log, arg_log_syslog);
|
||||
hub_set_log_verbosity(arg_verbose);
|
||||
}
|
||||
|
||||
|
||||
if (read_config(arg_config, &configuration, !arg_have_config) == -1)
|
||||
return -1;
|
||||
|
||||
@@ -145,7 +149,16 @@ int main_loop()
|
||||
}
|
||||
#if !defined(WIN32)
|
||||
setup_signal_handlers(hub);
|
||||
#endif
|
||||
#ifdef SYSTEMD
|
||||
/* Notify the service manager that this daemon has
|
||||
* been successfully initalized and shall enter the
|
||||
* main loop.
|
||||
*/
|
||||
sd_notifyf(0, "READY=1\n"
|
||||
"MAINPID=%lu", (unsigned long) getpid());
|
||||
#endif /* SYSTEMD */
|
||||
|
||||
#endif /* ! WIN32 */
|
||||
}
|
||||
|
||||
hub_set_variables(hub, &acl);
|
||||
@@ -161,7 +174,7 @@ int main_loop()
|
||||
#if !defined(WIN32)
|
||||
shutdown_signal_handlers(hub);
|
||||
#endif
|
||||
|
||||
|
||||
if (hub)
|
||||
{
|
||||
hub_shutdown_service(hub);
|
||||
@@ -216,13 +229,17 @@ void print_usage(char* program)
|
||||
" -q Quiet mode - no output\n"
|
||||
" -f Fork to background\n"
|
||||
" -l <file> Log messages to given file (default: stderr)\n"
|
||||
" -L Log messages to syslog\n"
|
||||
" -c <file> Specify configuration file (default: " SERVER_CONFIG ")\n"
|
||||
" -C Check configuration and return\n"
|
||||
" -s Show configuration parameters\n"
|
||||
" -S Show configuration parameters, but ignore defaults\n"
|
||||
" -h This message\n"
|
||||
#ifndef WIN32
|
||||
#ifdef SYSTEMD
|
||||
" -L Log messages to journal\n"
|
||||
#else
|
||||
" -L Log messages to syslog\n"
|
||||
#endif
|
||||
" -u <user> Run as given user\n"
|
||||
" -g <group> Run with given group permissions\n"
|
||||
" -p <file> Store pid in file (process id)\n"
|
||||
@@ -271,7 +288,7 @@ void parse_command_line(int argc, char** argv)
|
||||
arg_dump_config = 1;
|
||||
arg_check_config = 1;
|
||||
break;
|
||||
|
||||
|
||||
case 'S':
|
||||
arg_dump_config = 2;
|
||||
arg_check_config = 1;
|
||||
@@ -280,7 +297,7 @@ void parse_command_line(int argc, char** argv)
|
||||
case 'l':
|
||||
arg_log = optarg;
|
||||
break;
|
||||
|
||||
|
||||
case 'L':
|
||||
arg_log_syslog = 1;
|
||||
break;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -40,14 +40,11 @@ static int plugin_command_dispatch(struct command_base* cbase, struct hub_user*
|
||||
|
||||
LOG_PLUGIN("plugin_command_dispatch: cmd=%s", cmd->prefix);
|
||||
|
||||
cmdh = (struct plugin_command_handle*) list_get_first(data->commands);
|
||||
while (cmdh)
|
||||
LIST_FOREACH(struct plugin_command_handle*, cmdh, data->commands,
|
||||
{
|
||||
if (strcmp(cmdh->prefix, cmd->prefix) == 0)
|
||||
return cmdh->handler(plugin, puser, pcommand);
|
||||
|
||||
cmdh = (struct plugin_command_handle*) list_get_next(data->commands);
|
||||
}
|
||||
});
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -104,7 +101,6 @@ static int cbfunc_command_add(struct plugin_handle* plugin, struct plugin_comman
|
||||
cmdh->internal_handle = command;
|
||||
list_append(data->commands, cmdh);
|
||||
command_add(plugin_get_hub(plugin)->commands, command, (void*) plugin);
|
||||
printf("*** Add plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -113,7 +109,6 @@ static int cbfunc_command_del(struct plugin_handle* plugin, struct plugin_comman
|
||||
struct plugin_callback_data* data = get_callback_data(plugin);
|
||||
struct command_handle* command = (struct command_handle*) cmdh->internal_handle;
|
||||
|
||||
printf("*** Del plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
||||
list_remove(data->commands, cmdh);
|
||||
command_del(plugin_get_hub(plugin)->commands, command);
|
||||
hub_free(command);
|
||||
@@ -158,7 +153,7 @@ static void cbfunc_set_hub_name(struct plugin_handle* plugin, const char* str)
|
||||
char* new_str = adc_msg_escape(str ? str : hub->config->hub_name);
|
||||
|
||||
adc_msg_replace_named_argument(hub->command_info, ADC_INF_FLAG_NICK, new_str);
|
||||
|
||||
|
||||
// Broadcast hub name
|
||||
command = adc_msg_construct(ADC_CMD_IINF, (strlen(new_str) + 8));
|
||||
adc_msg_add_named_argument(command, ADC_INF_FLAG_NICK, new_str);
|
||||
@@ -175,7 +170,7 @@ static void cbfunc_set_hub_description(struct plugin_handle* plugin, const char*
|
||||
char* new_str = adc_msg_escape(str ? str : hub->config->hub_description);
|
||||
|
||||
adc_msg_replace_named_argument(hub->command_info, ADC_INF_FLAG_DESCRIPTION, new_str);
|
||||
|
||||
|
||||
// Broadcast hub description
|
||||
command = adc_msg_construct(ADC_CMD_IINF, (strlen(new_str) + 8));
|
||||
adc_msg_add_named_argument(command, ADC_INF_FLAG_DESCRIPTION, new_str);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -27,13 +27,12 @@
|
||||
PLUGIN_DEBUG(HUB, # FUNCNAME) \
|
||||
if (HUB->plugins && HUB->plugins->loaded) \
|
||||
{ \
|
||||
struct plugin_handle* plugin = (struct plugin_handle*) list_get_first(HUB->plugins->loaded); \
|
||||
while (plugin) \
|
||||
struct plugin_handle* plugin;\
|
||||
LIST_FOREACH(struct plugin_handle*, plugin, HUB->plugins->loaded, \
|
||||
{ \
|
||||
if (plugin->funcs.FUNCNAME) \
|
||||
CODE \
|
||||
plugin = (struct plugin_handle*) list_get_next(HUB->plugins->loaded); \
|
||||
} \
|
||||
}); \
|
||||
}
|
||||
|
||||
#define PLUGIN_INVOKE_STATUS_1(HUB, FUNCNAME, ARG1) \
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -229,16 +229,16 @@ int plugin_initialize(struct hub_config* config, struct hub_info* hub)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void plugin_unload_ptr(void* ptr)
|
||||
{
|
||||
struct plugin_handle* plugin = (struct plugin_handle*) ptr;
|
||||
plugin_unload(plugin);
|
||||
}
|
||||
|
||||
|
||||
void plugin_shutdown(struct uhub_plugins* handle)
|
||||
{
|
||||
struct plugin_handle* plugin = (struct plugin_handle*) list_get_first(handle->loaded);
|
||||
while (plugin)
|
||||
{
|
||||
list_remove(handle->loaded, plugin);
|
||||
plugin_unload(plugin);
|
||||
plugin = (struct plugin_handle*) list_get_first(handle->loaded);
|
||||
}
|
||||
|
||||
list_clear(handle->loaded, plugin_unload_ptr);
|
||||
list_destroy(handle->loaded);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2011, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -73,7 +73,7 @@ static void probe_net_event(struct net_connection* con, int events, void *arg)
|
||||
}
|
||||
#ifdef SSL_SUPPORT
|
||||
else if (bytes >= 11 &&
|
||||
probe_recvbuf[0] == 22 &&
|
||||
probe_recvbuf[0] == 22 &&
|
||||
probe_recvbuf[1] == 3 && /* protocol major version */
|
||||
probe_recvbuf[5] == 1 && /* message type */
|
||||
probe_recvbuf[9] == probe_recvbuf[1])
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -28,7 +28,7 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message*
|
||||
case 'B': /* Broadcast to all logged in clients */
|
||||
route_to_all(hub, msg);
|
||||
break;
|
||||
|
||||
|
||||
case 'D':
|
||||
target = uman_get_user_by_sid(hub->users, msg->target);
|
||||
if (target)
|
||||
@@ -36,7 +36,7 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message*
|
||||
route_to_user(hub, target, msg);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 'E':
|
||||
target = uman_get_user_by_sid(hub->users, msg->target);
|
||||
if (target)
|
||||
@@ -45,11 +45,11 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message*
|
||||
route_to_user(hub, u, msg);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 'F':
|
||||
route_to_subscribers(hub, msg);
|
||||
break;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Ignore the message */
|
||||
break;
|
||||
@@ -139,12 +139,11 @@ int route_flush_pipeline(struct hub_info* hub, struct hub_user* u)
|
||||
|
||||
int route_to_all(struct hub_info* hub, struct adc_message* command) /* iterate users */
|
||||
{
|
||||
struct hub_user* user = (struct hub_user*) list_get_first(hub->users->list);
|
||||
while (user)
|
||||
struct hub_user* user;
|
||||
LIST_FOREACH(struct hub_user*, user, hub->users->list,
|
||||
{
|
||||
route_to_user(hub, user, command);
|
||||
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||
}
|
||||
});
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -153,49 +152,40 @@ int route_to_subscribers(struct hub_info* hub, struct adc_message* command) /* i
|
||||
{
|
||||
int do_send;
|
||||
char* tmp;
|
||||
|
||||
struct hub_user* user = (struct hub_user*) list_get_first(hub->users->list);
|
||||
while (user)
|
||||
|
||||
struct hub_user* user;
|
||||
LIST_FOREACH(struct hub_user*, user, hub->users->list,
|
||||
{
|
||||
if (user->feature_cast)
|
||||
{
|
||||
do_send = 1;
|
||||
|
||||
tmp = list_get_first(command->feature_cast_include);
|
||||
while (tmp)
|
||||
|
||||
LIST_FOREACH(char*, tmp, command->feature_cast_include,
|
||||
{
|
||||
if (!user_have_feature_cast_support(user, tmp))
|
||||
{
|
||||
do_send = 0;
|
||||
break;
|
||||
}
|
||||
tmp = list_get_next(command->feature_cast_include);;
|
||||
}
|
||||
|
||||
if (!do_send) {
|
||||
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||
});
|
||||
|
||||
if (!do_send)
|
||||
continue;
|
||||
}
|
||||
|
||||
tmp = list_get_first(command->feature_cast_exclude);
|
||||
while (tmp)
|
||||
|
||||
LIST_FOREACH(char*, tmp, command->feature_cast_exclude,
|
||||
{
|
||||
if (user_have_feature_cast_support(user, tmp))
|
||||
{
|
||||
do_send = 0;
|
||||
break;
|
||||
}
|
||||
tmp = list_get_next(command->feature_cast_exclude);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
if (do_send)
|
||||
{
|
||||
route_to_user(hub, user, command);
|
||||
}
|
||||
}
|
||||
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -210,20 +200,17 @@ int route_info_message(struct hub_info* hub, struct hub_user* u)
|
||||
struct adc_message* cmd = adc_msg_copy(u->info);
|
||||
const char* address = user_get_address(u);
|
||||
struct hub_user* user = 0;
|
||||
|
||||
|
||||
adc_msg_remove_named_argument(cmd, ADC_INF_FLAG_IPV4_ADDR);
|
||||
adc_msg_add_named_argument(cmd, ADC_INF_FLAG_IPV4_ADDR, address);
|
||||
|
||||
user = (struct hub_user*) list_get_first(hub->users->list);
|
||||
while (user)
|
||||
|
||||
LIST_FOREACH(struct hub_user*, user, hub->users->list,
|
||||
{
|
||||
if (user_is_nat_override(user))
|
||||
route_to_user(hub, user, cmd);
|
||||
else
|
||||
route_to_user(hub, user, u->info);
|
||||
|
||||
user = (struct hub_user*) list_get_next(hub->users->list);
|
||||
}
|
||||
});
|
||||
adc_msg_free(cmd);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -38,7 +38,7 @@ static const char* user_log_str(struct hub_user* user)
|
||||
struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, struct ip_addr_encap* addr)
|
||||
{
|
||||
struct hub_user* user = NULL;
|
||||
|
||||
|
||||
LOG_TRACE("user_create(), hub=%p, con[sd=%d]", hub, net_con_get_sd(con));
|
||||
|
||||
user = (struct hub_user*) hub_malloc_zero(sizeof(struct hub_user));
|
||||
@@ -90,7 +90,7 @@ void user_set_state(struct hub_user* user, enum user_state state)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
user->state = state;
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ void user_update_info(struct hub_user* u, struct adc_message* cmd)
|
||||
prefix[1] = argument[1];
|
||||
adc_msg_replace_named_argument(cmd_new, prefix, argument+2);
|
||||
}
|
||||
|
||||
|
||||
hub_free(argument);
|
||||
argument = adc_msg_get_argument(cmd, n++);
|
||||
}
|
||||
@@ -232,15 +232,12 @@ void user_support_remove(struct hub_user* user, int fourcc)
|
||||
|
||||
int user_have_feature_cast_support(struct hub_user* user, char feature[4])
|
||||
{
|
||||
char* tmp = list_get_first(user->feature_cast);
|
||||
while (tmp)
|
||||
char* tmp;
|
||||
LIST_FOREACH(char*, tmp, user->feature_cast,
|
||||
{
|
||||
if (strncmp(tmp, feature, 4) == 0)
|
||||
return 1;
|
||||
|
||||
tmp = list_get_next(user->feature_cast);
|
||||
}
|
||||
|
||||
});
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2010, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -51,7 +51,7 @@ enum user_flags
|
||||
flag_muted = 0x00800000, /** User is muted (cannot chat) */
|
||||
flag_ignore = 0x01000000, /** Ignore further reads */
|
||||
flag_maxbuf = 0x02000000, /** Hit max buf read, ignore msg */
|
||||
flag_choke = 0x04000000, /** Choked: Cannot send, waiting for write event */
|
||||
flag_choke = 0x04000000, /** Choked: Cannot send, waiting for write event */
|
||||
flag_want_read = 0x08000000, /** Need to read (SSL) */
|
||||
flag_want_write = 0x10000000, /** Need to write (SSL) */
|
||||
flag_user_list = 0x20000000, /** Send queue bypass (when receiving the send queue) */
|
||||
@@ -150,7 +150,7 @@ extern void user_destroy(struct hub_user* user);
|
||||
* This associates a INF message to the user.
|
||||
* If the user already has a INF message associated, then this is
|
||||
* released before setting the new one.
|
||||
*
|
||||
*
|
||||
* @param info new inf message (can be NULL)
|
||||
*/
|
||||
extern void user_set_info(struct hub_user* user, struct adc_message* info);
|
||||
@@ -244,7 +244,7 @@ extern int user_flag_get(struct hub_user* user, enum user_flags flag);
|
||||
* Check if a user supports 'feature' for feature casting (basis for 'Fxxx' messages)
|
||||
* The feature cast is specified as the 'SU' argument to the user's
|
||||
* INF-message.
|
||||
*
|
||||
*
|
||||
* @param feature a feature to lookup (example: 'TCP4' or 'UDP4')
|
||||
* @return 1 if 'feature' supported, or 0 otherwise
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -28,7 +28,7 @@ static void clear_user_list_callback(void* ptr)
|
||||
if (ptr)
|
||||
{
|
||||
struct hub_user* u = (struct hub_user*) ptr;
|
||||
|
||||
|
||||
/* Mark the user as already being disconnected.
|
||||
* This prevents the hub from trying to send
|
||||
* quit messages to other users.
|
||||
@@ -38,6 +38,11 @@ static void clear_user_list_callback(void* ptr)
|
||||
}
|
||||
}
|
||||
|
||||
static int uman_map_compare(const void* a, const void* b)
|
||||
{
|
||||
return strcmp((const char*) a, (const char*) b);
|
||||
}
|
||||
|
||||
|
||||
struct hub_user_manager* uman_init()
|
||||
{
|
||||
@@ -46,15 +51,10 @@ struct hub_user_manager* uman_init()
|
||||
return NULL;
|
||||
|
||||
users->list = list_create();
|
||||
users->nickmap = rb_tree_create(uman_map_compare, NULL, NULL);
|
||||
users->cidmap = rb_tree_create(uman_map_compare, NULL, NULL);
|
||||
users->sids = sid_pool_create(net_get_max_sockets());
|
||||
|
||||
if (!users->list)
|
||||
{
|
||||
list_destroy(users->list);
|
||||
hub_free(users);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return users;
|
||||
}
|
||||
|
||||
@@ -64,11 +64,18 @@ int uman_shutdown(struct hub_user_manager* users)
|
||||
if (!users)
|
||||
return -1;
|
||||
|
||||
if (users->nickmap)
|
||||
rb_tree_destroy(users->nickmap);
|
||||
|
||||
if (users->cidmap)
|
||||
rb_tree_destroy(users->cidmap);
|
||||
|
||||
if (users->list)
|
||||
{
|
||||
list_clear(users->list, &clear_user_list_callback);
|
||||
list_destroy(users->list);
|
||||
}
|
||||
|
||||
sid_pool_destroy(users->sids);
|
||||
|
||||
hub_free(users);
|
||||
@@ -81,6 +88,9 @@ int uman_add(struct hub_user_manager* users, struct hub_user* user)
|
||||
if (!users || !user)
|
||||
return -1;
|
||||
|
||||
rb_tree_insert(users->nickmap, user->id.nick, user);
|
||||
rb_tree_insert(users->cidmap, user->id.cid, user);
|
||||
|
||||
list_append(users->list, user);
|
||||
users->count++;
|
||||
users->count_peak = MAX(users->count, users->count_peak);
|
||||
@@ -96,6 +106,8 @@ int uman_remove(struct hub_user_manager* users, struct hub_user* user)
|
||||
return -1;
|
||||
|
||||
list_remove(users->list, user);
|
||||
rb_tree_remove(users->nickmap, user->id.nick);
|
||||
rb_tree_remove(users->cidmap, user->id.cid);
|
||||
|
||||
if (users->count > 0)
|
||||
{
|
||||
@@ -120,42 +132,29 @@ struct hub_user* uman_get_user_by_sid(struct hub_user_manager* users, sid_t sid)
|
||||
|
||||
struct hub_user* uman_get_user_by_cid(struct hub_user_manager* users, const char* cid)
|
||||
{
|
||||
struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
|
||||
while (user)
|
||||
{
|
||||
if (strcmp(user->id.cid, cid) == 0)
|
||||
return user;
|
||||
user = (struct hub_user*) list_get_next(users->list);
|
||||
}
|
||||
return NULL;
|
||||
struct hub_user* user = (struct hub_user*) rb_tree_get(users->cidmap, (const void*) cid);
|
||||
return user;
|
||||
}
|
||||
|
||||
|
||||
struct hub_user* uman_get_user_by_nick(struct hub_user_manager* users, const char* nick)
|
||||
{
|
||||
struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
|
||||
while (user)
|
||||
{
|
||||
if (strcmp(user->id.nick, nick) == 0)
|
||||
return user;
|
||||
user = (struct hub_user*) list_get_next(users->list);
|
||||
}
|
||||
return NULL;
|
||||
struct hub_user* user = (struct hub_user*) rb_tree_get(users->nickmap, nick);
|
||||
return user;
|
||||
}
|
||||
|
||||
size_t uman_get_user_by_addr(struct hub_user_manager* users, struct linked_list* target, struct ip_range* range)
|
||||
{
|
||||
size_t num = 0;
|
||||
struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */
|
||||
while (user)
|
||||
struct hub_user* user;
|
||||
LIST_FOREACH(struct hub_user*, user, users->list,
|
||||
{
|
||||
if (ip_in_range(&user->id.addr, range))
|
||||
{
|
||||
list_append(target, user);
|
||||
num++;
|
||||
}
|
||||
user = (struct hub_user*) list_get_next(users->list);
|
||||
}
|
||||
});
|
||||
return num;
|
||||
}
|
||||
|
||||
@@ -164,8 +163,8 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, st
|
||||
int ret = 1;
|
||||
struct hub_user* user;
|
||||
user_flag_set(target, flag_user_list);
|
||||
user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on INF or PAS msg */
|
||||
while (user)
|
||||
|
||||
LIST_FOREACH(struct hub_user*, user, users->list,
|
||||
{
|
||||
if (user_is_logged_in(user))
|
||||
{
|
||||
@@ -173,8 +172,7 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, st
|
||||
if (!ret)
|
||||
break;
|
||||
}
|
||||
user = (struct hub_user*) list_get_next(users->list);
|
||||
}
|
||||
});
|
||||
|
||||
#if 0
|
||||
FIXME: FIXME FIXME handle send queue excess
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* uhub - A tiny ADC p2p connection hub
|
||||
* Copyright (C) 2007-2009, Jan Vidar Krey
|
||||
* Copyright (C) 2007-2013, Jan Vidar Krey
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -24,10 +24,12 @@ struct hub_user_manager
|
||||
{
|
||||
size_t count; /**<< "Number of all fully connected and logged in users" */
|
||||
size_t count_peak; /**<< "Peak number of users" */
|
||||
struct sid_pool* sids;
|
||||
uint64_t shared_size; /**<< "The total number of shared bytes among fully connected users." */
|
||||
uint64_t shared_files; /**<< "The total number of shared files among fully connected users." */
|
||||
struct sid_pool* sids; /**<< "Maps SIDs to users (constant time)" */
|
||||
struct linked_list* list; /**<< "Contains all logged in users" */
|
||||
struct rb_tree* nickmap; /**<< "Maps nicknames to users (red black tree)" */
|
||||
struct rb_tree* cidmap; /**<< "Maps CIDs to users (red black tree)" */
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -77,7 +79,7 @@ extern sid_t uman_get_free_sid(struct hub_user_manager* users, struct hub_user*
|
||||
*
|
||||
* NOTE: This function will only search connected users, which means
|
||||
* that SIDs assigned to users who are not yet completely logged in,
|
||||
* or are in the process of being disconnected will result in this
|
||||
* or are in the process of being disconnected will result in this
|
||||
* function returning NULL even though the sid is not freely available.
|
||||
*
|
||||
* FIXME: Is that really safe / sensible ?
|
||||
|
||||
Reference in New Issue
Block a user