]>
Commit | Line | Data |
---|---|---|
db137867 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-2005 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 | |
22 | * USA | |
23 | * | |
db137867 | 24 | */ |
3202e249 | 25 | |
db137867 | 26 | #ifndef RB_LIB_H |
3202e249 | 27 | # error "Do not use commio.h directly" |
db137867 AC |
28 | #endif |
29 | ||
30 | #ifndef INCLUDED_commio_h | |
31 | #define INCLUDED_commio_h | |
32 | ||
33 | ||
3202e249 | 34 | struct sockaddr; |
db137867 AC |
35 | struct _fde; |
36 | typedef struct _fde rb_fde_t; | |
37 | ||
38 | /* Callback for completed IO events */ | |
39 | typedef void PF(rb_fde_t *, void *); | |
40 | ||
41 | /* Callback for completed connections */ | |
42 | /* int fd, int status, void * */ | |
43 | typedef void CNCB(rb_fde_t *, int, void *); | |
44 | /* callback for fd table dumps */ | |
45 | typedef void DUMPCB(int, const char *desc, void *); | |
46 | /* callback for accept callbacks */ | |
47 | typedef void ACCB(rb_fde_t *, int status, struct sockaddr *addr, rb_socklen_t len, void *); | |
48 | /* callback for pre-accept callback */ | |
49 | typedef int ACPRE(rb_fde_t *, struct sockaddr *addr, rb_socklen_t len, void *); | |
50 | ||
51 | enum | |
52 | { | |
53 | RB_OK, | |
54 | RB_ERR_BIND, | |
55 | RB_ERR_DNS, | |
56 | RB_ERR_TIMEOUT, | |
57 | RB_ERR_CONNECT, | |
58 | RB_ERROR, | |
59 | RB_ERROR_SSL, | |
60 | RB_ERR_MAX | |
61 | }; | |
62 | ||
63 | #define RB_FD_NONE 0x01 | |
64 | #define RB_FD_FILE 0x02 | |
65 | #define RB_FD_SOCKET 0x04 | |
3202e249 | 66 | #ifndef _WIN32 |
db137867 AC |
67 | #define RB_FD_PIPE 0x08 |
68 | #else | |
69 | #define RB_FD_PIPE RB_FD_SOCKET | |
70 | #endif | |
71 | #define RB_FD_LISTEN 0x10 | |
72 | #define RB_FD_SSL 0x20 | |
73 | #define RB_FD_UNKNOWN 0x40 | |
c6ad9b0c SA |
74 | #define RB_FD_SCTP 0x80 |
75 | ||
76 | #define RB_FD_INHERIT_TYPES (RB_FD_SCTP) | |
db137867 AC |
77 | |
78 | #define RB_RW_IO_ERROR -1 /* System call error */ | |
79 | #define RB_RW_SSL_ERROR -2 /* SSL Error */ | |
80 | #define RB_RW_SSL_NEED_READ -3 /* SSL Needs read */ | |
81 | #define RB_RW_SSL_NEED_WRITE -4 /* SSL Needs write */ | |
82 | ||
83 | ||
84 | struct rb_iovec | |
85 | { | |
86 | void *iov_base; | |
87 | size_t iov_len; | |
88 | }; | |
89 | ||
90 | ||
91 | void rb_fdlist_init(int closeall, int maxfds, size_t heapsize); | |
92 | ||
339150ec | 93 | rb_fde_t *rb_open(rb_platform_fd_t, uint8_t, const char *); |
db137867 AC |
94 | void rb_close(rb_fde_t *); |
95 | void rb_dump_fd(DUMPCB *, void *xdata); | |
96 | void rb_note(rb_fde_t *, const char *); | |
97 | ||
98 | /* Type of IO */ | |
99 | #define RB_SELECT_READ 0x1 | |
100 | #define RB_SELECT_WRITE 0x2 | |
101 | ||
e6bbb410 EM |
102 | #define RB_SELECT_ACCEPT RB_SELECT_READ |
103 | #define RB_SELECT_CONNECT RB_SELECT_WRITE | |
db137867 | 104 | |
e6bbb410 EM |
105 | #define RB_SSL_CERTFP_LEN 64 |
106 | ||
107 | /* Methods for certfp */ | |
cf430c1a SA |
108 | /* Digest of full X.509 certificate */ |
109 | #define RB_SSL_CERTFP_METH_CERT_SHA1 0x0000 | |
110 | #define RB_SSL_CERTFP_METH_CERT_SHA256 0x0001 | |
111 | #define RB_SSL_CERTFP_METH_CERT_SHA512 0x0002 | |
112 | /* Digest of SubjectPublicKeyInfo (RFC 5280), used by DANE (RFC 6698) */ | |
113 | #define RB_SSL_CERTFP_METH_SPKI_SHA256 0x1001 | |
114 | #define RB_SSL_CERTFP_METH_SPKI_SHA512 0x1002 | |
e6bbb410 EM |
115 | |
116 | #define RB_SSL_CERTFP_LEN_SHA1 20 | |
117 | #define RB_SSL_CERTFP_LEN_SHA256 32 | |
118 | #define RB_SSL_CERTFP_LEN_SHA512 64 | |
7247337a | 119 | |
db137867 AC |
120 | int rb_set_nb(rb_fde_t *); |
121 | int rb_set_buffers(rb_fde_t *, int); | |
122 | ||
123 | int rb_get_sockerr(rb_fde_t *); | |
124 | ||
125 | void rb_settimeout(rb_fde_t *, time_t, PF *, void *); | |
126 | void rb_checktimeouts(void *); | |
5ad62c80 SA |
127 | void rb_connect_tcp(rb_fde_t *, struct sockaddr *, struct sockaddr *, CNCB *, void *, int); |
128 | void rb_connect_tcp_ssl(rb_fde_t *, struct sockaddr *, struct sockaddr *, CNCB *, void *, int); | |
6003ce76 | 129 | void rb_connect_sctp(rb_fde_t *, struct sockaddr_storage *connect_addrs, size_t connect_len, struct sockaddr_storage *bind_addrs, size_t bind_len, CNCB *, void *, int); |
db137867 AC |
130 | int rb_connect_sockaddr(rb_fde_t *, struct sockaddr *addr, int len); |
131 | ||
132 | const char *rb_errstr(int status); | |
133 | rb_fde_t *rb_socket(int family, int sock_type, int proto, const char *note); | |
3202e249 VY |
134 | int rb_socketpair(int family, int sock_type, int proto, rb_fde_t **F1, rb_fde_t **F2, |
135 | const char *note); | |
db137867 | 136 | |
c6ad9b0c SA |
137 | int rb_bind(rb_fde_t *F, struct sockaddr *addr); |
138 | int rb_sctp_bindx(rb_fde_t *F, struct sockaddr_storage *addrs, size_t len); | |
139 | int rb_inet_get_proto(rb_fde_t *F); | |
140 | ||
3202e249 | 141 | void rb_accept_tcp(rb_fde_t *, ACPRE * precb, ACCB * callback, void *data); |
db137867 AC |
142 | ssize_t rb_write(rb_fde_t *, const void *buf, int count); |
143 | ssize_t rb_writev(rb_fde_t *, struct rb_iovec *vector, int count); | |
144 | ||
145 | ssize_t rb_read(rb_fde_t *, void *buf, int count); | |
146 | int rb_pipe(rb_fde_t **, rb_fde_t **, const char *desc); | |
147 | ||
c1725bda | 148 | int rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile, const char *cipher_list); |
aa4737a0 AC |
149 | int rb_ssl_listen(rb_fde_t *, int backlog, int defer_accept); |
150 | int rb_listen(rb_fde_t *, int backlog, int defer_accept); | |
db137867 AC |
151 | |
152 | const char *rb_inet_ntop(int af, const void *src, char *dst, unsigned int size); | |
153 | int rb_inet_pton(int af, const char *src, void *dst); | |
154 | const char *rb_inet_ntop_sock(struct sockaddr *src, char *dst, unsigned int size); | |
17809d2d | 155 | int rb_inet_pton_sock(const char *src, struct sockaddr_storage *dst); |
db137867 AC |
156 | int rb_getmaxconnect(void); |
157 | int rb_ignore_errno(int); | |
158 | ||
159 | /* Generic wrappers */ | |
160 | void rb_setselect(rb_fde_t *, unsigned int type, PF * handler, void *client_data); | |
161 | void rb_init_netio(void); | |
162 | int rb_select(unsigned long); | |
163 | int rb_fd_ssl(rb_fde_t *F); | |
b1f7e409 | 164 | rb_platform_fd_t rb_get_fd(rb_fde_t *F); |
db137867 | 165 | const char *rb_get_ssl_strerror(rb_fde_t *F); |
e6bbb410 | 166 | int rb_get_ssl_certfp(rb_fde_t *F, uint8_t certfp[RB_SSL_CERTFP_LEN], int method); |
03469187 | 167 | int rb_get_ssl_certfp_file(const char *filename, uint8_t certfp[RB_SSL_CERTFP_LEN], int method); |
db137867 | 168 | |
dc7e6b42 | 169 | rb_fde_t *rb_get_fde(rb_platform_fd_t fd); |
db137867 | 170 | |
3202e249 | 171 | int rb_send_fd_buf(rb_fde_t *xF, rb_fde_t **F, int count, void *data, size_t datasize, pid_t pid); |
db137867 AC |
172 | int rb_recv_fd_buf(rb_fde_t *F, void *data, size_t datasize, rb_fde_t **xF, int count); |
173 | ||
a9fb3ed0 VY |
174 | void rb_set_type(rb_fde_t *F, uint8_t type); |
175 | uint8_t rb_get_type(rb_fde_t *F); | |
db137867 AC |
176 | |
177 | const char *rb_get_iotype(void); | |
178 | ||
3202e249 VY |
179 | typedef enum |
180 | { | |
db137867 | 181 | RB_PRNG_FILE, |
3202e249 | 182 | #ifdef _WIN32 |
db137867 AC |
183 | RB_PRNGWIN32, |
184 | #endif | |
185 | RB_PRNG_DEFAULT, | |
186 | } prng_seed_t; | |
187 | ||
188 | int rb_init_prng(const char *path, prng_seed_t seed_type); | |
189 | int rb_get_random(void *buf, size_t len); | |
3202e249 VY |
190 | void rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout); |
191 | void rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout); | |
db137867 AC |
192 | int rb_supports_ssl(void); |
193 | ||
c2ac22cc VY |
194 | unsigned int rb_ssl_handshake_count(rb_fde_t *F); |
195 | void rb_ssl_clear_handshake_count(rb_fde_t *F); | |
3202e249 | 196 | |
3202e249 VY |
197 | int rb_pass_fd_to_process(rb_fde_t *, pid_t, rb_fde_t *); |
198 | rb_fde_t *rb_recv_fd(rb_fde_t *); | |
199 | ||
833b2f9c AC |
200 | const char *rb_ssl_get_cipher(rb_fde_t *F); |
201 | ||
4eafa9e6 EM |
202 | int rb_ipv4_from_ipv6(const struct sockaddr_in6 *restrict ip6, struct sockaddr_in *restrict ip4); |
203 | ||
db137867 | 204 | #endif /* INCLUDED_commio_h */ |