X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fclient.c;h=1b72adc8bb92a49db74855f611d94ed873545f80;hp=30e214c440c74f95a2b563e313884884ae9a3498;hb=98a8ea105cccd0607f7f2949602580104c098d84;hpb=bebfbedf3fdf801a028c17a5b4395f705391462d diff --git a/src/ngircd/client.c b/src/ngircd/client.c index 30e214c4..1b72adc8 100644 --- a/src/ngircd/client.c +++ b/src/ngircd/client.c @@ -17,7 +17,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: client.c,v 1.90 2006/03/24 23:25:38 fw Exp $"; +static char UNUSED id[] = "$Id: client.c,v 1.98 2008/04/04 19:30:01 fw Exp $"; #include "imp.h" #include @@ -55,10 +55,11 @@ static char GetID_Buffer[GETID_LEN]; static WHOWAS My_Whowas[MAX_WHOWAS]; static int Last_Whowas = -1; +static long Max_Users, My_Max_Users; -static long Count PARAMS(( CLIENT_TYPE Type )); -static long MyCount PARAMS(( CLIENT_TYPE Type )); +static unsigned long Count PARAMS(( CLIENT_TYPE Type )); +static unsigned long MyCount PARAMS(( CLIENT_TYPE Type )); static CLIENT *New_Client_Struct PARAMS(( void )); static void Generate_MyToken PARAMS(( CLIENT *Client )); @@ -68,13 +69,6 @@ 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, bool Idented)); -#ifndef Client_DestroyNow -GLOBAL void Client_DestroyNow PARAMS((CLIENT *Client )); -#endif - - -long Max_Users = 0, My_Max_Users = 0; - GLOBAL void Client_Init( void ) @@ -98,9 +92,10 @@ Client_Init( void ) This_Server->hops = 0; gethostname( This_Server->host, CLIENT_HOST_LEN ); - h = gethostbyname( This_Server->host ); - if( h ) strlcpy( This_Server->host, h->h_name, sizeof( This_Server->host )); - + if (!Conf_NoDNS) { + h = gethostbyname( This_Server->host ); + if (h) strlcpy(This_Server->host, h->h_name, sizeof(This_Server->host)); + } Client_SetID( This_Server, Conf_ServerName ); Client_SetInfo( This_Server, Conf_ServerInfo ); @@ -211,8 +206,8 @@ Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, if( Modes ) Client_SetModes( client, Modes ); if( Type == CLIENT_SERVER ) Generate_MyToken( client ); - /* ist der User away? */ - 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; @@ -336,43 +331,14 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *FwdMsg, bool SendQuit ) } /* Client_Destroy */ -GLOBAL void -Client_DestroyNow( CLIENT *Client ) -{ - /* Destroy client structure immediately. This function is only - * intended for the connection layer to remove client structures - * of connections that can't be established! */ - - CLIENT *last, *c; - - assert( Client != NULL ); - - last = NULL; - c = My_Clients; - while( c ) - { - if( c == Client ) - { - /* Wir haben den Client gefunden: entfernen */ - if( last ) last->next = c->next; - else My_Clients = (CLIENT *)c->next; - free( c ); - break; - } - last = c; - c = (CLIENT *)c->next; - } -} /* Client_DestroyNow */ - - GLOBAL void Client_SetHostname( CLIENT *Client, char *Hostname ) { /* Hostname eines Clients setzen */ - + assert( Client != NULL ); assert( Hostname != NULL ); - + strlcpy( Client->host, Hostname, sizeof( Client->host )); } /* Client_SetHostname */ @@ -399,7 +365,7 @@ Client_SetUser( CLIENT *Client, char *User, bool Idented ) assert( Client != NULL ); assert( User != NULL ); - + if( Idented ) strlcpy( Client->user, User, sizeof( Client->user )); else { @@ -416,7 +382,7 @@ Client_SetInfo( CLIENT *Client, char *Info ) assert( Client != NULL ); assert( Info != NULL ); - + strlcpy( Client->info, Info, sizeof( Client->info )); } /* Client_SetInfo */ @@ -452,7 +418,7 @@ Client_SetPassword( CLIENT *Client, char *Pwd ) assert( Client != NULL ); assert( Pwd != NULL ); - + strlcpy( Client->pwd, Pwd, sizeof( Client->pwd )); } /* Client_SetPassword */ @@ -522,7 +488,7 @@ Client_ModeAdd( CLIENT *Client, char Mode ) */ char x[2]; - + assert( Client != NULL ); x[0] = Mode; x[1] = '\0'; @@ -564,28 +530,7 @@ Client_ModeDel( CLIENT *Client, char Mode ) GLOBAL CLIENT * -Client_GetFromConn( CONN_ID Idx ) -{ - /* return Client-Structure that belongs to the local Connection Idx. - * If none is found, return NULL. - */ - - CLIENT *c; - - assert( Idx >= 0 ); - - c = My_Clients; - while( c ) - { - if( c->conn_id == Idx ) return c; - c = (CLIENT *)c->next; - } - return NULL; -} /* Client_GetFromConn */ - - -GLOBAL CLIENT * -Client_Search( char *Nick ) +Client_Search( const char *Nick ) { /* return Client-Structure that has the corresponding Nick. * If none is found, return NULL. @@ -662,7 +607,8 @@ Client_ID( CLIENT *Client ) assert( Client != NULL ); #ifdef DEBUG - if( Client->type == CLIENT_USER ) assert( strlen( Client->id ) < CLIENT_NICK_LEN ); + if(Client->type == CLIENT_USER) + assert(strlen(Client->id) < Conf_MaxNickLength); #endif if( Client->id[0] ) return Client->id; @@ -682,8 +628,7 @@ GLOBAL char * Client_User( CLIENT *Client ) { assert( Client != NULL ); - if( Client->user[0] ) return Client->user; - else return "~"; + return Client->user[0] ? Client->user : "~"; } /* Client_User */ @@ -755,11 +700,13 @@ GLOBAL CLIENT * Client_NextHop( CLIENT *Client ) { CLIENT *c; - + assert( Client != NULL ); c = Client; - while( c->introducer && ( c->introducer != c ) && ( c->introducer != This_Server )) c = c->introducer; + while( c->introducer && ( c->introducer != c ) && ( c->introducer != This_Server )) + c = c->introducer; + return c; } /* Client_NextHop */ @@ -771,7 +718,7 @@ Client_Mask( CLIENT *Client ) * Prefixe benoetigt wird. */ 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 ); @@ -816,12 +763,9 @@ Client_Away( CLIENT *Client ) GLOBAL bool Client_CheckNick( CLIENT *Client, char *Nick ) { - /* Nick ueberpruefen */ - assert( Client != NULL ); assert( Nick != NULL ); - - /* Nick ungueltig? */ + if( ! Client_IsValidNick( Nick )) { IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick ); @@ -934,13 +878,12 @@ Client_MyServiceCount( void ) } /* Client_MyServiceCount */ -GLOBAL long +GLOBAL unsigned long Client_MyServerCount( void ) { CLIENT *c; - long cnt; + unsigned long cnt = 0; - cnt = 0; c = My_Clients; while( c ) { @@ -951,13 +894,12 @@ Client_MyServerCount( void ) } /* Client_MyServerCount */ -GLOBAL long +GLOBAL unsigned long Client_OperCount( void ) { CLIENT *c; - long cnt; + unsigned long cnt = 0; - cnt = 0; c = My_Clients; while( c ) { @@ -968,19 +910,19 @@ Client_OperCount( void ) } /* Client_OperCount */ -GLOBAL long +GLOBAL unsigned long Client_UnknownCount( void ) { CLIENT *c; - long cnt; + unsigned long cnt = 0; - cnt = 0; c = My_Clients; while( c ) { if( c && ( c->type != CLIENT_USER ) && ( c->type != CLIENT_SERVICE ) && ( c->type != CLIENT_SERVER )) cnt++; c = (CLIENT *)c->next; } + return cnt; } /* Client_UnknownCount */ @@ -1000,28 +942,25 @@ Client_MyMaxUserCount( void ) GLOBAL bool -Client_IsValidNick( char *Nick ) +Client_IsValidNick( const char *Nick ) { - /* Ist der Nick gueltig? */ + const char *ptr; + static const char goodchars[] = ";0123456789-"; - char *ptr, goodchars[20]; - assert( Nick != NULL ); - strcpy( goodchars, ";0123456789-" ); - if( Nick[0] == '#' ) return false; if( strchr( goodchars, Nick[0] )) return false; - if( strlen( Nick ) >= CLIENT_NICK_LEN ) return false; + if( strlen( Nick ) >= Conf_MaxNickLength) return false; ptr = Nick; while( *ptr ) { - if(( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false; - if(( *ptr > '}' ) && ( ! strchr( goodchars, *ptr ))) return false; + if (( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false; + if ( *ptr > '}' ) return false; ptr++; } - + return true; } /* Client_IsValidNick */ @@ -1058,13 +997,12 @@ Client_StartTime(CLIENT *Client) } /* Client_Uptime */ -static long +static unsigned long Count( CLIENT_TYPE Type ) { CLIENT *c; - long cnt; + unsigned long cnt = 0; - cnt = 0; c = My_Clients; while( c ) { @@ -1075,13 +1013,12 @@ Count( CLIENT_TYPE Type ) } /* Count */ -static long +static unsigned long MyCount( CLIENT_TYPE Type ) { CLIENT *c; - long cnt; + unsigned long cnt = 0; - cnt = 0; c = My_Clients; while( c ) { @@ -1096,9 +1033,9 @@ static CLIENT * New_Client_Struct( void ) { /* Neue CLIENT-Struktur pre-initialisieren */ - + CLIENT *c; - + c = (CLIENT *)malloc( sizeof( CLIENT )); if( ! c ) { @@ -1151,7 +1088,7 @@ Adjust_Counters( CLIENT *Client ) assert( Client != NULL ); if( Client->type != CLIENT_USER ) return; - + if( Client->conn_id != NONE ) { /* Local connection */ @@ -1174,7 +1111,7 @@ Client_RegisterWhowas( CLIENT *Client ) { int slot; time_t now; - + assert( Client != NULL ); now = time(NULL); @@ -1188,7 +1125,7 @@ Client_RegisterWhowas( CLIENT *Client ) #ifdef DEBUG Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot ); #endif - + My_Whowas[slot].time = now; strlcpy( My_Whowas[slot].id, Client_ID( Client ), sizeof( My_Whowas[slot].id )); @@ -1200,7 +1137,7 @@ Client_RegisterWhowas( CLIENT *Client ) sizeof( My_Whowas[slot].info )); strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )), sizeof( My_Whowas[slot].server )); - + Last_Whowas = slot; } /* Client_RegisterWhowas */