[BACK]Return to conn-func.c CVS log [TXT][DIR] Up to [local] / ircnowd / src / ngircd

Annotation of ircnowd/src/ngircd/conn-func.c, Revision 1.1.1.1

1.1       tomglok     1: /*
                      2:  * ngIRCd -- The Next Generation IRC Daemon
                      3:  * Copyright (c)2001-2018 Alexander Barton (alex@barton.de) and Contributors.
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify
                      6:  * it under the terms of the GNU General Public License as published by
                      7:  * the Free Software Foundation; either version 2 of the License, or
                      8:  * (at your option) any later version.
                      9:  * Please read the file COPYING, README and AUTHORS for more information.
                     10:  */
                     11:
                     12: #define CONN_MODULE
                     13:
                     14: #include "portab.h"
                     15:
                     16: /**
                     17:  * @file
                     18:  * Connection management: Global functions
                     19:  */
                     20:
                     21: #include <assert.h>
                     22: #include <time.h>
                     23:
                     24: #ifdef DEBUG
                     25: # include "log.h"
                     26: #endif
                     27: #include "conn.h"
                     28:
                     29: #include "conf.h"
                     30: #include "conn-func.h"
                     31:
                     32: /**
                     33:  * Update "idle timestamp", the time of the last visible user action
                     34:  * (e. g. like sending messages, joining or leaving channels).
                     35:  *
                     36:  * @param Idx Connection index.
                     37:  */
                     38: GLOBAL void
                     39: Conn_UpdateIdle(CONN_ID Idx)
                     40: {
                     41:        assert(Idx > NONE);
                     42:        My_Connections[Idx].lastprivmsg = time(NULL);
                     43: }
                     44:
                     45: /**
                     46:  * Update "ping timestamp", the time of the last outgoing PING request.
                     47:  *
                     48:  * the value 0 signals a newly connected client including servers during the
                     49:  * initial "server burst"; and 1 means that no PONG is pending for a PING.
                     50:  *
                     51:  * @param Idx Connection index.
                     52:  * @param TimeStamp 0, 1, or time stamp.
                     53:  */
                     54: GLOBAL void
                     55: Conn_UpdatePing(CONN_ID Idx, time_t TimeStamp)
                     56: {
                     57:        assert(Idx > NONE);
                     58:        My_Connections[Idx].lastping = TimeStamp;
                     59: }
                     60:
                     61: /*
                     62:  * Get signon time of a connection.
                     63:  */
                     64: GLOBAL time_t
                     65: Conn_GetSignon(CONN_ID Idx)
                     66: {
                     67:        assert(Idx > NONE);
                     68:        return My_Connections[Idx].signon;
                     69: }
                     70:
                     71: GLOBAL time_t
                     72: Conn_GetIdle( CONN_ID Idx )
                     73: {
                     74:        /* Return Idle-Timer of a connetion */
                     75:        assert( Idx > NONE );
                     76:        return time( NULL ) - My_Connections[Idx].lastprivmsg;
                     77: } /* Conn_GetIdle */
                     78:
                     79: GLOBAL time_t
                     80: Conn_LastPing( CONN_ID Idx )
                     81: {
                     82:        assert( Idx > NONE );
                     83:        return My_Connections[Idx].lastping;
                     84: } /* Conn_LastPing */
                     85:
                     86: /**
                     87:  * Add "penalty time" for a connection.
                     88:  *
                     89:  * During the "penalty time" the socket is ignored completely, no new data
                     90:  * is read. This function only increases the penalty, it is not possible to
                     91:  * decrease the penalty time.
                     92:  *
                     93:  * @param Idx Connection index.
                     94:  * @param Seconds Seconds to add.
                     95:  * @see Conn_ResetPenalty
                     96:  */
                     97: GLOBAL void
                     98: Conn_SetPenalty(CONN_ID Idx, time_t Seconds)
                     99: {
                    100:        time_t t;
                    101:
                    102:        assert(Idx > NONE);
                    103:        assert(Seconds >= 0);
                    104:
                    105:        /* Limit new penalty to maximum configured, when less than 10 seconds. *
                    106:           The latter is used to limit brute force attacks, therefore we don't *
                    107:           want to limit that! */
                    108:        if (Conf_MaxPenaltyTime >= 0
                    109:            && Seconds > Conf_MaxPenaltyTime
                    110:            && Seconds < 10)
                    111:                Seconds = Conf_MaxPenaltyTime;
                    112:
                    113:        t = time(NULL);
                    114:        if (My_Connections[Idx].delaytime < t)
                    115:                My_Connections[Idx].delaytime = t;
                    116:
                    117:        My_Connections[Idx].delaytime += Seconds;
                    118:
                    119: #ifdef DEBUG
                    120:        Log(LOG_DEBUG,
                    121:            "Add penalty time on connection %d: %ld second%s, total %ld second%s.",
                    122:            Idx, (long)Seconds, Seconds != 1 ? "s" : "",
                    123:            My_Connections[Idx].delaytime - t,
                    124:            My_Connections[Idx].delaytime - t != 1 ? "s" : "");
                    125: #endif
                    126: } /* Conn_SetPenalty */
                    127:
                    128: GLOBAL void
                    129: Conn_ClearFlags( void )
                    130: {
                    131:        CONN_ID i;
                    132:
                    133:        for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0;
                    134: } /* Conn_ClearFlags */
                    135:
                    136: GLOBAL int
                    137: Conn_Flag( CONN_ID Idx )
                    138: {
                    139:        assert( Idx > NONE );
                    140:        return My_Connections[Idx].flag;
                    141: } /* Conn_Flag */
                    142:
                    143: GLOBAL void
                    144: Conn_SetFlag( CONN_ID Idx, int Flag )
                    145: {
                    146:        assert( Idx > NONE );
                    147:        My_Connections[Idx].flag = Flag;
                    148: } /* Conn_SetFlag */
                    149:
                    150: GLOBAL CONN_ID
                    151: Conn_First( void )
                    152: {
                    153:        CONN_ID i;
                    154:
                    155:        for( i = 0; i < Pool_Size; i++ )
                    156:        {
                    157:                if( My_Connections[i].sock != NONE ) return i;
                    158:        }
                    159:        return NONE;
                    160: } /* Conn_First */
                    161:
                    162: GLOBAL CONN_ID
                    163: Conn_Next( CONN_ID Idx )
                    164: {
                    165:        CONN_ID i = NONE;
                    166:
                    167:        assert( Idx > NONE );
                    168:
                    169:        for( i = Idx + 1; i < Pool_Size; i++ )
                    170:        {
                    171:                if( My_Connections[i].sock != NONE ) return i;
                    172:        }
                    173:        return NONE;
                    174: } /* Conn_Next */
                    175:
                    176: GLOBAL UINT16
                    177: Conn_Options( CONN_ID Idx )
                    178: {
                    179:        assert( Idx > NONE );
                    180:        return My_Connections[Idx].options;
                    181: } /* Conn_Options */
                    182:
                    183: /**
                    184:  * Set connection option.
                    185:  */
                    186: GLOBAL void
                    187: Conn_SetOption(CONN_ID Idx, int Option)
                    188: {
                    189:        assert(Idx > NONE);
                    190:        Conn_OPTION_ADD(&My_Connections[Idx], Option);
                    191: } /* Conn_SetOption */
                    192:
                    193: /**
                    194:  * Get the start time of the connection.
                    195:  * The result is the start time in seconds since 1970-01-01, as reported
                    196:  * by the C function time(NULL).
                    197:  */
                    198: GLOBAL time_t
                    199: Conn_StartTime( CONN_ID Idx )
                    200: {
                    201:        CLIENT *c;
                    202:
                    203:        assert(Idx > NONE);
                    204:
                    205:        /* Search client structure for this link ... */
                    206:        c = Conn_GetClient(Idx);
                    207:        if(c != NULL)
                    208:                return Client_StartTime(c);
                    209:
                    210:        return 0;
                    211: } /* Conn_StartTime */
                    212:
                    213: /**
                    214:  * return number of bytes queued for writing
                    215:  */
                    216: GLOBAL size_t
                    217: Conn_SendQ( CONN_ID Idx )
                    218: {
                    219:        assert( Idx > NONE );
                    220: #ifdef ZLIB
                    221:        if( My_Connections[Idx].options & CONN_ZIP )
                    222:                return array_bytes(&My_Connections[Idx].zip.wbuf);
                    223:        else
                    224: #endif
                    225:        return array_bytes(&My_Connections[Idx].wbuf);
                    226: } /* Conn_SendQ */
                    227:
                    228: /**
                    229:  * return number of messages sent on this connection so far
                    230:  */
                    231: GLOBAL long
                    232: Conn_SendMsg( CONN_ID Idx )
                    233: {
                    234:
                    235:        assert( Idx > NONE );
                    236:        return My_Connections[Idx].msg_out;
                    237: } /* Conn_SendMsg */
                    238:
                    239: /**
                    240:  * return number of (uncompressed) bytes sent
                    241:  * on this connection so far
                    242:  */
                    243: GLOBAL long
                    244: Conn_SendBytes( CONN_ID Idx )
                    245: {
                    246:        assert( Idx > NONE );
                    247:        return My_Connections[Idx].bytes_out;
                    248: } /* Conn_SendBytes */
                    249:
                    250: /**
                    251:  * return number of bytes pending in read buffer
                    252:  */
                    253: GLOBAL size_t
                    254: Conn_RecvQ( CONN_ID Idx )
                    255: {
                    256:        assert( Idx > NONE );
                    257: #ifdef ZLIB
                    258:        if( My_Connections[Idx].options & CONN_ZIP )
                    259:                return array_bytes(&My_Connections[Idx].zip.rbuf);
                    260:        else
                    261: #endif
                    262:        return array_bytes(&My_Connections[Idx].rbuf);
                    263: } /* Conn_RecvQ */
                    264:
                    265: /**
                    266:  * return number of messages received on this connection so far
                    267:  */
                    268: GLOBAL long
                    269: Conn_RecvMsg( CONN_ID Idx )
                    270: {
                    271:        assert( Idx > NONE );
                    272:        return My_Connections[Idx].msg_in;
                    273: } /* Conn_RecvMsg */
                    274:
                    275: /**
                    276:  * return number of (uncompressed) bytes received on this
                    277:  * connection so far
                    278:  */
                    279: GLOBAL long
                    280: Conn_RecvBytes( CONN_ID Idx )
                    281: {
                    282:        assert( Idx > NONE );
                    283:        return My_Connections[Idx].bytes_in;
                    284: } /* Conn_RecvBytes */
                    285:
                    286: /**
                    287:  * Return the remote IP address of this connection as string.
                    288:  */
                    289: GLOBAL const char *
                    290: Conn_IPA(CONN_ID Idx)
                    291: {
                    292:        assert (Idx > NONE);
                    293:        return ng_ipaddr_tostr(&My_Connections[Idx].addr);
                    294: }
                    295:
                    296: GLOBAL void
                    297: Conn_ResetWCounter( void )
                    298: {
                    299:        WCounter = 0;
                    300: } /* Conn_ResetWCounter */
                    301:
                    302: GLOBAL long
                    303: Conn_WCounter( void )
                    304: {
                    305:        return WCounter;
                    306: } /* Conn_WCounter */
                    307:
                    308: /* -eof- */

CVSweb