]> jfr.im git - solanum.git/blame - libcharybdis/commio.h
[svn] Fix some cases where the size argument to strlcpy()
[solanum.git] / libcharybdis / commio.h
CommitLineData
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 */
35typedef void PF(int fd, void *);
36
37/* Callback for completed connections */
38/* int fd, int status, void * */
39typedef void CNCB(int fd, int, void *);
40
41#define FD_DESC_SZ 128 /* hostlen + comment */
42
43
44/* FD type values */
45enum
46{
47 FD_NONE,
48 FD_LOG,
49 FD_FILE,
50 FD_FILECLOSE,
51 FD_SOCKET,
52 FD_PIPE,
53 FD_UNKNOWN
54};
55
56enum
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
67typedef enum fdlist_t
68{
69 FDLIST_NONE,
70 FDLIST_SERVICE,
71 FDLIST_SERVER,
72 FDLIST_IDLECLIENT,
73 FDLIST_BUSYCLIENT,
74 FDLIST_MAX
75}
76fdlist_t;
77
78typedef struct _fde fde_t;
79
80
81extern int highest_fd;
82extern int number_fd;
83
84struct Client;
85
86struct _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
134extern fde_t *fd_table;
135
136void fdlist_init(void);
137
138extern void comm_open(int, unsigned int, const char *);
139extern void comm_close(int);
140extern void comm_dump(struct Client *source_p);
141#ifndef __GNUC__
142extern void comm_note(int fd, const char *format, ...);
143#else
144extern 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
158extern int readcalls;
159extern const char *const NONB_ERROR_MSG;
160extern const char *const SETBUF_ERROR_MSG;
161
162extern void comm_close_all(void);
163extern int comm_set_nb(int);
164extern int comm_set_buffers(int, int);
165
166extern int comm_get_sockerr(int);
167extern int ignoreErrno(int ierrno);
168
169extern void comm_settimeout(int fd, time_t, PF *, void *);
170extern void comm_setflush(int fd, time_t, PF *, void *);
171extern void comm_checktimeouts(void *);
172extern void comm_connect_tcp(int fd, const char *, u_short,
173 struct sockaddr *, int, CNCB *, void *, int, int);
174extern const char *comm_errstr(int status);
175extern int comm_socket(int family, int sock_type, int proto, const char *note);
176extern 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 */
179extern void comm_setselect(int fd, fdlist_t list, unsigned int type,
180 PF * handler, void *client_data, time_t timeout);
181extern void init_netio(void);
182extern int read_message(time_t, unsigned char);
183extern int comm_select(unsigned long);
184extern int disable_sock_options(int);
185#ifdef IPV6
186extern void mangle_mapped_sockaddr(struct sockaddr *in);
187#else
188#define mangle_mapped_sockaddr(x)
189#endif
190
191
192#endif /* INCLUDED_commio_h */