Annotation of ircnowd/src/ngircd/conn-func.c, Revision 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