Alter the way PINGs for /sping and lag check are used.
We now send PING <server> :<server> for /spings, and PING LAG!<cookie>.<tv_sec>.<tv_usec> :<server> for lag checks. The cookie is set randomly at server connect time, and means that clients connected to the same bouncer shouldn't act on each other's lag checks. We can now remove in_sping entirely - previously it would get out of synch if you disconnected with a sping in progress.
This commit is contained in:
@@ -80,7 +80,6 @@ extern LastMsg last_sent_ctcp[2];
|
|||||||
void BX_addtabkey (char *, char *, int);
|
void BX_addtabkey (char *, char *, int);
|
||||||
void clear_array (NickTab **, char *);
|
void clear_array (NickTab **, char *);
|
||||||
char *BX_random_str (int, int);
|
char *BX_random_str (int, int);
|
||||||
int check_serverlag (void);
|
|
||||||
void check_auto_away (time_t);
|
void check_auto_away (time_t);
|
||||||
ChannelList * BX_prepare_command (int *, char *, int);
|
ChannelList * BX_prepare_command (int *, char *, int);
|
||||||
int rename_file (char *, char **);
|
int rename_file (char *, char **);
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ typedef struct
|
|||||||
* used for redirect */
|
* used for redirect */
|
||||||
int lag; /* indication of lag from server CDE*/
|
int lag; /* indication of lag from server CDE*/
|
||||||
time_t lag_time; /* time ping sent to 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_msg; /* last mesg recieved from the server CDE */
|
||||||
|
|
||||||
time_t last_sent; /* last mesg time sent */
|
time_t last_sent; /* last mesg time sent */
|
||||||
@@ -238,6 +239,7 @@ extern SGroup *server_group_list;
|
|||||||
void BX_set_server_lag (int, int);
|
void BX_set_server_lag (int, int);
|
||||||
time_t get_server_lagtime (int);
|
time_t get_server_lagtime (int);
|
||||||
void set_server_lagtime (int, time_t);
|
void set_server_lagtime (int, time_t);
|
||||||
|
unsigned long get_server_lag_cookie(int gso_index);
|
||||||
|
|
||||||
char *BX_set_server_password (int, char *);
|
char *BX_set_server_password (int, char *);
|
||||||
void BX_set_server_nickname (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 *);
|
void reconnect_server(int *, int *, time_t *);
|
||||||
int finalize_server_connect(int, int, int);
|
int finalize_server_connect(int, int, int);
|
||||||
int next_server(int);
|
int next_server(int);
|
||||||
|
int check_serverlag (void);
|
||||||
void do_idle_server (void);
|
void do_idle_server (void);
|
||||||
|
|
||||||
/* XXXXX ick, gross, bad. XXXXX */
|
/* XXXXX ick, gross, bad. XXXXX */
|
||||||
|
|||||||
@@ -646,8 +646,8 @@ BUILT_IN_COMMAND(sping)
|
|||||||
while ((sname = next_arg(args, &args)))
|
while ((sname = next_arg(args, &args)))
|
||||||
{
|
{
|
||||||
if (*sname == '.')
|
if (*sname == '.')
|
||||||
if (!(sname = get_server_itsname(from_server)))
|
sname = get_server_itsname(from_server);
|
||||||
sname = get_server_name(from_server);
|
|
||||||
if (!wild_match("*.*", sname))
|
if (!wild_match("*.*", sname))
|
||||||
{
|
{
|
||||||
bitchsay("%s is not a server", sname);
|
bitchsay("%s is not a server", sname);
|
||||||
@@ -658,17 +658,9 @@ BUILT_IN_COMMAND(sping)
|
|||||||
get_time(&tmp->in_sping);
|
get_time(&tmp->in_sping);
|
||||||
set_server_sping(from_server, tmp);
|
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",
|
send_to_server("PING %s :%s",
|
||||||
get_server_itsname(from_server) ?
|
sname, sname);
|
||||||
get_server_itsname(from_server) :
|
|
||||||
get_server_name(from_server), sname);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,6 @@ extern int newscrollerpos, lastscrollerpos, lastscrollerwindow;
|
|||||||
extern int user_count;
|
extern int user_count;
|
||||||
extern int shit_count;
|
extern int shit_count;
|
||||||
extern int bot_count;
|
extern int bot_count;
|
||||||
extern int in_server_ping;
|
|
||||||
|
|
||||||
int serv_action = 0;
|
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)
|
int timer_unban (void *args, char *sub)
|
||||||
{
|
{
|
||||||
char *p = (char *)args;
|
char *p = (char *)args;
|
||||||
|
|||||||
118
source/parse.c
118
source/parse.c
@@ -64,7 +64,6 @@ static void strip_modes (char *, char *, char *);
|
|||||||
|
|
||||||
char *last_split_server = NULL;
|
char *last_split_server = NULL;
|
||||||
char *last_split_from = NULL;
|
char *last_split_from = NULL;
|
||||||
int in_server_ping = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* joined_nick: the nickname of the last person who joined the current
|
* joined_nick: the nickname of the last person who joined the current
|
||||||
@@ -784,86 +783,93 @@ static void p_quit(char *from, char **ArgList)
|
|||||||
#endif
|
#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)
|
static void p_pong(char *from, char **ArgList)
|
||||||
{
|
{
|
||||||
int is_server = 0;
|
int is_server = 0;
|
||||||
int i;
|
|
||||||
|
|
||||||
|
if (!ArgList[0] || !ArgList[1])
|
||||||
if (!ArgList[0])
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
is_server = wild_match("*.*", ArgList[0]);
|
is_server = wild_match("*.*", ArgList[0]);
|
||||||
if (in_server_ping && is_server)
|
|
||||||
{
|
if (check_ignore(from, FromUserHost, NULL, IGNORE_PONGS, NULL) == IGNORED)
|
||||||
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))
|
|
||||||
{
|
|
||||||
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;
|
return;
|
||||||
}
|
|
||||||
}
|
|
||||||
from_server = old_from_server;
|
|
||||||
}
|
|
||||||
if (check_ignore(from, FromUserHost, NULL, IGNORE_PONGS, NULL) != IGNORED)
|
|
||||||
{
|
|
||||||
if (!is_server)
|
if (!is_server)
|
||||||
return;
|
return;
|
||||||
reset_display_target();
|
|
||||||
if (!ArgList[1])
|
if (!strncmp(ArgList[1], "LAG!", 4))
|
||||||
say("%s: PONG received from %s", ArgList[0], from);
|
|
||||||
else if (!strncmp(ArgList[1], "LAG", 3))
|
|
||||||
{
|
{
|
||||||
char *p = empty_string;
|
/* PONG for lag check */
|
||||||
char buff[50];
|
char *p, *q;
|
||||||
struct timeval timenow = {0};
|
unsigned long cookie;
|
||||||
struct timeval timethen;
|
struct timeval timenow, timethen;
|
||||||
if ((p = strchr(ArgList[1], '.')))
|
int old_lag, new_lag;
|
||||||
|
|
||||||
|
p = strchr(ArgList[1], '.');
|
||||||
|
if (p)
|
||||||
{
|
{
|
||||||
*p++ = 0;
|
*p++ = 0;
|
||||||
timethen.tv_usec = my_atol(p);
|
cookie = strtoul(ArgList[1] + 4, NULL, 10);
|
||||||
|
|
||||||
|
if (cookie == get_server_lag_cookie(from_server))
|
||||||
|
{
|
||||||
|
q = strchr(p, '.');
|
||||||
|
if (q)
|
||||||
|
{
|
||||||
|
*q++ = 0;
|
||||||
|
timethen.tv_usec = my_atol(q);
|
||||||
} else
|
} else
|
||||||
timethen.tv_usec = 0;
|
timethen.tv_usec = 0;
|
||||||
timethen.tv_sec = my_atol(ArgList[1]+3);
|
|
||||||
|
timethen.tv_sec = my_atol(p);
|
||||||
get_time(&timenow);
|
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));
|
old_lag = get_server_lag(from_server);
|
||||||
clear_server_sping(from_server, ArgList[0]);
|
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 if (!my_stricmp(ArgList[1], get_server_nickname(from_server)))
|
else if (!my_stricmp(ArgList[1], get_server_nickname(from_server)))
|
||||||
{
|
{
|
||||||
char buff[50];
|
/* PONG from remote server */
|
||||||
Sping *tmp;
|
sping_reply(ArgList[0], ArgList[0], from_server);
|
||||||
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))
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
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
|
else
|
||||||
|
{
|
||||||
|
reset_display_target();
|
||||||
say("%s: PONG received from %s %s", ArgList[0], from, ArgList[1]);
|
say("%s: PONG received from %s %s", ArgList[0], from, ArgList[1]);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void p_error(char *from, char **ArgList)
|
static void p_error(char *from, char **ArgList)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -402,6 +402,28 @@ static void scan_nonblocking(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#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)
|
void do_idle_server (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -2299,6 +2321,7 @@ void register_server (int ssn_index, char *nick)
|
|||||||
server_list[ssn_index].operator = 0;
|
server_list[ssn_index].operator = 0;
|
||||||
/* set_umode(ssn_index); */
|
/* 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;
|
from_server = old_from_server;
|
||||||
check_host();
|
check_host();
|
||||||
}
|
}
|
||||||
@@ -2336,7 +2359,6 @@ void BX_set_server_lag (int gso_index, int secs)
|
|||||||
server_list[gso_index].lag = secs;
|
server_list[gso_index].lag = secs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
time_t get_server_lagtime (int gso_index)
|
time_t get_server_lagtime (int gso_index)
|
||||||
{
|
{
|
||||||
if ((gso_index < 0 || gso_index >= number_of_servers))
|
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;
|
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)
|
int BX_get_server_motd (int gsm_index)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user