diff --git a/include/misc.h b/include/misc.h index 8037f6f..28cc9c6 100644 --- a/include/misc.h +++ b/include/misc.h @@ -80,7 +80,6 @@ extern LastMsg last_sent_ctcp[2]; void BX_addtabkey (char *, char *, int); void clear_array (NickTab **, char *); char *BX_random_str (int, int); - int check_serverlag (void); void check_auto_away (time_t); ChannelList * BX_prepare_command (int *, char *, int); int rename_file (char *, char **); diff --git a/include/server.h b/include/server.h index 786c4af..13d4afe 100644 --- a/include/server.h +++ b/include/server.h @@ -95,6 +95,7 @@ typedef struct * used for redirect */ int lag; /* indication of lag from server CDE*/ time_t lag_time; /* time ping sent to server CDE */ + unsigned long lag_cookie; /* cookie to identify our lag check pings */ time_t last_msg; /* last mesg recieved from the server CDE */ time_t last_sent; /* last mesg time sent */ @@ -238,6 +239,7 @@ extern SGroup *server_group_list; void BX_set_server_lag (int, int); time_t get_server_lagtime (int); void set_server_lagtime (int, time_t); + unsigned long get_server_lag_cookie(int gso_index); char *BX_set_server_password (int, char *); void BX_set_server_nickname (int, char *); @@ -363,6 +365,7 @@ ChannelList *BX_get_server_channels (int); void reconnect_server(int *, int *, time_t *); int finalize_server_connect(int, int, int); int next_server(int); + int check_serverlag (void); void do_idle_server (void); /* XXXXX ick, gross, bad. XXXXX */ diff --git a/source/commands2.c b/source/commands2.c index 0951b5f..4dff1ac 100644 --- a/source/commands2.c +++ b/source/commands2.c @@ -646,8 +646,8 @@ BUILT_IN_COMMAND(sping) while ((sname = next_arg(args, &args))) { if (*sname == '.') - if (!(sname = get_server_itsname(from_server))) - sname = get_server_name(from_server); + sname = get_server_itsname(from_server); + if (!wild_match("*.*", sname)) { bitchsay("%s is not a server", sname); @@ -658,17 +658,9 @@ BUILT_IN_COMMAND(sping) get_time(&tmp->in_sping); set_server_sping(from_server, tmp); - if (!my_stricmp(sname, get_server_name(from_server)) || !my_stricmp(sname, get_server_itsname(from_server))) - send_to_server("PING LAG%ld.%ld :%s", - (long)tmp->in_sping.tv_sec, (long)tmp->in_sping.tv_usec, - sname); - else - send_to_server("PING %s :%s", - get_server_itsname(from_server) ? - get_server_itsname(from_server) : - get_server_name(from_server), sname); + send_to_server("PING %s :%s", + sname, sname); } - } } diff --git a/source/misc.c b/source/misc.c index bf03856..b5920f6 100644 --- a/source/misc.c +++ b/source/misc.c @@ -79,7 +79,6 @@ extern int newscrollerpos, lastscrollerpos, lastscrollerwindow; extern int user_count; extern int shit_count; extern int bot_count; -extern int in_server_ping; int serv_action = 0; @@ -245,25 +244,6 @@ BUILT_IN_COMMAND(extern_write) } - -int check_serverlag(void) -{ - int i; - - for (i = 0; i < server_list_size(); i++) - { - if (is_server_connected(i) && now != get_server_lagtime(i)) - { - set_server_lagtime(i, now); - my_send_to_server(i, "PING %s %s", get_server_nickname(i), get_server_itsname(i)); - in_server_ping++; - set_server_lag(i, -1); - } - } - - return 0; -} - int timer_unban (void *args, char *sub) { char *p = (char *)args; diff --git a/source/parse.c b/source/parse.c index 9350544..0a20a1d 100644 --- a/source/parse.c +++ b/source/parse.c @@ -64,7 +64,6 @@ static void strip_modes (char *, char *, char *); char *last_split_server = NULL; char *last_split_from = NULL; - int in_server_ping = 0; /* * joined_nick: the nickname of the last person who joined the current @@ -784,85 +783,92 @@ static void p_quit(char *from, char **ArgList) #endif } +static int sping_reply(char *from, char *sping_dest, int server) +{ + char buff[50]; + struct timeval timenow; + Sping *tmp = get_server_sping(server, sping_dest); + + if (!tmp) + return 0; + + get_time(&timenow); + snprintf(buff, sizeof buff, "%2.4f", BX_time_diff(tmp->in_sping, timenow)); + + reset_display_target(); + put_it("%s", convert_output_format("$G Server pong from %W$0%n $1 seconds", "%s %s", from, buff)); + clear_server_sping(server, sping_dest); + return 1; +} + static void p_pong(char *from, char **ArgList) { int is_server = 0; - int i; - - if (!ArgList[0]) + if (!ArgList[0] || !ArgList[1]) return; + is_server = wild_match("*.*", ArgList[0]); - if (in_server_ping && is_server) + + if (check_ignore(from, FromUserHost, NULL, IGNORE_PONGS, NULL) == IGNORED) + return; + + if (!is_server) + return; + + if (!strncmp(ArgList[1], "LAG!", 4)) { - int old_from_server = from_server; - for (i = 0; i < server_list_size(); i++) - { - if ((!my_stricmp(ArgList[0], get_server_name(i)) || !my_stricmp(ArgList[0], get_server_itsname(i))) && is_server_open(i)) + /* PONG for lag check */ + char *p, *q; + unsigned long cookie; + struct timeval timenow, timethen; + int old_lag, new_lag; + + p = strchr(ArgList[1], '.'); + if (p) + { + *p++ = 0; + cookie = strtoul(ArgList[1] + 4, NULL, 10); + + if (cookie == get_server_lag_cookie(from_server)) { - int old_lag = get_server_lag(i); - from_server = i; - set_server_lag(i, now - get_server_lagtime(i)); - in_server_ping--; - if (old_lag != get_server_lag(i)) - status_update(1); - from_server = old_from_server; - return; - } - } - from_server = old_from_server; - } - if (check_ignore(from, FromUserHost, NULL, IGNORE_PONGS, NULL) != IGNORED) - { - if (!is_server) - return; - reset_display_target(); - if (!ArgList[1]) - say("%s: PONG received from %s", ArgList[0], from); - else if (!strncmp(ArgList[1], "LAG", 3)) - { - char *p = empty_string; - char buff[50]; - struct timeval timenow = {0}; - struct timeval timethen; - if ((p = strchr(ArgList[1], '.'))) - { - *p++ = 0; - timethen.tv_usec = my_atol(p); - } else - timethen.tv_usec = 0; - timethen.tv_sec = my_atol(ArgList[1]+3); - get_time(&timenow); - sprintf(buff, "%2.4f", BX_time_diff(timethen, timenow)); - put_it("%s", convert_output_format("$G Server pong from %W$0%n $1 seconds", "%s %s", ArgList[0], buff)); - clear_server_sping(from_server, ArgList[0]); - } - else if (!my_stricmp(ArgList[1], get_server_nickname(from_server))) - { - char buff[50]; - Sping *tmp; - if ((tmp = get_server_sping(from_server, ArgList[0]))) - { - struct timeval timenow = {0}; - get_time(&timenow); - sprintf(buff, "%2.4f", BX_time_diff(tmp->in_sping, timenow)); - put_it("%s", convert_output_format("$G Server pong from %W$0%n $1 seconds", "%s %s", ArgList[0], buff)); - clear_server_sping(from_server, ArgList[0]); - if (is_server_connected(from_server)) + q = strchr(p, '.'); + if (q) { - int old_lag = get_server_lag(from_server); - set_server_lag(from_server, now - get_server_lagtime(from_server)); - if (old_lag != get_server_lag(from_server)) - status_update(1); + *q++ = 0; + timethen.tv_usec = my_atol(q); + } else + timethen.tv_usec = 0; + + timethen.tv_sec = my_atol(p); + get_time(&timenow); + + old_lag = get_server_lag(from_server); + new_lag = (int)(BX_time_diff(timethen, timenow) + 0.5); + if (old_lag != new_lag) + { + set_server_lag(from_server, new_lag); + status_update(1); } } } - else - say("%s: PONG received from %s %s", ArgList[0], from, ArgList[1]); } - return; + else if (!my_stricmp(ArgList[1], get_server_nickname(from_server))) + { + /* PONG from remote server */ + sping_reply(ArgList[0], ArgList[0], from_server); + } + else if (wild_match("*.*", ArgList[1])) + { + /* PONG from local server, possibly on behalf of remote server */ + sping_reply(ArgList[0], ArgList[1], from_server); + } + else + { + reset_display_target(); + say("%s: PONG received from %s %s", ArgList[0], from, ArgList[1]); + } } - static void p_error(char *from, char **ArgList) { diff --git a/source/server.c b/source/server.c index d0431f7..f117564 100644 --- a/source/server.c +++ b/source/server.c @@ -402,6 +402,28 @@ static void scan_nonblocking(void) } #endif +int check_serverlag(void) +{ + int i; + struct timeval tv; + + get_time(&tv); + + for (i = 0; i < server_list_size(); i++) + { + if (is_server_connected(i) && now != get_server_lagtime(i)) + { + set_server_lagtime(i, now); + my_send_to_server(i, "PING LAG!%lu.%ld.%ld :%s", + get_server_lag_cookie(i), + (long)tv.tv_sec, (long)tv.tv_usec, get_server_itsname(i)); + set_server_lag(i, -1); + } + } + + return 0; +} + void do_idle_server (void) { int i; @@ -2298,7 +2320,8 @@ void register_server (int ssn_index, char *nick) *server_list[ssn_index].umode = 0; server_list[ssn_index].operator = 0; /* set_umode(ssn_index); */ - server_list[ssn_index].login_flags |= LOGGED_IN; + server_list[ssn_index].login_flags |= LOGGED_IN; + server_list[ssn_index].lag_cookie = random_number(0); from_server = old_from_server; check_host(); } @@ -2336,7 +2359,6 @@ void BX_set_server_lag (int gso_index, int secs) server_list[gso_index].lag = secs; } - time_t get_server_lagtime (int gso_index) { if ((gso_index < 0 || gso_index >= number_of_servers)) @@ -2350,6 +2372,12 @@ void set_server_lagtime (int gso_index, time_t secs) server_list[gso_index].lag_time = secs; } +unsigned long get_server_lag_cookie(int gso_index) +{ + if ((gso_index < 0 || gso_index >= number_of_servers)) + return 0; + return server_list[gso_index].lag_cookie; +} int BX_get_server_motd (int gsm_index) {