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 0b04bfa7 2002-12-30 alex static char UNUSED id[] = "$Id: conn-func.c,v 1.1 2002/12/30 17:14:28 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 0b04bfa7 2002-12-30 alex
24 0b04bfa7 2002-12-30 alex #include "conn.h"
25 0b04bfa7 2002-12-30 alex
26 0b04bfa7 2002-12-30 alex #include "exp.h"
27 0b04bfa7 2002-12-30 alex #include "conn-func.h"
28 0b04bfa7 2002-12-30 alex
29 0b04bfa7 2002-12-30 alex
30 0b04bfa7 2002-12-30 alex GLOBAL VOID
31 0b04bfa7 2002-12-30 alex Conn_UpdateIdle( CONN_ID Idx )
32 0b04bfa7 2002-12-30 alex {
33 0b04bfa7 2002-12-30 alex /* Idle-Timer zuruecksetzen */
34 0b04bfa7 2002-12-30 alex
35 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
36 0b04bfa7 2002-12-30 alex My_Connections[Idx].lastprivmsg = time( NULL );
37 0b04bfa7 2002-12-30 alex }
38 0b04bfa7 2002-12-30 alex
39 0b04bfa7 2002-12-30 alex
40 0b04bfa7 2002-12-30 alex GLOBAL time_t
41 0b04bfa7 2002-12-30 alex Conn_GetIdle( CONN_ID Idx )
42 0b04bfa7 2002-12-30 alex {
43 0b04bfa7 2002-12-30 alex /* Idle-Time einer Verbindung liefern (in Sekunden) */
44 0b04bfa7 2002-12-30 alex
45 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
46 0b04bfa7 2002-12-30 alex return time( NULL ) - My_Connections[Idx].lastprivmsg;
47 0b04bfa7 2002-12-30 alex } /* Conn_GetIdle */
48 0b04bfa7 2002-12-30 alex
49 0b04bfa7 2002-12-30 alex
50 0b04bfa7 2002-12-30 alex GLOBAL time_t
51 0b04bfa7 2002-12-30 alex Conn_LastPing( CONN_ID Idx )
52 0b04bfa7 2002-12-30 alex {
53 0b04bfa7 2002-12-30 alex /* Zeitpunkt des letzten PING liefern */
54 0b04bfa7 2002-12-30 alex
55 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
56 0b04bfa7 2002-12-30 alex return My_Connections[Idx].lastping;
57 0b04bfa7 2002-12-30 alex } /* Conn_LastPing */
58 0b04bfa7 2002-12-30 alex
59 0b04bfa7 2002-12-30 alex
60 0b04bfa7 2002-12-30 alex GLOBAL VOID
61 0b04bfa7 2002-12-30 alex Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
62 0b04bfa7 2002-12-30 alex {
63 0b04bfa7 2002-12-30 alex /* Penalty-Delay fuer eine Verbindung (in Sekunden) setzen;
64 0b04bfa7 2002-12-30 alex * waehrend dieser Zeit wird der entsprechende Socket vom Server
65 0b04bfa7 2002-12-30 alex * bei Lese-Operationen komplett ignoriert. Der Delay kann mit
66 0b04bfa7 2002-12-30 alex * dieser Funktion nur erhoeht, nicht aber verringert werden. */
67 0b04bfa7 2002-12-30 alex
68 0b04bfa7 2002-12-30 alex time_t t;
69 0b04bfa7 2002-12-30 alex
70 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
71 0b04bfa7 2002-12-30 alex assert( Seconds >= 0 );
72 0b04bfa7 2002-12-30 alex
73 0b04bfa7 2002-12-30 alex t = time( NULL ) + Seconds;
74 0b04bfa7 2002-12-30 alex if( t > My_Connections[Idx].delaytime ) My_Connections[Idx].delaytime = t;
75 0b04bfa7 2002-12-30 alex } /* Conn_SetPenalty */
76 0b04bfa7 2002-12-30 alex
77 0b04bfa7 2002-12-30 alex
78 0b04bfa7 2002-12-30 alex GLOBAL VOID
79 0b04bfa7 2002-12-30 alex Conn_ResetPenalty( CONN_ID Idx )
80 0b04bfa7 2002-12-30 alex {
81 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
82 0b04bfa7 2002-12-30 alex My_Connections[Idx].delaytime = 0;
83 0b04bfa7 2002-12-30 alex } /* Conn_ResetPenalty */
84 0b04bfa7 2002-12-30 alex
85 0b04bfa7 2002-12-30 alex
86 0b04bfa7 2002-12-30 alex GLOBAL VOID
87 0b04bfa7 2002-12-30 alex Conn_ClearFlags( VOID )
88 0b04bfa7 2002-12-30 alex {
89 0b04bfa7 2002-12-30 alex /* Alle Connection auf "nicht-markiert" setzen */
90 0b04bfa7 2002-12-30 alex
91 0b04bfa7 2002-12-30 alex CONN_ID i;
92 0b04bfa7 2002-12-30 alex
93 0b04bfa7 2002-12-30 alex for( i = 0; i < Pool_Size; i++ ) My_Connections[i].flag = 0;
94 0b04bfa7 2002-12-30 alex } /* Conn_ClearFlags */
95 0b04bfa7 2002-12-30 alex
96 0b04bfa7 2002-12-30 alex
97 0b04bfa7 2002-12-30 alex GLOBAL INT
98 0b04bfa7 2002-12-30 alex Conn_Flag( CONN_ID Idx )
99 0b04bfa7 2002-12-30 alex {
100 0b04bfa7 2002-12-30 alex /* Ist eine Connection markiert (TRUE) oder nicht? */
101 0b04bfa7 2002-12-30 alex
102 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
103 0b04bfa7 2002-12-30 alex return My_Connections[Idx].flag;
104 0b04bfa7 2002-12-30 alex } /* Conn_Flag */
105 0b04bfa7 2002-12-30 alex
106 0b04bfa7 2002-12-30 alex
107 0b04bfa7 2002-12-30 alex GLOBAL VOID
108 0b04bfa7 2002-12-30 alex Conn_SetFlag( CONN_ID Idx, INT Flag )
109 0b04bfa7 2002-12-30 alex {
110 0b04bfa7 2002-12-30 alex /* Connection markieren */
111 0b04bfa7 2002-12-30 alex
112 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
113 0b04bfa7 2002-12-30 alex My_Connections[Idx].flag = Flag;
114 0b04bfa7 2002-12-30 alex } /* Conn_SetFlag */
115 0b04bfa7 2002-12-30 alex
116 0b04bfa7 2002-12-30 alex
117 0b04bfa7 2002-12-30 alex GLOBAL CONN_ID
118 0b04bfa7 2002-12-30 alex Conn_First( VOID )
119 0b04bfa7 2002-12-30 alex {
120 0b04bfa7 2002-12-30 alex /* Connection-Struktur der ersten Verbindung liefern;
121 0b04bfa7 2002-12-30 alex * Ist keine Verbindung vorhanden, wird NONE geliefert. */
122 0b04bfa7 2002-12-30 alex
123 0b04bfa7 2002-12-30 alex CONN_ID i;
124 0b04bfa7 2002-12-30 alex
125 0b04bfa7 2002-12-30 alex for( i = 0; i < Pool_Size; i++ )
126 0b04bfa7 2002-12-30 alex {
127 0b04bfa7 2002-12-30 alex if( My_Connections[i].sock != NONE ) return i;
128 0b04bfa7 2002-12-30 alex }
129 0b04bfa7 2002-12-30 alex return NONE;
130 0b04bfa7 2002-12-30 alex } /* Conn_First */
131 0b04bfa7 2002-12-30 alex
132 0b04bfa7 2002-12-30 alex
133 0b04bfa7 2002-12-30 alex GLOBAL CONN_ID
134 0b04bfa7 2002-12-30 alex Conn_Next( CONN_ID Idx )
135 0b04bfa7 2002-12-30 alex {
136 0b04bfa7 2002-12-30 alex /* Naechste Verbindungs-Struktur liefern; existiert keine
137 0b04bfa7 2002-12-30 alex * weitere, so wird NONE geliefert. */
138 0b04bfa7 2002-12-30 alex
139 0b04bfa7 2002-12-30 alex CONN_ID i = NONE;
140 0b04bfa7 2002-12-30 alex
141 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
142 0b04bfa7 2002-12-30 alex
143 0b04bfa7 2002-12-30 alex for( i = Idx + 1; i < Pool_Size; i++ )
144 0b04bfa7 2002-12-30 alex {
145 0b04bfa7 2002-12-30 alex if( My_Connections[i].sock != NONE ) return i;
146 0b04bfa7 2002-12-30 alex }
147 0b04bfa7 2002-12-30 alex return NONE;
148 0b04bfa7 2002-12-30 alex } /* Conn_Next */
149 0b04bfa7 2002-12-30 alex
150 0b04bfa7 2002-12-30 alex
151 0b04bfa7 2002-12-30 alex GLOBAL VOID
152 0b04bfa7 2002-12-30 alex Conn_SetOption( CONN_ID Idx, INT Option )
153 0b04bfa7 2002-12-30 alex {
154 0b04bfa7 2002-12-30 alex /* Option fuer Verbindung setzen.
155 0b04bfa7 2002-12-30 alex * Initial sind alle Optionen _nicht_ gesetzt. */
156 0b04bfa7 2002-12-30 alex
157 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
158 0b04bfa7 2002-12-30 alex assert( Option != 0 );
159 0b04bfa7 2002-12-30 alex
160 0b04bfa7 2002-12-30 alex My_Connections[Idx].options |= Option;
161 0b04bfa7 2002-12-30 alex } /* Conn_SetOption */
162 0b04bfa7 2002-12-30 alex
163 0b04bfa7 2002-12-30 alex
164 0b04bfa7 2002-12-30 alex GLOBAL VOID
165 0b04bfa7 2002-12-30 alex Conn_UnsetOption( CONN_ID Idx, INT Option )
166 0b04bfa7 2002-12-30 alex {
167 0b04bfa7 2002-12-30 alex /* Option fuer Verbindung loeschen */
168 0b04bfa7 2002-12-30 alex
169 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
170 0b04bfa7 2002-12-30 alex assert( Option != 0 );
171 0b04bfa7 2002-12-30 alex
172 0b04bfa7 2002-12-30 alex My_Connections[Idx].options &= ~Option;
173 0b04bfa7 2002-12-30 alex } /* Conn_UnsetOption */
174 0b04bfa7 2002-12-30 alex
175 0b04bfa7 2002-12-30 alex
176 0b04bfa7 2002-12-30 alex GLOBAL INT
177 0b04bfa7 2002-12-30 alex Conn_Options( CONN_ID Idx )
178 0b04bfa7 2002-12-30 alex {
179 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
180 0b04bfa7 2002-12-30 alex return My_Connections[Idx].options;
181 0b04bfa7 2002-12-30 alex } /* Conn_Options */
182 0b04bfa7 2002-12-30 alex
183 0b04bfa7 2002-12-30 alex
184 0b04bfa7 2002-12-30 alex GLOBAL time_t
185 0b04bfa7 2002-12-30 alex Conn_StartTime( CONN_ID Idx )
186 0b04bfa7 2002-12-30 alex {
187 0b04bfa7 2002-12-30 alex /* Zeitpunkt des Link-Starts liefern (in Sekunden) */
188 0b04bfa7 2002-12-30 alex
189 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
190 0b04bfa7 2002-12-30 alex return My_Connections[Idx].starttime;
191 0b04bfa7 2002-12-30 alex } /* Conn_Uptime */
192 0b04bfa7 2002-12-30 alex
193 0b04bfa7 2002-12-30 alex
194 0b04bfa7 2002-12-30 alex GLOBAL INT
195 0b04bfa7 2002-12-30 alex Conn_SendQ( CONN_ID Idx )
196 0b04bfa7 2002-12-30 alex {
197 0b04bfa7 2002-12-30 alex /* Laenge der Daten im Schreibbuffer liefern */
198 0b04bfa7 2002-12-30 alex
199 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
200 0b04bfa7 2002-12-30 alex #ifdef USE_ZLIB
201 0b04bfa7 2002-12-30 alex if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.wdatalen;
202 0b04bfa7 2002-12-30 alex else
203 0b04bfa7 2002-12-30 alex #endif
204 0b04bfa7 2002-12-30 alex return My_Connections[Idx].wdatalen;
205 0b04bfa7 2002-12-30 alex } /* Conn_SendQ */
206 0b04bfa7 2002-12-30 alex
207 0b04bfa7 2002-12-30 alex
208 0b04bfa7 2002-12-30 alex GLOBAL LONG
209 0b04bfa7 2002-12-30 alex Conn_SendMsg( CONN_ID Idx )
210 0b04bfa7 2002-12-30 alex {
211 0b04bfa7 2002-12-30 alex /* Anzahl gesendeter Nachrichten liefern */
212 0b04bfa7 2002-12-30 alex
213 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
214 0b04bfa7 2002-12-30 alex return My_Connections[Idx].msg_out;
215 0b04bfa7 2002-12-30 alex } /* Conn_SendMsg */
216 0b04bfa7 2002-12-30 alex
217 0b04bfa7 2002-12-30 alex
218 0b04bfa7 2002-12-30 alex GLOBAL LONG
219 0b04bfa7 2002-12-30 alex Conn_SendBytes( CONN_ID Idx )
220 0b04bfa7 2002-12-30 alex {
221 0b04bfa7 2002-12-30 alex /* Anzahl gesendeter Bytes (unkomprimiert) liefern */
222 0b04bfa7 2002-12-30 alex
223 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
224 0b04bfa7 2002-12-30 alex return My_Connections[Idx].bytes_out;
225 0b04bfa7 2002-12-30 alex } /* Conn_SendBytes */
226 0b04bfa7 2002-12-30 alex
227 0b04bfa7 2002-12-30 alex
228 0b04bfa7 2002-12-30 alex GLOBAL INT
229 0b04bfa7 2002-12-30 alex Conn_RecvQ( CONN_ID Idx )
230 0b04bfa7 2002-12-30 alex {
231 0b04bfa7 2002-12-30 alex /* Laenge der Daten im Lesebuffer liefern */
232 0b04bfa7 2002-12-30 alex
233 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
234 0b04bfa7 2002-12-30 alex #ifdef USE_ZLIB
235 0b04bfa7 2002-12-30 alex if( My_Connections[Idx].options & CONN_ZIP ) return My_Connections[Idx].zip.rdatalen;
236 0b04bfa7 2002-12-30 alex else
237 0b04bfa7 2002-12-30 alex #endif
238 0b04bfa7 2002-12-30 alex return My_Connections[Idx].rdatalen;
239 0b04bfa7 2002-12-30 alex } /* Conn_RecvQ */
240 0b04bfa7 2002-12-30 alex
241 0b04bfa7 2002-12-30 alex
242 0b04bfa7 2002-12-30 alex GLOBAL LONG
243 0b04bfa7 2002-12-30 alex Conn_RecvMsg( CONN_ID Idx )
244 0b04bfa7 2002-12-30 alex {
245 0b04bfa7 2002-12-30 alex /* Anzahl empfangener Nachrichten liefern */
246 0b04bfa7 2002-12-30 alex
247 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
248 0b04bfa7 2002-12-30 alex return My_Connections[Idx].msg_in;
249 0b04bfa7 2002-12-30 alex } /* Conn_RecvMsg */
250 0b04bfa7 2002-12-30 alex
251 0b04bfa7 2002-12-30 alex
252 0b04bfa7 2002-12-30 alex GLOBAL LONG
253 0b04bfa7 2002-12-30 alex Conn_RecvBytes( CONN_ID Idx )
254 0b04bfa7 2002-12-30 alex {
255 0b04bfa7 2002-12-30 alex /* Anzahl empfangener Bytes (unkomprimiert) liefern */
256 0b04bfa7 2002-12-30 alex
257 0b04bfa7 2002-12-30 alex assert( Idx > NONE );
258 0b04bfa7 2002-12-30 alex return My_Connections[Idx].bytes_in;
259 0b04bfa7 2002-12-30 alex } /* Conn_RecvBytes */
260 0b04bfa7 2002-12-30 alex
261 0b04bfa7 2002-12-30 alex
262 0b04bfa7 2002-12-30 alex GLOBAL VOID
263 0b04bfa7 2002-12-30 alex Conn_ResetWCounter( VOID )
264 0b04bfa7 2002-12-30 alex {
265 0b04bfa7 2002-12-30 alex WCounter = 0;
266 0b04bfa7 2002-12-30 alex } /* Conn_ResetWCounter */
267 0b04bfa7 2002-12-30 alex
268 0b04bfa7 2002-12-30 alex
269 0b04bfa7 2002-12-30 alex GLOBAL LONG
270 0b04bfa7 2002-12-30 alex Conn_WCounter( VOID )
271 0b04bfa7 2002-12-30 alex {
272 0b04bfa7 2002-12-30 alex return WCounter;
273 0b04bfa7 2002-12-30 alex } /* Conn_WCounter */
274 0b04bfa7 2002-12-30 alex
275 0b04bfa7 2002-12-30 alex
276 0b04bfa7 2002-12-30 alex /* -eof- */