* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
- *
- * Client management.
*/
-
#define __client_c__
-
#include "portab.h"
+/**
+ * @file
+ * Client management.
+ */
+
#include "imp.h"
#include <assert.h>
#include <unistd.h>
#include <exp.h>
-
#define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1
-
static CLIENT *This_Server, *My_Clients;
static WHOWAS My_Whowas[MAX_WHOWAS];
This_Server->hops = 0;
gethostname( This_Server->host, CLIENT_HOST_LEN );
- if (!Conf_NoDNS) {
+ if (Conf_DNS) {
h = gethostbyname( This_Server->host );
if (h) strlcpy(This_Server->host, h->h_name, sizeof(This_Server->host));
}
assert( Client != NULL );
assert( Hostname != NULL );
- strlcpy( Client->host, Hostname, sizeof( Client->host ));
+ if (strlen(Conf_CloakHost)) {
+ strlcpy( Client->host, Conf_CloakHost, sizeof( Client->host ));
+ } else {
+ strlcpy( Client->host, Hostname, sizeof( Client->host ));
+ }
} /* Client_SetHostname */
strlcpy( Client->id, ID, sizeof( Client->id ));
+ if (Conf_CloakUserToNick) {
+ strlcpy( Client->user, ID, sizeof( Client->user ));
+ strlcpy( Client->info, ID, sizeof( Client->info ));
+ }
+
/* Hash */
Client->hash = Hash( Client->id );
} /* Client_SetID */
assert( Client != NULL );
assert( User != NULL );
- if (Idented) {
+ if (Conf_CloakUserToNick) {
+ strlcpy(Client->user, Client->id, sizeof(Client->user));
+ } else if (Idented) {
strlcpy(Client->user, User, sizeof(Client->user));
} else {
Client->user[0] = '~';
* @param User User name to set.
*/
GLOBAL void
-Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User) {
+Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User)
+{
assert(Client != NULL);
assert(User != NULL);
assert( Client != NULL );
assert( Info != NULL );
- strlcpy(Client->info, Info, sizeof(Client->info));
+ if (Conf_CloakUserToNick)
+ strlcpy(Client->info, Client->id, sizeof(Client->info));
+ else
+ strlcpy(Client->info, Info, sizeof(Client->info));
} /* Client_SetInfo */
} /* Client_Search */
+/**
+ * Get client structure ("introducer") identfied by a server token.
+ * @return CLIENT structure or NULL if none could be found.
+ */
GLOBAL CLIENT *
Client_GetFromToken( CLIENT *Client, int Token )
{
- /* Client-Struktur, die den entsprechenden Introducer (=Client)
- * und das gegebene Token hat, liefern. Wird keine gefunden,
- * so wird NULL geliefert. */
-
CLIENT *c;
assert( Client != NULL );
- assert( Token > 0 );
+
+ if (!Token)
+ return NULL;
c = My_Clients;
while (c) {
#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 )
{
/**
- * 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 )
{
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 ));
} /* 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- */