]> jfr.im git - solanum.git/blame - librb/include/rb_commio.h
Add basic SCTP listener support that binds to multiple addresses
[solanum.git] / librb / include / rb_commio.h
CommitLineData
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 34struct sockaddr;
db137867
AC
35struct _fde;
36typedef struct _fde rb_fde_t;
37
38/* Callback for completed IO events */
39typedef void PF(rb_fde_t *, void *);
40
41/* Callback for completed connections */
42/* int fd, int status, void * */
43typedef void CNCB(rb_fde_t *, int, void *);
44/* callback for fd table dumps */
45typedef void DUMPCB(int, const char *desc, void *);
46/* callback for accept callbacks */
47typedef void ACCB(rb_fde_t *, int status, struct sockaddr *addr, rb_socklen_t len, void *);
48/* callback for pre-accept callback */
49typedef int ACPRE(rb_fde_t *, struct sockaddr *addr, rb_socklen_t len, void *);
50
51enum
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
84struct rb_iovec
85{
86 void *iov_base;
87 size_t iov_len;
88};
89
90
91void rb_fdlist_init(int closeall, int maxfds, size_t heapsize);
92
339150ec 93rb_fde_t *rb_open(rb_platform_fd_t, uint8_t, const char *);
db137867
AC
94void rb_close(rb_fde_t *);
95void rb_dump_fd(DUMPCB *, void *xdata);
96void 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
120int rb_set_nb(rb_fde_t *);
121int rb_set_buffers(rb_fde_t *, int);
122
123int rb_get_sockerr(rb_fde_t *);
124
125void rb_settimeout(rb_fde_t *, time_t, PF *, void *);
126void rb_checktimeouts(void *);
5ad62c80
SA
127void rb_connect_tcp(rb_fde_t *, struct sockaddr *, struct sockaddr *, CNCB *, void *, int);
128void rb_connect_tcp_ssl(rb_fde_t *, struct sockaddr *, struct sockaddr *, CNCB *, void *, int);
db137867
AC
129int rb_connect_sockaddr(rb_fde_t *, struct sockaddr *addr, int len);
130
131const char *rb_errstr(int status);
132rb_fde_t *rb_socket(int family, int sock_type, int proto, const char *note);
3202e249
VY
133int rb_socketpair(int family, int sock_type, int proto, rb_fde_t **F1, rb_fde_t **F2,
134 const char *note);
db137867 135
c6ad9b0c
SA
136int rb_bind(rb_fde_t *F, struct sockaddr *addr);
137int rb_sctp_bindx(rb_fde_t *F, struct sockaddr_storage *addrs, size_t len);
138int rb_inet_get_proto(rb_fde_t *F);
139
3202e249 140void rb_accept_tcp(rb_fde_t *, ACPRE * precb, ACCB * callback, void *data);
db137867
AC
141ssize_t rb_write(rb_fde_t *, const void *buf, int count);
142ssize_t rb_writev(rb_fde_t *, struct rb_iovec *vector, int count);
143
144ssize_t rb_read(rb_fde_t *, void *buf, int count);
145int rb_pipe(rb_fde_t **, rb_fde_t **, const char *desc);
146
c1725bda 147int rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile, const char *cipher_list);
aa4737a0
AC
148int rb_ssl_listen(rb_fde_t *, int backlog, int defer_accept);
149int rb_listen(rb_fde_t *, int backlog, int defer_accept);
db137867
AC
150
151const char *rb_inet_ntop(int af, const void *src, char *dst, unsigned int size);
152int rb_inet_pton(int af, const char *src, void *dst);
153const char *rb_inet_ntop_sock(struct sockaddr *src, char *dst, unsigned int size);
154int rb_inet_pton_sock(const char *src, struct sockaddr *dst);
155int rb_getmaxconnect(void);
156int rb_ignore_errno(int);
157
158/* Generic wrappers */
159void rb_setselect(rb_fde_t *, unsigned int type, PF * handler, void *client_data);
160void rb_init_netio(void);
161int rb_select(unsigned long);
162int rb_fd_ssl(rb_fde_t *F);
b1f7e409 163rb_platform_fd_t rb_get_fd(rb_fde_t *F);
db137867 164const char *rb_get_ssl_strerror(rb_fde_t *F);
e6bbb410 165int rb_get_ssl_certfp(rb_fde_t *F, uint8_t certfp[RB_SSL_CERTFP_LEN], int method);
03469187 166int rb_get_ssl_certfp_file(const char *filename, uint8_t certfp[RB_SSL_CERTFP_LEN], int method);
db137867 167
dc7e6b42 168rb_fde_t *rb_get_fde(rb_platform_fd_t fd);
db137867 169
3202e249 170int rb_send_fd_buf(rb_fde_t *xF, rb_fde_t **F, int count, void *data, size_t datasize, pid_t pid);
db137867
AC
171int rb_recv_fd_buf(rb_fde_t *F, void *data, size_t datasize, rb_fde_t **xF, int count);
172
a9fb3ed0
VY
173void rb_set_type(rb_fde_t *F, uint8_t type);
174uint8_t rb_get_type(rb_fde_t *F);
db137867
AC
175
176const char *rb_get_iotype(void);
177
3202e249
VY
178typedef enum
179{
db137867 180 RB_PRNG_FILE,
3202e249 181#ifdef _WIN32
db137867
AC
182 RB_PRNGWIN32,
183#endif
184 RB_PRNG_DEFAULT,
185} prng_seed_t;
186
187int rb_init_prng(const char *path, prng_seed_t seed_type);
188int rb_get_random(void *buf, size_t len);
3202e249
VY
189void rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout);
190void rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout);
db137867
AC
191int rb_supports_ssl(void);
192
c2ac22cc
VY
193unsigned int rb_ssl_handshake_count(rb_fde_t *F);
194void rb_ssl_clear_handshake_count(rb_fde_t *F);
3202e249 195
3202e249
VY
196int rb_pass_fd_to_process(rb_fde_t *, pid_t, rb_fde_t *);
197rb_fde_t *rb_recv_fd(rb_fde_t *);
198
833b2f9c
AC
199const char *rb_ssl_get_cipher(rb_fde_t *F);
200
4eafa9e6
EM
201int rb_ipv4_from_ipv6(const struct sockaddr_in6 *restrict ip6, struct sockaddr_in *restrict ip4);
202
db137867 203#endif /* INCLUDED_commio_h */