diff --git a/autotest/test_commands.tcc b/autotest/test_commands.tcc index 1790d05..eb73f57 100644 --- a/autotest/test_commands.tcc +++ b/autotest/test_commands.tcc @@ -19,7 +19,8 @@ EXO_TEST(setup, { hub = hub_malloc_zero(sizeof(struct hub_info)); cbase = command_initialize(hub); hub->commands = cbase; - return cbase && hub && uman_init(hub) == 0; + hub->users = uman_init(); + return cbase && hub && hub->users; }); static int test_handler(struct command_base* cbase, struct hub_user* user, struct hub_command* hcmd) @@ -127,7 +128,7 @@ EXO_TEST(command_number_3, { return verify("!test3 -12", cmd_status_ok); }); EXO_TEST(command_user_1, { return verify("!test4 tester", cmd_status_arg_nick); }); EXO_TEST(command_user_2, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_arg_cid); }); -EXO_TEST(command_user_3, { return uman_add(hub, &user) == 0; }); +EXO_TEST(command_user_3, { return uman_add(hub->users, &user) == 0; }); EXO_TEST(command_user_4, { return verify("!test4 tester", cmd_status_ok); }); EXO_TEST(command_user_5, { return verify("!test5 3AGHMAASJA2RFNM22AA6753V7B7DYEPNTIWHBAY", cmd_status_ok); }); @@ -225,7 +226,7 @@ EXO_TEST(command_argument_cred_6, { #undef SETUP_COMMAND -EXO_TEST(command_user_destroy, { return uman_remove(hub, &user) == 0; }); +EXO_TEST(command_user_destroy, { return uman_remove(hub->users, &user) == 0; }); EXO_TEST(command_destroy, { @@ -241,3 +242,10 @@ EXO_TEST(command_destroy, { DEL_TEST(c_test7); return 1; }); + +EXO_TEST(cleanup, { + uman_shutdown(hub->users); + command_shutdown(hub->commands); + hub_free(hub); + return 1; +}); diff --git a/autotest/test_usermanager.tcc b/autotest/test_usermanager.tcc index 61634cf..c2ef61f 100644 --- a/autotest/test_usermanager.tcc +++ b/autotest/test_usermanager.tcc @@ -2,32 +2,19 @@ #define MAX_USERS 64 -static struct hub_info um_hub; +static struct hub_user_manager* uman = 0; static struct hub_user um_user[MAX_USERS]; -// static struct net_connection um_cons[MAX_USERS]; - -EXO_TEST(um_test_setup, { - int i = 0; - memset(&um_hub, 0, sizeof(um_hub)); - - for (i = 0; i < MAX_USERS; i++) - { -/* memset(&um_cons[i], 0, sizeof(struct net_connection)); - um_cons[i].sd = -1; - - memset(&um_user[i], 0, sizeof(struct hub_user)); - um_user[i].id.sid = i+1; - um_user[i].connection = &um_cons[i];*/ - } - return 1; -}); EXO_TEST(um_init_1, { - return uman_init(0) != 0; -}); - -EXO_TEST(um_init_2, { - return uman_init(&um_hub) == 0; + sid_t s; + uman = uman_init(); + + for (s = 0; s < MAX_USERS; s++) + { + memset(&um_user[s], 0, sizeof(struct hub_user)); + um_user[s].id.sid = s; + } + return !!uman; }); EXO_TEST(um_shutdown_1, { @@ -35,32 +22,29 @@ EXO_TEST(um_shutdown_1, { }); EXO_TEST(um_shutdown_2, { - return uman_shutdown(&um_hub) == 0; + return uman_shutdown(uman) == 0; }); -EXO_TEST(um_shutdown_3, { - return uman_shutdown(&um_hub) == -1; -}); - -EXO_TEST(um_init_3, { - return uman_init(&um_hub) == 0; +EXO_TEST(um_init_2, { + uman = uman_init(); + return !!uman; }); EXO_TEST(um_add_1, { - return uman_add(&um_hub, &um_user[0]) == 0; + return uman_add(uman, &um_user[0]) == 0; }); EXO_TEST(um_size_1, { - return hub_get_user_count(&um_hub) == 1; + return uman->count == 1; }); EXO_TEST(um_remove_1, { - return uman_remove(&um_hub, &um_user[0]) == 0; + return uman_remove(uman, &um_user[0]) == 0; }); EXO_TEST(um_size_2, { - return hub_get_user_count(&um_hub) == 0; + return uman->count == 0; }); @@ -68,25 +52,21 @@ EXO_TEST(um_add_2, { int i; for (i = 0; i < MAX_USERS; i++) { - if (uman_add(&um_hub, &um_user[i]) != 0) + if (uman_add(uman, &um_user[i]) != 0) return 0; } return 1; }); EXO_TEST(um_size_3, { - return hub_get_user_count(&um_hub) == MAX_USERS; -}); - -EXO_TEST(um_add_3, { - return uman_add(&um_hub, &um_user[5]) != 0; + return uman->count == MAX_USERS; }); EXO_TEST(um_remove_2, { int i; for (i = 0; i < MAX_USERS; i++) { - if (uman_remove(&um_hub, &um_user[i]) != 0) + if (uman_remove(uman, &um_user[i]) != 0) return 0; } return 1; @@ -105,5 +85,5 @@ EXO_TEST(um_remove_2, { /* Last test */ EXO_TEST(um_shutdown_4, { - return uman_shutdown(&um_hub) == 0; + return uman_shutdown(uman) == 0; }); diff --git a/src/core/command_parser.c b/src/core/command_parser.c index 93ee5e2..c940f93 100644 --- a/src/core/command_parser.c +++ b/src/core/command_parser.c @@ -117,7 +117,7 @@ static enum command_parse_status command_extract_arguments(struct hub_info* hub, case 'u': data = hub_malloc(sizeof(*data)); data->type = type_user; - data->data.user = uman_get_user_by_nick(hub, token); + data->data.user = uman_get_user_by_nick(hub->users, token); if (!data->data.user) { hub_free(data); @@ -129,7 +129,7 @@ static enum command_parse_status command_extract_arguments(struct hub_info* hub, case 'i': data = hub_malloc(sizeof(*data)); data->type = type_user; - data->data.user = uman_get_user_by_cid(hub, token); + data->data.user = uman_get_user_by_cid(hub->users, token); if (!data->data.user) { hub_free(data); diff --git a/src/core/commands.c b/src/core/commands.c index fb3256c..8702152 100644 --- a/src/core/commands.c +++ b/src/core/commands.c @@ -421,7 +421,7 @@ static int command_whoip(struct command_base* cbase, struct hub_user* user, stru struct hub_user* u; int ret = 0; - ret = uman_get_user_by_addr(cbase->hub, users, arg->data.range); + ret = uman_get_user_by_addr(cbase->hub->users, users, arg->data.range); if (!ret) { list_clear(users, &null_free); diff --git a/src/core/hub.c b/src/core/hub.c index 8697f96..7229e76 100644 --- a/src/core/hub.c +++ b/src/core/hub.c @@ -110,21 +110,21 @@ int hub_handle_message(struct hub_info* hub, struct hub_user* u, const char* lin case ADC_CMD_DRES: cmd->priority = -1; - if (plugin_handle_search_result(hub, u, uman_get_user_by_sid(hub, cmd->target), cmd->cache) == st_deny) + if (plugin_handle_search_result(hub, u, uman_get_user_by_sid(hub->users, cmd->target), cmd->cache) == st_deny) break; /* CHECK_FLOOD(search, 0); */ ROUTE_MSG; case ADC_CMD_DRCM: cmd->priority = -1; - if (plugin_handle_revconnect(hub, u, uman_get_user_by_sid(hub, cmd->target)) == st_deny) + if (plugin_handle_revconnect(hub, u, uman_get_user_by_sid(hub->users, cmd->target)) == st_deny) break; CHECK_FLOOD(connect, 1); ROUTE_MSG; case ADC_CMD_DCTM: cmd->priority = -1; - if (plugin_handle_connect(hub, u, uman_get_user_by_sid(hub, cmd->target)) == st_deny) + if (plugin_handle_connect(hub, u, uman_get_user_by_sid(hub->users, cmd->target)) == st_deny) break; CHECK_FLOOD(connect, 1); ROUTE_MSG; @@ -340,7 +340,7 @@ int hub_handle_chat_message(struct hub_info* hub, struct hub_user* u, struct adc } else if (private_msg) { - struct hub_user* target = uman_get_user_by_sid(hub, cmd->target); + struct hub_user* target = uman_get_user_by_sid(hub->users, cmd->target); if (target) status = plugin_handle_private_message(hub, u, target, message_decoded, 0); else @@ -381,7 +381,7 @@ void hub_send_sid(struct hub_info* hub, struct hub_user* u) if (user_is_connecting(u)) { command = adc_msg_construct(ADC_CMD_ISID, 10); - sid = uman_get_free_sid(hub, u); + sid = uman_get_free_sid(hub->users, u); adc_msg_add_argument(command, (const char*) sid_to_string(sid)); route_to_user(hub, u, command); adc_msg_free(command); @@ -520,11 +520,11 @@ static int check_duplicate_logins_ok(struct hub_info* hub, struct hub_user* user struct hub_user* lookup1; struct hub_user* lookup2; - lookup1 = uman_get_user_by_nick(hub, user->id.nick); + lookup1 = uman_get_user_by_nick(hub->users, user->id.nick); if (lookup1) return status_msg_inf_error_nick_taken; - lookup2 = uman_get_user_by_cid(hub, user->id.cid); + lookup2 = uman_get_user_by_cid(hub->users, user->id.cid); if (lookup2) return status_msg_inf_error_cid_taken; @@ -568,8 +568,8 @@ static void hub_event_dispatcher(void* callback_data, struct event_data* message case UHUB_EVENT_USER_QUIT: { - uman_remove(hub, user); - uman_send_quit_message(hub, user); + uman_remove(hub->users, user); + uman_send_quit_message(hub, hub->users, user); on_logout_user(hub, user); hub_schedule_destroy_user(hub, user); break; @@ -586,7 +586,7 @@ static void hub_event_dispatcher(void* callback_data, struct event_data* message struct hub_user* u = (struct hub_user*) list_get_first(hub->users->list); while (u) { - uman_remove(hub, u); + uman_remove(hub->users, u); user_destroy(u); u = (struct hub_user*) list_get_first(hub->users->list); } @@ -781,7 +781,8 @@ struct hub_info* hub_start_service(struct hub_config* config) hub->config = config; hub->users = NULL; - if (uman_init(hub) == -1) + hub->users = uman_init(); + if (!hub->users) { net_con_close(hub->server); hub_free(hub); @@ -791,7 +792,7 @@ struct hub_info* hub_start_service(struct hub_config* config) if (event_queue_initialize(&hub->queue, hub_event_dispatcher, (void*) hub) == -1) { net_con_close(hub->server); - uman_shutdown(hub); + uman_shutdown(hub->users); hub_free(hub); return 0; } @@ -803,7 +804,7 @@ struct hub_info* hub_start_service(struct hub_config* config) net_con_close(hub->server); hub_free(hub->recvbuf); hub_free(hub->sendbuf); - uman_shutdown(hub); + uman_shutdown(hub->users); hub_free(hub); return 0; } @@ -832,7 +833,7 @@ void hub_shutdown_service(struct hub_info* hub) event_queue_shutdown(hub->queue); net_con_close(hub->server); server_alt_port_stop(hub); - uman_shutdown(hub); + uman_shutdown(hub->users); hub->status = hub_status_stopped; hub_free(hub->sendbuf); hub_free(hub->recvbuf); diff --git a/src/core/hubevent.c b/src/core/hubevent.c index dc61da2..f25b4f4 100644 --- a/src/core/hubevent.c +++ b/src/core/hubevent.c @@ -24,12 +24,12 @@ void on_login_success(struct hub_info* hub, struct hub_user* u) { /* Send user list of all existing users */ - if (!uman_send_user_list(hub, u)) + if (!uman_send_user_list(hub, hub->users, u)) return; /* Mark as being in the normal state, and add user to the user list */ user_set_state(u, state_normal); - uman_add(hub, u); + uman_add(hub->users, u); /* Announce new user to all connected users */ if (user_is_logged_in(u)) diff --git a/src/core/inf.c b/src/core/inf.c index a14f8ae..704abdc 100644 --- a/src/core/inf.c +++ b/src/core/inf.c @@ -325,8 +325,8 @@ static int check_nick(struct hub_info* hub, struct hub_user* user, struct adc_me static int check_logged_in(struct hub_info* hub, struct hub_user* user, struct adc_message* cmd) { - struct hub_user* lookup1 = uman_get_user_by_nick(hub, user->id.nick); - struct hub_user* lookup2 = uman_get_user_by_cid(hub, user->id.cid); + 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) { diff --git a/src/core/netevent.c b/src/core/netevent.c index 46b9306..d250883 100644 --- a/src/core/netevent.c +++ b/src/core/netevent.c @@ -21,9 +21,6 @@ #include "hubio.h" #include "probe.h" -/* FIXME: This should not be needed! */ -extern struct hub_info* g_hub; - int handle_net_read(struct hub_user* user) { static char buf[MAX_RECV_BUF]; @@ -71,9 +68,9 @@ int handle_net_read(struct hub_user* user) } else { - if (((pos - start) > 0) && g_hub->config->max_recv_buffer > (pos - start)) + if (((pos - start) > 0) && user->hub->config->max_recv_buffer > (pos - start)) { - if (hub_handle_message(g_hub, user, start, (pos - start)) == -1) + if (hub_handle_message(user->hub, user, start, (pos - start)) == -1) { return quit_protocol_error; } @@ -88,7 +85,7 @@ int handle_net_read(struct hub_user* user) if (lastPos || remaining) { - if (remaining < (size_t) g_hub->config->max_recv_buffer) + if (remaining < (size_t) user->hub->config->max_recv_buffer) { hub_recvq_set(q, lastPos ? lastPos : buf, remaining); } @@ -144,7 +141,7 @@ void net_event(struct net_connection* con, int event, void *arg) { if (user_is_connecting(user)) { - hub_disconnect_user(g_hub, user, quit_timeout); + hub_disconnect_user(user->hub, user, quit_timeout); } return; } @@ -154,7 +151,7 @@ void net_event(struct net_connection* con, int event, void *arg) flag_close = handle_net_read(user); if (flag_close) { - hub_disconnect_user(g_hub, user, flag_close); + hub_disconnect_user(user->hub, user, flag_close); return; } } @@ -164,7 +161,7 @@ void net_event(struct net_connection* con, int event, void *arg) flag_close = handle_net_write(user); if (flag_close) { - hub_disconnect_user(g_hub, user, flag_close); + hub_disconnect_user(user->hub, user, flag_close); return; } } diff --git a/src/core/route.c b/src/core/route.c index 8fd94eb..d903bb6 100644 --- a/src/core/route.c +++ b/src/core/route.c @@ -30,7 +30,7 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message* break; case 'D': - target = uman_get_user_by_sid(hub, msg->target); + target = uman_get_user_by_sid(hub->users, msg->target); if (target) { route_to_user(hub, target, msg); @@ -38,7 +38,7 @@ int route_message(struct hub_info* hub, struct hub_user* u, struct adc_message* break; case 'E': - target = uman_get_user_by_sid(hub, msg->target); + target = uman_get_user_by_sid(hub->users, msg->target); if (target) { route_to_user(hub, target, msg); diff --git a/src/core/user.c b/src/core/user.c index 0f1acb8..294f7f5 100644 --- a/src/core/user.c +++ b/src/core/user.c @@ -60,6 +60,8 @@ struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, s flood_control_reset(&user->flood_search); flood_control_reset(&user->flood_update); flood_control_reset(&user->flood_extras); + + user->hub = hub; return user; } diff --git a/src/core/usermanager.c b/src/core/usermanager.c index 452eff4..cd934fd 100644 --- a/src/core/usermanager.c +++ b/src/core/usermanager.c @@ -38,50 +38,48 @@ static void clear_user_list_callback(void* ptr) } } -void uman_update_stats(struct hub_info* hub) +#ifdef STATS_SUPPORT +void uman_update_stats(struct hub_user_manager* users) { const int factor = TIMEOUT_STATS; struct net_statistics* total; struct net_statistics* intermediate; net_stats_get(&intermediate, &total); - hub->stats.net_tx = (intermediate->tx / factor); - hub->stats.net_rx = (intermediate->rx / factor); - hub->stats.net_tx_peak = MAX(hub->stats.net_tx, hub->stats.net_tx_peak); - hub->stats.net_rx_peak = MAX(hub->stats.net_rx, hub->stats.net_rx_peak); - hub->stats.net_tx_total = total->tx; - hub->stats.net_rx_total = total->rx; + users->stats.net_tx = (intermediate->tx / factor); + users->stats.net_rx = (intermediate->rx / factor); + users->stats.net_tx_peak = MAX(users->stats.net_tx, users->stats.net_tx_peak); + users->stats.net_rx_peak = MAX(users->stats.net_rx, users->stats.net_rx_peak); + users->stats.net_tx_total = total->tx; + users->stats.net_rx_total = total->rx; net_stats_reset(); } -void uman_print_stats(struct hub_info* hub) +void uman_print_stats(struct hub_user_manager* users) { LOG_INFO("Statistics users=" PRINTF_SIZE_T " (peak_users=" PRINTF_SIZE_T "), net_tx=%d KB/s, net_rx=%d KB/s (peak_tx=%d KB/s, peak_rx=%d KB/s)", - hub->users->count, - hub->users->count_peak, - (int) hub->stats.net_tx / 1024, - (int) hub->stats.net_rx / 1024, - (int) hub->stats.net_tx_peak / 1024, - (int) hub->stats.net_rx_peak / 1024); + users->users->count, + users->users->count_peak, + (int) users->stats.net_tx / 1024, + (int) users->stats.net_rx / 1024, + (int) users->stats.net_tx_peak / 1024, + (int) users->stats.net_rx_peak / 1024); } static void timer_statistics(struct timeout_evt* t) { - struct hub_info* hub = (struct hub_info*) t->ptr; - uman_update_stats(hub); - timeout_queue_reschedule(net_backend_get_timeout_queue(), hub->users->timeout, TIMEOUT_STATS); + struct hub_user_manager* users = (struct hub_user_manager*) t->ptr; + uman_update_stats(users); + timeout_queue_reschedule(net_backend_get_timeout_queue(), users->timeout, TIMEOUT_STATS); } +#endif // STATS_SUPPORT -int uman_init(struct hub_info* hub) +struct hub_user_manager* uman_init() { - struct hub_user_manager* users = NULL; - if (!hub) - return -1; - - users = (struct hub_user_manager*) hub_malloc_zero(sizeof(struct hub_user_manager)); + struct hub_user_manager* users = (struct hub_user_manager*) hub_malloc_zero(sizeof(struct hub_user_manager)); if (!users) - return -1; + return NULL; users->list = list_create(); users->sids = sid_pool_create(net_get_max_sockets()); @@ -90,143 +88,136 @@ int uman_init(struct hub_info* hub) { list_destroy(users->list); hub_free(users); - return -1; + return NULL; } +#ifdef STATS_SUPPORT if (net_backend_get_timeout_queue()) { users->timeout = hub_malloc_zero(sizeof(struct timeout_evt)); timeout_evt_initialize(users->timeout, timer_statistics, hub); timeout_queue_insert(net_backend_get_timeout_queue(), users->timeout, TIMEOUT_STATS); } +#endif // STATS_SUPPORT - hub->users = users; - return 0; + return users; } -int uman_shutdown(struct hub_info* hub) +int uman_shutdown(struct hub_user_manager* users) { - if (!hub || !hub->users) + if (!users) return -1; +#ifdef STATS_SUPPORT if (net_backend_get_timeout_queue()) { - timeout_queue_remove(net_backend_get_timeout_queue(), hub->users->timeout); - hub_free(hub->users->timeout); + timeout_queue_remove(net_backend_get_timeout_queue(), users->timeout); + hub_free(users->timeout); } +#endif - if (hub->users->list) + if (users->list) { - list_clear(hub->users->list, &clear_user_list_callback); - list_destroy(hub->users->list); + list_clear(users->list, &clear_user_list_callback); + list_destroy(users->list); } - sid_pool_destroy(hub->users->sids); - hub_free(hub->users); - hub->users = 0; - + sid_pool_destroy(users->sids); + hub_free(users); return 0; } -int uman_add(struct hub_info* hub, struct hub_user* user) +int uman_add(struct hub_user_manager* users, struct hub_user* user) { - if (!hub || !user) + if (!users || !user) return -1; - if (user->hub) - return -1; + list_append(users->list, user); + users->count++; + users->count_peak = MAX(users->count, users->count_peak); - list_append(hub->users->list, user); - hub->users->count++; - hub->users->count_peak = MAX(hub->users->count, hub->users->count_peak); - - hub->users->shared_size += user->limits.shared_size; - hub->users->shared_files += user->limits.shared_files; - - user->hub = hub; + users->shared_size += user->limits.shared_size; + users->shared_files += user->limits.shared_files; return 0; } -int uman_remove(struct hub_info* hub, struct hub_user* user) +int uman_remove(struct hub_user_manager* users, struct hub_user* user) { - if (!hub || !user) + if (!users || !user) return -1; - list_remove(hub->users->list, user); + list_remove(users->list, user); - if (hub->users->count > 0) + if (users->count > 0) { - hub->users->count--; + users->count--; } else { uhub_assert(!"negative count!"); } - hub->users->shared_size -= user->limits.shared_size; - hub->users->shared_files -= user->limits.shared_files; - - user->hub = 0; - + users->shared_size -= user->limits.shared_size; + users->shared_files -= user->limits.shared_files; return 0; } -struct hub_user* uman_get_user_by_sid(struct hub_info* hub, sid_t sid) +struct hub_user* uman_get_user_by_sid(struct hub_user_manager* users, sid_t sid) { - return sid_lookup(hub->users->sids, sid); + return sid_lookup(users->sids, sid); } -struct hub_user* uman_get_user_by_cid(struct hub_info* hub, const char* cid) +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(hub->users->list); /* iterate users - only on incoming INF msg */ + 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(hub->users->list); + user = (struct hub_user*) list_get_next(users->list); } return NULL; } -struct hub_user* uman_get_user_by_nick(struct hub_info* hub, const char* nick) +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(hub->users->list); /* iterate users - only on incoming INF msg */ + 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(hub->users->list); + user = (struct hub_user*) list_get_next(users->list); } return NULL; } -size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* users, struct ip_range* range) +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(hub->users->list); /* iterate users - only on incoming INF msg */ + struct hub_user* user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on incoming INF msg */ while (user) { if (ip_in_range(&user->id.addr, range)) { - list_append(users, user); + list_append(target, user); num++; } - user = (struct hub_user*) list_get_next(hub->users->list); + user = (struct hub_user*) list_get_next(users->list); } return num; } -int uman_send_user_list(struct hub_info* hub, struct hub_user* target) +int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* target) { int ret = 1; struct hub_user* user; user_flag_set(target, flag_user_list); - user = (struct hub_user*) list_get_first(hub->users->list); /* iterate users - only on INF or PAS msg */ + user = (struct hub_user*) list_get_first(users->list); /* iterate users - only on INF or PAS msg */ while (user) { if (user_is_logged_in(user)) @@ -235,7 +226,7 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user* target) if (!ret) break; } - user = (struct hub_user*) list_get_next(hub->users->list); + user = (struct hub_user*) list_get_next(users->list); } #if 0 @@ -248,7 +239,7 @@ int uman_send_user_list(struct hub_info* hub, struct hub_user* target) return ret; } -void uman_send_quit_message(struct hub_info* hub, struct hub_user* leaving) +void uman_send_quit_message(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* leaving) { struct adc_message* command = adc_msg_construct(ADC_CMD_IQUI, 6); adc_msg_add_argument(command, (const char*) sid_to_string(leaving->id.sid)); @@ -261,9 +252,9 @@ void uman_send_quit_message(struct hub_info* hub, struct hub_user* leaving) adc_msg_free(command); } -sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user) +sid_t uman_get_free_sid(struct hub_user_manager* users, struct hub_user* user) { - sid_t sid = sid_alloc(hub->users->sids, user); + sid_t sid = sid_alloc(users->sids, user); user->id.sid = sid; return sid; } diff --git a/src/core/usermanager.h b/src/core/usermanager.h index 7cc5190..5971447 100644 --- a/src/core/usermanager.h +++ b/src/core/usermanager.h @@ -28,36 +28,38 @@ struct hub_user_manager 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 linked_list* list; /**<< "Contains all logged in users" */ +#ifdef STATS_SUPPORT struct timeout_evt* timeout; /**<< "Timeout handler for statistics" */ +#endif }; /** * Initializes the user manager. * @return 0 on success, or -1 if error (out of memory). */ -extern int uman_init(struct hub_info* hub); +extern struct hub_user_manager* uman_init(); /** * Shuts down the user manager. * All users will be disconnected and deleted as part of this. * - * @return 0 on success, or -1 in an error occured (hub is invalid). + * @return 0 on success, or -1 in an error occured (invalid pointer). */ -extern int uman_shutdown(struct hub_info* hub); +extern int uman_shutdown(struct hub_user_manager* users); /** * Generate statistics for logfiles. */ -extern void uman_update_stats(struct hub_info* hub); -extern void uman_print_stats(struct hub_info* hub); +extern void uman_update_stats(struct hub_user_manager* users); +extern void uman_print_stats(struct hub_user_manager* users); /** * Add a user to the user manager. * - * @param hub The hub to add the user to + * @param users The usermanager to add the user to * @param user The user to be added to the hub. */ -extern int uman_add(struct hub_info* hub, struct hub_user* user); +extern int uman_add(struct hub_user_manager* users, struct hub_user* user); /** * Remove a user from the user manager. @@ -66,12 +68,12 @@ extern int uman_add(struct hub_info* hub, struct hub_user* user); * * @return 0 if successfully removed, -1 if error. */ -extern int uman_remove(struct hub_info* hub, struct hub_user* user); +extern int uman_remove(struct hub_user_manager* users, struct hub_user* user); /** * Returns and allocates an unused session ID (SID). */ -extern sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user); +extern sid_t uman_get_free_sid(struct hub_user_manager* users, struct hub_user* user); /** * Lookup a user based on the session ID (SID). @@ -86,26 +88,28 @@ extern sid_t uman_get_free_sid(struct hub_info* hub, struct hub_user* user); * * @return a user if found, or NULL if not found */ -extern struct hub_user* uman_get_user_by_sid(struct hub_info* hub, sid_t sid); +extern struct hub_user* uman_get_user_by_sid(struct hub_user_manager* users, sid_t sid); /** * Lookup a user based on the client ID (CID). * @return a user if found, or NULL if not found */ -extern struct hub_user* uman_get_user_by_cid(struct hub_info* hub, const char* cid); +extern struct hub_user* uman_get_user_by_cid(struct hub_user_manager* users, const char* cid); /** * Lookup a user based on the nick name. * @return a user if found, or NULL if not found */ -extern struct hub_user* uman_get_user_by_nick(struct hub_info* hub, const char* nick); +extern struct hub_user* uman_get_user_by_nick(struct hub_user_manager* users, const char* nick); /** * Lookup users based on an ip address range. * + * @param[out] target the list of users matching the address + * @param range the IP range of users to match * @return The number of users matching the addressess, or -1 on error (mask is wrong). */ -extern size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* users, struct ip_range* range); +extern size_t uman_get_user_by_addr(struct hub_user_manager* users, struct linked_list* target, struct ip_range* range); /** * Send the user list of connected clients to 'user'. @@ -113,13 +117,13 @@ extern size_t uman_get_user_by_addr(struct hub_info* hub, struct linked_list* us * * @return 1 if sending the user list succeeded, 0 otherwise. */ -extern int uman_send_user_list(struct hub_info* hub, struct hub_user* user); +extern int uman_send_user_list(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* user); /** * Send a quit message to all connected users when 'user' is * leaving the hub (for whatever reason). */ -extern void uman_send_quit_message(struct hub_info* hub, struct hub_user* user); +extern void uman_send_quit_message(struct hub_info* hub, struct hub_user_manager* users, struct hub_user* user); #endif /* HAVE_UHUB_USER_MANAGER_H */