about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/ngircd/client.c40
-rw-r--r--src/ngircd/client.h5
-rw-r--r--src/ngircd/irc-info.c4
-rw-r--r--src/ngircd/irc-login.c2
4 files changed, 48 insertions, 3 deletions
diff --git a/src/ngircd/client.c b/src/ngircd/client.c
index 72774ca9..26d4929d 100644
--- a/src/ngircd/client.c
+++ b/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, const char *FwdMsg, bool Sen
 				free(c->account_name);
 			if (c->cloaked)
 				free(c->cloaked);
+			if (c->ipa_text)
+				free(c->ipa_text);
 			free( c );
 			break;
 		}
@@ -368,6 +372,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 +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.
  *
diff --git a/src/ngircd/client.h b/src/ngircd/client.h
index 702f114c..71d413b2 100644
--- a/src/ngircd/client.h
+++ b/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, 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 ));
diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c
index 47a37979..3d77237f 100644
--- a/src/ngircd/irc-info.c
+++ b/src/ngircd/irc-info.c
@@ -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,
diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c
index 26dae6b7..88804ef2 100644
--- a/src/ngircd/irc-login.c
+++ b/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 */