266 lines
5.4 KiB
C
266 lines
5.4 KiB
C
/* @(#)$Id: servers.c,v 1.9 1998/01/25 18:35:47 seks Exp $ */
|
|
|
|
/* Undernet Channel Service (X)
|
|
* Copyright (C) 1995-2002 Robin Thellend
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* The author can be contact by email at <csfeedback@robin.pfft.net>
|
|
*
|
|
* Please note that this software is unsupported and mostly
|
|
* obsolete. It was replaced by GNUworld/CMaster. See
|
|
* http://gnuworld.sourceforge.net/ for more information.
|
|
*/
|
|
|
|
#include "h.h"
|
|
|
|
aserver **FindServer(aserver ** head, char *name)
|
|
{
|
|
register aserver **tmp;
|
|
|
|
if (head == NULL || *head == NULL)
|
|
return NULL;
|
|
|
|
while (*head != NULL)
|
|
{
|
|
if (!strcasecmp((*head)->name, name))
|
|
{
|
|
return head;
|
|
}
|
|
if ((tmp = FindServer(&(*head)->down, name)) != NULL)
|
|
{
|
|
return tmp;
|
|
}
|
|
else
|
|
{
|
|
head = &(*head)->next;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
aserver *ToServer(char *name)
|
|
{
|
|
return (*FindServer(&ServerList, name));
|
|
}
|
|
|
|
void onserver(char *source, char *newserver, char *args)
|
|
{
|
|
register aserver *head;
|
|
register aserver *tmp;
|
|
register int i;
|
|
char TS[80];
|
|
|
|
if (source[0] != '\0')
|
|
{
|
|
head = ToServer(source);
|
|
}
|
|
else
|
|
{
|
|
head = NULL;
|
|
}
|
|
|
|
#ifdef BACKUP
|
|
if (!strcasecmp(newserver, MAIN_SERVERNAME))
|
|
{
|
|
quit(MAIN_NICK " is back", 0);
|
|
}
|
|
#endif
|
|
|
|
tmp = (aserver *) MALLOC(sizeof(aserver));
|
|
tmp->name = (char *)MALLOC(strlen(newserver) + 1);
|
|
strcpy(tmp->name, newserver);
|
|
GetWord(2, args, TS);
|
|
tmp->TS = atol(TS);
|
|
if (head == NULL)
|
|
{
|
|
tmp->next = ServerList;
|
|
ServerList = tmp;
|
|
TSoffset = tmp->TS - now;
|
|
#ifdef DEBUG
|
|
printf("New connection: my time: %ld others' time %ld (%ld)\n",
|
|
now, tmp->TS, TSoffset);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
tmp->next = head->down;
|
|
head->down = tmp;
|
|
}
|
|
tmp->up = head;
|
|
tmp->down = NULL;
|
|
for (i = 0; i < 100; i++)
|
|
tmp->users[i] = NULL;
|
|
}
|
|
|
|
void onsquit(char *source, char *theserver, char *args)
|
|
{
|
|
register aserver *serv, **s;
|
|
register int i;
|
|
char TS[80];
|
|
|
|
#ifdef FAKE_UWORLD
|
|
if (!strcasecmp(theserver, UFAKE_SERVER) && Uworld_status == 1)
|
|
{
|
|
GetWord(0, args, TS);
|
|
if (atol(TS) == UworldServTS)
|
|
{
|
|
char buffer[200];
|
|
sprintf(buffer, "%s squitted", UFAKE_NICK);
|
|
log(buffer);
|
|
Uworld_status = 0;
|
|
}
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
s = FindServer(&ServerList, theserver);
|
|
|
|
if (s == NULL)
|
|
{
|
|
char buffer[200];
|
|
sprintf(buffer, "ERROR: SQUIT unknown server %s (from %s)",
|
|
theserver, source);
|
|
log(buffer);
|
|
return;
|
|
}
|
|
|
|
serv = *s;
|
|
|
|
#ifdef DEBUG
|
|
printf("SQUIT: %s %s\n", source, theserver);
|
|
#endif
|
|
|
|
if (args != NULL)
|
|
{
|
|
GetWord(0, args, TS);
|
|
#ifdef DEBUG
|
|
if (s != NULL)
|
|
printf("ConnectTS: %ld SquitTS: %ld\n", serv->TS, atol(TS));
|
|
#endif
|
|
}
|
|
|
|
if (serv != ServerList && args != NULL && serv->TS != atol(TS))
|
|
{
|
|
#ifdef DEBUG
|
|
printf("TS's are different.. ignoring squit!\n");
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
while (serv->down != NULL)
|
|
{
|
|
onsquit(NULL, serv->down->name, NULL);
|
|
}
|
|
|
|
for (i = 0; i < 100; i++)
|
|
{
|
|
while (serv->users[i] != NULL)
|
|
{
|
|
onquit(serv->users[i]->N->nick);
|
|
}
|
|
}
|
|
|
|
TTLALLOCMEM -= strlen(serv->name) + 1;
|
|
free(serv->name);
|
|
*s = serv->next;
|
|
TTLALLOCMEM -= sizeof(aserver);
|
|
free(serv);
|
|
}
|
|
|
|
void showmap(char *source)
|
|
{
|
|
int count = 0;
|
|
|
|
if (CurrentSendQ > HIGHSENDQTHRESHOLD)
|
|
{
|
|
notice(source, "Cannot process your request at this time. Try again later.");
|
|
return;
|
|
}
|
|
notice(source, SERVERNAME);
|
|
showserv(source, ServerList, &count);
|
|
CheckFloodFlood(source, count);
|
|
}
|
|
|
|
void showserv(char *source, aserver * server, int *count)
|
|
{
|
|
static char prefix[80] = "";
|
|
static int offset = 0;
|
|
char buffer[200];
|
|
register asuser *suser;
|
|
register int nbusers = 0, i;
|
|
|
|
if (server == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
(*count)++; /* number of servers */
|
|
|
|
/* count number of users */
|
|
for (i = 0; i < 100; i++)
|
|
{
|
|
suser = server->users[i];
|
|
while (suser != NULL)
|
|
{
|
|
nbusers++;
|
|
suser = suser->next;
|
|
}
|
|
}
|
|
|
|
if (server->next == NULL)
|
|
{
|
|
sprintf(buffer, "%s`-%s (%d client%s)", prefix, server->name, nbusers, (nbusers != 1) ? "s" : "");
|
|
}
|
|
else
|
|
{
|
|
sprintf(buffer, "%s|-%s (%d client%s)", prefix, server->name, nbusers, (nbusers != 1) ? "s" : "");
|
|
}
|
|
notice(source, buffer);
|
|
|
|
if (server->next != NULL)
|
|
strcpy(prefix + offset, "| ");
|
|
else
|
|
strcpy(prefix + offset, " ");
|
|
|
|
offset += 2;
|
|
showserv(source, server->down, count);
|
|
offset -= 2;
|
|
prefix[offset] = '\0';
|
|
|
|
showserv(source, server->next, count);
|
|
}
|
|
|
|
void onsettime(char *source, char *value)
|
|
{
|
|
char buffer[200];
|
|
|
|
TSoffset = atol(value) - now;
|
|
sprintf(buffer, "SETTIME from %s (%s) (%ld)", source, value, TSoffset);
|
|
log(buffer);
|
|
#ifdef DEBUG
|
|
puts(buffer);
|
|
#endif
|
|
}
|
|
|
|
void showversion(char *source)
|
|
{
|
|
char buffer[200];
|
|
|
|
sprintf(buffer, ":%s 351 %s . %s :%s\n", SERVERNAME, source, SERVERNAME, VERSION);
|
|
sendtoserv(buffer);
|
|
}
|