commit 7f0d10118427e74a45f29a8a80bdc84476238188 from: Alexander Barton date: Mon May 16 12:23:48 2005 UTC New functions Client_GetWhowas, Client_GetLastWhowasIndex, and Register_Whowas. commit - 9f247ebd5a9b424ae9e6c10ba31dcb4b7190b1f8 commit + 7f0d10118427e74a45f29a8a80bdc84476238188 blob - 8c2afa67725ab4595ea4dbc504f1396b79ebbe62 blob + 0c19655cb28c31253dfdb7e602daf12ababd0069 --- src/ngircd/client.c +++ src/ngircd/client.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de) * * 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 @@ -17,7 +17,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: client.c,v 1.79 2005/04/27 07:46:50 alex Exp $"; +static char UNUSED id[] = "$Id: client.c,v 1.80 2005/05/16 12:23:48 alex Exp $"; #include "imp.h" #include @@ -53,13 +53,17 @@ static char UNUSED id[] = "$Id: client.c,v 1.79 2005/0 LOCAL CLIENT *This_Server, *My_Clients; LOCAL char GetID_Buffer[GETID_LEN]; +LOCAL WHOWAS My_Whowas[MAX_WHOWAS]; +LOCAL int Last_Whowas = -1; + LOCAL long Count PARAMS(( CLIENT_TYPE Type )); LOCAL long MyCount PARAMS(( CLIENT_TYPE Type )); LOCAL CLIENT *New_Client_Struct PARAMS(( void )); LOCAL void Generate_MyToken PARAMS(( CLIENT *Client )); LOCAL void Adjust_Counters PARAMS(( CLIENT *Client )); +LOCAL void Register_Whowas PARAMS(( CLIENT *Client )); #ifndef Client_DestroyNow GLOBAL void Client_DestroyNow PARAMS((CLIENT *Client )); @@ -98,6 +102,8 @@ Client_Init( void ) Client_SetInfo( This_Server, Conf_ServerInfo ); My_Clients = This_Server; + + memset( &My_Whowas, 0, sizeof( My_Whowas )); } /* Client_Init */ @@ -258,7 +264,12 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *Fw else IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :" ); } } + + /* Unregister client from channels */ Channel_Quit( c, FwdMsg ? FwdMsg : c->id ); + + /* Register client in My_Whowas structure */ + Register_Whowas( c ); } else if( c->type == CLIENT_SERVER ) { @@ -986,8 +997,27 @@ Client_IsValidNick( char *Nick ) return true; } /* Client_IsValidNick */ + + +/** + * Return pointer to "My_Whowas" structure. + */ +GLOBAL WHOWAS * +Client_GetWhowas( void ) +{ + return My_Whowas; +} /* Client_GetWhowas */ +/** + * Return the index of the last used WHOWAS entry. + */ +GLOBAL int +Client_GetLastWhowasIndex( void ) +{ + return Last_Whowas; +} /* Client_GetLastWhowasIndex */ + LOCAL long Count( CLIENT_TYPE Type ) { @@ -1093,4 +1123,37 @@ Adjust_Counters( CLIENT *Client ) } /* Adjust_Counters */ +/** + * Register client in My_Whowas structure for further recall by WHOWAS. + */ +LOCAL void +Register_Whowas( CLIENT *Client ) +{ + int slot; + + assert( Client != NULL ); + + slot = Last_Whowas + 1; + if( slot >= MAX_WHOWAS || slot < 0 ) slot = 0; + +#ifdef DEBUG + Log( LOG_DEBUG, "Saving WHOWAS information to slot %d ...", slot ); +#endif + + My_Whowas[slot].time = time( NULL ); + strlcpy( My_Whowas[slot].id, Client_ID( 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 ), + sizeof( My_Whowas[slot].host )); + strlcpy( My_Whowas[slot].info, Client_Info( Client ), + sizeof( My_Whowas[slot].info )); + strlcpy( My_Whowas[slot].server, Client_ID( Client_Introducer( Client )), + sizeof( My_Whowas[slot].server )); + + Last_Whowas = slot; +} /* Register_Whowas */ + + /* -eof- */