]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/client.c
New configuration option "NoZeroConf" to disable ZeroConf registration
[ngircd-alex.git] / src / ngircd / client.c
index 8402499936e02c530f81592c3c385a0e1f85a947..033478356ea2e9ddadc963fc2493476ad0b86810 100644 (file)
@@ -363,7 +363,7 @@ Client_SetUser( CLIENT *Client, const char *User, bool Idented )
  * @param User User name to set.
  */
 GLOBAL void
-Client_SetOrigUser(CLIENT *Client, const char *User) {
+Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User) {
        assert(Client != NULL);
        assert(User != NULL);
 
@@ -647,14 +647,36 @@ Client_OrigUser(CLIENT *Client) {
 #endif
 
 
+/**
+ * Return the hostname of a client.
+ * @param Client Pointer to client structure
+ * @return Pointer to client hostname
+ */
 GLOBAL char *
-Client_Hostname( CLIENT *Client )
+Client_Hostname(CLIENT *Client)
 {
-       assert( Client != NULL );
+       assert (Client != NULL);
        return Client->host;
 } /* Client_Hostname */
 
 
+/**
+ * Get potentially cloaked hostname of a client.
+ * If the client has not enabled cloaking, the real hostname is used.
+ * @param Client Pointer to client structure
+ * @return Pointer to client hostname
+ */
+GLOBAL char *
+Client_HostnameCloaked(CLIENT *Client)
+{
+       assert(Client != NULL);
+       if (Client_HasMode(Client, 'x'))
+               return Client_ID(Client->introducer);
+       else
+               return Client_Hostname(Client);
+} /* Client_HostnameCloaked */
+
+
 GLOBAL char *
 Client_Password( CLIENT *Client )
 {
@@ -727,23 +749,56 @@ Client_NextHop( CLIENT *Client )
 
 
 /**
- * return Client-ID ("client!user@host"), this ID is needed for e.g.
- * prefixes.  Returnes pointer to static buffer.
+ * Return ID of a client: "client!user@host"
+ * This client ID is used for IRC prefixes, for example.
+ * Please note that this function uses a global static buffer, so you can't
+ * nest invocations without overwriting erlier results!
+ * @param Client Pointer to client structure
+ * @return Pointer to global buffer containing the client ID
  */
 GLOBAL char *
 Client_Mask( CLIENT *Client )
 {
-       static char GetID_Buffer[GETID_LEN];
+       static char Mask_Buffer[GETID_LEN];
 
-       assert( Client != NULL );
+       assert (Client != NULL);
 
-       if( Client->type == CLIENT_SERVER ) return Client->id;
+       /* Servers: return name only, there is no "mask" */
+       if (Client->type == CLIENT_SERVER)
+               return Client->id;
 
-       snprintf(GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host);
-       return GetID_Buffer;
+       snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
+                Client->id, Client->user, Client->host);
+       return Mask_Buffer;
 } /* Client_Mask */
 
 
+/**
+ * Return ID of a client with cloaked hostname: "client!user@server-name"
+ * This client ID is used for IRC prefixes, for example.
+ * Please note that this function uses a global static buffer, so you can't
+ * nest invocations without overwriting erlier results!
+ * If the client has not enabled cloaking, the real hostname is used.
+ * @param Client Pointer to client structure
+ * @return Pointer to global buffer containing the client ID
+ */
+GLOBAL char *
+Client_MaskCloaked(CLIENT *Client)
+{
+       static char Mask_Buffer[GETID_LEN];
+
+       assert (Client != NULL);
+
+       /* Is the client using cloaking at all? */
+       if (!Client_HasMode(Client, 'x'))
+           return Client_Mask(Client);
+
+       snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
+                Client->id, Client->user, Client_ID(Client->introducer));
+       return Mask_Buffer;
+} /* Client_MaskCloaked */
+
+
 GLOBAL CLIENT *
 Client_Introducer( CLIENT *Client )
 {
@@ -1138,7 +1193,7 @@ Client_RegisterWhowas( CLIENT *Client )
                 sizeof( My_Whowas[slot].id ));
        strlcpy( My_Whowas[slot].user, Client_User( Client ),
                 sizeof( My_Whowas[slot].user ));
-       strlcpy( My_Whowas[slot].host, Client_Hostname( Client ),
+       strlcpy( My_Whowas[slot].host, Client_HostnameCloaked( Client ),
                 sizeof( My_Whowas[slot].host ));
        strlcpy( My_Whowas[slot].info, Client_Info( Client ),
                 sizeof( My_Whowas[slot].info ));
@@ -1219,4 +1274,26 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
 } /* Destroy_UserOrService */
 
 
+#ifdef DEBUG
+
+GLOBAL void
+Client_DebugDump(void)
+{
+       CLIENT *c;
+
+       Log(LOG_DEBUG, "Client status:");
+       c = My_Clients;
+       while (c) {
+               Log(LOG_DEBUG,
+                   " - %s: type=%d, host=%s, user=%s, conn=%d, start=%ld, flags=%s",
+                   Client_ID(c), Client_Type(c), Client_Hostname(c),
+                   Client_User(c), Client_Conn(c), Client_StartTime(c),
+                   Client_Flags(c));
+               c = (CLIENT *)c->next;
+       }
+} /* Client_DumpClients */
+
+#endif
+
+
 /* -eof- */