]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/client.c
New function Conn_IPA(): get client IP address as string
[ngircd-alex.git] / src / ngircd / client.c
index 5ad412217e98eb615927d0620e8945d8c78030de..c565830a6b82957c8cc0287046c2175b7459b60c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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
@@ -181,42 +181,46 @@ Client_NewRemoteUser(CLIENT *Introducer, const char *Nick, int Hops, const char
  */
 static CLIENT *
 Init_New_Client(CONN_ID Idx, CLIENT *Introducer, 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)
 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 */
@@ -225,7 +229,7 @@ Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
 GLOBAL void
 Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool SendQuit )
 {
-       /* Client entfernen. */
+       /* remove a client */
        
        CLIENT *last, *c;
        char msg[LINE_LEN];
@@ -237,7 +241,7 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
        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));
@@ -250,8 +254,16 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
        {
                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;
@@ -259,7 +271,7 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
                }
                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;
 
@@ -273,7 +285,7 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
                                        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 );
@@ -753,18 +765,18 @@ Client_CheckID( CLIENT *Client, char *ID )
        assert( Client->conn_id > NONE );
        assert( ID != NULL );
 
-       /* Nick too long? */
+       /* ID too long? */
        if (strlen(ID) > CLIENT_ID_LEN) {
                IRC_WriteStrClient(Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID(Client), ID);
                return false;
        }
 
-       /* does ID already exist? */
+       /* ID already in use? */
        c = My_Clients;
        while (c) {
                if (strcasecmp(c->id, ID) == 0) {
                        snprintf(str, sizeof(str), "ID \"%s\" already registered", ID);
-                       if (Client->conn_id != c->conn_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);