]>
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. */ | |
ebebfa5f | 93 | #define infousermodes "dioswkgxRXInP" |
189935b1 | 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 */ | |
08d23967 | 169 | FLAG_ACCOUNTONLY, /**< ASUKA_R: hide privmsgs/notices if |
170 | user is not authed or opered */ | |
ebebfa5f | 171 | FLAG_PARANOID, /**< ASUKA_P: sends notices on whois */ |
189935b1 | 172 | FLAG_HIDDENHOST, /**< user's host is hidden */ |
1d4df40c | 173 | FLAG_SETHOST, /**< ASUKA_h: oper's host is changed */ |
943fcf70 | 174 | FLAG_NOCHAN, /**< user's channels are hidden */ |
175 | FLAG_NOIDLE, /**< user's idletime is hidden */ | |
176 | FLAG_XTRAOP, /**< oper has special powers */ | |
177 | ||
189935b1 | 178 | FLAG_LAST_FLAG, /**< number of flags */ |
179 | FLAG_LOCAL_UMODES = FLAG_LOCOP, /**< First local mode flag */ | |
180 | FLAG_GLOBAL_UMODES = FLAG_OPER /**< First global mode flag */ | |
181 | }; | |
182 | ||
183 | /** Declare flagset type for operator privileges. */ | |
184 | DECLARE_FLAGSET(Privs, PRIV_LAST_PRIV); | |
185 | /** Declare flagset type for user flags. */ | |
186 | DECLARE_FLAGSET(Flags, FLAG_LAST_FLAG); | |
187 | ||
188 | #include "capab.h" /* client capabilities */ | |
189 | ||
190 | /** Represents a local connection. | |
191 | * This contains a lot of stuff irrelevant to server connections, but | |
192 | * those are so rare as to not be worth special-casing. | |
193 | */ | |
194 | struct Connection | |
195 | { | |
196 | unsigned long con_magic; /**< magic number */ | |
197 | struct Connection* con_next; /**< Next connection with queued data */ | |
198 | struct Connection** con_prev_p; /**< What points to us */ | |
199 | struct Client* con_client; /**< Client associated with connection */ | |
200 | unsigned int con_count; /**< Amount of data in buffer */ | |
201 | int con_freeflag; /**< indicates if connection can be freed */ | |
202 | int con_error; /**< last socket level error for client */ | |
203 | int con_sentalong; /**< sentalong marker for connection */ | |
204 | unsigned int con_snomask; /**< mask for server messages */ | |
205 | time_t con_nextnick; /**< Next time a nick change is allowed */ | |
206 | time_t con_nexttarget;/**< Next time a target change is allowed */ | |
207 | time_t con_lasttime; /**< Last time data read from socket */ | |
208 | time_t con_since; /**< Last time we accepted a command */ | |
209 | unsigned int con_cookie; /**< Random number the user must PONG */ | |
210 | struct MsgQ con_sendQ; /**< Outgoing message queue */ | |
211 | struct DBuf con_recvQ; /**< Incoming data yet to be parsed */ | |
212 | unsigned int con_sendM; /**< Stats: protocol messages sent */ | |
213 | unsigned int con_receiveM; /**< Stats: protocol messages received */ | |
214 | uint64_t con_sendB; /**< Bytes sent. */ | |
215 | uint64_t con_receiveB; /**< Bytes received. */ | |
216 | struct Listener* con_listener; /**< Listening socket which we accepted | |
217 | from. */ | |
218 | struct SLink* con_confs; /**< Associated configuration records. */ | |
219 | HandlerType con_handler; /**< Message index into command table | |
220 | for parsing. */ | |
221 | struct ListingArgs* con_listing; /**< Current LIST status. */ | |
222 | unsigned long con_unreg; /**< Indicate what still needs to be done */ | |
223 | unsigned int con_max_sendq; /**< cached max send queue for client */ | |
224 | unsigned int con_ping_freq; /**< cached ping freq */ | |
225 | unsigned short con_lastsq; /**< # 2k blocks when sendqueued | |
226 | called last. */ | |
227 | unsigned char con_targets[MAXTARGETS]; /**< Hash values of | |
228 | current targets. */ | |
229 | char con_sock_ip[SOCKIPLEN + 1]; /**< Remote IP address as a string. */ | |
230 | char con_sockhost[HOSTLEN + 1]; /**< This is the host name from | |
231 | the socket and after which the | |
232 | connection was accepted. */ | |
233 | char con_passwd[PASSWDLEN + 1]; /**< Password given by user. */ | |
234 | char con_buffer[BUFSIZE]; /**< Incoming message buffer; or | |
235 | the error that caused this | |
236 | clients socket to close. */ | |
237 | struct Socket con_socket; /**< socket descriptor for | |
238 | client */ | |
239 | struct Timer con_proc; /**< process latent messages from | |
240 | client */ | |
241 | struct Privs con_privs; /**< Oper privileges */ | |
242 | struct CapSet con_capab; /**< Client capabilities (from us) */ | |
243 | struct CapSet con_active; /**< Active capabilities (to us) */ | |
244 | struct AuthRequest* con_auth; /**< auth request for client */ | |
245 | struct IAuthRequest* con_iauth; /**< iauth request for client */ | |
246 | }; | |
247 | ||
248 | /** Magic constant to identify valid Connection structures. */ | |
249 | #define CONNECTION_MAGIC 0x12f955f3 | |
250 | ||
251 | /** Represents a client anywhere on the network. */ | |
252 | struct Client { | |
253 | unsigned long cli_magic; /**< magic number */ | |
254 | struct Client* cli_next; /**< link in GlobalClientList */ | |
255 | struct Client* cli_prev; /**< link in GlobalClientList */ | |
256 | struct Client* cli_hnext; /**< link in hash table bucket or this */ | |
257 | struct Connection* cli_connect; /**< Connection structure associated with us */ | |
258 | struct User* cli_user; /**< Defined if this client is a user */ | |
259 | struct Server* cli_serv; /**< Defined if this client is a server */ | |
260 | struct Whowas* cli_whowas; /**< Pointer to ww struct to be freed on quit */ | |
261 | char cli_yxx[4]; /**< Numeric Nick: YY if this is a | |
262 | server, XXX if this is a user */ | |
263 | time_t cli_firsttime; /**< time client was created */ | |
264 | time_t cli_lastnick; /**< TimeStamp on nick */ | |
265 | int cli_marker; /**< /who processing marker */ | |
266 | struct Flags cli_flags; /**< client flags */ | |
267 | unsigned int cli_hopcount; /**< number of servers to this 0 = local */ | |
268 | struct irc_in_addr cli_ip; /**< Real IP of client */ | |
269 | short cli_status; /**< Client type */ | |
270 | char cli_name[HOSTLEN + 1]; /**< Unique name of the client, nick or host */ | |
271 | char cli_username[USERLEN + 1]; /**< Username determined by ident lookup */ | |
272 | char cli_info[REALLEN + 1]; /**< Free form additional client information */ | |
273 | }; | |
274 | ||
275 | #define CLIREG_NICK 0x0001 /**< Client must set nickname */ | |
276 | #define CLIREG_USER 0x0002 /**< Client must set username */ | |
277 | #define CLIREG_COOKIE 0x0004 /**< Client must return cookie */ | |
278 | #define CLIREG_CAP 0x0008 /**< Client in capability negotiation */ | |
279 | ||
280 | #define CLIREG_INIT (CLIREG_NICK | CLIREG_USER | CLIREG_COOKIE) | |
281 | ||
282 | /** Magic constant to identify valid Client structures. */ | |
283 | #define CLIENT_MAGIC 0x4ca08286 | |
284 | ||
285 | /** Verify that a client is valid. */ | |
286 | #define cli_verify(cli) ((cli)->cli_magic == CLIENT_MAGIC) | |
287 | /** Get client's magic number. */ | |
288 | #define cli_magic(cli) ((cli)->cli_magic) | |
289 | /** Get global next client. */ | |
290 | #define cli_next(cli) ((cli)->cli_next) | |
291 | /** Get global previous client. */ | |
292 | #define cli_prev(cli) ((cli)->cli_prev) | |
293 | /** Get next client in hash bucket chain. */ | |
294 | #define cli_hnext(cli) ((cli)->cli_hnext) | |
295 | /** Get connection associated with client. */ | |
296 | #define cli_connect(cli) ((cli)->cli_connect) | |
297 | /** Get local client that links us to \a cli. */ | |
298 | #define cli_from(cli) con_client(cli_connect(cli)) | |
299 | /** Get User structure for client, if client is a user. */ | |
300 | #define cli_user(cli) ((cli)->cli_user) | |
301 | /** Get Server structure for client, if client is a server. */ | |
302 | #define cli_serv(cli) ((cli)->cli_serv) | |
303 | /** Get Whowas link for client. */ | |
304 | #define cli_whowas(cli) ((cli)->cli_whowas) | |
305 | /** Get client numnick. */ | |
306 | #define cli_yxx(cli) ((cli)->cli_yxx) | |
307 | /** Get time we last read data from the client socket. */ | |
308 | #define cli_lasttime(cli) con_lasttime(cli_connect(cli)) | |
309 | /** Get time we last parsed something from the client. */ | |
310 | #define cli_since(cli) con_since(cli_connect(cli)) | |
311 | /** Get time client was created. */ | |
312 | #define cli_firsttime(cli) ((cli)->cli_firsttime) | |
313 | /** Get time client last changed nickname. */ | |
314 | #define cli_lastnick(cli) ((cli)->cli_lastnick) | |
315 | /** Get WHO marker for client. */ | |
316 | #define cli_marker(cli) ((cli)->cli_marker) | |
317 | /** Get flags flagset for client. */ | |
318 | #define cli_flags(cli) ((cli)->cli_flags) | |
319 | /** Get hop count to client. */ | |
320 | #define cli_hopcount(cli) ((cli)->cli_hopcount) | |
321 | /** Get client IP address. */ | |
322 | #define cli_ip(cli) ((cli)->cli_ip) | |
323 | /** Get status bitmask for client. */ | |
324 | #define cli_status(cli) ((cli)->cli_status) | |
325 | /** Return non-zero if the client is local. */ | |
326 | #define cli_local(cli) (cli_from(cli) == cli) | |
327 | /** Get oper privileges for client. */ | |
328 | #define cli_privs(cli) con_privs(cli_connect(cli)) | |
329 | /** Get client capabilities for client */ | |
330 | #define cli_capab(cli) con_capab(cli_connect(cli)) | |
331 | /** Get active client capabilities for client */ | |
332 | #define cli_active(cli) con_active(cli_connect(cli)) | |
333 | /** Get flags for remaining registration tasks */ | |
334 | #define cli_unreg(cli) con_unreg(cli_connect(cli)) | |
335 | /** Get client name. */ | |
336 | #define cli_name(cli) ((cli)->cli_name) | |
337 | /** Get client username (ident). */ | |
338 | #define cli_username(cli) ((cli)->cli_username) | |
339 | /** Get client realname (information field). */ | |
340 | #define cli_info(cli) ((cli)->cli_info) | |
341 | ||
342 | /** Get number of incoming bytes queued for client. */ | |
343 | #define cli_count(cli) con_count(cli_connect(cli)) | |
344 | /** Get file descriptor for sending in client's direction. */ | |
345 | #define cli_fd(cli) con_fd(cli_connect(cli)) | |
346 | /** Get free flags for the client's connection. */ | |
347 | #define cli_freeflag(cli) con_freeflag(cli_connect(cli)) | |
348 | /** Get last error code for the client's connection. */ | |
349 | #define cli_error(cli) con_error(cli_connect(cli)) | |
350 | /** Get server notice mask for the client. */ | |
351 | #define cli_snomask(cli) con_snomask(cli_connect(cli)) | |
352 | /** Get next time a nick change is allowed for the client. */ | |
353 | #define cli_nextnick(cli) con_nextnick(cli_connect(cli)) | |
354 | /** Get next time a target change is allowed for the client. */ | |
355 | #define cli_nexttarget(cli) con_nexttarget(cli_connect(cli)) | |
356 | /** Get required PING/PONG cookie for client. */ | |
357 | #define cli_cookie(cli) con_cookie(cli_connect(cli)) | |
358 | /** Get SendQ for client. */ | |
359 | #define cli_sendQ(cli) con_sendQ(cli_connect(cli)) | |
360 | /** Get RecvQ for client. */ | |
361 | #define cli_recvQ(cli) con_recvQ(cli_connect(cli)) | |
362 | /** Get count of messages sent to client. */ | |
363 | #define cli_sendM(cli) con_sendM(cli_connect(cli)) | |
364 | /** Get number of messages received from client. */ | |
365 | #define cli_receiveM(cli) con_receiveM(cli_connect(cli)) | |
366 | /** Get number of bytes (modulo 1024) sent to client. */ | |
367 | #define cli_sendB(cli) con_sendB(cli_connect(cli)) | |
368 | /** Get number of bytes (modulo 1024) received from client. */ | |
369 | #define cli_receiveB(cli) con_receiveB(cli_connect(cli)) | |
370 | /** Get listener that accepted the client's connection. */ | |
371 | #define cli_listener(cli) con_listener(cli_connect(cli)) | |
372 | /** Get list of attached conf lines. */ | |
373 | #define cli_confs(cli) con_confs(cli_connect(cli)) | |
374 | /** Get handler type for client. */ | |
375 | #define cli_handler(cli) con_handler(cli_connect(cli)) | |
376 | /** Get LIST status for client. */ | |
377 | #define cli_listing(cli) con_listing(cli_connect(cli)) | |
378 | /** Get cached max SendQ for client. */ | |
379 | #define cli_max_sendq(cli) con_max_sendq(cli_connect(cli)) | |
380 | /** Get ping frequency for client. */ | |
381 | #define cli_ping_freq(cli) con_ping_freq(cli_connect(cli)) | |
382 | /** Get lastsq for client's connection. */ | |
383 | #define cli_lastsq(cli) con_lastsq(cli_connect(cli)) | |
384 | /** Get the array of current targets for the client. */ | |
385 | #define cli_targets(cli) con_targets(cli_connect(cli)) | |
386 | /** Get the string form of the client's IP address. */ | |
387 | #define cli_sock_ip(cli) con_sock_ip(cli_connect(cli)) | |
388 | /** Get the resolved hostname for the client. */ | |
389 | #define cli_sockhost(cli) con_sockhost(cli_connect(cli)) | |
390 | /** Get the client's password. */ | |
391 | #define cli_passwd(cli) con_passwd(cli_connect(cli)) | |
392 | /** Get the unprocessed input buffer for a client's connection. */ | |
393 | #define cli_buffer(cli) con_buffer(cli_connect(cli)) | |
394 | /** Get the Socket structure for sending to a client. */ | |
395 | #define cli_socket(cli) con_socket(cli_connect(cli)) | |
396 | /** Get Timer for processing waiting messages from the client. */ | |
397 | #define cli_proc(cli) con_proc(cli_connect(cli)) | |
398 | /** Get auth request for client. */ | |
399 | #define cli_auth(cli) con_auth(cli_connect(cli)) | |
400 | /** Get iauth request for client. */ | |
401 | #define cli_iauth(cli) con_iauth(cli_connect(cli)) | |
402 | /** Get sentalong marker for client. */ | |
403 | #define cli_sentalong(cli) con_sentalong(cli_connect(cli)) | |
404 | ||
405 | /** Verify that a connection is valid. */ | |
406 | #define con_verify(con) ((con)->con_magic == CONNECTION_MAGIC) | |
407 | /** Get connection's magic number. */ | |
408 | #define con_magic(con) ((con)->con_magic) | |
409 | /** Get global next connection. */ | |
410 | #define con_next(con) ((con)->con_next) | |
411 | /** Get global previous connection. */ | |
412 | #define con_prev_p(con) ((con)->con_prev_p) | |
413 | /** Get locally connected client for connection. */ | |
414 | #define con_client(con) ((con)->con_client) | |
415 | /** Get number of unprocessed data bytes from connection. */ | |
416 | #define con_count(con) ((con)->con_count) | |
417 | /** Get file descriptor for connection. */ | |
418 | #define con_fd(con) s_fd(&(con)->con_socket) | |
419 | /** Get freeable flags for connection. */ | |
420 | #define con_freeflag(con) ((con)->con_freeflag) | |
421 | /** Get last error code on connection. */ | |
422 | #define con_error(con) ((con)->con_error) | |
423 | /** Get sentalong marker for connection. */ | |
424 | #define con_sentalong(con) ((con)->con_sentalong) | |
425 | /** Get server notice mask for connection. */ | |
426 | #define con_snomask(con) ((con)->con_snomask) | |
427 | /** Get next nick change time for connection. */ | |
428 | #define con_nextnick(con) ((con)->con_nextnick) | |
429 | /** Get next new target time for connection. */ | |
430 | #define con_nexttarget(con) ((con)->con_nexttarget) | |
431 | /** Get last time we read from the connection. */ | |
432 | #define con_lasttime(con) ((con)->con_lasttime) | |
433 | /** Get last time we accepted a command from the connection. */ | |
434 | #define con_since(con) ((con)->con_since) | |
435 | /** Get PING/PONG confirmation cookie for connection. */ | |
436 | #define con_cookie(con) ((con)->con_cookie) | |
437 | /** Get SendQ for connection. */ | |
438 | #define con_sendQ(con) ((con)->con_sendQ) | |
439 | /** Get RecvQ for connection. */ | |
440 | #define con_recvQ(con) ((con)->con_recvQ) | |
441 | /** Get number of messages sent to connection. */ | |
442 | #define con_sendM(con) ((con)->con_sendM) | |
443 | /** Get number of messages received from connection. */ | |
444 | #define con_receiveM(con) ((con)->con_receiveM) | |
445 | /** Get number of bytes (modulo 1024) sent to connection. */ | |
446 | #define con_sendB(con) ((con)->con_sendB) | |
447 | /** Get number of bytes (modulo 1024) received from connection. */ | |
448 | #define con_receiveB(con) ((con)->con_receiveB) | |
449 | /** Get listener that accepted the connection. */ | |
450 | #define con_listener(con) ((con)->con_listener) | |
451 | /** Get list of ConfItems attached to the connection. */ | |
452 | #define con_confs(con) ((con)->con_confs) | |
453 | /** Get command handler for the connection. */ | |
454 | #define con_handler(con) ((con)->con_handler) | |
455 | /** Get the LIST status for the connection. */ | |
456 | #define con_listing(con) ((con)->con_listing) | |
457 | /** Get remining steps before registration completes. */ | |
458 | #define con_unreg(con) ((con)->con_unreg) | |
459 | /** Get the maximum permitted SendQ size for the connection. */ | |
460 | #define con_max_sendq(con) ((con)->con_max_sendq) | |
461 | /** Get the ping frequency for the connection. */ | |
462 | #define con_ping_freq(con) ((con)->con_ping_freq) | |
463 | /** Get the lastsq for the connection. */ | |
464 | #define con_lastsq(con) ((con)->con_lastsq) | |
465 | /** Get the current targets array for the connection. */ | |
466 | #define con_targets(con) ((con)->con_targets) | |
467 | /** Get the string-formatted IP address for the connection. */ | |
468 | #define con_sock_ip(con) ((con)->con_sock_ip) | |
469 | /** Get the resolved hostname for the connection. */ | |
470 | #define con_sockhost(con) ((con)->con_sockhost) | |
471 | /** Get the password sent by the remote end of the connection. */ | |
472 | #define con_passwd(con) ((con)->con_passwd) | |
473 | /** Get the buffer of unprocessed incoming data from the connection. */ | |
474 | #define con_buffer(con) ((con)->con_buffer) | |
475 | /** Get the Socket for the connection. */ | |
476 | #define con_socket(con) ((con)->con_socket) | |
477 | /** Get the Timer for processing more data from the connection. */ | |
478 | #define con_proc(con) ((con)->con_proc) | |
479 | /** Get the oper privilege set for the connection. */ | |
480 | #define con_privs(con) (&(con)->con_privs) | |
481 | /** Get the peer's capabilities for the connection. */ | |
482 | #define con_capab(con) (&(con)->con_capab) | |
483 | /** Get the active capabilities for the connection. */ | |
484 | #define con_active(con) (&(con)->con_active) | |
485 | /** Get the auth request for the connection. */ | |
486 | #define con_auth(con) ((con)->con_auth) | |
487 | /** Get the iauth request for the connection. */ | |
488 | #define con_iauth(con) ((con)->con_iauth) | |
489 | ||
490 | #define STAT_CONNECTING 0x001 /**< connecting to another server */ | |
491 | #define STAT_HANDSHAKE 0x002 /**< pass - server sent */ | |
492 | #define STAT_ME 0x004 /**< this server */ | |
493 | #define STAT_UNKNOWN 0x008 /**< unidentified connection */ | |
494 | #define STAT_UNKNOWN_USER 0x010 /**< connection on a client port */ | |
495 | #define STAT_UNKNOWN_SERVER 0x020 /**< connection on a server port */ | |
496 | #define STAT_SERVER 0x040 /**< fully registered server */ | |
497 | #define STAT_USER 0x080 /**< fully registered user */ | |
498 | ||
499 | /* | |
500 | * status macros. | |
501 | */ | |
502 | /** Return non-zero if the client is registered. */ | |
503 | #define IsRegistered(x) (cli_status(x) & (STAT_SERVER | STAT_USER)) | |
504 | /** Return non-zero if the client is an outbound connection that is | |
505 | * still connecting. */ | |
506 | #define IsConnecting(x) (cli_status(x) == STAT_CONNECTING) | |
507 | /** Return non-zero if the client is an outbound connection that has | |
508 | * sent our password. */ | |
509 | #define IsHandshake(x) (cli_status(x) == STAT_HANDSHAKE) | |
510 | /** Return non-zero if the client is this server. */ | |
511 | #define IsMe(x) (cli_status(x) == STAT_ME) | |
512 | /** Return non-zero if the client has not yet registered. */ | |
513 | #define IsUnknown(x) (cli_status(x) & \ | |
514 | (STAT_UNKNOWN | STAT_UNKNOWN_USER | STAT_UNKNOWN_SERVER)) | |
515 | /** Return non-zero if the client is an unregistered connection on a | |
516 | * server port. */ | |
517 | #define IsServerPort(x) (cli_status(x) == STAT_UNKNOWN_SERVER ) | |
518 | /** Return non-zero if the client is an unregistered connection on a | |
519 | * user port. */ | |
520 | #define IsUserPort(x) (cli_status(x) == STAT_UNKNOWN_USER ) | |
521 | /** Return non-zero if the client is a real client connection. */ | |
522 | #define IsClient(x) (cli_status(x) & \ | |
523 | (STAT_HANDSHAKE | STAT_ME | STAT_UNKNOWN |\ | |
524 | STAT_UNKNOWN_USER | STAT_UNKNOWN_SERVER | STAT_SERVER | STAT_USER)) | |
525 | /** Return non-zero if the client ignores flood limits. */ | |
526 | #define IsTrusted(x) (cli_status(x) & \ | |
527 | (STAT_CONNECTING | STAT_HANDSHAKE | STAT_ME | STAT_SERVER)) | |
528 | /** Return non-zero if the client is a registered server. */ | |
529 | #define IsServer(x) (cli_status(x) == STAT_SERVER) | |
530 | /** Return non-zero if the client is a registered user. */ | |
531 | #define IsUser(x) (cli_status(x) == STAT_USER) | |
532 | ||
533 | ||
534 | /** Mark a client with STAT_CONNECTING. */ | |
535 | #define SetConnecting(x) (cli_status(x) = STAT_CONNECTING) | |
536 | /** Mark a client with STAT_HANDSHAKE. */ | |
537 | #define SetHandshake(x) (cli_status(x) = STAT_HANDSHAKE) | |
538 | /** Mark a client with STAT_SERVER. */ | |
539 | #define SetServer(x) (cli_status(x) = STAT_SERVER) | |
540 | /** Mark a client with STAT_ME. */ | |
541 | #define SetMe(x) (cli_status(x) = STAT_ME) | |
542 | /** Mark a client with STAT_USER. */ | |
543 | #define SetUser(x) (cli_status(x) = STAT_USER) | |
544 | ||
545 | /** Return non-zero if a client is directly connected to me. */ | |
546 | #define MyConnect(x) (cli_from(x) == (x)) | |
547 | /** Return non-zero if a client is a locally connected user. */ | |
548 | #define MyUser(x) (MyConnect(x) && IsUser(x)) | |
549 | /** Return non-zero if a client is a locally connected IRC operator. */ | |
550 | #define MyOper(x) (MyConnect(x) && IsOper(x)) | |
551 | /** Return protocol version used by a server. */ | |
552 | #define Protocol(x) ((cli_serv(x))->prot) | |
553 | ||
554 | /* | |
555 | * flags macros | |
556 | */ | |
557 | /** Set a flag in a client's flags. */ | |
558 | #define SetFlag(cli, flag) FlagSet(&cli_flags(cli), flag) | |
559 | /** Clear a flag from a client's flags. */ | |
560 | #define ClrFlag(cli, flag) FlagClr(&cli_flags(cli), flag) | |
561 | /** Return non-zero if a flag is set in a client's flags. */ | |
562 | #define HasFlag(cli, flag) FlagHas(&cli_flags(cli), flag) | |
563 | ||
564 | /** Return non-zero if the client is an IRC operator (global or local). */ | |
565 | #define IsAnOper(x) (HasFlag(x, FLAG_OPER) || HasFlag(x, FLAG_LOCOP)) | |
566 | /** Return non-zero if the client's connection is blocked. */ | |
567 | #define IsBlocked(x) HasFlag(x, FLAG_BLOCKED) | |
568 | /** Return non-zero if the client's connection is still being burst. */ | |
569 | #define IsBurst(x) HasFlag(x, FLAG_BURST) | |
570 | /** Return non-zero if we have received the peer's entire burst but | |
571 | * not their EOB ack. */ | |
572 | #define IsBurstAck(x) HasFlag(x, FLAG_BURST_ACK) | |
573 | /** Return non-zero if we are still bursting to the client. */ | |
574 | #define IsBurstOrBurstAck(x) (HasFlag(x, FLAG_BURST) || HasFlag(x, FLAG_BURST_ACK)) | |
575 | /** Return non-zero if the client has set mode +k (channel service). */ | |
576 | #define IsChannelService(x) HasFlag(x, FLAG_CHSERV) | |
577 | /** Return non-zero if the client's socket is disconnected. */ | |
578 | #define IsDead(x) HasFlag(x, FLAG_DEADSOCKET) | |
579 | /** Return non-zero if the client has set mode +d (deaf). */ | |
580 | #define IsDeaf(x) HasFlag(x, FLAG_DEAF) | |
581 | /** Return non-zero if the client has been IP-checked for clones. */ | |
582 | #define IsIPChecked(x) HasFlag(x, FLAG_IPCHECK) | |
583 | /** Return non-zero if the client has been okayed by iauth. */ | |
584 | #define IsIAuthed(x) HasFlag(x, FLAG_IAUTHED) | |
585 | /** Return non-zero if we have received an ident response for the client. */ | |
586 | #define IsIdented(x) HasFlag(x, FLAG_GOTID) | |
587 | /** Return non-zero if the client has set mode +i (invisible). */ | |
588 | #define IsInvisible(x) HasFlag(x, FLAG_INVISIBLE) | |
589 | /** Return non-zero if the client caused a net.burst. */ | |
590 | #define IsJunction(x) HasFlag(x, FLAG_JUNCTION) | |
591 | /** Return non-zero if the client has set mode +O (local operator). */ | |
592 | #define IsLocOp(x) HasFlag(x, FLAG_LOCOP) | |
593 | /** Return non-zero if the client has set mode +o (global operator). */ | |
594 | #define IsOper(x) HasFlag(x, FLAG_OPER) | |
595 | /** Return non-zero if the client has an active UDP ping request. */ | |
596 | #define IsUPing(x) HasFlag(x, FLAG_UPING) | |
597 | /** Return non-zero if the client has no '\n' in its buffer. */ | |
598 | #define NoNewLine(x) HasFlag(x, FLAG_NONL) | |
599 | /** Return non-zero if the client has set mode +g (debugging). */ | |
600 | #define SendDebug(x) HasFlag(x, FLAG_DEBUG) | |
601 | /** Return non-zero if the client has set mode +s (server notices). */ | |
602 | #define SendServNotice(x) HasFlag(x, FLAG_SERVNOTICE) | |
603 | /** Return non-zero if the client has set mode +w (wallops). */ | |
604 | #define SendWallops(x) HasFlag(x, FLAG_WALLOP) | |
605 | /** Return non-zero if the client claims to be a hub. */ | |
606 | #define IsHub(x) HasFlag(x, FLAG_HUB) | |
607 | /** Return non-zero if the client understands IPv6 addresses in P10. */ | |
608 | #define IsIPv6(x) HasFlag(x, FLAG_IPV6) | |
609 | /** Return non-zero if the client claims to be a services server. */ | |
610 | #define IsService(x) HasFlag(x, FLAG_SERVICE) | |
611 | /** Return non-zero if the client has an account stamp. */ | |
612 | #define IsAccount(x) HasFlag(x, FLAG_ACCOUNT) | |
613 | /** Return non-zero if the client has set mode +x (hidden host). */ | |
614 | #define IsHiddenHost(x) HasFlag(x, FLAG_HIDDENHOST) | |
943fcf70 | 615 | /** Return non-zero if the client has set mode +X (xtraop) */ |
616 | #define IsXtraOp(x) HasFlag(x, FLAG_XTRAOP) | |
617 | /** Return non-zero if the client has set mode +n (hide channels) */ | |
618 | #define IsNoChan(x) HasFlag(x, FLAG_NOCHAN) | |
619 | /** Return non-zero if the client has set mode +I (hide idletime) */ | |
620 | #define IsNoIdle(x) HasFlag(x, FLAG_NOIDLE) | |
189935b1 | 621 | /** Return non-zero if the client has an active PING request. */ |
622 | #define IsPingSent(x) HasFlag(x, FLAG_PINGSENT) | |
08d23967 | 623 | /** Return non-zero if the client should not receive privmsgs/notices |
624 | * from unauthed users */ | |
625 | #define IsAccountOnly(x) HasFlag(x, FLAG_ACCOUNTONLY) | |
ebebfa5f | 626 | /** Return non-zero if the client should receive notices when someone |
627 | * does a whois on it. */ | |
628 | #define IsParanoid(x) HasFlag(x, FLAG_PARANOID) | |
189935b1 | 629 | |
630 | /** Return non-zero if the client has operator or server privileges. */ | |
631 | #define IsPrivileged(x) (IsAnOper(x) || IsServer(x)) | |
632 | /** Return non-zero if the client's host is hidden. */ | |
633 | #define HasHiddenHost(x) (IsHiddenHost(x) && IsAccount(x)) | |
1d4df40c | 634 | /** Return non-zero if the client is using a spoofhost */ |
635 | #define IsSetHost(x) HasFlag(x, FLAG_SETHOST) | |
636 | #define HasSetHost(x) (IsSetHost(x)) | |
189935b1 | 637 | |
638 | /** Mark a client as having an in-progress net.burst. */ | |
639 | #define SetBurst(x) SetFlag(x, FLAG_BURST) | |
640 | /** Mark a client as being between EOB and EOB ACK. */ | |
641 | #define SetBurstAck(x) SetFlag(x, FLAG_BURST_ACK) | |
642 | /** Mark a client as having mode +k (channel service). */ | |
643 | #define SetChannelService(x) SetFlag(x, FLAG_CHSERV) | |
644 | /** Mark a client as having mode +d (deaf). */ | |
645 | #define SetDeaf(x) SetFlag(x, FLAG_DEAF) | |
646 | /** Mark a client as having mode +g (debugging). */ | |
647 | #define SetDebug(x) SetFlag(x, FLAG_DEBUG) | |
648 | /** Mark a client as having ident looked up. */ | |
649 | #define SetGotId(x) SetFlag(x, FLAG_GOTID) | |
650 | /** Mark a client as being IP-checked. */ | |
651 | #define SetIPChecked(x) SetFlag(x, FLAG_IPCHECK) | |
652 | /** Mark a client as being iauth-checked. */ | |
653 | #define SetIAuthed(x) SetFlag(x, FLAG_IAUTHED) | |
654 | /** Mark a client as having mode +i (invisible). */ | |
655 | #define SetInvisible(x) SetFlag(x, FLAG_INVISIBLE) | |
656 | /** Mark a client as causing a net.join. */ | |
657 | #define SetJunction(x) SetFlag(x, FLAG_JUNCTION) | |
658 | /** Mark a client as having mode +O (local operator). */ | |
659 | #define SetLocOp(x) SetFlag(x, FLAG_LOCOP) | |
660 | /** Mark a client as having mode +o (global operator). */ | |
661 | #define SetOper(x) SetFlag(x, FLAG_OPER) | |
662 | /** Mark a client as having a pending UDP ping. */ | |
663 | #define SetUPing(x) SetFlag(x, FLAG_UPING) | |
664 | /** Mark a client as having mode +w (wallops). */ | |
665 | #define SetWallops(x) SetFlag(x, FLAG_WALLOP) | |
666 | /** Mark a client as having mode +s (server notices). */ | |
667 | #define SetServNotice(x) SetFlag(x, FLAG_SERVNOTICE) | |
668 | /** Mark a client as being a hub server. */ | |
669 | #define SetHub(x) SetFlag(x, FLAG_HUB) | |
670 | /** Mark a client as being an IPv6-grokking server. */ | |
671 | #define SetIPv6(x) SetFlag(x, FLAG_IPV6) | |
672 | /** Mark a client as being a services server. */ | |
673 | #define SetService(x) SetFlag(x, FLAG_SERVICE) | |
674 | /** Mark a client as having an account stamp. */ | |
675 | #define SetAccount(x) SetFlag(x, FLAG_ACCOUNT) | |
676 | /** Mark a client as having mode +x (hidden host). */ | |
677 | #define SetHiddenHost(x) SetFlag(x, FLAG_HIDDENHOST) | |
1d4df40c | 678 | /** Mark a client as having mode +h (spoofhost). */ |
679 | #define SetSetHost(x) SetFlag(x, FLAG_SETHOST) | |
943fcf70 | 680 | /** Mark a client as having mode +X (xtraop). */ |
681 | #define SetXtraOp(x) SetFlag(x, FLAG_XTRAOP) | |
682 | /** Mark a client as having mode +n (hide channels). */ | |
683 | #define SetNoChan(x) SetFlag(x, FLAG_NOCHAN) | |
684 | /** Mark a client as having mode +I (hide idletime). */ | |
685 | #define SetNoIdle(x) SetFlag(x, FLAG_NOIDLE) | |
189935b1 | 686 | /** Mark a client as having a pending PING. */ |
687 | #define SetPingSent(x) SetFlag(x, FLAG_PINGSENT) | |
08d23967 | 688 | /** Mark a client as having mode +R (account only). */ |
689 | #define SetAccountOnly(x) SetFlag(x, FLAG_ACCOUNTONLY) | |
ebebfa5f | 690 | /** Mark a client as having mode +P (paranoid). */ |
691 | #define SetParanoid(x) SetFlag(x, FLAG_PARANOID) | |
189935b1 | 692 | |
693 | /** Return non-zero if \a sptr sees \a acptr as an operator. */ | |
694 | #define SeeOper(sptr,acptr) (IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) \ | |
695 | || HasPriv(sptr, PRIV_SEE_OPERS))) | |
696 | ||
697 | /** Clear the client's net.burst in-progress flag. */ | |
698 | #define ClearBurst(x) ClrFlag(x, FLAG_BURST) | |
699 | /** Clear the client's between EOB and EOB ACK flag. */ | |
700 | #define ClearBurstAck(x) ClrFlag(x, FLAG_BURST_ACK) | |
701 | /** Remove mode +k (channel service) from the client. */ | |
702 | #define ClearChannelService(x) ClrFlag(x, FLAG_CHSERV) | |
703 | /** Remove mode +d (deaf) from the client. */ | |
704 | #define ClearDeaf(x) ClrFlag(x, FLAG_DEAF) | |
705 | /** Remove mode +g (debugging) from the client. */ | |
706 | #define ClearDebug(x) ClrFlag(x, FLAG_DEBUG) | |
707 | /** Remove the client's IP-checked flag. */ | |
708 | #define ClearIPChecked(x) ClrFlag(x, FLAG_IPCHECK) | |
709 | /** Remove mode +i (invisible) from the client. */ | |
710 | #define ClearInvisible(x) ClrFlag(x, FLAG_INVISIBLE) | |
711 | /** Remove mode +O (local operator) from the client. */ | |
712 | #define ClearLocOp(x) ClrFlag(x, FLAG_LOCOP) | |
713 | /** Remove mode +o (global operator) from the client. */ | |
714 | #define ClearOper(x) ClrFlag(x, FLAG_OPER) | |
715 | /** Clear the client's pending UDP ping flag. */ | |
716 | #define ClearUPing(x) ClrFlag(x, FLAG_UPING) | |
717 | /** Remove mode +w (wallops) from the client. */ | |
718 | #define ClearWallops(x) ClrFlag(x, FLAG_WALLOP) | |
719 | /** Remove mode +s (server notices) from the client. */ | |
720 | #define ClearServNotice(x) ClrFlag(x, FLAG_SERVNOTICE) | |
721 | /** Remove mode +x (hidden host) from the client. */ | |
722 | #define ClearHiddenHost(x) ClrFlag(x, FLAG_HIDDENHOST) | |
1d4df40c | 723 | /** Remove mode +h (spoofhost) from a client. */ |
724 | #define ClearSetHost(x) ClrFlag(x, FLAG_SETHOST) | |
943fcf70 | 725 | /** Remove mode +X (xtraop) from a client. */ |
726 | #define ClearXtraOp(x) ClrFlag(x, FLAG_XTRAOP) | |
727 | /** Remove mode +n (hide channels) from a client. */ | |
728 | #define ClearNoChan(x) ClrFlag(x, FLAG_NOCHAN) | |
729 | /** Remove mode +I (hide idletime) from a client. */ | |
730 | #define ClearNoIdle(x) ClrFlag(x, FLAG_NOIDLE) | |
189935b1 | 731 | /** Clear the client's pending PING flag. */ |
732 | #define ClearPingSent(x) ClrFlag(x, FLAG_PINGSENT) | |
08d23967 | 733 | /** Remove mode +R (account only) from a client */ |
734 | #define ClearAccountOnly(x) ClrFlag(x, FLAG_ACCOUNTONLY) | |
ebebfa5f | 735 | /** Remove mode +P (paranoid) from a client */ |
736 | #define ClearParanoid(x) ClrFlag(x, FLAG_PARANOID) | |
189935b1 | 737 | |
738 | /* free flags */ | |
739 | #define FREEFLAG_SOCKET 0x0001 /**< socket needs to be freed */ | |
740 | #define FREEFLAG_TIMER 0x0002 /**< timer needs to be freed */ | |
741 | ||
742 | /* server notice stuff */ | |
743 | ||
744 | #define SNO_ADD 1 /**< Perform "or" on server notice mask. */ | |
745 | #define SNO_DEL 2 /**< Perform "and ~x" on server notice mask. */ | |
746 | #define SNO_SET 3 /**< Set server notice mask. */ | |
747 | /* DON'T CHANGE THESE VALUES ! */ | |
748 | /* THE CLIENTS DEPEND ON IT ! */ | |
749 | #define SNO_OLDSNO 0x1 /**< unsorted old messages */ | |
750 | #define SNO_SERVKILL 0x2 /**< server kills (nick collisions) */ | |
751 | #define SNO_OPERKILL 0x4 /**< oper kills */ | |
752 | #define SNO_HACK2 0x8 /**< desyncs */ | |
753 | #define SNO_HACK3 0x10 /**< temporary desyncs */ | |
754 | #define SNO_UNAUTH 0x20 /**< unauthorized connections */ | |
755 | #define SNO_TCPCOMMON 0x40 /**< common TCP or socket errors */ | |
756 | #define SNO_TOOMANY 0x80 /**< too many connections */ | |
757 | #define SNO_HACK4 0x100 /**< Uworld actions on channels */ | |
758 | #define SNO_GLINE 0x200 /**< glines */ | |
759 | #define SNO_NETWORK 0x400 /**< net join/break, etc */ | |
760 | #define SNO_IPMISMATCH 0x800 /**< IP mismatches */ | |
761 | #define SNO_THROTTLE 0x1000 /**< host throttle add/remove notices */ | |
762 | #define SNO_OLDREALOP 0x2000 /**< old oper-only messages */ | |
763 | #define SNO_CONNEXIT 0x4000 /**< client connect/exit (ugh) */ | |
764 | #define SNO_AUTO 0x8000 /**< AUTO G-Lines */ | |
765 | #define SNO_DEBUG 0x10000 /**< debugging messages (DEBUGMODE only) */ | |
766 | ||
767 | #ifdef DEBUGMODE | |
768 | # define SNO_ALL 0x1ffff /**< Bitmask of all valid server | |
769 | * notice bits. */ | |
770 | #else | |
771 | # define SNO_ALL 0xffff | |
772 | #endif | |
773 | ||
774 | /** Server notice bits allowed to normal users. */ | |
775 | #define SNO_USER (SNO_ALL & ~SNO_OPER) | |
776 | ||
777 | /** Server notice bits enabled by default for normal users. */ | |
778 | #define SNO_DEFAULT (SNO_NETWORK|SNO_OPERKILL|SNO_GLINE) | |
779 | /** Server notice bits enabled by default for IRC operators. */ | |
f9a0d470 | 780 | #define SNO_OPERDEFAULT (SNO_DEFAULT|SNO_HACK2|SNO_THROTTLE|SNO_OLDSNO) |
189935b1 | 781 | /** Server notice bits reserved to IRC operators. */ |
782 | #define SNO_OPER (SNO_CONNEXIT|SNO_OLDREALOP) | |
783 | /** Noisy server notice bits that cause other bits to be cleared during connect. */ | |
784 | #define SNO_NOISY (SNO_SERVKILL|SNO_UNAUTH) | |
785 | ||
786 | /** Test whether a privilege has been granted to a client. */ | |
787 | #define HasPriv(cli, priv) FlagHas(cli_privs(cli), priv) | |
788 | /** Grant a privilege to a client. */ | |
789 | #define SetPriv(cli, priv) FlagSet(cli_privs(cli), priv) | |
790 | /** Revoke a privilege from a client. */ | |
791 | #define ClrPriv(cli, priv) FlagClr(cli_privs(cli), priv) | |
792 | ||
793 | /** Test whether a client has a capability */ | |
794 | #define HasCap(cli, cap) CapHas(cli_capab(cli), (cap)) | |
795 | /** Test whether a client has the capability active */ | |
796 | #define CapActive(cli, cap) CapHas(cli_active(cli), (cap)) | |
797 | ||
798 | #define HIDE_IP 0 /**< Do not show IP address in get_client_name() */ | |
799 | #define SHOW_IP 1 /**< Show ident and IP address in get_client_name() */ | |
800 | ||
801 | extern const char* get_client_name(const struct Client* sptr, int showip); | |
802 | extern const char* client_get_default_umode(const struct Client* sptr); | |
803 | extern int client_get_ping(const struct Client* local_client); | |
804 | extern void client_drop_sendq(struct Connection* con); | |
805 | extern void client_add_sendq(struct Connection* con, | |
806 | struct Connection** con_p); | |
807 | extern void client_set_privs(struct Client *client, struct ConfItem *oper); | |
808 | extern int client_report_privs(struct Client* to, struct Client* client); | |
809 | ||
810 | #endif /* INCLUDED_client_h */ | |
811 |