#include "portab.h"
-static char UNUSED id[] = "$Id: client.c,v 1.87 2006/03/11 01:37:31 alex Exp $";
+static char UNUSED id[] = "$Id: client.c,v 1.97 2007/11/21 12:16:36 alex Exp $";
#include "imp.h"
#include <assert.h>
static int Last_Whowas = -1;
-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 ));
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;
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 );
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;
{
if( c->id[0] ) Log( LOG_NOTICE, "Client \"%s\" unregistered (connection %d): %s", c->id, c->conn_id, txt );
else Log( LOG_NOTICE, "Client unregistered (connection %d): %s", c->conn_id, txt );
- }
- else
- {
- if( c->id[0] ) Log( LOG_WARNING, "Unregistered unknown client \"%s\": %s", c->id, txt );
- else Log( LOG_WARNING, "Unregistered unknown client: %s", c->id, txt );
+ } else {
+ Log(LOG_WARNING, "Unregistered unknown client \"%s\": %s",
+ c->id[0] ? c->id : "(No Nick)", txt );
}
}
} /* 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 */
assert( Client != NULL );
assert( User != NULL );
-
+
if( Idented ) strlcpy( Client->user, User, sizeof( Client->user ));
else
{
assert( Client != NULL );
assert( Info != NULL );
-
+
strlcpy( Client->info, Info, sizeof( Client->info ));
} /* Client_SetInfo */
assert( Client != NULL );
assert( Pwd != NULL );
-
+
strlcpy( Client->pwd, Pwd, sizeof( Client->pwd ));
} /* Client_SetPassword */
*/
char x[2];
-
+
assert( Client != NULL );
x[0] = Mode; x[1] = '\0';
} /* Client_ModeDel */
-GLOBAL CLIENT *
-Client_GetFromConn( CONN_ID Idx )
-{
- /* return Client-Structure that belongs to the local Connection Idx gehoert.
- * 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 )
{
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;
Client_User( CLIENT *Client )
{
assert( Client != NULL );
- if( Client->user[0] ) return Client->user;
- else return "~";
+ return Client->user[0] ? Client->user : "~";
} /* Client_User */
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 */
* 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 );
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 );
} /* 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 )
{
} /* 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 )
{
} /* 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 */
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 */
} /* 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 )
{
} /* 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 )
{
New_Client_Struct( void )
{
/* Neue CLIENT-Struktur pre-initialisieren */
-
+
CLIENT *c;
-
+
c = (CLIENT *)malloc( sizeof( CLIENT ));
if( ! c )
{
assert( Client != NULL );
if( Client->type != CLIENT_USER ) return;
-
+
if( Client->conn_id != NONE )
{
/* Local connection */
Client_RegisterWhowas( CLIENT *Client )
{
int slot;
-
+ time_t now;
+
assert( Client != NULL );
+ now = time(NULL);
/* Don't register clients that were connected less than 30 seconds. */
- if( time(NULL) - Client->starttime < 30 )
+ if( now - Client->starttime < 30 )
return;
slot = Last_Whowas + 1;
#ifdef DEBUG
Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot );
#endif
-
- My_Whowas[slot].time = time( NULL );
+
+ My_Whowas[slot].time = now;
strlcpy( My_Whowas[slot].id, Client_ID( Client ),
sizeof( My_Whowas[slot].id ));
strlcpy( My_Whowas[slot].user, Client_User( 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 */