]>
Commit | Line | Data |
---|---|---|
212380e3 AC |
1 | /* |
2 | * ircd-ratbox: A slightly useful ircd. | |
3 | * commio.h: A header for the network subsystem. | |
4 | * | |
5 | * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center | |
6 | * Copyright (C) 1996-2002 Hybrid Development Team | |
7 | * Copyright (C) 2002-2004 ircd-ratbox development team | |
8 | * | |
9 | * This program is free software; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License as published by | |
11 | * the Free Software Foundation; either version 2 of the License, or | |
12 | * (at your option) any later version. | |
13 | * | |
14 | * This program is distributed in the hope that it will be useful, | |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | * GNU General Public License for more details. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License | |
20 | * along with this program; if not, write to the Free Software | |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
22 | * USA | |
23 | * | |
24 | * $Id: commio.h 1757 2006-07-25 23:34:45Z jilles $ | |
25 | */ | |
26 | ||
27 | #ifndef INCLUDED_commio_h | |
28 | #define INCLUDED_commio_h | |
29 | ||
30 | #include "setup.h" | |
31 | #include "config.h" | |
32 | #include "ircd_defs.h" | |
33 | ||
34 | /* Callback for completed IO events */ | |
35 | typedef void PF(int fd, void *); | |
36 | ||
37 | /* Callback for completed connections */ | |
38 | /* int fd, int status, void * */ | |
39 | typedef void CNCB(int fd, int, void *); | |
40 | ||
41 | #define FD_DESC_SZ 128 /* hostlen + comment */ | |
42 | ||
43 | ||
44 | /* FD type values */ | |
45 | enum | |
46 | { | |
47 | FD_NONE, | |
48 | FD_LOG, | |
49 | FD_FILE, | |
50 | FD_FILECLOSE, | |
51 | FD_SOCKET, | |
52 | FD_PIPE, | |
53 | FD_UNKNOWN | |
54 | }; | |
55 | ||
56 | enum | |
57 | { | |
58 | COMM_OK, | |
59 | COMM_ERR_BIND, | |
60 | COMM_ERR_DNS, | |
61 | COMM_ERR_TIMEOUT, | |
62 | COMM_ERR_CONNECT, | |
63 | COMM_ERROR, | |
64 | COMM_ERR_MAX | |
65 | }; | |
66 | ||
67 | typedef enum fdlist_t | |
68 | { | |
69 | FDLIST_NONE, | |
70 | FDLIST_SERVICE, | |
71 | FDLIST_SERVER, | |
72 | FDLIST_IDLECLIENT, | |
73 | FDLIST_BUSYCLIENT, | |
74 | FDLIST_MAX | |
75 | } | |
76 | fdlist_t; | |
77 | ||
78 | typedef struct _fde fde_t; | |
79 | ||
80 | ||
81 | extern int highest_fd; | |
82 | extern int number_fd; | |
83 | ||
84 | struct Client; | |
85 | ||
86 | struct _fde | |
87 | { | |
88 | /* New-school stuff, again pretty much ripped from squid */ | |
89 | /* | |
90 | * Yes, this gives us only one pending read and one pending write per | |
91 | * filedescriptor. Think though: when do you think we'll need more? | |
92 | */ | |
93 | int fd; /* So we can use the fde_t as a callback ptr */ | |
94 | int type; | |
95 | fdlist_t list; /* Which list this FD should sit on */ | |
96 | int comm_index; /* where in the poll list we live */ | |
97 | char desc[FD_DESC_SZ]; | |
98 | PF *read_handler; | |
99 | void *read_data; | |
100 | PF *write_handler; | |
101 | void *write_data; | |
102 | PF *timeout_handler; | |
103 | void *timeout_data; | |
104 | time_t timeout; | |
105 | PF *flush_handler; | |
106 | void *flush_data; | |
107 | time_t flush_timeout; | |
108 | struct DNSQuery *dns_query; | |
109 | struct | |
110 | { | |
111 | unsigned int open:1; | |
112 | unsigned int close_request:1; | |
113 | unsigned int write_daemon:1; | |
114 | unsigned int closing:1; | |
115 | unsigned int socket_eof:1; | |
116 | unsigned int nolinger:1; | |
117 | unsigned int nonblocking:1; | |
118 | unsigned int ipc:1; | |
119 | unsigned int called_connect:1; | |
120 | } | |
121 | flags; | |
122 | struct | |
123 | { | |
124 | struct irc_sockaddr_storage hostaddr; | |
125 | CNCB *callback; | |
126 | void *data; | |
127 | /* We'd also add the retry count here when we get to that -- adrian */ | |
128 | } | |
129 | connect; | |
130 | int pflags; | |
131 | }; | |
132 | ||
133 | ||
134 | extern fde_t *fd_table; | |
135 | ||
136 | void fdlist_init(void); | |
137 | ||
138 | extern void comm_open(int, unsigned int, const char *); | |
139 | extern void comm_close(int); | |
140 | extern void comm_dump(struct Client *source_p); | |
141 | #ifndef __GNUC__ | |
142 | extern void comm_note(int fd, const char *format, ...); | |
143 | #else | |
144 | extern void comm_note(int fd, const char *format, ...) __attribute__ ((format(printf, 2, 3))); | |
145 | #endif | |
146 | ||
147 | #define FB_EOF 0x01 | |
148 | #define FB_FAIL 0x02 | |
149 | ||
150 | ||
151 | /* Size of a read buffer */ | |
152 | #define READBUF_SIZE 16384 /* used by src/packet.c and src/s_serv.c */ | |
153 | ||
154 | /* Type of IO */ | |
155 | #define COMM_SELECT_READ 0x1 | |
156 | #define COMM_SELECT_WRITE 0x2 | |
157 | #define COMM_SELECT_RETRY 0x4 | |
158 | extern int readcalls; | |
159 | extern const char *const NONB_ERROR_MSG; | |
160 | extern const char *const SETBUF_ERROR_MSG; | |
161 | ||
162 | extern void comm_close_all(void); | |
163 | extern int comm_set_nb(int); | |
164 | extern int comm_set_buffers(int, int); | |
165 | ||
166 | extern int comm_get_sockerr(int); | |
167 | extern int ignoreErrno(int ierrno); | |
168 | ||
169 | extern void comm_settimeout(int fd, time_t, PF *, void *); | |
170 | extern void comm_setflush(int fd, time_t, PF *, void *); | |
171 | extern void comm_checktimeouts(void *); | |
172 | extern void comm_connect_tcp(int fd, const char *, u_short, | |
173 | struct sockaddr *, int, CNCB *, void *, int, int); | |
174 | extern const char *comm_errstr(int status); | |
175 | extern int comm_socket(int family, int sock_type, int proto, const char *note); | |
176 | extern int comm_accept(int fd, struct sockaddr *pn, socklen_t *addrlen); | |
177 | ||
178 | /* These must be defined in the network IO loop code of your choice */ | |
179 | extern void comm_setselect(int fd, fdlist_t list, unsigned int type, | |
180 | PF * handler, void *client_data, time_t timeout); | |
181 | extern void init_netio(void); | |
182 | extern int read_message(time_t, unsigned char); | |
183 | extern int comm_select(unsigned long); | |
184 | extern int disable_sock_options(int); | |
185 | #ifdef IPV6 | |
186 | extern void mangle_mapped_sockaddr(struct sockaddr *in); | |
187 | #else | |
188 | #define mangle_mapped_sockaddr(x) | |
189 | #endif | |
190 | ||
191 | ||
192 | #endif /* INCLUDED_commio_h */ |