commit 33f32dbd6707f15374ca626f036ab7ada9dbb112 from: Alexander Barton date: Tue Sep 23 09:53:15 2008 UTC New function Client_TypeText() and Destroy_UserOrService(). Client_TypeText() is used to get correct naming ("Client", "Service", ...) for log messages, and Destroy_UserOrService() is used to correctly destroy user and services clients. commit - 74aac88dbf674979795a90f855f96883b43d18e6 commit + 33f32dbd6707f15374ca626f036ab7ada9dbb112 blob - 1b72adc8bb92a49db74855f611d94ed873545f80 blob + a8a2ddfa528c3e34ec84989d0a64acffb8352dfc --- src/ngircd/client.c +++ src/ngircd/client.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2005 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2008 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,8 +17,6 @@ #include "portab.h" -static char UNUSED id[] = "$Id: client.c,v 1.98 2008/04/04 19:30:01 fw Exp $"; - #include "imp.h" #include #include @@ -66,10 +64,15 @@ static void Generate_MyToken PARAMS(( CLIENT *Client ) static void Adjust_Counters PARAMS(( CLIENT *Client )); static CLIENT *Init_New_Client PARAMS((CONN_ID Idx, CLIENT *Introducer, - CLIENT *TopServer, int Type, char *ID, char *User, char *Hostname, - char *Info, int Hops, int Token, char *Modes, bool Idented)); + CLIENT *TopServer, int Type, char *ID, + char *User, char *Hostname, char *Info, + int Hops, int Token, char *Modes, + bool Idented)); +static void Destroy_UserOrService PARAMS((CLIENT *Client, char *Txt, char *FwdMsg, + bool SendQuit)); + GLOBAL void Client_Init( void ) { @@ -260,41 +263,8 @@ Client_Destroy( CLIENT *Client, char *LogMsg, char *Fw if( last ) last->next = c->next; else My_Clients = (CLIENT *)c->next; - if( c->type == CLIENT_USER ) - { - if( c->conn_id != NONE ) - { - /* Ein lokaler User */ - Log( LOG_NOTICE, "User \"%s\" unregistered (connection %d): %s", Client_Mask( c ), c->conn_id, txt ); - - if( SendQuit ) - { - /* Alle andere Server informieren! */ - if( FwdMsg ) IRC_WriteStrServersPrefix( NULL, c, "QUIT :%s", FwdMsg ); - else IRC_WriteStrServersPrefix( NULL, c, "QUIT :" ); - } - } - else - { - /* Remote User */ - Log( LOG_DEBUG, "User \"%s\" unregistered: %s", Client_Mask( c ), txt ); - - if( SendQuit ) - { - /* Andere Server informieren, ausser denen, die "in - * Richtung dem liegen", auf dem der User registriert - * ist. Von denen haben wir das QUIT ja wohl bekommen. */ - if( FwdMsg ) IRC_WriteStrServersPrefix( Client_NextHop( c ), c, "QUIT :%s", FwdMsg ); - 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 */ - Client_RegisterWhowas( c ); - } + if(c->type == CLIENT_USER || c->type == CLIENT_SERVICE) + Destroy_UserOrService(c, txt, FwdMsg, SendQuit); else if( c->type == CLIENT_SERVER ) { if( c != This_Server ) @@ -1142,4 +1112,71 @@ Client_RegisterWhowas( CLIENT *Client ) } /* Client_RegisterWhowas */ +GLOBAL char * +Client_TypeText(CLIENT *Client) +{ + assert(Client != NULL); + switch (Client_Type(Client)) { + case CLIENT_USER: + return "User"; + break; + case CLIENT_SERVICE: + return "Service"; + break; + case CLIENT_SERVER: + return "Server"; + break; + default: + return "Client"; + } +} /* Client_TypeText */ + + +/** + * Destroy user or service client. + */ +static void +Destroy_UserOrService(CLIENT *Client, char *Txt, char *FwdMsg, bool SendQuit) +{ + if(Client->conn_id != NONE) { + /* Local (directly connected) client */ + Log(LOG_NOTICE, + "%s \"%s\" unregistered (connection %d): %s", + Client_TypeText(Client), Client_Mask(Client), + Client->conn_id, Txt); + + if (SendQuit) { + /* Inforam all the other servers */ + if (FwdMsg) + IRC_WriteStrServersPrefix(NULL, + Client, "QUIT :%s", FwdMsg ); + else + IRC_WriteStrServersPrefix(NULL, + Client, "QUIT :"); + } + } else { + /* Remote client */ + LogDebug("%s \"%s\" unregistered: %s", + Client_TypeText(Client), Client_Mask(Client), Txt); + + if(SendQuit) { + /* Inform all the other servers, but the ones in the + * direction we got the QUIT from */ + if(FwdMsg) + IRC_WriteStrServersPrefix(Client_NextHop(Client), + Client, "QUIT :%s", FwdMsg ); + else + IRC_WriteStrServersPrefix(Client_NextHop(Client), + Client, "QUIT :" ); + } + } + + /* Unregister client from channels */ + Channel_Quit(Client, FwdMsg ? FwdMsg : Client->id); + + /* Register client in My_Whowas structure */ + Client_RegisterWhowas(Client); +} /* Destroy_UserOrService */ + + /* -eof- */ blob - 75b99b272d0d38f3e1108b651171452d88c8eb49 blob + 6fcf7b64e22fe35f65c5fe64d2ff135813dee84b --- src/ngircd/client.h +++ src/ngircd/client.h @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2008 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 @@ -8,16 +8,12 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: client.h,v 1.46 2007/01/23 16:07:19 alex Exp $ - * * Client management (header) */ - #ifndef __client_h__ #define __client_h__ - #define CLIENT_UNKNOWN 1 /* connection of unknown type */ #define CLIENT_GOTPASS 2 /* client did send PASS */ #define CLIENT_GOTNICK 4 /* client did send NICK */ @@ -150,8 +146,8 @@ GLOBAL int Client_GetLastWhowasIndex PARAMS(( void )); GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client )); +GLOBAL char * Client_TypeText PARAMS((CLIENT *Client)); #endif - /* -eof- */