1 /*
2 * server.h: header for server.c
3 *
4 * Copyright 1990 Michael Sandrof
5 * Copyright 1997 EPIC Software Labs
6 * See the COPYRIGHT file, or do a HELP IRCII COPYRIGHT
7 */
8
9 #ifndef __server_h__
10 #define __server_h__
11
12
13 /* To get definition of Who, Ison, and Userhost queues. */
14 #include "who.h"
15
16 #ifdef NEED_SERVER_LIST
17 /* To get definition of Notify */
18 #include "notify.h"
19 #include "alist.h"
20
21 /* XXXX Ick. Gross. Bad. XXX */
22 struct notify_stru;
23
24 typedef array A005;
25 typedef struct
26 {
27 char *name;
28 u_32int_t hash;
29 char *value;
30 } A005_item;
31
32 typedef struct WaitCmdstru
33 {
34 char *stuff;
35 struct WaitCmdstru *next;
36 } WaitCmd;
37
38 /* Server: a structure for the server_list */
39 typedef struct
40 {
41 char *name; /* the name of the server */
42 char *itsname; /* the server's idea of its name */
43 char *password; /* password for that server */
44 int port; /* port number on that server */
45 char *group; /* Server group it belongs to */
46 char *nickname; /* Authoritative nickname for us */
47 char *s_nickname; /* last NICK command sent */
48 char *d_nickname; /* Default nickname to use */
49 char *unique_id; /* Unique ID (for ircnet) */
50 size_t fudge_factor; /* How much s_nickname's fudged */
51 int nickname_pending; /* Is a NICK command pending? */
52 int resetting_nickname; /* Is a nickname reset in progress? */
53 int registration_pending; /* Is a registration going on ? */
54 int registered; /* true if registration is assured */
55 int rejoined_channels; /* Has we tried to auto-rejoin? */
56 char *userhost; /* my userhost on this server */
57 char *away; /* away message for this server */
58 int operator; /* true if operator */
59 int version; /* the version of the server -
60 * defined above */
61 int server2_8; /* defined if we get an 001 numeric */
62 char *version_string; /* what is says */
63 long flags; /* Various flags */
64 long flags2; /* More Various flags */
65 char *umodes; /* Possible user modes */
66 char umode[54]; /* Currently set user modes */
67 int s_takes_arg; /* Set to 1 if s user mode has arg */
68 int des; /* file descriptor to server */
69 int eof; /* eof flag for server */
70 int sent; /* set if something has been sent,
71 * used for redirect */
72 char *redirect; /* Who we're redirecting to here */
73 WhoEntry * who_queue; /* Who queue */
74 IsonEntry * ison_wait; /* Ison wait queue */
75 IsonEntry * ison_queue; /* Ison queue */
76 UserhostEntry * userhost_queue; /* Userhost queue */
77
78 SS local_sockname; /* sockname of this connection */
79 SS remote_sockname; /* sockname of this connection */
80 SS uh_addr; /* ip address the server sees */
81 NotifyList notify_list; /* Notify list for this server */
82 int reconnects; /* Number of reconnects done */
83 char *cookie; /* Erf/TS4 "cookie" value */
84 int save_channels; /* True if abnormal connection */
85 int line_length; /* How long a protocol command may be */
86 int max_cached_chan_size; /* Bigger channels won't cache U@H */
87 int closing; /* True if close_server called */
88 int reconnect_to; /* Server to connect to on EOF */
89 char *quit_message; /* Where we stash a quit message */
90 A005 a005; /* 005 settings kept kere. */
91
92 int funny_min; /* Funny stuff */
93 int funny_max;
94 int funny_flags;
95 char * funny_match;
96
97 #ifdef HAVE_SSL
98 SSL_CTX* ctx;
99 SSL_METHOD* meth;
100 #endif
101 void * ssl_fd;
102 int try_ssl; /* SSL requested on next connection. */
103 int ssl_enabled; /* Current SSL status. */
104
105 int doing_privmsg;
106 int doing_notice;
107 int doing_ctcp;
108 int waiting_in;
109 int waiting_out;
110 WaitCmd * start_wait_list;
111 WaitCmd * end_wait_list;
112
113 char * invite_channel;
114 char * last_notify_nick;
115 char * joined_nick;
116 char * public_nick;
117 char * recv_nick;
118 char * sent_nick;
119 char * sent_body;
120
121 int (*dgets) (char *, int, int, void *);
122 } Server;
123 extern Server **server_list;
124 #endif /* NEED_SERVER_LIST */
125
126 extern int number_of_servers;
127 extern int connected_to_server;
128 extern int primary_server;
129 extern int from_server;
130 extern int last_server;
131 extern int parsing_server_index;
132
133 #ifdef NEED_SERVER_LIST
get_server(int server)134 static __inline__ Server * get_server (int server)
135 {
136 if (server == -1 && from_server >= 0)
137 server = from_server;
138 if (server < 0 || server >= number_of_servers)
139 return NULL;
140 return server_list[server];
141 }
142
143 /*
144 * These two macros do bounds checking on server refnums that are
145 * passed into various server functions
146 */
147 #define CHECK_SERVER(x) \
148 { \
149 if (!get_server(x)) \
150 return; \
151 }
152
153 #define CHECK_SERVER_RET(x, y) \
154 { \
155 if (!get_server(x)) \
156 return (y); \
157 }
158
159
160 #define __FROMSERV get_server(from_server)
161 #define SERVER(x) get_server(x)
162
163 #endif /* NEED_SERVER_LIST */
164
165 #define NOSERV -2
166 #define FROMSERV -1
167
168 /*
169 * type definition to distinguish different
170 * server versions
171 */
172 #define Server2_8 1
173 #define Server2_9 2
174 #define Server2_10 3
175 #define Server_u2_8 4
176 #define Server_u2_9 5
177 #define Server_u2_10 6
178 #define Server_u3_0 7
179
180 /* Funny stuff */
181 #define FUNNY_PUBLIC 1 << 0
182 #define FUNNY_PRIVATE 1 << 1
183 #define FUNNY_TOPIC 1 << 2
184 #define FUNNY_USERS 1 << 4
185 #define FUNNY_NAME 1 << 5
186
187
188
189 BUILT_IN_COMMAND(servercmd);
190 BUILT_IN_COMMAND(disconnectcmd);
191
192 void add_to_server_list (const char *, int,
193 const char *, const char *,
194 const char *, const char *,
195 int);
196 int find_in_server_list (const char *, int);
197 void destroy_server_list (void);
198 int find_server_refnum (char *, char **rest);
199 int parse_server_index (const char *, int);
200 void parse_server_info (char **, char **, char **,
201 char **, char **, char **);
202 void build_server_list (char *, char *);
203 int read_server_file (void);
204 void display_server_list (void);
205 char * create_server_list (void); /* MALLOC */
206 int server_list_size (void);
207
208 void do_server (fd_set *, fd_set *);
209 void flush_server (int);
210 void send_to_server (const char *, ...) __A(1);
211 void send_to_aserver (int, const char *, ...) __A(2);
212 void send_to_aserver_raw (int, size_t len, const char *buffer);
213 int connect_to_new_server (int, int, int);
214 int close_all_servers (const char *);
215 void close_server (int, const char *);
216
217 void set_server_away (int, const char *);
218 const char * get_server_away (int);
219
220 const char * get_possible_umodes (int);
221 void set_possible_umodes (int, const char *);
222 const char * get_umode (int);
223 void clear_user_modes (int);
224 void reinstate_user_modes (void);
225 void update_user_mode (const char *);
226 void set_server_flag (int, int, int);
227 int get_server_flag (int, int);
228
229 void set_server_version (int, int);
230 int get_server_version (int);
231
232 void set_server_name (int, const char *);
233 const char * get_server_name (int);
234 void set_server_itsname (int, const char *);
235 const char * get_server_itsname (int);
236 void set_server_group (int, const char *);
237 const char * get_server_group (int);
238 const char * get_server_type (int);
239 void set_server_version_string (int, const char *);
240 const char * get_server_version_string (int);
241 int get_server_isssl (int);
242 const char * get_server_cipher (int);
243
244 void register_server (int, const char *);
245 void server_registration_is_not_pending (int);
246 void password_sendline (char *, char *);
247 char * set_server_password (int, const char *);
248 int is_server_open (int);
249 int is_server_registered (int);
250 void server_is_registered (int, int);
251 int auto_reconnect_callback (void *);
252 int server_reconnects_to (int, int);
253 int reconnect (int, int);
254
255 int get_server_port (int);
256 int get_server_local_port (int);
257 SS get_server_local_addr (int);
258 SS get_server_uh_addr (int);
259
260 const char * get_server_userhost (int);
261 void got_my_userhost (int, UserhostItem *,
262 const char *, const char *);
263
264 int get_server_operator (int);
265 void set_server_operator (int, int);
266
267 void use_server_cookie (int);
268
269 const char * get_server_nickname (int);
270 int is_me (int, const char *);
271 void change_server_nickname (int, const char *);
272 const char * get_pending_nickname (int);
273 void accept_server_nickname (int, const char *);
274 void fudge_nickname (int);
275 void nickname_sendline (char *, char *);
276 void reset_nickname (int);
277
278 void set_server_redirect (int, const char *);
279 const char * get_server_redirect (int);
280 int check_server_redirect (int, const char *);
281 void save_servers (FILE *);
282
283 void server_did_rejoin_channels (int);
284 int did_server_rejoin_channels (int);
285
286 void clear_reconnect_counts (void);
287
288 int get_server_enable_ssl (int);
289 void set_server_enable_ssl (int, int);
290
291 void make_005 (int);
292 void destroy_005 (int);
293 const char* get_server_005 (int, const char *);
294 void set_server_005 (int, char*, char*);
295
296 void server_hard_wait (int);
297 void server_passive_wait (int, const char *);
298 int check_server_wait (int, const char *);
299
300 void set_server_doing_privmsg (int, int);
301 int get_server_doing_privmsg (int);
302 void set_server_doing_notice (int, int);
303 int get_server_doing_notice (int);
304 void set_server_doing_ctcp (int, int);
305 int get_server_doing_ctcp (int);
306 void set_server_nickname_pending (int, int);
307 int get_server_nickname_pending (int);
308 void set_server_sent (int, int);
309 int get_server_sent (int);
310 void set_server_try_ssl (int, int);
311 int get_server_try_ssl (int);
312 void set_server_ssl_enabled (int, int);
313 int get_server_ssl_enabled (int);
314 void set_server_save_channels (int, int);
315 int get_server_save_channels (int);
316 void set_server_protocol_state (int, int);
317 int get_server_protocol_state (int);
318 void set_server_line_length (int, int);
319 int get_server_line_length (int);
320 void set_server_max_cached_chan_size (int, int);
321 int get_server_max_cached_chan_size (int);
322
323 void set_server_invite_channel (int, const char *);
324 const char * get_server_invite_channel (int);
325 void set_server_last_notify (int, const char *);
326 const char * get_server_last_notify (int);
327 void set_server_joined_nick (int, const char *);
328 const char * get_server_joined_nick (int);
329 void set_server_public_nick (int, const char *);
330 const char * get_server_public_nick (int);
331 void set_server_recv_nick (int, const char *);
332 const char * get_server_recv_nick (int);
333 void set_server_sent_nick (int, const char *);
334 const char * get_server_sent_nick (int);
335 void set_server_sent_body (int, const char *);
336 const char * get_server_sent_body (int);
337 void set_server_quit_message (int, const char *message);
338 const char * get_server_quit_message (int);
339 void set_server_cookie (int, const char *);
340 const char * get_server_cookie (int);
341 void set_server_last_notify_nick (int, const char *);
342 const char * get_server_last_notify_nick (int);
343 void set_server_unique_id (int, const char *);
344 const char * get_server_unique_id (int);
345
346 void set_server_funny_min (int, int);
347 int get_server_funny_min (int);
348 void set_server_funny_max (int, int);
349 int get_server_funny_max (int);
350 void set_server_funny_flags (int, int);
351 int get_server_funny_flags (int);
352 void set_server_funny_match (int, const char *);
353 const char * get_server_funny_match (int);
354 void set_server_funny_stuff (int, int, int, int, const char *);
355
356 void set_server_window_count (int, int);
357 int get_server_window_count (int);
358
359 char * serverctl (char *);
360 #endif /* _SERVER_H_ */
361