]> jfr.im git - irc/rqf/shadowircd.git/blame - libratbox/include/rb_commio.h
Copied libratbox and related stuff from shadowircd upstream.
[irc/rqf/shadowircd.git] / libratbox / include / rb_commio.h
CommitLineData
b57f37fb
WP
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 *
94b4fbf9 24 * $Id: rb_commio.h 26092 2008-09-19 15:13:52Z androsyn $
b57f37fb 25 */
94b4fbf9 26
b57f37fb 27#ifndef RB_LIB_H
94b4fbf9 28# error "Do not use commio.h directly"
b57f37fb
WP
29#endif
30
31#ifndef INCLUDED_commio_h
32#define INCLUDED_commio_h
33
34
94b4fbf9 35struct sockaddr;
b57f37fb
WP
36struct _fde;
37typedef struct _fde rb_fde_t;
38
39/* Callback for completed IO events */
40typedef void PF(rb_fde_t *, void *);
41
42/* Callback for completed connections */
43/* int fd, int status, void * */
44typedef void CNCB(rb_fde_t *, int, void *);
45/* callback for fd table dumps */
46typedef void DUMPCB(int, const char *desc, void *);
47/* callback for accept callbacks */
48typedef void ACCB(rb_fde_t *, int status, struct sockaddr *addr, rb_socklen_t len, void *);
49/* callback for pre-accept callback */
50typedef int ACPRE(rb_fde_t *, struct sockaddr *addr, rb_socklen_t len, void *);
51
52enum
53{
54 RB_OK,
55 RB_ERR_BIND,
56 RB_ERR_DNS,
57 RB_ERR_TIMEOUT,
58 RB_ERR_CONNECT,
59 RB_ERROR,
60 RB_ERROR_SSL,
61 RB_ERR_MAX
62};
63
64#define RB_FD_NONE 0x01
65#define RB_FD_FILE 0x02
66#define RB_FD_SOCKET 0x04
94b4fbf9 67#ifndef _WIN32
b57f37fb
WP
68#define RB_FD_PIPE 0x08
69#else
70#define RB_FD_PIPE RB_FD_SOCKET
71#endif
72#define RB_FD_LISTEN 0x10
73#define RB_FD_SSL 0x20
74#define RB_FD_UNKNOWN 0x40
75
76#define RB_RW_IO_ERROR -1 /* System call error */
77#define RB_RW_SSL_ERROR -2 /* SSL Error */
78#define RB_RW_SSL_NEED_READ -3 /* SSL Needs read */
79#define RB_RW_SSL_NEED_WRITE -4 /* SSL Needs write */
80
81
82struct rb_iovec
83{
84 void *iov_base;
85 size_t iov_len;
86};
87
88
89void rb_fdlist_init(int closeall, int maxfds, size_t heapsize);
90
94b4fbf9 91rb_fde_t *rb_open(int, uint8_t, const char *);
b57f37fb
WP
92void rb_close(rb_fde_t *);
93void rb_dump_fd(DUMPCB *, void *xdata);
94void rb_note(rb_fde_t *, const char *);
95
96/* Type of IO */
97#define RB_SELECT_READ 0x1
98#define RB_SELECT_WRITE 0x2
99
100#define RB_SELECT_ACCEPT RB_SELECT_READ
101#define RB_SELECT_CONNECT RB_SELECT_WRITE
102
103int rb_set_nb(rb_fde_t *);
104int rb_set_buffers(rb_fde_t *, int);
105
106int rb_get_sockerr(rb_fde_t *);
107
108void rb_settimeout(rb_fde_t *, time_t, PF *, void *);
109void rb_checktimeouts(void *);
94b4fbf9
VY
110void rb_connect_tcp(rb_fde_t *, struct sockaddr *, struct sockaddr *, int, CNCB *, void *, int);
111void rb_connect_tcp_ssl(rb_fde_t *, struct sockaddr *, struct sockaddr *, int, CNCB *, void *, int);
b57f37fb
WP
112int rb_connect_sockaddr(rb_fde_t *, struct sockaddr *addr, int len);
113
114const char *rb_errstr(int status);
115rb_fde_t *rb_socket(int family, int sock_type, int proto, const char *note);
94b4fbf9
VY
116int rb_socketpair(int family, int sock_type, int proto, rb_fde_t **F1, rb_fde_t **F2,
117 const char *note);
b57f37fb 118
94b4fbf9 119void rb_accept_tcp(rb_fde_t *, ACPRE * precb, ACCB * callback, void *data);
b57f37fb
WP
120ssize_t rb_write(rb_fde_t *, const void *buf, int count);
121ssize_t rb_writev(rb_fde_t *, struct rb_iovec *vector, int count);
122
123ssize_t rb_read(rb_fde_t *, void *buf, int count);
124int rb_pipe(rb_fde_t **, rb_fde_t **, const char *desc);
125
126int rb_setup_ssl_server(const char *cert, const char *keyfile, const char *dhfile);
127int rb_ssl_listen(rb_fde_t *, int backlog);
128int rb_listen(rb_fde_t *, int backlog);
129
130const char *rb_inet_ntop(int af, const void *src, char *dst, unsigned int size);
131int rb_inet_pton(int af, const char *src, void *dst);
132const char *rb_inet_ntop_sock(struct sockaddr *src, char *dst, unsigned int size);
133int rb_inet_pton_sock(const char *src, struct sockaddr *dst);
134int rb_getmaxconnect(void);
135int rb_ignore_errno(int);
136
137/* Generic wrappers */
138void rb_setselect(rb_fde_t *, unsigned int type, PF * handler, void *client_data);
139void rb_init_netio(void);
140int rb_select(unsigned long);
141int rb_fd_ssl(rb_fde_t *F);
142int rb_get_fd(rb_fde_t *F);
143const char *rb_get_ssl_strerror(rb_fde_t *F);
144
145rb_fde_t *rb_get_fde(int fd);
146
94b4fbf9 147int rb_send_fd_buf(rb_fde_t *xF, rb_fde_t **F, int count, void *data, size_t datasize, pid_t pid);
b57f37fb
WP
148int rb_recv_fd_buf(rb_fde_t *F, void *data, size_t datasize, rb_fde_t **xF, int count);
149
4414eb3c
VY
150void rb_set_type(rb_fde_t *F, uint8_t type);
151uint8_t rb_get_type(rb_fde_t *F);
b57f37fb
WP
152
153const char *rb_get_iotype(void);
154
94b4fbf9
VY
155typedef enum
156{
b57f37fb
WP
157 RB_PRNG_EGD,
158 RB_PRNG_FILE,
94b4fbf9 159#ifdef _WIN32
b57f37fb
WP
160 RB_PRNGWIN32,
161#endif
162 RB_PRNG_DEFAULT,
163} prng_seed_t;
164
165int rb_init_prng(const char *path, prng_seed_t seed_type);
166int rb_get_random(void *buf, size_t len);
4414eb3c 167int rb_get_pseudo_random(void *buf, size_t len);
94b4fbf9
VY
168void rb_ssl_start_accepted(rb_fde_t *new_F, ACCB * cb, void *data, int timeout);
169void rb_ssl_start_connected(rb_fde_t *F, CNCB * callback, void *data, int timeout);
b57f37fb
WP
170int rb_supports_ssl(void);
171
033be687
VY
172unsigned int rb_ssl_handshake_count(rb_fde_t *F);
173void rb_ssl_clear_handshake_count(rb_fde_t *F);
94b4fbf9
VY
174
175
176int rb_pass_fd_to_process(rb_fde_t *, pid_t, rb_fde_t *);
177rb_fde_t *rb_recv_fd(rb_fde_t *);
178
b57f37fb 179#endif /* INCLUDED_commio_h */