]>
jfr.im git - solanum.git/blob - librb/include/rb_commio.h
2 * ircd-ratbox: A slightly useful ircd.
3 * commio.h: A header for the network subsystem.
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
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.
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.
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
27 # error "Do not use commio.h directly"
30 #ifndef INCLUDED_commio_h
31 #define INCLUDED_commio_h
36 typedef struct _fde rb_fde_t
;
38 /* Callback for completed IO events */
39 typedef void PF(rb_fde_t
*, void *);
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 *);
63 #define RB_FD_NONE 0x01
64 #define RB_FD_FILE 0x02
65 #define RB_FD_SOCKET 0x04
66 #define RB_FD_PIPE 0x08
67 #define RB_FD_LISTEN 0x10
68 #define RB_FD_SSL 0x20
69 #define RB_FD_UNKNOWN 0x40
70 #define RB_FD_SCTP 0x80
72 #define RB_FD_INHERIT_TYPES (RB_FD_SCTP)
74 #define RB_RW_IO_ERROR -1 /* System call error */
75 #define RB_RW_SSL_ERROR -2 /* SSL Error */
76 #define RB_RW_SSL_NEED_READ -3 /* SSL Needs read */
77 #define RB_RW_SSL_NEED_WRITE -4 /* SSL Needs write */
87 void rb_fdlist_init(int closeall
, int maxfds
, size_t heapsize
);
89 rb_fde_t
*rb_open(int, uint8_t, const char *);
90 void rb_close(rb_fde_t
*);
91 void rb_dump_fd(DUMPCB
*, void *xdata
);
92 void rb_note(rb_fde_t
*, const char *);
93 void rb_close_pending_fds(void);
96 #define RB_SELECT_READ 0x1
97 #define RB_SELECT_WRITE 0x2
99 #define RB_SELECT_ACCEPT RB_SELECT_READ
100 #define RB_SELECT_CONNECT RB_SELECT_WRITE
102 #define RB_SSL_CERTFP_LEN 64
104 /* Methods for certfp */
105 /* Digest of full X.509 certificate */
106 #define RB_SSL_CERTFP_METH_CERT_SHA1 0x0000
107 #define RB_SSL_CERTFP_METH_CERT_SHA256 0x0001
108 #define RB_SSL_CERTFP_METH_CERT_SHA512 0x0002
109 /* Digest of SubjectPublicKeyInfo (RFC 5280), used by DANE (RFC 6698) */
110 #define RB_SSL_CERTFP_METH_SPKI_SHA256 0x1001
111 #define RB_SSL_CERTFP_METH_SPKI_SHA512 0x1002
113 #define RB_SSL_CERTFP_LEN_SHA1 20
114 #define RB_SSL_CERTFP_LEN_SHA256 32
115 #define RB_SSL_CERTFP_LEN_SHA512 64
117 int rb_set_nb(rb_fde_t
*);
118 int rb_set_cloexec(rb_fde_t
*);
119 int rb_clear_cloexec(rb_fde_t
*);
120 int rb_set_buffers(rb_fde_t
*, int);
122 int rb_get_sockerr(rb_fde_t
*);
124 void rb_settimeout(rb_fde_t
*, time_t, PF
*, void *);
125 void rb_checktimeouts(void *);
126 void rb_connect_tcp(rb_fde_t
*, struct sockaddr
*, struct sockaddr
*, CNCB
*, void *, int);
127 void rb_connect_tcp_ssl(rb_fde_t
*, struct sockaddr
*, struct sockaddr
*, CNCB
*, void *, int);
128 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);
129 int rb_connect_sockaddr(rb_fde_t
*, struct sockaddr
*addr
, int len
);
131 const char *rb_errstr(int status
);
132 rb_fde_t
*rb_socket(int family
, int sock_type
, int proto
, const char *note
);
133 int rb_socketpair(int family
, int sock_type
, int proto
, rb_fde_t
**F1
, rb_fde_t
**F2
,
136 int rb_bind(rb_fde_t
*F
, struct sockaddr
*addr
);
137 int rb_sctp_bindx(rb_fde_t
*F
, struct sockaddr_storage
*addrs
, size_t len
);
138 int rb_inet_get_proto(rb_fde_t
*F
);
140 void rb_accept_tcp(rb_fde_t
*, ACPRE
* precb
, ACCB
* callback
, void *data
);
141 ssize_t
rb_write(rb_fde_t
*, const void *buf
, int count
);
142 ssize_t
rb_writev(rb_fde_t
*, struct rb_iovec
*vector
, int count
);
144 ssize_t
rb_read(rb_fde_t
*, void *buf
, int count
);
145 int rb_pipe(rb_fde_t
**, rb_fde_t
**, const char *desc
);
147 int rb_setup_ssl_server(const char *cert
, const char *keyfile
, const char *dhfile
, const char *cipher_list
);
148 int rb_ssl_listen(rb_fde_t
*, int backlog
, int defer_accept
);
149 int rb_listen(rb_fde_t
*, int backlog
, int defer_accept
);
151 const char *rb_inet_ntop(int af
, const void *src
, char *dst
, unsigned int size
);
152 int rb_inet_pton(int af
, const char *src
, void *dst
);
153 const char *rb_inet_ntop_sock(struct sockaddr
*src
, char *dst
, unsigned int size
);
154 int rb_inet_pton_sock(const char *src
, struct sockaddr_storage
*dst
);
155 int rb_getmaxconnect(void);
156 int rb_ignore_errno(int);
158 /* Generic wrappers */
159 void rb_setselect(rb_fde_t
*, unsigned int type
, PF
* handler
, void *client_data
);
160 void rb_init_netio(void);
161 int rb_select(unsigned long);
162 void rb_defer(void (*)(void *), void *);
163 int rb_fd_ssl(rb_fde_t
*F
);
164 int rb_get_fd(rb_fde_t
*F
);
165 const char *rb_get_ssl_strerror(rb_fde_t
*F
);
166 int rb_get_ssl_certfp(rb_fde_t
*F
, uint8_t certfp
[RB_SSL_CERTFP_LEN
], int method
);
167 int rb_get_ssl_certfp_file(const char *filename
, uint8_t certfp
[RB_SSL_CERTFP_LEN
], int method
);
169 rb_fde_t
*rb_get_fde(int fd
);
171 int rb_send_fd_buf(rb_fde_t
*xF
, rb_fde_t
**F
, int count
, void *data
, size_t datasize
, pid_t pid
);
172 int rb_recv_fd_buf(rb_fde_t
*F
, void *data
, size_t datasize
, rb_fde_t
**xF
, int count
);
174 void rb_set_type(rb_fde_t
*F
, uint8_t type
);
175 uint8_t rb_get_type(rb_fde_t
*F
);
177 const char *rb_get_iotype(void);
185 int rb_init_prng(const char *path
, prng_seed_t seed_type
);
186 int rb_get_random(void *buf
, size_t len
);
187 void rb_ssl_start_accepted(rb_fde_t
*new_F
, ACCB
* cb
, void *data
, int timeout
);
188 void rb_ssl_start_connected(rb_fde_t
*F
, CNCB
* callback
, void *data
, int timeout
);
189 int rb_supports_ssl(void);
191 unsigned int rb_ssl_handshake_count(rb_fde_t
*F
);
192 void rb_ssl_clear_handshake_count(rb_fde_t
*F
);
194 int rb_pass_fd_to_process(rb_fde_t
*, pid_t
, rb_fde_t
*);
195 rb_fde_t
*rb_recv_fd(rb_fde_t
*);
197 const char *rb_ssl_get_cipher(rb_fde_t
*F
);
199 int rb_ipv4_from_ipv6(const struct sockaddr_in6
*restrict ip6
, struct sockaddr_in
*restrict ip4
);
201 #endif /* INCLUDED_commio_h */