Commit Diff


commit - 2bacb8210b4f0807eb50587bcc4329c7ea7a50c3
commit + 44698e44e8a9bf9f3a1211e10b4d59e00be5864f
blob - 72774ca9f4c749449d40a9344393aa3f6eef54b0
blob + 2835b46f51f7bc6d19e59894f5bb43d8cef4cfcd
--- src/ngircd/client.c
+++ src/ngircd/client.c
@@ -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, co
 				}
 			}
 
-			if (c->account_name)
-				free(c->account_name);
-			if (c->cloaked)
-				free(c->cloaked);
-			free( c );
+			Free_Client(&c);
 			break;
 		}
 		last = c;
@@ -368,7 +363,28 @@ Client_SetHostname( CLIENT *Client, const char *Hostna
 } /* 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 )
 {
 	assert( Client != NULL );
@@ -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,9 +1428,28 @@ 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 )
 {
blob - 702f114cf0f484d773f6d237d81a2152cbbb03f5
blob + 71d413b2f01be419f8c72c997cb33ca620e01a7e
--- src/ngircd/client.h
+++ src/ngircd/client.h
@@ -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, ch
 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 ));
blob - 47a3797974a0d8c9f511c86b32055aa30b4f60fb
blob + 3d77237f4e08f95928d826462734dafc3f19e759
--- src/ngircd/irc-info.c
+++ src/ngircd/irc-info.c
@@ -407,8 +407,8 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIE
 	    (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,
blob - 26dae6b73b2826ca82a47d2263f4f7b6607fe7d6
blob + 88804ef2b8b7dd1f95b71522ebc2ff3b84496827
--- src/ngircd/irc-login.c
+++ src/ngircd/irc-login.c
@@ -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 */