Changed server disconnect message

This commit is contained in:
Michiel Broek 2005-04-18 14:28:41 +00:00
parent 57dae361b2
commit 81c697dc5c
2 changed files with 47 additions and 11 deletions

View File

@ -67,6 +67,9 @@ static char *ncsstate[] = {
*/ */
void fill_ncslist(ncs_list **, char *, char *, char *); void fill_ncslist(ncs_list **, char *, char *, char *);
void dump_ncslist(void); void dump_ncslist(void);
void tidy_servers(srv_list **);
void add_server(srv_list **, char *, int);
void del_server(srv_list **, char *);
int send_msg(int, struct sockaddr_in, char *, char *); int send_msg(int, struct sockaddr_in, char *, char *);
void check_servers(void); void check_servers(void);
void command_pass(char *, char *); void command_pass(char *, char *);
@ -131,10 +134,10 @@ void dump_ncslist(void)
tmp->gotserver ? "yes":"no ", (int)tmp->action - (int)now); tmp->gotserver ? "yes":"no ", (int)tmp->action - (int)now);
} }
Syslog('r', "Server Users Connect time"); Syslog('r', "Server Hops Users Connect time");
Syslog('r', "------------------------------ ----- ---------------------"); Syslog('r', "------------------------------ ----- ----- --------------------");
for (srv = servers; srv; srv = srv->next) { for (srv = servers; srv; srv = srv->next) {
Syslog('r', "%-30s %5d %s", srv->server, srv->users, rfcdate(srv->connected)); Syslog('r', "%-30s %5d %5d %s", srv->server, srv->hops, srv->users, rfcdate(srv->connected));
} }
changed = FALSE; changed = FALSE;
} }
@ -154,7 +157,7 @@ void tidy_servers(srv_list ** fdp)
void add_server(srv_list **fdp, char *name) void add_server(srv_list **fdp, char *name, int hops)
{ {
srv_list *tmp, *ta; srv_list *tmp, *ta;
@ -164,6 +167,7 @@ void add_server(srv_list **fdp, char *name)
strncpy(tmp->server, name, 63); strncpy(tmp->server, name, 63);
tmp->connected = time(NULL); tmp->connected = time(NULL);
tmp->users = 0; tmp->users = 0;
tmp->hops = hops;
if (*fdp == NULL) { if (*fdp == NULL) {
*fdp = tmp; *fdp = tmp;
@ -178,6 +182,32 @@ void add_server(srv_list **fdp, char *name)
void del_server(srv_list **fdp, char *name)
{
srv_list *tmp, *old = NULL;
Syslog('r', "delserver %s", name);
for (tmp = *fdp; tmp; tmp = old) {
Syslog('r', " loop %s", tmp->server);
if (strcmp(tmp->server, name) == 0) {
if (old) {
Syslog('r', " old is true");
old->next = tmp->next;
} else {
Syslog('r', " old = false");
*fdp = tmp->next;
}
old = tmp->next;
free(tmp);
} else {
old = tmp->next;
}
}
}
/* /*
* Send a message to all servers * Send a message to all servers
*/ */
@ -252,7 +282,7 @@ void check_servers(void)
/* /*
* First add this server name to the servers database. * First add this server name to the servers database.
*/ */
add_server(&servers, ibcsrv.myname); add_server(&servers, ibcsrv.myname, 0);
} }
} }
} }
@ -510,6 +540,7 @@ void command_server(char *hostname, char *parameters)
tnsl->state = NCS_CONNECT; tnsl->state = NCS_CONNECT;
tnsl->action = now + (time_t)10; tnsl->action = now + (time_t)10;
Syslog('+', "IBC: connected with %s", tnsl->server); Syslog('+', "IBC: connected with %s", tnsl->server);
add_server(&servers, tnsl->server, 1);
return; return;
} }
Syslog('r', "IBC: collision with %s", tnsl->server); Syslog('r', "IBC: collision with %s", tnsl->server);
@ -530,6 +561,7 @@ void command_server(char *hostname, char *parameters)
tnsl->state = NCS_CONNECT; tnsl->state = NCS_CONNECT;
tnsl->action = now + (time_t)10; tnsl->action = now + (time_t)10;
Syslog('+', "IBC: connected with %s", tnsl->server); Syslog('+', "IBC: connected with %s", tnsl->server);
add_server(&servers, tnsl->server, 1);
changed = TRUE; changed = TRUE;
} else { } else {
Syslog('r', "IBC: got SERVER command without PASS command from %s", hostname); Syslog('r', "IBC: got SERVER command without PASS command from %s", hostname);
@ -553,17 +585,18 @@ void command_squit(char *hostname, char *parameters)
name = strtok(parameters, " \0"); name = strtok(parameters, " \0");
message = strtok(NULL, "\0"); message = strtok(NULL, "\0");
if (strcmp(name, tnsl->myname) == 0) { if (strcmp(name, tnsl->server) == 0) {
Syslog('+', "IBC: disconnect server %s: %s", name, message); Syslog('+', "IBC: disconnect server %s: %s", name, message);
tnsl->state = NCS_HANGUP; tnsl->state = NCS_HANGUP;
tnsl->action = time(NULL) + (time_t)120; // 2 minutes delay before calling again. tnsl->action = time(NULL) + (time_t)120; // 2 minutes delay before calling again.
tnsl->gotpass = FALSE; tnsl->gotpass = FALSE;
tnsl->gotserver = FALSE; tnsl->gotserver = FALSE;
tnsl->token = 0; tnsl->token = 0;
changed = TRUE;
} else { } else {
Syslog('r', "IBC: disconnect server %s: message is not for us, but update database"); Syslog('r', "IBC: disconnect server %s: message is not for us, but update database");
} }
del_server(&servers, name);
changed = TRUE;
} }
@ -575,7 +608,7 @@ void receiver(struct servent *se)
int rc, len, inlist; int rc, len, inlist;
socklen_t sl; socklen_t sl;
ncs_list *tnsl; ncs_list *tnsl;
char *hostname, *prefix, *command, *parameters; char temp[512], *hostname, *prefix, *command, *parameters;
pfd.fd = ls; pfd.fd = ls;
pfd.events = POLLIN; pfd.events = POLLIN;
@ -665,9 +698,9 @@ void receiver(struct servent *se)
sprintf(csbuf, "461 %s: Not enough parameters\r\n", command); sprintf(csbuf, "461 %s: Not enough parameters\r\n", command);
send_msg(tnsl->socket, tnsl->servaddr_in, tnsl->server, csbuf); send_msg(tnsl->socket, tnsl->servaddr_in, tnsl->server, csbuf);
} else { } else {
sprintf(csbuf, "SQUIT %s %s", hostname, parameters); sprintf(temp, "SQUIT %s %s", hostname, parameters);
command_squit(hostname, parameters); command_squit(hostname, parameters);
send_all(csbuf); send_all(temp);
} }
} else if (atoi(command)) { } else if (atoi(command)) {
Syslog('r', "IBC: Got error %d", atoi(command)); Syslog('r', "IBC: Got error %d", atoi(command));
@ -734,11 +767,13 @@ void *ibc_thread(void *dummy)
Syslog('r', "IBC: start shutdown connections"); Syslog('r', "IBC: start shutdown connections");
for (tnsl = ncsl; tnsl; tnsl = tnsl->next) { for (tnsl = ncsl; tnsl; tnsl = tnsl->next) {
if (tnsl->state == NCS_CONNECT) { if (tnsl->state == NCS_CONNECT) {
sprintf(csbuf, "SQUIT %s System shutdown\r\n", tnsl->server); sprintf(csbuf, "SQUIT %s System shutdown\r\n", tnsl->myname);
send_msg(tnsl->socket, tnsl->servaddr_in, tnsl->server, csbuf); send_msg(tnsl->socket, tnsl->servaddr_in, tnsl->server, csbuf);
} }
} }
tidy_servers(&servers);
exit: exit:
ibc_run = FALSE; ibc_run = FALSE;
Syslog('+', "IBC thread stopped"); Syslog('+', "IBC thread stopped");

View File

@ -35,6 +35,7 @@ typedef struct _ncs_list {
typedef struct _srv_list { typedef struct _srv_list {
struct _srv_list *next; struct _srv_list *next;
char server[64]; /* FQDN of the server */ char server[64]; /* FQDN of the server */
int hops; /* Howmany hops away */
time_t connected; /* Connection time */ time_t connected; /* Connection time */
int users; /* Users in chat */ int users; /* Users in chat */
} srv_list; } srv_list;