X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn-func.c;h=b6e82849b0c6ae98f9441cafff8f67d5487d58f7;hp=172784b660f4a650cd731b49e8ad9bcfa0e52fb3;hb=9811223fb882413645db38948ac05fa21ddd3514;hpb=0b04bfa7c04b074e5183109a3f67a46bcdda3aea diff --git a/src/ngircd/conn-func.c b/src/ngircd/conn-func.c index 172784b6..b6e82849 100644 --- a/src/ngircd/conn-func.c +++ b/src/ngircd/conn-func.c @@ -1,127 +1,144 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2014 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 * 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. - * - * Connection management: Global functions */ - #define CONN_MODULE #include "portab.h" -static char UNUSED id[] = "$Id: conn-func.c,v 1.1 2002/12/30 17:14:28 alex Exp $"; +/** + * @file + * Connection management: Global functions + */ -#include "imp.h" #include +#include +#ifdef DEBUG +# include "log.h" +#endif #include "conn.h" -#include "exp.h" #include "conn-func.h" - -GLOBAL VOID -Conn_UpdateIdle( CONN_ID Idx ) +/** + * Update "idle timestamp", the time of the last visible user action + * (e. g. like sending messages, joining or leaving channels). + * + * @param Idx Connection index. + */ +GLOBAL void +Conn_UpdateIdle(CONN_ID Idx) { - /* Idle-Timer zuruecksetzen */ + assert(Idx > NONE); + My_Connections[Idx].lastprivmsg = time(NULL); +} - assert( Idx > NONE ); - My_Connections[Idx].lastprivmsg = time( NULL ); +/** + * Update "ping timestamp", the time of the last outgoing PING request. + * + * @param Idx Connection index. + */ +GLOBAL void +Conn_UpdatePing(CONN_ID Idx) +{ + assert(Idx > NONE); + My_Connections[Idx].lastping = time(NULL); } +/* + * Get signon time of a connection. + */ +GLOBAL time_t +Conn_GetSignon(CONN_ID Idx) +{ + assert(Idx > NONE); + return My_Connections[Idx].signon; +} GLOBAL time_t Conn_GetIdle( CONN_ID Idx ) { - /* Idle-Time einer Verbindung liefern (in Sekunden) */ - + /* Return Idle-Timer of a connetion */ assert( Idx > NONE ); return time( NULL ) - My_Connections[Idx].lastprivmsg; } /* Conn_GetIdle */ - GLOBAL time_t Conn_LastPing( CONN_ID Idx ) { - /* Zeitpunkt des letzten PING liefern */ - assert( Idx > NONE ); return My_Connections[Idx].lastping; } /* Conn_LastPing */ - -GLOBAL VOID -Conn_SetPenalty( CONN_ID Idx, time_t Seconds ) +/** + * Add "penalty time" for a connection. + * + * During the "penalty time" the socket is ignored completely, no new data + * is read. This function only increases the penalty, it is not possible to + * decrease the penalty time. + * + * @param Idex Connection index. + * @param Seconds Seconds to add. + * @see Conn_ResetPenalty + */ +GLOBAL void +Conn_SetPenalty(CONN_ID Idx, time_t Seconds) { - /* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen; - * waehrend dieser Zeit wird der entsprechende Socket vom Server - * bei Lese-Operationen komplett ignoriert. Der Delay kann mit - * dieser Funktion nur erhoeht, nicht aber verringert werden. */ - time_t t; - - assert( Idx > NONE ); - assert( Seconds >= 0 ); - - t = time( NULL ) + Seconds; - if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t; -} /* Conn_SetPenalty */ + assert(Idx > NONE); + assert(Seconds >= 0); -GLOBAL VOID -Conn_ResetPenalty( CONN_ID Idx ) -{ - assert( Idx > NONE ); - My_Connections[Idx].delaytime = 0; -} /* Conn_ResetPenalty */ + t = time(NULL); + if (My_Connections[Idx].delaytime < t) + My_Connections[Idx].delaytime = t; + My_Connections[Idx].delaytime += Seconds; -GLOBAL VOID -Conn_ClearFlags( VOID ) -{ - /* Alle Connection auf "nicht-markiert" setzen */ +#ifdef DEBUG + Log(LOG_DEBUG, + "Add penalty time on connection %d: %ld second%s, total %ld second%s.", + Idx, (long)Seconds, Seconds != 1 ? "s" : "", + My_Connections[Idx].delaytime - t, + My_Connections[Idx].delaytime - t != 1 ? "s" : ""); +#endif +} /* Conn_SetPenalty */ +GLOBAL void +Conn_ClearFlags( void ) +{ CONN_ID i; for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0; } /* Conn_ClearFlags */ - -GLOBAL INT +GLOBAL int Conn_Flag( CONN_ID Idx ) { - /* Ist eine Connection markiert (TRUE) oder nicht? */ - assert( Idx > NONE ); return My_Connections[Idx].flag; } /* Conn_Flag */ - -GLOBAL VOID -Conn_SetFlag( CONN_ID Idx, INT Flag ) +GLOBAL void +Conn_SetFlag( CONN_ID Idx, int Flag ) { - /* Connection markieren */ - assert( Idx > NONE ); My_Connections[Idx].flag = Flag; } /* Conn_SetFlag */ - GLOBAL CONN_ID -Conn_First( VOID ) +Conn_First( void ) { - /* Connection-Struktur der ersten Verbindung liefern; - * Ist keine Verbindung vorhanden, wird NONE geliefert. */ - CONN_ID i; - + for( i = 0; i < Pool_Size; i++ ) { if( My_Connections[i].sock != NONE ) return i; @@ -129,17 +146,13 @@ Conn_First( VOID ) return NONE; } /* Conn_First */ - GLOBAL CONN_ID Conn_Next( CONN_ID Idx ) { - /* Naechste Verbindungs-Struktur liefern; existiert keine - * weitere, so wird NONE geliefert. */ - CONN_ID i = NONE; assert( Idx > NONE ); - + for( i = Idx + 1; i < Pool_Size; i++ ) { if( My_Connections[i].sock != NONE ) return i; @@ -147,130 +160,136 @@ Conn_Next( CONN_ID Idx ) return NONE; } /* Conn_Next */ - -GLOBAL VOID -Conn_SetOption( CONN_ID Idx, INT Option ) -{ - /* Option fuer Verbindung setzen. - * Initial sind alle Optionen _nicht_ gesetzt. */ - - assert( Idx > NONE ); - assert( Option != 0 ); - - My_Connections[Idx].options |= Option; -} /* Conn_SetOption */ - - -GLOBAL VOID -Conn_UnsetOption( CONN_ID Idx, INT Option ) -{ - /* Option fuer Verbindung loeschen */ - - assert( Idx > NONE ); - assert( Option != 0 ); - - My_Connections[Idx].options &= ~Option; -} /* Conn_UnsetOption */ - - -GLOBAL INT +GLOBAL UINT16 Conn_Options( CONN_ID Idx ) { assert( Idx > NONE ); return My_Connections[Idx].options; } /* Conn_Options */ +/** + * Set connection option. + */ +GLOBAL void +Conn_SetOption(CONN_ID Idx, int Option) +{ + assert(Idx > NONE); + Conn_OPTION_ADD(&My_Connections[Idx], Option); +} /* Conn_SetOption */ +/** + * Get the start time of the connection. + * The result is the start time in seconds since 1970-01-01, as reported + * by the C function time(NULL). + */ GLOBAL time_t Conn_StartTime( CONN_ID Idx ) { - /* Zeitpunkt des Link-Starts liefern (in Sekunden) */ + CLIENT *c; - assert( Idx > NONE ); - return My_Connections[Idx].starttime; -} /* Conn_Uptime */ + assert(Idx > NONE); + + /* Search client structure for this link ... */ + c = Conn_GetClient(Idx); + if(c != NULL) + return Client_StartTime(c); + return 0; +} /* Conn_StartTime */ -GLOBAL INT +/** + * return number of bytes queued for writing + */ +GLOBAL size_t Conn_SendQ( CONN_ID Idx ) { - /* Laenge der Daten im Schreibbuffer liefern */ - assert( Idx > NONE ); -#ifdef USE_ZLIB - if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen; +#ifdef ZLIB + if( My_Connections[Idx].options & CONN_ZIP ) + return array_bytes(&My_Connections[Idx].zip.wbuf); else #endif - return My_Connections[Idx].wdatalen; + return array_bytes(&My_Connections[Idx].wbuf); } /* Conn_SendQ */ - -GLOBAL LONG +/** + * return number of messages sent on this connection so far + */ +GLOBAL long Conn_SendMsg( CONN_ID Idx ) { - /* Anzahl gesendeter Nachrichten liefern */ assert( Idx > NONE ); return My_Connections[Idx].msg_out; } /* Conn_SendMsg */ - -GLOBAL LONG +/** + * return number of (uncompressed) bytes sent + * on this connection so far + */ +GLOBAL long Conn_SendBytes( CONN_ID Idx ) { - /* Anzahl gesendeter Bytes (unkomprimiert) liefern */ - assert( Idx > NONE ); return My_Connections[Idx].bytes_out; } /* Conn_SendBytes */ - -GLOBAL INT +/** + * return number of bytes pending in read buffer + */ +GLOBAL size_t Conn_RecvQ( CONN_ID Idx ) { - /* Laenge der Daten im Lesebuffer liefern */ - assert( Idx > NONE ); -#ifdef USE_ZLIB - if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen; +#ifdef ZLIB + if( My_Connections[Idx].options & CONN_ZIP ) + return array_bytes(&My_Connections[Idx].zip.rbuf); else #endif - return My_Connections[Idx].rdatalen; + return array_bytes(&My_Connections[Idx].rbuf); } /* Conn_RecvQ */ - -GLOBAL LONG +/** + * return number of messages received on this connection so far + */ +GLOBAL long Conn_RecvMsg( CONN_ID Idx ) { - /* Anzahl empfangener Nachrichten liefern */ - assert( Idx > NONE ); return My_Connections[Idx].msg_in; } /* Conn_RecvMsg */ - -GLOBAL LONG +/** + * return number of (uncompressed) bytes received on this + * connection so far + */ +GLOBAL long Conn_RecvBytes( CONN_ID Idx ) { - /* Anzahl empfangener Bytes (unkomprimiert) liefern */ - assert( Idx > NONE ); return My_Connections[Idx].bytes_in; } /* Conn_RecvBytes */ +/** + * Return the remote IP address of this connection as string. + */ +GLOBAL const char * +Conn_IPA(CONN_ID Idx) +{ + assert (Idx > NONE); + return ng_ipaddr_tostr(&My_Connections[Idx].addr); +} -GLOBAL VOID -Conn_ResetWCounter( VOID ) +GLOBAL void +Conn_ResetWCounter( void ) { WCounter = 0; } /* Conn_ResetWCounter */ - -GLOBAL LONG -Conn_WCounter( VOID ) +GLOBAL long +Conn_WCounter( void ) { return WCounter; } /* Conn_WCounter */ - /* -eof- */