/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
*
* 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
static CLIENT *This_Server, *My_Clients;
-static char GetID_Buffer[GETID_LEN];
static WHOWAS My_Whowas[MAX_WHOWAS];
static int Last_Whowas = -1;
static void Adjust_Counters PARAMS(( CLIENT *Client ));
static CLIENT *Init_New_Client PARAMS((CONN_ID Idx, CLIENT *Introducer,
- CLIENT *TopServer, int Type, char *ID,
- char *User, char *Hostname, char *Info,
- int Hops, int Token, char *Modes,
+ CLIENT *TopServer, int Type, const char *ID,
+ const char *User, const char *Hostname, const char *Info,
+ int Hops, int Token, const char *Modes,
bool Idented));
-static void Destroy_UserOrService PARAMS((CLIENT *Client, char *Txt, char *FwdMsg,
+static void Destroy_UserOrService PARAMS((CLIENT *Client,const char *Txt, const char *FwdMsg,
bool SendQuit));
* @return New CLIENT structure.
*/
GLOBAL CLIENT *
-Client_NewLocal(CONN_ID Idx, char *Hostname, int Type, bool Idented)
+Client_NewLocal(CONN_ID Idx, const char *Hostname, int Type, bool Idented)
{
return Init_New_Client(Idx, This_Server, NULL, Type, NULL, NULL,
Hostname, NULL, 0, 0, NULL, Idented);
* @return New CLIENT structure.
*/
GLOBAL CLIENT *
-Client_NewRemoteServer(CLIENT *Introducer, char *Hostname, CLIENT *TopServer,
- int Hops, int Token, char *Info, bool Idented)
+Client_NewRemoteServer(CLIENT *Introducer, const char *Hostname, CLIENT *TopServer,
+ int Hops, int Token, const char *Info, bool Idented)
{
return Init_New_Client(NONE, Introducer, TopServer, CLIENT_SERVER,
Hostname, NULL, Hostname, Info, Hops, Token, NULL, Idented);
* @return New CLIENT structure.
*/
GLOBAL CLIENT *
-Client_NewRemoteUser(CLIENT *Introducer, char *Nick, int Hops, char *User,
- char *Hostname, int Token, char *Modes, char *Info, bool Idented)
+Client_NewRemoteUser(CLIENT *Introducer, const char *Nick, int Hops, const char *User,
+ const char *Hostname, int Token, const char *Modes, const char *Info, bool Idented)
{
return Init_New_Client(NONE, Introducer, NULL, CLIENT_USER, Nick,
User, Hostname, Info, Hops, Token, Modes, Idented);
*/
static CLIENT *
Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
- int Type, char *ID, char *User, char *Hostname, char *Info, int Hops,
- int Token, char *Modes, bool Idented)
+ int Type, const char *ID, const char *User, const char *Hostname,
+ const char *Info, int Hops, int Token, const char *Modes, bool Idented)
{
CLIENT *client;
- assert( Idx >= NONE );
- assert( Introducer != NULL );
- assert( Hostname != NULL );
+ assert(Idx >= NONE);
+ assert(Introducer != NULL);
+ assert(Hostname != NULL);
- client = New_Client_Struct( );
- if( ! client ) return NULL;
+ client = New_Client_Struct();
+ if (!client)
+ return NULL;
- /* Initialisieren */
client->starttime = time(NULL);
client->conn_id = Idx;
client->introducer = Introducer;
client->topserver = TopServer;
client->type = Type;
- if( ID ) Client_SetID( client, ID );
- if( User ) Client_SetUser( client, User, Idented );
- if( Hostname ) Client_SetHostname( client, Hostname );
- if( Info ) Client_SetInfo( client, Info );
+ if (ID)
+ Client_SetID(client, ID);
+ if (User)
+ Client_SetUser(client, User, Idented);
+ if (Hostname)
+ Client_SetHostname(client, Hostname);
+ if (Info)
+ Client_SetInfo(client, Info);
client->hops = Hops;
client->token = Token;
- if( Modes ) Client_SetModes( client, Modes );
- if( Type == CLIENT_SERVER ) Generate_MyToken( client );
+ if (Modes)
+ Client_SetModes(client, Modes);
+ if (Type == CLIENT_SERVER)
+ Generate_MyToken(client);
- if( strchr( client->modes, 'a' ))
- strlcpy( client->away, DEFAULT_AWAY_MSG, sizeof( client->away ));
+ if (strchr(client->modes, 'a'))
+ strlcpy(client->away, DEFAULT_AWAY_MSG, sizeof(client->away));
- /* Verketten */
client->next = (POINTER *)My_Clients;
My_Clients = client;
- /* Adjust counters */
- Adjust_Counters( client );
+ Adjust_Counters(client);
return client;
} /* Init_New_Client */
GLOBAL void
-Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit )
+Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool SendQuit )
{
- /* Client entfernen. */
+ /* remove a client */
CLIENT *last, *c;
- char msg[LINE_LEN], *txt;
+ char msg[LINE_LEN];
+ const char *txt;
assert( Client != NULL );
else txt = FwdMsg;
if( ! txt ) txt = "Reason unknown.";
- /* Netz-Split-Nachricht vorbereiten (noch nicht optimal) */
+ /* netsplit message */
if( Client->type == CLIENT_SERVER ) {
strlcpy(msg, This_Server->id, sizeof (msg));
strlcat(msg, " ", sizeof (msg));
{
if(( Client->type == CLIENT_SERVER ) && ( c->introducer == Client ) && ( c != Client ))
{
- /* der Client, der geloescht wird ist ein Server. Der Client, den wir gerade
- * pruefen, ist ein Child von diesem und muss daher auch entfernt werden */
+ /*
+ * The client that is about to be removed is a server,
+ * the client we are checking right now is a child of that
+ * server and thus has to be removed, too.
+ *
+ * Call Client_Destroy() recursively with the server as the
+ * new "object to be removed". This starts the cycle again, until
+ * all servers that are linked via the original server have been
+ * removed.
+ */
Client_Destroy( c, NULL, msg, false );
last = NULL;
c = My_Clients;
}
if( c == Client )
{
- /* Wir haben den Client gefunden: entfernen */
+ /* found the client: remove it */
if( last ) last->next = c->next;
else My_Clients = (CLIENT *)c->next;
else Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" unregistered: %s", c->id, txt );
}
- /* andere Server informieren */
+ /* inform other servers */
if( ! NGIRCd_SignalQuit )
{
if( FwdMsg ) IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "SQUIT %s :%s", c->id, FwdMsg );
GLOBAL void
-Client_SetHostname( CLIENT *Client, char *Hostname )
+Client_SetHostname( CLIENT *Client, const char *Hostname )
{
- /* Hostname eines Clients setzen */
-
assert( Client != NULL );
assert( Hostname != NULL );
GLOBAL void
-Client_SetID( CLIENT *Client, char *ID )
+Client_SetID( CLIENT *Client, const char *ID )
{
- /* Hostname eines Clients setzen, Hash-Wert berechnen */
-
assert( Client != NULL );
assert( ID != NULL );
GLOBAL void
-Client_SetUser( CLIENT *Client, char *User, bool Idented )
+Client_SetUser( CLIENT *Client, const char *User, bool Idented )
{
- /* Username eines Clients setzen */
+ /* set clients username */
assert( Client != NULL );
assert( User != NULL );
- if( Idented ) strlcpy( Client->user, User, sizeof( Client->user ));
- else
- {
+ if (Idented) {
+ strlcpy(Client->user, User, sizeof(Client->user));
+ } else {
Client->user[0] = '~';
- strlcpy( Client->user + 1, User, sizeof( Client->user ) - 1 );
+ strlcpy(Client->user + 1, User, sizeof(Client->user) - 1);
}
} /* Client_SetUser */
GLOBAL void
-Client_SetInfo( CLIENT *Client, char *Info )
+Client_SetInfo( CLIENT *Client, const char *Info )
{
- /* Hostname eines Clients setzen */
+ /* set client hostname */
assert( Client != NULL );
assert( Info != NULL );
- strlcpy( Client->info, Info, sizeof( Client->info ));
+ strlcpy(Client->info, Info, sizeof(Client->info));
} /* Client_SetInfo */
GLOBAL void
-Client_SetModes( CLIENT *Client, char *Modes )
+Client_SetModes( CLIENT *Client, const char *Modes )
{
- /* Modes eines Clients setzen */
-
assert( Client != NULL );
assert( Modes != NULL );
- strlcpy( Client->modes, Modes, sizeof( Client->modes ));
+ strlcpy(Client->modes, Modes, sizeof( Client->modes ));
} /* Client_SetModes */
GLOBAL void
-Client_SetFlags( CLIENT *Client, char *Flags )
+Client_SetFlags( CLIENT *Client, const char *Flags )
{
- /* Flags eines Clients setzen */
-
assert( Client != NULL );
assert( Flags != NULL );
- strlcpy( Client->flags, Flags, sizeof( Client->flags ));
+ strlcpy(Client->flags, Flags, sizeof(Client->flags));
} /* Client_SetFlags */
GLOBAL void
-Client_SetPassword( CLIENT *Client, char *Pwd )
+Client_SetPassword( CLIENT *Client, const char *Pwd )
{
- /* Von einem Client geliefertes Passwort */
+ /* set password sent by client */
assert( Client != NULL );
assert( Pwd != NULL );
- strlcpy( Client->pwd, Pwd, sizeof( Client->pwd ));
+ strlcpy(Client->pwd, Pwd, sizeof(Client->pwd));
} /* Client_SetPassword */
GLOBAL void
-Client_SetAway( CLIENT *Client, char *Txt )
+Client_SetAway( CLIENT *Client, const char *Txt )
{
/* Set AWAY reason of client */
assert( Client != NULL );
x[0] = Mode; x[1] = '\0';
- if( ! strchr( Client->modes, x[0] ))
- {
- /* Client hat den Mode noch nicht -> setzen */
+ if (!strchr( Client->modes, x[0])) {
strlcat( Client->modes, x, sizeof( Client->modes ));
return true;
}
ptr = strchr( search_id, '!' );
if( ptr ) *ptr = '\0';
- search_hash = Hash( search_id );
+ search_hash = Hash(search_id);
c = My_Clients;
- while( c )
- {
- if( c->hash == search_hash )
- {
- /* lt. Hash-Wert: Treffer! */
- if( strcasecmp( c->id, search_id ) == 0 ) return c;
- }
+ while (c) {
+ if (c->hash == search_hash && strcasecmp(c->id, search_id) == 0)
+ return c;
c = (CLIENT *)c->next;
}
return NULL;
assert( Token > 0 );
c = My_Clients;
- while( c )
- {
- if(( c->type == CLIENT_SERVER ) && ( c->introducer == Client ) && ( c->token == Token )) return c;
+ while (c) {
+ if ((c->type == CLIENT_SERVER) && (c->introducer == Client) &&
+ (c->token == Token))
+ return c;
c = (CLIENT *)c->next;
}
return NULL;
} /* Client_NextHop */
+/**
+ * return Client-ID ("client!user@host"), this ID is needed for e.g.
+ * prefixes. Returnes pointer to static buffer.
+ */
GLOBAL char *
Client_Mask( CLIENT *Client )
{
- /* Client-"ID" liefern, wie sie z.B. fuer
- * Prefixe benoetigt wird. */
+ static char GetID_Buffer[GETID_LEN];
assert( Client != NULL );
if( Client->type == CLIENT_SERVER ) return Client->id;
- snprintf( GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host );
+ snprintf(GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host);
return GetID_Buffer;
} /* Client_Mask */
GLOBAL char *
Client_Away( CLIENT *Client )
{
- /* AWAY-Text liefern */
-
assert( Client != NULL );
return Client->away;
} /* Client_Away */
assert( Client != NULL );
assert( Nick != NULL );
- if( ! Client_IsValidNick( Nick ))
+ if (! Client_IsValidNick( Nick ))
{
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
return false;
GLOBAL bool
Client_CheckID( CLIENT *Client, char *ID )
{
- /* Nick ueberpruefen */
-
char str[COMMAND_LEN];
CLIENT *c;
assert( Client->conn_id > NONE );
assert( ID != NULL );
- /* Nick zu lang? */
- if( strlen( ID ) > CLIENT_ID_LEN )
- {
- IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), ID );
+ /* ID too long? */
+ if (strlen(ID) > CLIENT_ID_LEN) {
+ IRC_WriteStrClient(Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID(Client), ID);
return false;
}
- /* ID bereits vergeben? */
+ /* ID already in use? */
c = My_Clients;
- while( c )
- {
- if( strcasecmp( c->id, ID ) == 0 )
- {
- /* die Server-ID gibt es bereits */
- snprintf( str, sizeof( str ), "ID \"%s\" already registered", ID );
- if( Client->conn_id != c->conn_id ) Log( LOG_ERR, "%s (on connection %d)!", str, c->conn_id );
- else Log( LOG_ERR, "%s (via network)!", str );
- Conn_Close( Client->conn_id, str, str, true);
+ while (c) {
+ if (strcasecmp(c->id, ID) == 0) {
+ snprintf(str, sizeof(str), "ID \"%s\" already registered", ID);
+ if (c->conn_id != NONE)
+ Log(LOG_ERR, "%s (on connection %d)!", str, c->conn_id);
+ else
+ Log(LOG_ERR, "%s (via network)!", str);
+ Conn_Close(Client->conn_id, str, str, true);
return false;
}
c = (CLIENT *)c->next;
GLOBAL CLIENT *
Client_First( void )
{
- /* Ersten Client liefern. */
-
return My_Clients;
} /* Client_First */
GLOBAL CLIENT *
Client_Next( CLIENT *c )
{
- /* Naechsten Client liefern. Existiert keiner,
- * so wird NULL geliefert. */
-
assert( c != NULL );
return (CLIENT *)c->next;
} /* Client_Next */
* Destroy user or service client.
*/
static void
-Destroy_UserOrService(CLIENT *Client, char *Txt, char *FwdMsg, bool SendQuit)
+Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool SendQuit)
{
if(Client->conn_id != NONE) {
/* Local (directly connected) client */