diff --git a/include/h.h b/include/h.h index f520b0718..d6db89ede 100644 --- a/include/h.h +++ b/include/h.h @@ -148,7 +148,7 @@ extern MODVAR int R_do_dns, R_fin_dns, R_fin_dnsc, R_fail_dns, R_do_id, R_fin_id, R_fail_id; #endif -extern MODVAR struct list_head client_list, lclient_list, server_list, oper_list, unknown_list; +extern MODVAR struct list_head client_list, lclient_list, server_list, oper_list, unknown_list, global_server_list; extern inline aCommand *find_Command(char *cmd, short token, int flags); extern aCommand *find_Command_simple(char *cmd); extern aChannel *find_channel(char *, aChannel *); diff --git a/src/list.c b/src/list.c index f57cc9fec..4833f6931 100644 --- a/src/list.c +++ b/src/list.c @@ -72,7 +72,7 @@ MODVAR MembershipL *freemembershipL = NULL; MODVAR int numclients = 0; /* unless documented otherwise, these are all local-only, except client_list. */ -MODVAR struct list_head client_list, lclient_list, server_list, oper_list, unknown_list; +MODVAR struct list_head client_list, lclient_list, server_list, oper_list, unknown_list, global_server_list; void initlists(void) { @@ -90,6 +90,7 @@ void initlists(void) INIT_LIST_HEAD(&server_list); INIT_LIST_HEAD(&oper_list); INIT_LIST_HEAD(&unknown_list); + INIT_LIST_HEAD(&global_server_list); } void outofmemory(void) diff --git a/src/modules/m_server.c b/src/modules/m_server.c index 966787c74..0f2ee2176 100644 --- a/src/modules/m_server.c +++ b/src/modules/m_server.c @@ -666,6 +666,7 @@ CMD_FUNC(m_server_remote) (void)find_or_add(acptr->name); add_client_to_list(acptr); (void)add_to_client_hash_table(acptr->name, acptr); + list_move(&acptr->client_node, &global_server_list); RunHook(HOOKTYPE_SERVER_CONNECT, acptr); list_for_each_entry(bcptr, &server_list, special_node) @@ -756,6 +757,7 @@ int m_server_synch(aClient *cptr, long numeric, ConfigItem_link *aconf) IRCstats.me_servers++; IRCstats.servers++; IRCstats.unknown--; + list_move(&cptr->client_node, &global_server_list); list_move(&cptr->lclient_node, &lclient_list); list_add(&cptr->special_node, &server_list); if ((Find_uline(cptr->name))) @@ -825,11 +827,12 @@ int m_server_synch(aClient *cptr, long numeric, ConfigItem_link *aconf) } } - list_for_each_entry_reverse(acptr, &server_list, special_node) + list_for_each_entry_reverse(acptr, &global_server_list, client_node) { /* acptr->from == acptr for acptr == cptr */ if (acptr->from == cptr) continue; + if (IsServer(acptr)) { if (SupportNS(cptr)) @@ -874,6 +877,7 @@ int m_server_synch(aClient *cptr, long numeric, ConfigItem_link *aconf) } } } + /* Synching nick information */ list_for_each_entry_reverse(acptr, &client_list, client_node) {