]>
Commit | Line | Data |
---|---|---|
1 | /* proto.h - IRC protocol output | |
2 | * Copyright 2000-2004 srvx Development Team | |
3 | * | |
4 | * This file is part of x3. | |
5 | * | |
6 | * x3 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 of the License, or | |
9 | * (at your option) 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 srvx; if not, write to the Free Software Foundation, | |
18 | * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | |
19 | */ | |
20 | ||
21 | #if !defined(PROTO_H) | |
22 | #define PROTO_H | |
23 | ||
24 | /* Warning for those looking at how this code does multi-protocol | |
25 | * support: It's an awful, nasty hack job. It is intended for short | |
26 | * term use, not long term, since we are already developing x3, | |
27 | * which has much nicer interfaces that hide most of the ugly | |
28 | * differences between protocol dialects. */ | |
29 | ||
30 | #define COMBO_NUMERIC_LEN 5 /* 1/2, 1/3 or 2/3 digits for server/client parts */ | |
31 | #define MAXLEN 512 /* Maximum IRC line length */ | |
32 | #define MAXNUMPARAMS 200 | |
33 | #define ALLCHANMSG_FUNCS_MAX 4 /* +1 == 5 potential 'allchanmsg' funcs */ | |
34 | ||
35 | #ifdef HAVE_NETINET_IN_H | |
36 | #include <netinet/in.h> | |
37 | #endif | |
38 | ||
39 | struct gline; | |
40 | struct shun; | |
41 | struct server; | |
42 | struct userNode; | |
43 | struct chanNode; | |
44 | ||
45 | /* connection manager state */ | |
46 | ||
47 | enum cState | |
48 | { | |
49 | DISCONNECTED, | |
50 | AUTHENTICATING, | |
51 | BURSTING, | |
52 | CONNECTED | |
53 | }; | |
54 | ||
55 | #define UPLINK_UNAVAILABLE 0x001 | |
56 | ||
57 | struct uplinkNode | |
58 | { | |
59 | char *name; | |
60 | ||
61 | char *host; | |
62 | int port; | |
63 | ||
64 | struct sockaddr *bind_addr; | |
65 | int bind_addr_len; | |
66 | ||
67 | char *password; | |
68 | char *their_password; | |
69 | ||
70 | enum cState state; | |
71 | int tries; | |
72 | int max_tries; | |
73 | long flags; | |
74 | ||
75 | struct uplinkNode *prev; | |
76 | struct uplinkNode *next; | |
77 | }; | |
78 | ||
79 | struct cManagerNode | |
80 | { | |
81 | struct uplinkNode *uplinks; | |
82 | struct uplinkNode *uplink; | |
83 | ||
84 | int cycles; | |
85 | int enabled; | |
86 | }; | |
87 | ||
88 | #ifdef WITH_PROTOCOL_P10 | |
89 | struct server* GetServerN(const char *numeric); | |
90 | struct userNode* GetUserN(const char *numeric); | |
91 | #endif | |
92 | ||
93 | /* Basic protocol parsing support. */ | |
94 | void init_parse(void); | |
95 | int parse_line(char *line, int recursive); | |
96 | ||
97 | char *client_report_privs(struct userNode *client); | |
98 | int check_priv(char *priv); | |
99 | ||
100 | /* Callback notifications for protocol support. */ | |
101 | typedef void (*chanmsg_func_t) (struct userNode *user, struct chanNode *chan, char *text, struct userNode *bot); | |
102 | void reg_chanmsg_func(unsigned char prefix, struct userNode *service, chanmsg_func_t handler); | |
103 | void reg_allchanmsg_func(struct userNode *service, chanmsg_func_t handler); | |
104 | struct userNode *get_chanmsg_bot(unsigned char prefix); | |
105 | ||
106 | typedef void (*privmsg_func_t) (struct userNode *user, struct userNode *target, char *text, int server_qualified); | |
107 | void reg_privmsg_func(struct userNode *user, privmsg_func_t handler); | |
108 | void reg_notice_func(struct userNode *user, privmsg_func_t handler); | |
109 | void unreg_privmsg_func(struct userNode *user, privmsg_func_t handler); | |
110 | void unreg_notice_func(struct userNode *user, privmsg_func_t handler); | |
111 | ||
112 | typedef void (*oper_func_t) (struct userNode *user); | |
113 | void reg_oper_func(oper_func_t handler); | |
114 | ||
115 | /* replay silliness */ | |
116 | void replay_read_line(void); | |
117 | void replay_event_loop(void); | |
118 | ||
119 | /* connection maintenance */ | |
120 | void irc_server(struct server *srv); | |
121 | void irc_user(struct userNode *user); | |
122 | void irc_nick(struct userNode *user, const char *old_nick); | |
123 | void irc_introduce(const char *passwd); | |
124 | void irc_ping(const char *something); | |
125 | void irc_pong(const char *who, const char *data); | |
126 | void irc_quit(struct userNode *user, const char *message); | |
127 | void irc_squit(struct server *srv, const char *message, const char *service_message); | |
128 | void irc_squit_route(struct server *srv, const char *message, ...); | |
129 | void irc_connect(struct userNode *user, char *server, unsigned int port, struct server *target); | |
130 | ||
131 | /* messages */ | |
132 | void irc_privmsg(struct userNode *from, const char *to, const char *message); | |
133 | void irc_notice(struct userNode *from, const char *to, const char *message); | |
134 | void irc_notice_user(struct userNode *from, struct userNode *to, const char *message); | |
135 | void irc_wallchops(struct userNode *from, const char *to, const char *message); | |
136 | void irc_wallops(const char *format, ...); | |
137 | ||
138 | /* channel maintenance */ | |
139 | void irc_join(struct userNode *who, struct chanNode *what); | |
140 | void irc_invite(struct userNode *from, struct userNode *who, struct chanNode *to); | |
141 | void irc_mode(struct userNode *who, struct chanNode *target, const char *modes); | |
142 | void irc_umode(struct userNode *target, const char *modes); | |
143 | void irc_kick(struct userNode *who, struct userNode *target, struct chanNode *from, const char *msg); | |
144 | void irc_part(struct userNode *who, struct chanNode *what, const char *reason); | |
145 | void irc_topic(struct userNode *service, struct userNode *who, struct chanNode *what, const char *topic); | |
146 | void irc_fetchtopic(struct userNode *from, const char *to); | |
147 | void irc_svsjoin(struct userNode *from, struct userNode *who, struct chanNode *to); | |
148 | ||
149 | /* network maintenance */ | |
150 | void irc_silence(struct userNode *who, const char *mask, int add); | |
151 | void irc_gline(struct server *srv, struct gline *gline, int silent); | |
152 | void irc_shun(struct server *srv, struct shun *shun); | |
153 | void irc_settime(const char *srv_name_mask, time_t new_time); | |
154 | void irc_ungline(const char *mask); | |
155 | void irc_unshun(const char *mask); | |
156 | void irc_error(const char *to, const char *message); | |
157 | void irc_kill(struct userNode *from, struct userNode *target, const char *message); | |
158 | void irc_raw(const char *what); | |
159 | void irc_stats(struct userNode *from, struct server *target, char type); | |
160 | void irc_svsnick(struct userNode *from, struct userNode *target, const char *newnick); | |
161 | void irc_swhois(struct userNode *from, struct userNode *target, const char *message); | |
162 | void irc_privs(struct userNode *target, char *flag, int add); | |
163 | ||
164 | /* account maintenance */ | |
165 | void irc_rename(struct userNode *user, const char *new_handle); | |
166 | void irc_delete(struct userNode *user); | |
167 | void irc_account(struct userNode *user, const char *stamp, time_t timestamp); | |
168 | void irc_regnick(struct userNode *user); | |
169 | void irc_fakehost(struct userNode *user, const char *host); | |
170 | ||
171 | /* numeric messages */ | |
172 | void irc_numeric(struct userNode *user, unsigned int num, const char *format, ...); | |
173 | /* RFC1459-compliant numeric responses */ | |
174 | #define RPL_ENDOFSTATS 219 | |
175 | #define RPL_STATSUPTIME 242 | |
176 | #define RPL_MAXCONNECTIONS 250 | |
177 | #define RPL_WHOISUSER 311 | |
178 | #define RPL_WHOISSERVER 312 | |
179 | #define RPL_WHOISOPERATOR 313 | |
180 | #define RPL_ENDOFWHOIS 318 | |
181 | #define ERR_NOSUCHNICK 401 | |
182 | ||
183 | /* stuff originally from other headers that is really protocol-specific */ | |
184 | int IsChannelName(const char *name); | |
185 | int is_valid_nick(const char *nick); | |
186 | struct userNode *AddService(const char *nick, const char *modes, const char *desc, const char *hostname); | |
187 | struct userNode *AddClone(const char *nick, const char *ident, const char *hostname, const char *desc); | |
188 | struct server* AddServer(struct server* uplink, const char *name, int hops, time_t boot, time_t link, const char *numeric, const char *description); | |
189 | void DelServer(struct server* serv, int announce, const char *message); | |
190 | void DelUser(struct userNode* user, struct userNode *killer, int announce, const char *why); | |
191 | /* Most protocols will want to make an AddUser helper function. */ | |
192 | ||
193 | /* User modes */ | |
194 | void mod_usermode(struct userNode *user, const char *modes); | |
195 | ||
196 | /* Channel mode manipulation */ | |
197 | #define KEYLEN 23 | |
198 | typedef unsigned long chan_mode_t; | |
199 | /* Rules for struct mod_chanmode: | |
200 | * For a membership mode change, args[n].mode can contain more than | |
201 | * one mode bit (e.g. MODE_CHANOP|MODE_VOICE). Hostmask strings are | |
202 | * "owned" by the caller and are not freed by mod_chanmode_free(). | |
203 | */ | |
204 | struct mod_chanmode { | |
205 | chan_mode_t modes_set, modes_clear; | |
206 | unsigned int new_limit, argc; | |
207 | #ifndef NDEBUG | |
208 | unsigned int alloc_argc; | |
209 | #endif | |
210 | char new_key[KEYLEN + 1]; | |
211 | char new_upass[KEYLEN + 1]; | |
212 | char new_apass[KEYLEN + 1]; | |
213 | struct { | |
214 | unsigned int mode; | |
215 | union { | |
216 | struct modeNode *member; | |
217 | const char *hostmask; | |
218 | } u; | |
219 | } args[1]; | |
220 | }; | |
221 | #define MCP_ALLOW_OVB 0x0001 /* allow op, voice, ban manipulation */ | |
222 | #define MCP_FROM_SERVER 0x0002 /* parse as from a server */ | |
223 | #define MCP_KEY_FREE 0x0004 /* -k without a key argument */ | |
224 | #define MCP_REGISTERED 0x0008 /* chan is already registered; do not allow changes to MODE_REGISTERED */ | |
225 | #define MCP_UPASS_FREE 0x0010 /* -U without a key argument */ | |
226 | #define MCP_APASS_FREE 0x0020 /* -A without a key argument */ | |
227 | #define MC_ANNOUNCE 0x0100 /* send a mod_chanmode() change out */ | |
228 | #define MC_NOTIFY 0x0200 /* make local callbacks to announce */ | |
229 | #ifdef NDEBUG | |
230 | #define mod_chanmode_init(CHANMODE) do { memset((CHANMODE), 0, sizeof(*CHANMODE)); } while (0) | |
231 | #else | |
232 | #define mod_chanmode_init(CHANMODE) do { memset((CHANMODE), 0, sizeof(*CHANMODE)); (CHANMODE)->alloc_argc = ArrayLength((CHANMODE)->args); } while (0) | |
233 | #endif | |
234 | ||
235 | struct mod_chanmode *mod_chanmode_alloc(unsigned int argc); | |
236 | struct mod_chanmode *mod_chanmode_dup(struct mod_chanmode *orig, unsigned int extra); | |
237 | struct mod_chanmode *mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, unsigned int flags, short base_oplevel); | |
238 | void mod_chanmode_apply(struct userNode *who, struct chanNode *channel, struct mod_chanmode *change); | |
239 | void mod_chanmode_announce(struct userNode *who, struct chanNode *channel, struct mod_chanmode *change); | |
240 | char *mod_chanmode_format(struct mod_chanmode *desc, char *buffer); | |
241 | void mod_chanmode_free(struct mod_chanmode *change); | |
242 | int mod_chanmode(struct userNode *who, struct chanNode *channel, char **modes, unsigned int argc, unsigned int flags); | |
243 | typedef void (*mode_change_func_t) (struct chanNode *channel, struct userNode *user, const struct mod_chanmode *change); | |
244 | void reg_mode_change_func(mode_change_func_t handler); | |
245 | int irc_make_chanmode(struct chanNode *chan, char *out); | |
246 | ||
247 | /* The "default" for generate_hostmask is to have all of these options off. */ | |
248 | #define GENMASK_STRICT_HOST 1 | |
249 | #define GENMASK_STRICT_IDENT 32 | |
250 | #define GENMASK_ANY_IDENT 64 | |
251 | #define GENMASK_STRICT (GENMASK_STRICT_IDENT|GENMASK_STRICT_HOST) | |
252 | #define GENMASK_USENICK 2 | |
253 | #define GENMASK_OMITNICK 4 /* Hurray for Kevin! */ | |
254 | #define GENMASK_BYIP 8 | |
255 | #define GENMASK_X3MASK 16 | |
256 | #define GENMASK_NO_HIDING 128 | |
257 | char *generate_hostmask(struct userNode *user, int options); | |
258 | ||
259 | #endif /* !defined(PROTO_H) */ |