Commit Diff


commit - 3b65f4e38d1ab019513f16b70581ae10574006e8
commit + 1dc93286a0d5b80259604b4f25021fcc5a730b5b
blob - 72774ca9f4c749449d40a9344393aa3f6eef54b0
blob + 26d4929d732b04ecaaef3c24527465fafbe94160
--- src/ngircd/client.c
+++ src/ngircd/client.c
@@ -128,6 +128,8 @@ Client_Exit( void )
 			free(c->account_name);
 		if (c->cloaked)
 			free(c->cloaked);
+		if (c->ipa_text)
+			free(c->ipa_text);
 		free( c );
 		c = next;
 	}
@@ -326,6 +328,8 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, co
 				free(c->account_name);
 			if (c->cloaked)
 				free(c->cloaked);
+			if (c->ipa_text)
+				free(c->ipa_text);
 			free( c );
 			break;
 		}
@@ -366,6 +370,27 @@ Client_SetHostname( CLIENT *Client, const char *Hostna
 		strlcpy(Client->host, Hostname, sizeof(Client->host));
 	}
 } /* 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
@@ -789,6 +814,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.
  *
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 */