]>
Commit | Line | Data |
---|---|---|
189935b1 | 1 | /* |
2 | * IRC - Internet Relay Chat, include/client.h | |
3 | * Copyright (C) 1990 Jarkko Oikarinen and | |
4 | * University of Oulu, Computing Center | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation; either version 2, or (at your option) | |
9 | * any later version. | |
10 | * | |
11 | * This program is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with this program; if not, write to the Free Software | |
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
19 | */ | |
20 | /** @file | |
21 | * @brief Structures and functions for handling local clients. | |
22 | * @version $Id: client.h,v 1.48 2005/06/27 13:25:51 entrope Exp $ | |
23 | */ | |
24 | #ifndef INCLUDED_client_h | |
25 | #define INCLUDED_client_h | |
26 | #ifndef INCLUDED_ircd_defs_h | |
27 | #include "ircd_defs.h" | |
28 | #endif | |
29 | #ifndef INCLUDED_dbuf_h | |
30 | #include "dbuf.h" | |
31 | #endif | |
32 | #ifndef INCLUDED_msgq_h | |
33 | #include "msgq.h" | |
34 | #endif | |
35 | #ifndef INCLUDED_ircd_events_h | |
36 | #include "ircd_events.h" | |
37 | #endif | |
38 | #ifndef INCLUDED_ircd_handler_h | |
39 | #include "ircd_handler.h" | |
40 | #endif | |
41 | #ifndef INCLUDED_res_h | |
42 | #include "res.h" | |
43 | #endif | |
44 | #ifndef INCLUDED_sys_types_h | |
45 | #include <sys/types.h> /* time_t, size_t */ | |
46 | #define INCLUDED_sys_types_h | |
47 | #endif | |
48 | ||
49 | struct ConfItem; | |
50 | struct Listener; | |
51 | struct ListingArgs; | |
52 | struct SLink; | |
53 | struct Server; | |
54 | struct User; | |
55 | struct Whowas; | |
56 | struct hostent; | |
57 | struct Privs; | |
58 | struct AuthRequest; | |
59 | ||
60 | /* | |
61 | * Structures | |
62 | * | |
63 | * Only put structures here that are being used in a very large number of | |
64 | * source files. Other structures go in the header file of there corresponding | |
65 | * source file, or in the source file itself (when only used in that file). | |
66 | */ | |
67 | ||
68 | /** Single element in a flag bitset array. */ | |
69 | typedef unsigned long flagpage_t; | |
70 | ||
71 | /** Number of bits in a flagpage_t. */ | |
72 | #define FLAGSET_NBITS (8 * sizeof(flagpage_t)) | |
73 | /** Element number for flag \a flag. */ | |
74 | #define FLAGSET_INDEX(flag) ((flag) / FLAGSET_NBITS) | |
75 | /** Element bit for flag \a flag. */ | |
76 | #define FLAGSET_MASK(flag) (1ul<<((flag) % FLAGSET_NBITS)) | |
77 | ||
78 | /** Declare a flagset structure of a particular size. */ | |
79 | #define DECLARE_FLAGSET(name,max) \ | |
80 | struct name \ | |
81 | { \ | |
82 | unsigned long bits[((max + FLAGSET_NBITS - 1) / FLAGSET_NBITS)]; \ | |
83 | } | |
84 | ||
85 | /** Test whether a flag is set in a flagset. */ | |
86 | #define FlagHas(set,flag) ((set)->bits[FLAGSET_INDEX(flag)] & FLAGSET_MASK(flag)) | |
87 | /** Set a flag in a flagset. */ | |
88 | #define FlagSet(set,flag) ((set)->bits[FLAGSET_INDEX(flag)] |= FLAGSET_MASK(flag)) | |
89 | /** Clear a flag in a flagset. */ | |
90 | #define FlagClr(set,flag) ((set)->bits[FLAGSET_INDEX(flag)] &= ~FLAGSET_MASK(flag)) | |
91 | ||
92 | /** String containing valid user modes, in no particular order. */ | |
93 | #define infousermodes "dioswkgx" | |
94 | ||
95 | /** Operator privileges. */ | |
96 | enum Priv | |
97 | { | |
98 | PRIV_CHAN_LIMIT, /**< no channel limit on oper */ | |
99 | PRIV_MODE_LCHAN, /**< oper can mode local chans */ | |
100 | PRIV_WALK_LCHAN, /**< oper can walk through local modes */ | |
101 | PRIV_DEOP_LCHAN, /**< no deop oper on local chans */ | |
102 | PRIV_SHOW_INVIS, /**< show local invisible users */ | |
103 | PRIV_SHOW_ALL_INVIS, /**< show all invisible users */ | |
104 | PRIV_UNLIMIT_QUERY, /**< unlimit who queries */ | |
105 | PRIV_KILL, /**< oper can KILL */ | |
106 | PRIV_LOCAL_KILL, /**< oper can local KILL */ | |
107 | PRIV_REHASH, /**< oper can REHASH */ | |
108 | PRIV_RESTART, /**< oper can RESTART */ | |
109 | PRIV_DIE, /**< oper can DIE */ | |
110 | PRIV_GLINE, /**< oper can GLINE */ | |
111 | PRIV_LOCAL_GLINE, /**< oper can local GLINE */ | |
112 | PRIV_JUPE, /**< oper can JUPE */ | |
113 | PRIV_LOCAL_JUPE, /**< oper can local JUPE */ | |
114 | PRIV_OPMODE, /**< oper can OP/CLEARMODE */ | |
115 | PRIV_LOCAL_OPMODE, /**< oper can local OP/CLEARMODE */ | |
116 | PRIV_SET, /**< oper can SET */ | |
117 | PRIV_WHOX, /**< oper can use /who x */ | |
118 | PRIV_BADCHAN, /**< oper can BADCHAN */ | |
119 | PRIV_LOCAL_BADCHAN, /**< oper can local BADCHAN */ | |
120 | PRIV_SEE_CHAN, /**< oper can see in secret chans */ | |
121 | PRIV_PROPAGATE, /**< propagate oper status */ | |
122 | PRIV_DISPLAY, /**< "Is an oper" displayed */ | |
123 | PRIV_SEE_OPERS, /**< display hidden opers */ | |
124 | PRIV_WIDE_GLINE, /**< oper can set wider G-lines */ | |
125 | PRIV_LIST_CHAN, /**< oper can list secret channels */ | |
126 | PRIV_FORCE_OPMODE, /**< can hack modes on quarantined channels */ | |
127 | PRIV_FORCE_LOCAL_OPMODE, /**< can hack modes on quarantined local channels */ | |
128 | PRIV_APASS_OPMODE, /**< can hack modes +A/-A/+U/-U */ | |
129 | PRIV_LAST_PRIV /**< number of privileges */ | |
130 | }; | |
131 | ||
132 | /** Client flags and modes. | |
133 | * Note that flags at least FLAG_LOCAL_UMODES but less than | |
134 | * FLAG_GLOBAL_UMODES are treated as local modes, and flags at least | |
135 | * FLAG_GLOBAL_UMODES (but less than FLAG_LAST_FLAG) are treated as | |
136 | * global modes. | |
137 | */ | |
138 | enum Flag | |
139 | { | |
140 | FLAG_PINGSENT, /**< Unreplied ping sent */ | |
141 | FLAG_DEADSOCKET, /**< Local socket is dead--Exiting soon */ | |
142 | FLAG_KILLED, /**< Prevents "QUIT" from being sent for this */ | |
143 | FLAG_BLOCKED, /**< socket is in a blocked condition */ | |
144 | FLAG_CLOSING, /**< set when closing to suppress errors */ | |
145 | FLAG_UPING, /**< has active UDP ping request */ | |
146 | FLAG_HUB, /**< server is a hub */ | |
147 | FLAG_IPV6, /**< server understands P10 IPv6 addrs */ | |
148 | FLAG_SERVICE, /**< server is a service */ | |
149 | FLAG_GOTID, /**< successful ident lookup achieved */ | |
150 | FLAG_DOID, /**< I-lines say must use ident return */ | |
151 | FLAG_NONL, /**< No \n in buffer */ | |
152 | FLAG_TS8, /**< Why do you want to know? */ | |
153 | FLAG_MAP, /**< Show server on the map */ | |
154 | FLAG_JUNCTION, /**< Junction causing the net.burst. */ | |
155 | FLAG_BURST, /**< Server is receiving a net.burst */ | |
156 | FLAG_BURST_ACK, /**< Server is waiting for eob ack */ | |
157 | FLAG_IPCHECK, /**< Added or updated IPregistry data */ | |
158 | FLAG_IAUTHED, /**< Got IAUTH response for user */ | |
159 | FLAG_LOCOP, /**< Local operator -- SRB */ | |
160 | FLAG_SERVNOTICE, /**< server notices such as kill */ | |
161 | FLAG_OPER, /**< Operator */ | |
162 | FLAG_INVISIBLE, /**< makes user invisible */ | |
163 | FLAG_WALLOP, /**< send wallops to them */ | |
164 | FLAG_DEAF, /**< Makes user deaf */ | |
165 | FLAG_CHSERV, /**< Disallow KICK or MODE -o on the user; | |
166 | don't display channels in /whois */ | |
167 | FLAG_DEBUG, /**< send global debug/anti-hack info */ | |
168 | FLAG_ACCOUNT, /**< account name has been set */ | |
169 | FLAG_HIDDENHOST, /**< user's host is hidden */ | |
170 | FLAG_LAST_FLAG, /**< number of flags */ | |
171 | FLAG_LOCAL_UMODES = FLAG_LOCOP, /**< First local mode flag */ | |
172 | FLAG_GLOBAL_UMODES = FLAG_OPER /**< First global mode flag */ | |
173 | }; | |
174 | ||
175 | /** Declare flagset type for operator privileges. */ | |
176 | DECLARE_FLAGSET(Privs, PRIV_LAST_PRIV); | |
177 | /** Declare flagset type for user flags. */ | |
178 | DECLARE_FLAGSET(Flags, FLAG_LAST_FLAG); | |
179 | ||
180 | #include "capab.h" /* client capabilities */ | |
181 | ||
182 | /** Represents a local connection. | |
183 | * This contains a lot of stuff irrelevant to server connections, but | |
184 | * those are so rare as to not be worth special-casing. | |
185 | */ | |
186 | struct Connection | |
187 | { | |
188 | unsigned long con_magic; /**< magic number */ | |
189 | struct Connection* con_next; /**< Next connection with queued data */ | |
190 | struct Connection** con_prev_p; /**< What points to us */ | |
191 | struct Client* con_client; /**< Client associated with connection */ | |
192 | unsigned int con_count; /**< Amount of data in buffer */ | |
193 | int con_freeflag; /**< indicates if connection can be freed */ | |
194 | int con_error; /**< last socket level error for client */ | |
195 | int con_sentalong; /**< sentalong marker for connection */ | |
196 | unsigned int con_snomask; /**< mask for server messages */ | |
197 | time_t con_nextnick; /**< Next time a nick change is allowed */ | |
198 | time_t con_nexttarget;/**< Next time a target change is allowed */ | |
199 | time_t con_lasttime; /**< Last time data read from socket */ | |
200 | time_t con_since; /**< Last time we accepted a command */ | |
201 | unsigned int con_cookie; /**< Random number the user must PONG */ | |
202 | struct MsgQ con_sendQ; /**< Outgoing message queue */ | |
203 | struct DBuf con_recvQ; /**< Incoming data yet to be parsed */ | |
204 | unsigned int con_sendM; /**< Stats: protocol messages sent */ | |
205 | unsigned int con_receiveM; /**< Stats: protocol messages received */ | |
206 | uint64_t con_sendB; /**< Bytes sent. */ | |
207 | uint64_t con_receiveB; /**< Bytes received. */ | |
208 | struct Listener* con_listener; /**< Listening socket which we accepted | |
209 | from. */ | |
210 | struct SLink* con_confs; /**< Associated configuration records. */ | |
211 | HandlerType con_handler; /**< Message index into command table | |
212 | for parsing. */ | |
213 | struct ListingArgs* con_listing; /**< Current LIST status. */ | |
214 | unsigned long con_unreg; /**< Indicate what still needs to be done */ | |
215 | unsigned int con_max_sendq; /**< cached max send queue for client */ | |
216 | unsigned int con_ping_freq; /**< cached ping freq */ | |
217 | unsigned short con_lastsq; /**< # 2k blocks when sendqueued | |
218 | called last. */ | |
219 | unsigned char con_targets[MAXTARGETS]; /**< Hash values of | |
220 | current targets. */ | |
221 | char con_sock_ip[SOCKIPLEN + 1]; /**< Remote IP address as a string. */ | |
222 | char con_sockhost[HOSTLEN + 1]; /**< This is the host name from | |
223 | the socket and after which the | |
224 | connection was accepted. */ | |
225 | char con_passwd[PASSWDLEN + 1]; /**< Password given by user. */ | |
226 | char con_buffer[BUFSIZE]; /**< Incoming message buffer; or | |
227 | the error that caused this | |
228 | clients socket to close. */ | |
229 | struct Socket con_socket; /**< socket descriptor for | |
230 | client */ | |
231 | struct Timer con_proc; /**< process latent messages from | |
232 | client */ | |
233 | struct Privs con_privs; /**< Oper privileges */ | |
234 | struct CapSet con_capab; /**< Client capabilities (from us) */ | |
235 | struct CapSet con_active; /**< Active capabilities (to us) */ | |
236 | struct AuthRequest* con_auth; /**< auth request for client */ | |
237 | struct IAuthRequest* con_iauth; /**< iauth request for client */ | |
238 | }; | |
239 | ||
240 | /** Magic constant to identify valid Connection structures. */ | |
241 | #define CONNECTION_MAGIC 0x12f955f3 | |
242 | ||
243 | /** Represents a client anywhere on the network. */ | |
244 | struct Client { | |
245 | unsigned long cli_magic; /**< magic number */ | |
246 | struct Client* cli_next; /**< link in GlobalClientList */ | |
247 | struct Client* cli_prev; /**< link in GlobalClientList */ | |
248 | struct Client* cli_hnext; /**< link in hash table bucket or this */ | |
249 | struct Connection* cli_connect; /**< Connection structure associated with us */ | |
250 | struct User* cli_user; /**< Defined if this client is a user */ | |
251 | struct Server* cli_serv; /**< Defined if this client is a server */ | |
252 | struct Whowas* cli_whowas; /**< Pointer to ww struct to be freed on quit */ | |
253 | char cli_yxx[4]; /**< Numeric Nick: YY if this is a | |
254 | server, XXX if this is a user */ | |
255 | time_t cli_firsttime; /**< time client was created */ | |
256 | time_t cli_lastnick; /**< TimeStamp on nick */ | |
257 | int cli_marker; /**< /who processing marker */ | |
258 | struct Flags cli_flags; /**< client flags */ | |
259 | unsigned int cli_hopcount; /**< number of servers to this 0 = local */ | |
260 | struct irc_in_addr cli_ip; /**< Real IP of client */ | |
261 | short cli_status; /**< Client type */ | |
262 | char cli_name[HOSTLEN + 1]; /**< Unique name of the client, nick or host */ | |
263 | char cli_username[USERLEN + 1]; /**< Username determined by ident lookup */ | |
264 | char cli_info[REALLEN + 1]; /**< Free form additional client information */ | |
265 | }; | |
266 | ||
267 | #define CLIREG_NICK 0x0001 /**< Client must set nickname */ | |
268 | #define CLIREG_USER 0x0002 /**< Client must set username */ | |
269 | #define CLIREG_COOKIE 0x0004 /**< Client must return cookie */ | |
270 | #define CLIREG_CAP 0x0008 /**< Client in capability negotiation */ | |
271 | ||
272 | #define CLIREG_INIT (CLIREG_NICK | CLIREG_USER | CLIREG_COOKIE) | |
273 | ||
274 | /** Magic constant to identify valid Client structures. */ | |
275 | #define CLIENT_MAGIC 0x4ca08286 | |
276 | ||
277 | /** Verify that a client is valid. */ | |
278 | #define cli_verify(cli) ((cli)->cli_magic == CLIENT_MAGIC) | |
279 | /** Get client's magic number. */ | |
280 | #define cli_magic(cli) ((cli)->cli_magic) | |
281 | /** Get global next client. */ | |
282 | #define cli_next(cli) ((cli)->cli_next) | |
283 | /** Get global previous client. */ | |
284 | #define cli_prev(cli) ((cli)->cli_prev) | |
285 | /** Get next client in hash bucket chain. */ | |
286 | #define cli_hnext(cli) ((cli)->cli_hnext) | |
287 | /** Get connection associated with client. */ | |
288 | #define cli_connect(cli) ((cli)->cli_connect) | |
289 | /** Get local client that links us to \a cli. */ | |
290 | #define cli_from(cli) con_client(cli_connect(cli)) | |
291 | /** Get User structure for client, if client is a user. */ | |
292 | #define cli_user(cli) ((cli)->cli_user) | |
293 | /** Get Server structure for client, if client is a server. */ | |
294 | #define cli_serv(cli) ((cli)->cli_serv) | |
295 | /** Get Whowas link for client. */ | |
296 | #define cli_whowas(cli) ((cli)->cli_whowas) | |
297 | /** Get client numnick. */ | |
298 | #define cli_yxx(cli) ((cli)->cli_yxx) | |
299 | /** Get time we last read data from the client socket. */ | |
300 | #define cli_lasttime(cli) con_lasttime(cli_connect(cli)) | |
301 | /** Get time we last parsed something from the client. */ | |
302 | #define cli_since(cli) con_since(cli_connect(cli)) | |
303 | /** Get time client was created. */ | |
304 | #define cli_firsttime(cli) ((cli)->cli_firsttime) | |
305 | /** Get time client last changed nickname. */ | |
306 | #define cli_lastnick(cli) ((cli)->cli_lastnick) | |
307 | /** Get WHO marker for client. */ | |
308 | #define cli_marker(cli) ((cli)->cli_marker) | |
309 | /** Get flags flagset for client. */ | |
310 | #define cli_flags(cli) ((cli)->cli_flags) | |
311 | /** Get hop count to client. */ | |
312 | #define cli_hopcount(cli) ((cli)->cli_hopcount) | |
313 | /** Get client IP address. */ | |
314 | #define cli_ip(cli) ((cli)->cli_ip) | |
315 | /** Get status bitmask for client. */ | |
316 | #define cli_status(cli) ((cli)->cli_status) | |
317 | /** Return non-zero if the client is local. */ | |
318 | #define cli_local(cli) (cli_from(cli) == cli) | |
319 | /** Get oper privileges for client. */ | |
320 | #define cli_privs(cli) con_privs(cli_connect(cli)) | |
321 | /** Get client capabilities for client */ | |
322 | #define cli_capab(cli) con_capab(cli_connect(cli)) | |
323 | /** Get active client capabilities for client */ | |
324 | #define cli_active(cli) con_active(cli_connect(cli)) | |
325 | /** Get flags for remaining registration tasks */ | |
326 | #define cli_unreg(cli) con_unreg(cli_connect(cli)) | |
327 | /** Get client name. */ | |
328 | #define cli_name(cli) ((cli)->cli_name) | |
329 | /** Get client username (ident). */ | |
330 | #define cli_username(cli) ((cli)->cli_username) | |
331 | /** Get client realname (information field). */ | |
332 | #define cli_info(cli) ((cli)->cli_info) | |
333 | ||
334 | /** Get number of incoming bytes queued for client. */ | |
335 | #define cli_count(cli) con_count(cli_connect(cli)) | |
336 | /** Get file descriptor for sending in client's direction. */ | |
337 | #define cli_fd(cli) con_fd(cli_connect(cli)) | |
338 | /** Get free flags for the client's connection. */ | |
339 | #define cli_freeflag(cli) con_freeflag(cli_connect(cli)) | |
340 | /** Get last error code for the client's connection. */ | |
341 | #define cli_error(cli) con_error(cli_connect(cli)) | |
342 | /** Get server notice mask for the client. */ | |
343 | #define cli_snomask(cli) con_snomask(cli_connect(cli)) | |
344 | /** Get next time a nick change is allowed for the client. */ | |
345 | #define cli_nextnick(cli) con_nextnick(cli_connect(cli)) | |
346 | /** Get next time a target change is allowed for the client. */ | |
347 | #define cli_nexttarget(cli) con_nexttarget(cli_connect(cli)) | |
348 | /** Get required PING/PONG cookie for client. */ | |
349 | #define cli_cookie(cli) con_cookie(cli_connect(cli)) | |
350 | /** Get SendQ for client. */ | |
351 | #define cli_sendQ(cli) con_sendQ(cli_connect(cli)) | |
352 | /** Get RecvQ for client. */ | |
353 | #define cli_recvQ(cli) con_recvQ(cli_connect(cli)) | |
354 | /** Get count of messages sent to client. */ | |
355 | #define cli_sendM(cli) con_sendM(cli_connect(cli)) | |
356 | /** Get number of messages received from client. */ | |
357 | #define cli_receiveM(cli) con_receiveM(cli_connect(cli)) | |
358 | /** Get number of bytes (modulo 1024) sent to client. */ | |
359 | #define cli_sendB(cli) con_sendB(cli_connect(cli)) | |
360 | /** Get number of bytes (modulo 1024) received from client. */ | |
361 | #define cli_receiveB(cli) con_receiveB(cli_connect(cli)) | |
362 | /** Get listener that accepted the client's connection. */ | |
363 | #define cli_listener(cli) con_listener(cli_connect(cli)) | |
364 | /** Get list of attached conf lines. */ | |
365 | #define cli_confs(cli) con_confs(cli_connect(cli)) | |
366 | /** Get handler type for client. */ | |
367 | #define cli_handler(cli) con_handler(cli_connect(cli)) | |
368 | /** Get LIST status for client. */ | |
369 | #define cli_listing(cli) con_listing(cli_connect(cli)) | |
370 | /** Get cached max SendQ for client. */ | |
371 | #define cli_max_sendq(cli) con_max_sendq(cli_connect(cli)) | |
372 | /** Get ping frequency for client. */ | |
373 | #define cli_ping_freq(cli) con_ping_freq(cli_connect(cli)) | |
374 | /** Get lastsq for client's connection. */ | |
375 | #define cli_lastsq(cli) con_lastsq(cli_connect(cli)) | |
376 | /** Get the array of current targets for the client. */ | |
377 | #define cli_targets(cli) con_targets(cli_connect(cli)) | |
378 | /** Get the string form of the client's IP address. */ | |
379 | #define cli_sock_ip(cli) con_sock_ip(cli_connect(cli)) | |
380 | /** Get the resolved hostname for the client. */ | |
381 | #define cli_sockhost(cli) con_sockhost(cli_connect(cli)) | |
382 | /** Get the client's password. */ | |
383 | #define cli_passwd(cli) con_passwd(cli_connect(cli)) | |
384 | /** Get the unprocessed input buffer for a client's connection. */ | |
385 | #define cli_buffer(cli) con_buffer(cli_connect(cli)) | |
386 | /** Get the Socket structure for sending to a client. */ | |
387 | #define cli_socket(cli) con_socket(cli_connect(cli)) | |
388 | /** Get Timer for processing waiting messages from the client. */ | |
389 | #define cli_proc(cli) con_proc(cli_connect(cli)) | |
390 | /** Get auth request for client. */ | |
391 | #define cli_auth(cli) con_auth(cli_connect(cli)) | |
392 | /** Get iauth request for client. */ | |
393 | #define cli_iauth(cli) con_iauth(cli_connect(cli)) | |
394 | /** Get sentalong marker for client. */ | |
395 | #define cli_sentalong(cli) con_sentalong(cli_connect(cli)) | |
396 | ||
397 | /** Verify that a connection is valid. */ | |
398 | #define con_verify(con) ((con)->con_magic == CONNECTION_MAGIC) | |
399 | /** Get connection's magic number. */ | |
400 | #define con_magic(con) ((con)->con_magic) | |
401 | /** Get global next connection. */ | |
402 | #define con_next(con) ((con)->con_next) | |
403 | /** Get global previous connection. */ | |
404 | #define con_prev_p(con) ((con)->con_prev_p) | |
405 | /** Get locally connected client for connection. */ | |
406 | #define con_client(con) ((con)->con_client) | |
407 | /** Get number of unprocessed data bytes from connection. */ | |
408 | #define con_count(con) ((con)->con_count) | |
409 | /** Get file descriptor for connection. */ | |
410 | #define con_fd(con) s_fd(&(con)->con_socket) | |
411 | /** Get freeable flags for connection. */ | |
412 | #define con_freeflag(con) ((con)->con_freeflag) | |
413 | /** Get last error code on connection. */ | |
414 | #define con_error(con) ((con)->con_error) | |
415 | /** Get sentalong marker for connection. */ | |
416 | #define con_sentalong(con) ((con)->con_sentalong) | |
417 | /** Get server notice mask for connection. */ | |
418 | #define con_snomask(con) ((con)->con_snomask) | |
419 | /** Get next nick change time for connection. */ | |
420 | #define con_nextnick(con) ((con)->con_nextnick) | |
421 | /** Get next new target time for connection. */ | |
422 | #define con_nexttarget(con) ((con)->con_nexttarget) | |
423 | /** Get last time we read from the connection. */ | |
424 | #define con_lasttime(con) ((con)->con_lasttime) | |
425 | /** Get last time we accepted a command from the connection. */ | |
426 | #define con_since(con) ((con)->con_since) | |
427 | /** Get PING/PONG confirmation cookie for connection. */ | |
428 | #define con_cookie(con) ((con)->con_cookie) | |
429 | /** Get SendQ for connection. */ | |
430 | #define con_sendQ(con) ((con)->con_sendQ) | |
431 | /** Get RecvQ for connection. */ | |
432 | #define con_recvQ(con) ((con)->con_recvQ) | |
433 | /** Get number of messages sent to connection. */ | |
434 | #define con_sendM(con) ((con)->con_sendM) | |
435 | /** Get number of messages received from connection. */ | |
436 | #define con_receiveM(con) ((con)->con_receiveM) | |
437 | /** Get number of bytes (modulo 1024) sent to connection. */ | |
438 | #define con_sendB(con) ((con)->con_sendB) | |
439 | /** Get number of bytes (modulo 1024) received from connection. */ | |
440 | #define con_receiveB(con) ((con)->con_receiveB) | |
441 | /** Get listener that accepted the connection. */ | |
442 | #define con_listener(con) ((con)->con_listener) | |
443 | /** Get list of ConfItems attached to the connection. */ | |
444 | #define con_confs(con) ((con)->con_confs) | |
445 | /** Get command handler for the connection. */ | |
446 | #define con_handler(con) ((con)->con_handler) | |
447 | /** Get the LIST status for the connection. */ | |
448 | #define con_listing(con) ((con)->con_listing) | |
449 | /** Get remining steps before registration completes. */ | |
450 | #define con_unreg(con) ((con)->con_unreg) | |
451 | /** Get the maximum permitted SendQ size for the connection. */ | |
452 | #define con_max_sendq(con) ((con)->con_max_sendq) | |
453 | /** Get the ping frequency for the connection. */ | |
454 | #define con_ping_freq(con) ((con)->con_ping_freq) | |
455 | /** Get the lastsq for the connection. */ | |
456 | #define con_lastsq(con) ((con)->con_lastsq) | |
457 | /** Get the current targets array for the connection. */ | |
458 | #define con_targets(con) ((con)->con_targets) | |
459 | /** Get the string-formatted IP address for the connection. */ | |
460 | #define con_sock_ip(con) ((con)->con_sock_ip) | |
461 | /** Get the resolved hostname for the connection. */ | |
462 | #define con_sockhost(con) ((con)->con_sockhost) | |
463 | /** Get the password sent by the remote end of the connection. */ | |
464 | #define con_passwd(con) ((con)->con_passwd) | |
465 | /** Get the buffer of unprocessed incoming data from the connection. */ | |
466 | #define con_buffer(con) ((con)->con_buffer) | |
467 | /** Get the Socket for the connection. */ | |
468 | #define con_socket(con) ((con)->con_socket) | |
469 | /** Get the Timer for processing more data from the connection. */ | |
470 | #define con_proc(con) ((con)->con_proc) | |
471 | /** Get the oper privilege set for the connection. */ | |
472 | #define con_privs(con) (&(con)->con_privs) | |
473 | /** Get the peer's capabilities for the connection. */ | |
474 | #define con_capab(con) (&(con)->con_capab) | |
475 | /** Get the active capabilities for the connection. */ | |
476 | #define con_active(con) (&(con)->con_active) | |
477 | /** Get the auth request for the connection. */ | |
478 | #define con_auth(con) ((con)->con_auth) | |
479 | /** Get the iauth request for the connection. */ | |
480 | #define con_iauth(con) ((con)->con_iauth) | |
481 | ||
482 | #define STAT_CONNECTING 0x001 /**< connecting to another server */ | |
483 | #define STAT_HANDSHAKE 0x002 /**< pass - server sent */ | |
484 | #define STAT_ME 0x004 /**< this server */ | |
485 | #define STAT_UNKNOWN 0x008 /**< unidentified connection */ | |
486 | #define STAT_UNKNOWN_USER 0x010 /**< connection on a client port */ | |
487 | #define STAT_UNKNOWN_SERVER 0x020 /**< connection on a server port */ | |
488 | #define STAT_SERVER 0x040 /**< fully registered server */ | |
489 | #define STAT_USER 0x080 /**< fully registered user */ | |
490 | ||
491 | /* | |
492 | * status macros. | |
493 | */ | |
494 | /** Return non-zero if the client is registered. */ | |
495 | #define IsRegistered(x) (cli_status(x) & (STAT_SERVER | STAT_USER)) | |
496 | /** Return non-zero if the client is an outbound connection that is | |
497 | * still connecting. */ | |
498 | #define IsConnecting(x) (cli_status(x) == STAT_CONNECTING) | |
499 | /** Return non-zero if the client is an outbound connection that has | |
500 | * sent our password. */ | |
501 | #define IsHandshake(x) (cli_status(x) == STAT_HANDSHAKE) | |
502 | /** Return non-zero if the client is this server. */ | |
503 | #define IsMe(x) (cli_status(x) == STAT_ME) | |
504 | /** Return non-zero if the client has not yet registered. */ | |
505 | #define IsUnknown(x) (cli_status(x) & \ | |
506 | (STAT_UNKNOWN | STAT_UNKNOWN_USER | STAT_UNKNOWN_SERVER)) | |
507 | /** Return non-zero if the client is an unregistered connection on a | |
508 | * server port. */ | |
509 | #define IsServerPort(x) (cli_status(x) == STAT_UNKNOWN_SERVER ) | |
510 | /** Return non-zero if the client is an unregistered connection on a | |
511 | * user port. */ | |
512 | #define IsUserPort(x) (cli_status(x) == STAT_UNKNOWN_USER ) | |
513 | /** Return non-zero if the client is a real client connection. */ | |
514 | #define IsClient(x) (cli_status(x) & \ | |
515 | (STAT_HANDSHAKE | STAT_ME | STAT_UNKNOWN |\ | |
516 | STAT_UNKNOWN_USER | STAT_UNKNOWN_SERVER | STAT_SERVER | STAT_USER)) | |
517 | /** Return non-zero if the client ignores flood limits. */ | |
518 | #define IsTrusted(x) (cli_status(x) & \ | |
519 | (STAT_CONNECTING | STAT_HANDSHAKE | STAT_ME | STAT_SERVER)) | |
520 | /** Return non-zero if the client is a registered server. */ | |
521 | #define IsServer(x) (cli_status(x) == STAT_SERVER) | |
522 | /** Return non-zero if the client is a registered user. */ | |
523 | #define IsUser(x) (cli_status(x) == STAT_USER) | |
524 | ||
525 | ||
526 | /** Mark a client with STAT_CONNECTING. */ | |
527 | #define SetConnecting(x) (cli_status(x) = STAT_CONNECTING) | |
528 | /** Mark a client with STAT_HANDSHAKE. */ | |
529 | #define SetHandshake(x) (cli_status(x) = STAT_HANDSHAKE) | |
530 | /** Mark a client with STAT_SERVER. */ | |
531 | #define SetServer(x) (cli_status(x) = STAT_SERVER) | |
532 | /** Mark a client with STAT_ME. */ | |
533 | #define SetMe(x) (cli_status(x) = STAT_ME) | |
534 | /** Mark a client with STAT_USER. */ | |
535 | #define SetUser(x) (cli_status(x) = STAT_USER) | |
536 | ||
537 | /** Return non-zero if a client is directly connected to me. */ | |
538 | #define MyConnect(x) (cli_from(x) == (x)) | |
539 | /** Return non-zero if a client is a locally connected user. */ | |
540 | #define MyUser(x) (MyConnect(x) && IsUser(x)) | |
541 | /** Return non-zero if a client is a locally connected IRC operator. */ | |
542 | #define MyOper(x) (MyConnect(x) && IsOper(x)) | |
543 | /** Return protocol version used by a server. */ | |
544 | #define Protocol(x) ((cli_serv(x))->prot) | |
545 | ||
546 | /* | |
547 | * flags macros | |
548 | */ | |
549 | /** Set a flag in a client's flags. */ | |
550 | #define SetFlag(cli, flag) FlagSet(&cli_flags(cli), flag) | |
551 | /** Clear a flag from a client's flags. */ | |
552 | #define ClrFlag(cli, flag) FlagClr(&cli_flags(cli), flag) | |
553 | /** Return non-zero if a flag is set in a client's flags. */ | |
554 | #define HasFlag(cli, flag) FlagHas(&cli_flags(cli), flag) | |
555 | ||
556 | /** Return non-zero if the client is an IRC operator (global or local). */ | |
557 | #define IsAnOper(x) (HasFlag(x, FLAG_OPER) || HasFlag(x, FLAG_LOCOP)) | |
558 | /** Return non-zero if the client's connection is blocked. */ | |
559 | #define IsBlocked(x) HasFlag(x, FLAG_BLOCKED) | |
560 | /** Return non-zero if the client's connection is still being burst. */ | |
561 | #define IsBurst(x) HasFlag(x, FLAG_BURST) | |
562 | /** Return non-zero if we have received the peer's entire burst but | |
563 | * not their EOB ack. */ | |
564 | #define IsBurstAck(x) HasFlag(x, FLAG_BURST_ACK) | |
565 | /** Return non-zero if we are still bursting to the client. */ | |
566 | #define IsBurstOrBurstAck(x) (HasFlag(x, FLAG_BURST) || HasFlag(x, FLAG_BURST_ACK)) | |
567 | /** Return non-zero if the client has set mode +k (channel service). */ | |
568 | #define IsChannelService(x) HasFlag(x, FLAG_CHSERV) | |
569 | /** Return non-zero if the client's socket is disconnected. */ | |
570 | #define IsDead(x) HasFlag(x, FLAG_DEADSOCKET) | |
571 | /** Return non-zero if the client has set mode +d (deaf). */ | |
572 | #define IsDeaf(x) HasFlag(x, FLAG_DEAF) | |
573 | /** Return non-zero if the client has been IP-checked for clones. */ | |
574 | #define IsIPChecked(x) HasFlag(x, FLAG_IPCHECK) | |
575 | /** Return non-zero if the client has been okayed by iauth. */ | |
576 | #define IsIAuthed(x) HasFlag(x, FLAG_IAUTHED) | |
577 | /** Return non-zero if we have received an ident response for the client. */ | |
578 | #define IsIdented(x) HasFlag(x, FLAG_GOTID) | |
579 | /** Return non-zero if the client has set mode +i (invisible). */ | |
580 | #define IsInvisible(x) HasFlag(x, FLAG_INVISIBLE) | |
581 | /** Return non-zero if the client caused a net.burst. */ | |
582 | #define IsJunction(x) HasFlag(x, FLAG_JUNCTION) | |
583 | /** Return non-zero if the client has set mode +O (local operator). */ | |
584 | #define IsLocOp(x) HasFlag(x, FLAG_LOCOP) | |
585 | /** Return non-zero if the client has set mode +o (global operator). */ | |
586 | #define IsOper(x) HasFlag(x, FLAG_OPER) | |
587 | /** Return non-zero if the client has an active UDP ping request. */ | |
588 | #define IsUPing(x) HasFlag(x, FLAG_UPING) | |
589 | /** Return non-zero if the client has no '\n' in its buffer. */ | |
590 | #define NoNewLine(x) HasFlag(x, FLAG_NONL) | |
591 | /** Return non-zero if the client has set mode +g (debugging). */ | |
592 | #define SendDebug(x) HasFlag(x, FLAG_DEBUG) | |
593 | /** Return non-zero if the client has set mode +s (server notices). */ | |
594 | #define SendServNotice(x) HasFlag(x, FLAG_SERVNOTICE) | |
595 | /** Return non-zero if the client has set mode +w (wallops). */ | |
596 | #define SendWallops(x) HasFlag(x, FLAG_WALLOP) | |
597 | /** Return non-zero if the client claims to be a hub. */ | |
598 | #define IsHub(x) HasFlag(x, FLAG_HUB) | |
599 | /** Return non-zero if the client understands IPv6 addresses in P10. */ | |
600 | #define IsIPv6(x) HasFlag(x, FLAG_IPV6) | |
601 | /** Return non-zero if the client claims to be a services server. */ | |
602 | #define IsService(x) HasFlag(x, FLAG_SERVICE) | |
603 | /** Return non-zero if the client has an account stamp. */ | |
604 | #define IsAccount(x) HasFlag(x, FLAG_ACCOUNT) | |
605 | /** Return non-zero if the client has set mode +x (hidden host). */ | |
606 | #define IsHiddenHost(x) HasFlag(x, FLAG_HIDDENHOST) | |
607 | /** Return non-zero if the client has an active PING request. */ | |
608 | #define IsPingSent(x) HasFlag(x, FLAG_PINGSENT) | |
609 | ||
610 | /** Return non-zero if the client has operator or server privileges. */ | |
611 | #define IsPrivileged(x) (IsAnOper(x) || IsServer(x)) | |
612 | /** Return non-zero if the client's host is hidden. */ | |
613 | #define HasHiddenHost(x) (IsHiddenHost(x) && IsAccount(x)) | |
614 | ||
615 | /** Mark a client as having an in-progress net.burst. */ | |
616 | #define SetBurst(x) SetFlag(x, FLAG_BURST) | |
617 | /** Mark a client as being between EOB and EOB ACK. */ | |
618 | #define SetBurstAck(x) SetFlag(x, FLAG_BURST_ACK) | |
619 | /** Mark a client as having mode +k (channel service). */ | |
620 | #define SetChannelService(x) SetFlag(x, FLAG_CHSERV) | |
621 | /** Mark a client as having mode +d (deaf). */ | |
622 | #define SetDeaf(x) SetFlag(x, FLAG_DEAF) | |
623 | /** Mark a client as having mode +g (debugging). */ | |
624 | #define SetDebug(x) SetFlag(x, FLAG_DEBUG) | |
625 | /** Mark a client as having ident looked up. */ | |
626 | #define SetGotId(x) SetFlag(x, FLAG_GOTID) | |
627 | /** Mark a client as being IP-checked. */ | |
628 | #define SetIPChecked(x) SetFlag(x, FLAG_IPCHECK) | |
629 | /** Mark a client as being iauth-checked. */ | |
630 | #define SetIAuthed(x) SetFlag(x, FLAG_IAUTHED) | |
631 | /** Mark a client as having mode +i (invisible). */ | |
632 | #define SetInvisible(x) SetFlag(x, FLAG_INVISIBLE) | |
633 | /** Mark a client as causing a net.join. */ | |
634 | #define SetJunction(x) SetFlag(x, FLAG_JUNCTION) | |
635 | /** Mark a client as having mode +O (local operator). */ | |
636 | #define SetLocOp(x) SetFlag(x, FLAG_LOCOP) | |
637 | /** Mark a client as having mode +o (global operator). */ | |
638 | #define SetOper(x) SetFlag(x, FLAG_OPER) | |
639 | /** Mark a client as having a pending UDP ping. */ | |
640 | #define SetUPing(x) SetFlag(x, FLAG_UPING) | |
641 | /** Mark a client as having mode +w (wallops). */ | |
642 | #define SetWallops(x) SetFlag(x, FLAG_WALLOP) | |
643 | /** Mark a client as having mode +s (server notices). */ | |
644 | #define SetServNotice(x) SetFlag(x, FLAG_SERVNOTICE) | |
645 | /** Mark a client as being a hub server. */ | |
646 | #define SetHub(x) SetFlag(x, FLAG_HUB) | |
647 | /** Mark a client as being an IPv6-grokking server. */ | |
648 | #define SetIPv6(x) SetFlag(x, FLAG_IPV6) | |
649 | /** Mark a client as being a services server. */ | |
650 | #define SetService(x) SetFlag(x, FLAG_SERVICE) | |
651 | /** Mark a client as having an account stamp. */ | |
652 | #define SetAccount(x) SetFlag(x, FLAG_ACCOUNT) | |
653 | /** Mark a client as having mode +x (hidden host). */ | |
654 | #define SetHiddenHost(x) SetFlag(x, FLAG_HIDDENHOST) | |
655 | /** Mark a client as having a pending PING. */ | |
656 | #define SetPingSent(x) SetFlag(x, FLAG_PINGSENT) | |
657 | ||
658 | /** Return non-zero if \a sptr sees \a acptr as an operator. */ | |
659 | #define SeeOper(sptr,acptr) (IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) \ | |
660 | || HasPriv(sptr, PRIV_SEE_OPERS))) | |
661 | ||
662 | /** Clear the client's net.burst in-progress flag. */ | |
663 | #define ClearBurst(x) ClrFlag(x, FLAG_BURST) | |
664 | /** Clear the client's between EOB and EOB ACK flag. */ | |
665 | #define ClearBurstAck(x) ClrFlag(x, FLAG_BURST_ACK) | |
666 | /** Remove mode +k (channel service) from the client. */ | |
667 | #define ClearChannelService(x) ClrFlag(x, FLAG_CHSERV) | |
668 | /** Remove mode +d (deaf) from the client. */ | |
669 | #define ClearDeaf(x) ClrFlag(x, FLAG_DEAF) | |
670 | /** Remove mode +g (debugging) from the client. */ | |
671 | #define ClearDebug(x) ClrFlag(x, FLAG_DEBUG) | |
672 | /** Remove the client's IP-checked flag. */ | |
673 | #define ClearIPChecked(x) ClrFlag(x, FLAG_IPCHECK) | |
674 | /** Remove mode +i (invisible) from the client. */ | |
675 | #define ClearInvisible(x) ClrFlag(x, FLAG_INVISIBLE) | |
676 | /** Remove mode +O (local operator) from the client. */ | |
677 | #define ClearLocOp(x) ClrFlag(x, FLAG_LOCOP) | |
678 | /** Remove mode +o (global operator) from the client. */ | |
679 | #define ClearOper(x) ClrFlag(x, FLAG_OPER) | |
680 | /** Clear the client's pending UDP ping flag. */ | |
681 | #define ClearUPing(x) ClrFlag(x, FLAG_UPING) | |
682 | /** Remove mode +w (wallops) from the client. */ | |
683 | #define ClearWallops(x) ClrFlag(x, FLAG_WALLOP) | |
684 | /** Remove mode +s (server notices) from the client. */ | |
685 | #define ClearServNotice(x) ClrFlag(x, FLAG_SERVNOTICE) | |
686 | /** Remove mode +x (hidden host) from the client. */ | |
687 | #define ClearHiddenHost(x) ClrFlag(x, FLAG_HIDDENHOST) | |
688 | /** Clear the client's pending PING flag. */ | |
689 | #define ClearPingSent(x) ClrFlag(x, FLAG_PINGSENT) | |
690 | ||
691 | /* free flags */ | |
692 | #define FREEFLAG_SOCKET 0x0001 /**< socket needs to be freed */ | |
693 | #define FREEFLAG_TIMER 0x0002 /**< timer needs to be freed */ | |
694 | ||
695 | /* server notice stuff */ | |
696 | ||
697 | #define SNO_ADD 1 /**< Perform "or" on server notice mask. */ | |
698 | #define SNO_DEL 2 /**< Perform "and ~x" on server notice mask. */ | |
699 | #define SNO_SET 3 /**< Set server notice mask. */ | |
700 | /* DON'T CHANGE THESE VALUES ! */ | |
701 | /* THE CLIENTS DEPEND ON IT ! */ | |
702 | #define SNO_OLDSNO 0x1 /**< unsorted old messages */ | |
703 | #define SNO_SERVKILL 0x2 /**< server kills (nick collisions) */ | |
704 | #define SNO_OPERKILL 0x4 /**< oper kills */ | |
705 | #define SNO_HACK2 0x8 /**< desyncs */ | |
706 | #define SNO_HACK3 0x10 /**< temporary desyncs */ | |
707 | #define SNO_UNAUTH 0x20 /**< unauthorized connections */ | |
708 | #define SNO_TCPCOMMON 0x40 /**< common TCP or socket errors */ | |
709 | #define SNO_TOOMANY 0x80 /**< too many connections */ | |
710 | #define SNO_HACK4 0x100 /**< Uworld actions on channels */ | |
711 | #define SNO_GLINE 0x200 /**< glines */ | |
712 | #define SNO_NETWORK 0x400 /**< net join/break, etc */ | |
713 | #define SNO_IPMISMATCH 0x800 /**< IP mismatches */ | |
714 | #define SNO_THROTTLE 0x1000 /**< host throttle add/remove notices */ | |
715 | #define SNO_OLDREALOP 0x2000 /**< old oper-only messages */ | |
716 | #define SNO_CONNEXIT 0x4000 /**< client connect/exit (ugh) */ | |
717 | #define SNO_AUTO 0x8000 /**< AUTO G-Lines */ | |
718 | #define SNO_DEBUG 0x10000 /**< debugging messages (DEBUGMODE only) */ | |
719 | ||
720 | #ifdef DEBUGMODE | |
721 | # define SNO_ALL 0x1ffff /**< Bitmask of all valid server | |
722 | * notice bits. */ | |
723 | #else | |
724 | # define SNO_ALL 0xffff | |
725 | #endif | |
726 | ||
727 | /** Server notice bits allowed to normal users. */ | |
728 | #define SNO_USER (SNO_ALL & ~SNO_OPER) | |
729 | ||
730 | /** Server notice bits enabled by default for normal users. */ | |
731 | #define SNO_DEFAULT (SNO_NETWORK|SNO_OPERKILL|SNO_GLINE) | |
732 | /** Server notice bits enabled by default for IRC operators. */ | |
733 | #define SNO_OPERDEFAULT (SNO_DEFAULT|SNO_HACK2|SNO_HACK4|SNO_THROTTLE|SNO_OLDSNO) | |
734 | /** Server notice bits reserved to IRC operators. */ | |
735 | #define SNO_OPER (SNO_CONNEXIT|SNO_OLDREALOP) | |
736 | /** Noisy server notice bits that cause other bits to be cleared during connect. */ | |
737 | #define SNO_NOISY (SNO_SERVKILL|SNO_UNAUTH) | |
738 | ||
739 | /** Test whether a privilege has been granted to a client. */ | |
740 | #define HasPriv(cli, priv) FlagHas(cli_privs(cli), priv) | |
741 | /** Grant a privilege to a client. */ | |
742 | #define SetPriv(cli, priv) FlagSet(cli_privs(cli), priv) | |
743 | /** Revoke a privilege from a client. */ | |
744 | #define ClrPriv(cli, priv) FlagClr(cli_privs(cli), priv) | |
745 | ||
746 | /** Test whether a client has a capability */ | |
747 | #define HasCap(cli, cap) CapHas(cli_capab(cli), (cap)) | |
748 | /** Test whether a client has the capability active */ | |
749 | #define CapActive(cli, cap) CapHas(cli_active(cli), (cap)) | |
750 | ||
751 | #define HIDE_IP 0 /**< Do not show IP address in get_client_name() */ | |
752 | #define SHOW_IP 1 /**< Show ident and IP address in get_client_name() */ | |
753 | ||
754 | extern const char* get_client_name(const struct Client* sptr, int showip); | |
755 | extern const char* client_get_default_umode(const struct Client* sptr); | |
756 | extern int client_get_ping(const struct Client* local_client); | |
757 | extern void client_drop_sendq(struct Connection* con); | |
758 | extern void client_add_sendq(struct Connection* con, | |
759 | struct Connection** con_p); | |
760 | extern void client_set_privs(struct Client *client, struct ConfItem *oper); | |
761 | extern int client_report_privs(struct Client* to, struct Client* client); | |
762 | ||
763 | #endif /* INCLUDED_client_h */ | |
764 |