Blame


1 0b04bfa7 2002-12-30 alex /*
2 0b04bfa7 2002-12-30 alex * ngIRCd -- The Next Generation IRC Daemon
3 0b04bfa7 2002-12-30 alex * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
4 0b04bfa7 2002-12-30 alex *
5 0b04bfa7 2002-12-30 alex * This program is free software; you can redistribute it and/or modify
6 0b04bfa7 2002-12-30 alex * it under the terms of the GNU General Public License as published by
7 0b04bfa7 2002-12-30 alex * the Free Software Foundation; either version 2 of the License, or
8 0b04bfa7 2002-12-30 alex * (at your option) any later version.
9 0b04bfa7 2002-12-30 alex * Please read the file COPYING, README and AUTHORS for more information.
10 0b04bfa7 2002-12-30 alex *
11 0b04bfa7 2002-12-30 alex * Connection management: Global functions
12 0b04bfa7 2002-12-30 alex */
13 0b04bfa7 2002-12-30 alex
14 0b04bfa7 2002-12-30 alex
15 0b04bfa7 2002-12-30 alex #define CONN_MODULE
16 0b04bfa7 2002-12-30 alex
17 0b04bfa7 2002-12-30 alex #include "portab.h"
18 0b04bfa7 2002-12-30 alex
19 8b0ac230 2005-06-12 alex static char UNUSED id[] = "$Id: conn-func.c,v 1.6 2005/06/12 16:32:17 alex Exp $";
20 0b04bfa7 2002-12-30 alex
21 0b04bfa7 2002-12-30 alex #include "imp.h"
22 0b04bfa7 2002-12-30 alex #include <assert.h>
23 7b6e2662 2003-11-05 alex #include <log.h>
24 0b04bfa7 2002-12-30 alex
25 0b04bfa7 2002-12-30 alex #include "conn.h"
26 8b0ac230 2005-06-12 alex #include "client.h"
27 0b04bfa7 2002-12-30 alex
28 0b04bfa7 2002-12-30 alex #include "exp.h"
29 0b04bfa7 2002-12-30 alex #include "conn-func.h"
30 0b04bfa7 2002-12-30 alex
31 0b04bfa7 2002-12-30 alex
32 8adff592 2005-03-19 fw GLOBAL void
33 0b04bfa7 2002-12-30 alex Conn_UpdateIdle( CONN_ID Idx )
34 0b04bfa7 2002-12-30 alex {
35 0b04bfa7 2002-12-30 alex /* Idle-Timer zuruecksetzen */
36 0b04bfa7 2002-12-30 alex
37 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
38 0b04bfa7 2002-12-30 alex My_Connections[Idx].lastprivmsg = time( NULL );
39 0b04bfa7 2002-12-30 alex }
40 0b04bfa7 2002-12-30 alex
41 0b04bfa7 2002-12-30 alex
42 0b04bfa7 2002-12-30 alex GLOBAL time_t
43 0b04bfa7 2002-12-30 alex Conn_GetIdle( CONN_ID Idx )
44 0b04bfa7 2002-12-30 alex {
45 0b04bfa7 2002-12-30 alex /* Idle-Time einer Verbindung liefern (in Sekunden) */
46 0b04bfa7 2002-12-30 alex
47 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
48 0b04bfa7 2002-12-30 alex return time( NULL ) - My_Connections[Idx].lastprivmsg;
49 0b04bfa7 2002-12-30 alex } /* Conn_GetIdle */
50 0b04bfa7 2002-12-30 alex
51 0b04bfa7 2002-12-30 alex
52 0b04bfa7 2002-12-30 alex GLOBAL time_t
53 0b04bfa7 2002-12-30 alex Conn_LastPing( CONN_ID Idx )
54 0b04bfa7 2002-12-30 alex {
55 0b04bfa7 2002-12-30 alex /* Zeitpunkt des letzten PING liefern */
56 0b04bfa7 2002-12-30 alex
57 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
58 0b04bfa7 2002-12-30 alex return My_Connections[Idx].lastping;
59 0b04bfa7 2002-12-30 alex } /* Conn_LastPing */
60 0b04bfa7 2002-12-30 alex
61 0b04bfa7 2002-12-30 alex
62 8adff592 2005-03-19 fw GLOBAL void
63 0b04bfa7 2002-12-30 alex Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
64 0b04bfa7 2002-12-30 alex {
65 0b04bfa7 2002-12-30 alex /* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
66 0b04bfa7 2002-12-30 alex * waehrend dieser Zeit wird der entsprechende Socket vom Server
67 0b04bfa7 2002-12-30 alex * bei Lese-Operationen komplett ignoriert. Der Delay kann mit
68 0b04bfa7 2002-12-30 alex * dieser Funktion nur erhoeht, nicht aber verringert werden. */
69 0b04bfa7 2002-12-30 alex
70 0b04bfa7 2002-12-30 alex time_t t;
71 0b04bfa7 2002-12-30 alex
72 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
73 0b04bfa7 2002-12-30 alex assert( Seconds >= 0 );
74 7b6e2662 2003-11-05 alex
75 0b04bfa7 2002-12-30 alex t = time( NULL ) + Seconds;
76 0b04bfa7 2002-12-30 alex if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
77 0b04bfa7 2002-12-30 alex } /* Conn_SetPenalty */
78 0b04bfa7 2002-12-30 alex
79 0b04bfa7 2002-12-30 alex
80 8adff592 2005-03-19 fw GLOBAL void
81 0b04bfa7 2002-12-30 alex Conn_ResetPenalty( CONN_ID Idx )
82 0b04bfa7 2002-12-30 alex {
83 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
84 0b04bfa7 2002-12-30 alex My_Connections[Idx].delaytime = 0;
85 0b04bfa7 2002-12-30 alex } /* Conn_ResetPenalty */
86 0b04bfa7 2002-12-30 alex
87 0b04bfa7 2002-12-30 alex
88 8adff592 2005-03-19 fw GLOBAL void
89 8adff592 2005-03-19 fw Conn_ClearFlags( void )
90 0b04bfa7 2002-12-30 alex {
91 0b04bfa7 2002-12-30 alex /* Alle Connection auf "nicht-markiert" setzen */
92 0b04bfa7 2002-12-30 alex
93 0b04bfa7 2002-12-30 alex CONN_ID i;
94 0b04bfa7 2002-12-30 alex
95 0b04bfa7 2002-12-30 alex for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0;
96 0b04bfa7 2002-12-30 alex } /* Conn_ClearFlags */
97 0b04bfa7 2002-12-30 alex
98 0b04bfa7 2002-12-30 alex
99 8adff592 2005-03-19 fw GLOBAL int
100 0b04bfa7 2002-12-30 alex Conn_Flag( CONN_ID Idx )
101 0b04bfa7 2002-12-30 alex {
102 8adff592 2005-03-19 fw /* Ist eine Connection markiert (true) oder nicht? */
103 0b04bfa7 2002-12-30 alex
104 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
105 0b04bfa7 2002-12-30 alex return My_Connections[Idx].flag;
106 0b04bfa7 2002-12-30 alex } /* Conn_Flag */
107 0b04bfa7 2002-12-30 alex
108 0b04bfa7 2002-12-30 alex
109 8adff592 2005-03-19 fw GLOBAL void
110 8adff592 2005-03-19 fw Conn_SetFlag( CONN_ID Idx, int Flag )
111 0b04bfa7 2002-12-30 alex {
112 0b04bfa7 2002-12-30 alex /* Connection markieren */
113 0b04bfa7 2002-12-30 alex
114 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
115 0b04bfa7 2002-12-30 alex My_Connections[Idx].flag = Flag;
116 0b04bfa7 2002-12-30 alex } /* Conn_SetFlag */
117 0b04bfa7 2002-12-30 alex
118 0b04bfa7 2002-12-30 alex
119 0b04bfa7 2002-12-30 alex GLOBAL CONN_ID
120 8adff592 2005-03-19 fw Conn_First( void )
121 0b04bfa7 2002-12-30 alex {
122 0b04bfa7 2002-12-30 alex /* Connection-Struktur der ersten Verbindung liefern;
123 0b04bfa7 2002-12-30 alex * Ist keine Verbindung vorhanden, wird NONE geliefert. */
124 0b04bfa7 2002-12-30 alex
125 0b04bfa7 2002-12-30 alex CONN_ID i;
126 0b04bfa7 2002-12-30 alex
127 0b04bfa7 2002-12-30 alex for( i = 0; i < Pool_Size; i++ )
128 0b04bfa7 2002-12-30 alex {
129 0b04bfa7 2002-12-30 alex if( My_Connections[i].sock != NONE ) return i;
130 0b04bfa7 2002-12-30 alex }
131 0b04bfa7 2002-12-30 alex return NONE;
132 0b04bfa7 2002-12-30 alex } /* Conn_First */
133 0b04bfa7 2002-12-30 alex
134 0b04bfa7 2002-12-30 alex
135 0b04bfa7 2002-12-30 alex GLOBAL CONN_ID
136 0b04bfa7 2002-12-30 alex Conn_Next( CONN_ID Idx )
137 0b04bfa7 2002-12-30 alex {
138 0b04bfa7 2002-12-30 alex /* Naechste Verbindungs-Struktur liefern; existiert keine
139 0b04bfa7 2002-12-30 alex * weitere, so wird NONE geliefert. */
140 0b04bfa7 2002-12-30 alex
141 0b04bfa7 2002-12-30 alex CONN_ID i = NONE;
142 0b04bfa7 2002-12-30 alex
143 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
144 0b04bfa7 2002-12-30 alex
145 0b04bfa7 2002-12-30 alex for( i = Idx + 1; i < Pool_Size; i++ )
146 0b04bfa7 2002-12-30 alex {
147 0b04bfa7 2002-12-30 alex if( My_Connections[i].sock != NONE ) return i;
148 0b04bfa7 2002-12-30 alex }
149 0b04bfa7 2002-12-30 alex return NONE;
150 0b04bfa7 2002-12-30 alex } /* Conn_Next */
151 0b04bfa7 2002-12-30 alex
152 0b04bfa7 2002-12-30 alex
153 8adff592 2005-03-19 fw GLOBAL int
154 0b04bfa7 2002-12-30 alex Conn_Options( CONN_ID Idx )
155 0b04bfa7 2002-12-30 alex {
156 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
157 0b04bfa7 2002-12-30 alex return My_Connections[Idx].options;
158 0b04bfa7 2002-12-30 alex } /* Conn_Options */
159 0b04bfa7 2002-12-30 alex
160 0b04bfa7 2002-12-30 alex
161 8b0ac230 2005-06-12 alex /**
162 8b0ac230 2005-06-12 alex * Get the start time of the connection.
163 8b0ac230 2005-06-12 alex * The result is the start time in seconds since 1970-01-01, as reported
164 8b0ac230 2005-06-12 alex * by the C function time(NULL).
165 8b0ac230 2005-06-12 alex */
166 0b04bfa7 2002-12-30 alex GLOBAL time_t
167 0b04bfa7 2002-12-30 alex Conn_StartTime( CONN_ID Idx )
168 0b04bfa7 2002-12-30 alex {
169 8b0ac230 2005-06-12 alex CLIENT *c;
170 0b04bfa7 2002-12-30 alex
171 8b0ac230 2005-06-12 alex assert(Idx > NONE);
172 0b04bfa7 2002-12-30 alex
173 8b0ac230 2005-06-12 alex /* Search client structure for this link ... */
174 8b0ac230 2005-06-12 alex c = Client_GetFromConn(Idx);
175 8b0ac230 2005-06-12 alex if(c != NULL)
176 8b0ac230 2005-06-12 alex return Client_StartTime(c);
177 0b04bfa7 2002-12-30 alex
178 8b0ac230 2005-06-12 alex return 0;
179 8b0ac230 2005-06-12 alex } /* Conn_StartTime */
180 8b0ac230 2005-06-12 alex
181 8b0ac230 2005-06-12 alex
182 8adff592 2005-03-19 fw GLOBAL int
183 0b04bfa7 2002-12-30 alex Conn_SendQ( CONN_ID Idx )
184 0b04bfa7 2002-12-30 alex {
185 0b04bfa7 2002-12-30 alex /* Laenge der Daten im Schreibbuffer liefern */
186 0b04bfa7 2002-12-30 alex
187 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
188 c40592d2 2003-12-26 alex #ifdef ZLIB
189 0b04bfa7 2002-12-30 alex if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
190 0b04bfa7 2002-12-30 alex else
191 0b04bfa7 2002-12-30 alex #endif
192 0b04bfa7 2002-12-30 alex return My_Connections[Idx].wdatalen;
193 0b04bfa7 2002-12-30 alex } /* Conn_SendQ */
194 0b04bfa7 2002-12-30 alex
195 0b04bfa7 2002-12-30 alex
196 8adff592 2005-03-19 fw GLOBAL long
197 0b04bfa7 2002-12-30 alex Conn_SendMsg( CONN_ID Idx )
198 0b04bfa7 2002-12-30 alex {
199 0b04bfa7 2002-12-30 alex /* Anzahl gesendeter Nachrichten liefern */
200 0b04bfa7 2002-12-30 alex
201 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
202 0b04bfa7 2002-12-30 alex return My_Connections[Idx].msg_out;
203 0b04bfa7 2002-12-30 alex } /* Conn_SendMsg */
204 0b04bfa7 2002-12-30 alex
205 0b04bfa7 2002-12-30 alex
206 8adff592 2005-03-19 fw GLOBAL long
207 0b04bfa7 2002-12-30 alex Conn_SendBytes( CONN_ID Idx )
208 0b04bfa7 2002-12-30 alex {
209 0b04bfa7 2002-12-30 alex /* Anzahl gesendeter Bytes (unkomprimiert) liefern */
210 0b04bfa7 2002-12-30 alex
211 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
212 0b04bfa7 2002-12-30 alex return My_Connections[Idx].bytes_out;
213 0b04bfa7 2002-12-30 alex } /* Conn_SendBytes */
214 0b04bfa7 2002-12-30 alex
215 0b04bfa7 2002-12-30 alex
216 8adff592 2005-03-19 fw GLOBAL int
217 0b04bfa7 2002-12-30 alex Conn_RecvQ( CONN_ID Idx )
218 0b04bfa7 2002-12-30 alex {
219 0b04bfa7 2002-12-30 alex /* Laenge der Daten im Lesebuffer liefern */
220 0b04bfa7 2002-12-30 alex
221 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
222 c40592d2 2003-12-26 alex #ifdef ZLIB
223 0b04bfa7 2002-12-30 alex if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
224 0b04bfa7 2002-12-30 alex else
225 0b04bfa7 2002-12-30 alex #endif
226 0b04bfa7 2002-12-30 alex return My_Connections[Idx].rdatalen;
227 0b04bfa7 2002-12-30 alex } /* Conn_RecvQ */
228 0b04bfa7 2002-12-30 alex
229 0b04bfa7 2002-12-30 alex
230 8adff592 2005-03-19 fw GLOBAL long
231 0b04bfa7 2002-12-30 alex Conn_RecvMsg( CONN_ID Idx )
232 0b04bfa7 2002-12-30 alex {
233 0b04bfa7 2002-12-30 alex /* Anzahl empfangener Nachrichten liefern */
234 0b04bfa7 2002-12-30 alex
235 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
236 0b04bfa7 2002-12-30 alex return My_Connections[Idx].msg_in;
237 0b04bfa7 2002-12-30 alex } /* Conn_RecvMsg */
238 0b04bfa7 2002-12-30 alex
239 0b04bfa7 2002-12-30 alex
240 8adff592 2005-03-19 fw GLOBAL long
241 0b04bfa7 2002-12-30 alex Conn_RecvBytes( CONN_ID Idx )
242 0b04bfa7 2002-12-30 alex {
243 0b04bfa7 2002-12-30 alex /* Anzahl empfangener Bytes (unkomprimiert) liefern */
244 0b04bfa7 2002-12-30 alex
245 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
246 0b04bfa7 2002-12-30 alex return My_Connections[Idx].bytes_in;
247 0b04bfa7 2002-12-30 alex } /* Conn_RecvBytes */
248 0b04bfa7 2002-12-30 alex
249 0b04bfa7 2002-12-30 alex
250 8adff592 2005-03-19 fw GLOBAL void
251 8adff592 2005-03-19 fw Conn_ResetWCounter( void )
252 0b04bfa7 2002-12-30 alex {
253 0b04bfa7 2002-12-30 alex WCounter = 0;
254 0b04bfa7 2002-12-30 alex } /* Conn_ResetWCounter */
255 0b04bfa7 2002-12-30 alex
256 0b04bfa7 2002-12-30 alex
257 8adff592 2005-03-19 fw GLOBAL long
258 8adff592 2005-03-19 fw Conn_WCounter( void )
259 0b04bfa7 2002-12-30 alex {
260 0b04bfa7 2002-12-30 alex return WCounter;
261 0b04bfa7 2002-12-30 alex } /* Conn_WCounter */
262 0b04bfa7 2002-12-30 alex
263 0b04bfa7 2002-12-30 alex
264 0b04bfa7 2002-12-30 alex /* -eof- */