]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Merge branch 'bug159-WebircIPA'
authorAlexander Barton <alex@barton.de>
Mon, 26 Aug 2013 21:22:20 +0000 (23:22 +0200)
committerAlexander Barton <alex@barton.de>
Mon, 26 Aug 2013 21:22:20 +0000 (23:22 +0200)
* bug159-WebircIPA:
  Introduce Free_Client() function to free CLIENT structure
  Save client IP address text for "WebIRC" users

src/ngircd/client.c
src/ngircd/client.h
src/ngircd/irc-info.c
src/ngircd/irc-login.c

index 72774ca9f4c749449d40a9344393aa3f6eef54b0..2835b46f51f7bc6d19e59894f5bb43d8cef4cfcd 100644 (file)
@@ -62,6 +62,8 @@ static CLIENT *New_Client_Struct PARAMS(( void ));
 static void Generate_MyToken PARAMS(( CLIENT *Client ));
 static void Adjust_Counters PARAMS(( CLIENT *Client ));
 
+static void Free_Client PARAMS(( CLIENT **Client ));
+
 static CLIENT *Init_New_Client PARAMS((CONN_ID Idx, CLIENT *Introducer,
                                       CLIENT *TopServer, int Type, const char *ID,
                                       const char *User, const char *Hostname, const char *Info,
@@ -120,18 +122,15 @@ Client_Exit( void )
        
        cnt = 0;
        c = My_Clients;
-       while( c )
-       {
+       while(c) {
                cnt++;
                next = (CLIENT *)c->next;
-               if (c->account_name)
-                       free(c->account_name);
-               if (c->cloaked)
-                       free(c->cloaked);
-               free( c );
+               Free_Client(&c);
                c = next;
        }
-       if( cnt ) Log( LOG_INFO, "Freed %d client structure%s.", cnt, cnt == 1 ? "" : "s" );
+       if (cnt)
+               Log(LOG_INFO, "Freed %d client structure%s.",
+                   cnt, cnt == 1 ? "" : "s");
 } /* Client_Exit */
 
 
@@ -322,11 +321,7 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
                                }
                        }
 
-                       if (c->account_name)
-                               free(c->account_name);
-                       if (c->cloaked)
-                               free(c->cloaked);
-                       free( c );
+                       Free_Client(&c);
                        break;
                }
                last = c;
@@ -368,6 +363,27 @@ Client_SetHostname( CLIENT *Client, const char *Hostname )
 } /* Client_SetHostname */
 
 
+/**
+ * Set IP address to display for a client.
+ *
+ * @param Client The client.
+ * @param IPAText Textual representation of the IP address or NULL to unset.
+ */
+GLOBAL void
+Client_SetIPAText(CLIENT *Client, const char *IPAText)
+{
+       assert(Client != NULL);
+
+       if (Client->ipa_text)
+               free(Client->ipa_text);
+
+       if (*IPAText)
+               Client->ipa_text = strndup(IPAText, CLIENT_HOST_LEN - 1);
+       else
+               Client->ipa_text = NULL;
+}
+
+
 GLOBAL void
 Client_SetID( CLIENT *Client, const char *ID )
 {
@@ -789,6 +805,21 @@ Client_HostnameDisplayed(CLIENT *Client)
        return Client->cloaked;
 }
 
+GLOBAL const char *
+Client_IPAText(CLIENT *Client)
+{
+       assert(Client != NULL);
+
+       /* Not a local client? */
+       if (Client_Conn(Client) <= NONE)
+               return "0.0.0.0";
+
+       if (!Client->ipa_text)
+               return Conn_GetIPAInfo(Client_Conn(Client));
+       else
+               return Client->ipa_text;
+}
+
 /**
  * Update (and generate, if necessary) the cloaked hostname of a client.
  *
@@ -1370,6 +1401,11 @@ MyCount( CLIENT_TYPE Type )
 } /* MyCount */
 
 
+/**
+ * Allocate and initialize new CLIENT strcuture.
+ *
+ * @return Pointer to CLIENT structure or NULL on error.
+ */
 static CLIENT *
 New_Client_Struct( void )
 {
@@ -1392,8 +1428,27 @@ New_Client_Struct( void )
        c->mytoken = -1;
 
        return c;
-} /* New_Client */
+}
 
+/**
+ * Free a CLIENT structure and its member variables.
+ */
+static void
+Free_Client(CLIENT **Client)
+{
+       assert(Client != NULL);
+       assert(*Client != NULL);
+
+       if ((*Client)->account_name)
+               free((*Client)->account_name);
+       if ((*Client)->cloaked)
+               free((*Client)->cloaked);
+       if ((*Client)->ipa_text)
+               free((*Client)->ipa_text);
+
+       free(*Client);
+       *Client = NULL;
+}
 
 static void
 Generate_MyToken( CLIENT *Client )
index 702f114cf0f484d773f6d237d81a2152cbbb03f5..71d413b2f01be419f8c72c997cb33ca620e01a7e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
  *
  * 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
@@ -49,6 +49,7 @@ typedef struct _CLIENT
        struct _CLIENT *topserver;      /* toplevel servers (only valid if client is a server) */
        char host[CLIENT_HOST_LEN];     /* hostname of the client */
        char *cloaked;                  /* cloaked hostname of the client */
+       char *ipa_text;                 /* textual representaton of IP address */
        char user[CLIENT_USER_LEN];     /* user name ("login") */
 #if defined(PAM) && defined(IDENTAUTH)
        char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */
@@ -114,6 +115,7 @@ GLOBAL char *Client_OrigUser PARAMS(( CLIENT *Client ));
 GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
 GLOBAL char *Client_HostnameCloaked PARAMS((CLIENT *Client));
 GLOBAL char *Client_HostnameDisplayed PARAMS(( CLIENT *Client ));
+GLOBAL const char *Client_IPAText PARAMS(( CLIENT *Client ));
 GLOBAL char *Client_Modes PARAMS(( CLIENT *Client ));
 GLOBAL char *Client_Flags PARAMS(( CLIENT *Client ));
 GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client ));
@@ -131,6 +133,7 @@ GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, char Mode ));
 GLOBAL bool Client_HasFlag PARAMS(( CLIENT *Client, char Flag ));
 
 GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, const char *Hostname ));
+GLOBAL void Client_SetIPAText PARAMS(( CLIENT *Client, const char *IPAText ));
 GLOBAL void Client_SetID PARAMS(( CLIENT *Client, const char *Nick ));
 GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented ));
 GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User ));
index 47a3797974a0d8c9f511c86b32055aa30b4f60fb..3d77237f4e08f95928d826462734dafc3f19e759 100644 (file)
@@ -407,8 +407,8 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
            (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) {
                /* Client hostname */
                if (!IRC_WriteStrClient(from, RPL_WHOISHOST_MSG,
-                                       Client_ID(from), Client_ID(c), Client_Hostname(c),
-                                       Conn_GetIPAInfo(Client_Conn(c))))
+                                       Client_ID(from), Client_ID(c),
+                                       Client_Hostname(c), Client_IPAText(c)))
                        return DISCONNECTED;
                /* Client modes */
                if (!IRC_WriteStrClient(from, RPL_WHOISMODES_MSG,
index 26dae6b73b2826ca82a47d2263f4f7b6607fe7d6..88804ef2b8b7dd1f95b71522ebc2ff3b84496827 100644 (file)
@@ -610,6 +610,8 @@ IRC_WEBIRC(CLIENT *Client, REQUEST *Req)
        Client_SetUser(Client, Req->argv[1], true);
        Client_SetOrigUser(Client, Req->argv[1]);
        Client_SetHostname(Client, Req->argv[2]);
+       Client_SetIPAText(Client, Req->argv[3]);
+
        return CONNECTED;
 } /* IRC_WEBIRC */