]>
jfr.im git - solanum.git/blob - libcharybdis/select.c
2 * ircd-ratbox: A slightly useful ircd.
3 * select.c: select() compatible network routines.
5 * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
6 * Copyright (C) 1996-2002 Hybrid Development Team
7 * Copyright (C) 2001 Adrian Chadd <adrian@creative.net.au>
8 * Copyright (C) 2002-2005 ircd-ratbox development team
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25 * $Id: select.c 3528 2007-07-07 08:08:23Z nenolod $
30 #include "libcharybdis.h"
33 * Note that this is only a single list - multiple lists is kinda pointless
34 * under select because the list size is a function of the highest FD :-)
38 fd_set select_readfds
;
39 fd_set select_writefds
;
42 * You know, I'd rather have these local to comm_select but for some
43 * reason my gcc decides that I can't modify them at all..
49 static void select_update_selectfds(int fd
, short event
, PF
* handler
);
51 /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
52 /* Private functions */
55 * set and clear entries in the select array ..
58 select_update_selectfds(int fd
, short event
, PF
* handler
)
60 /* Update the read / write set */
61 if(event
& COMM_SELECT_READ
)
64 FD_SET(fd
, &select_readfds
);
66 FD_CLR(fd
, &select_readfds
);
68 if(event
& COMM_SELECT_WRITE
)
71 FD_SET(fd
, &select_writefds
);
73 FD_CLR(fd
, &select_writefds
);
78 /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
79 /* Public functions */
85 * This is a needed exported function which will be called to initialise
86 * the network loop code.
91 FD_ZERO(&select_readfds
);
92 FD_ZERO(&select_writefds
);
98 * This is a needed exported function which will be called to register
99 * and deregister interest in a pending IO state for a given FD.
102 comm_setselect(int fd
, fdlist_t list
, unsigned int type
, PF
* handler
,
103 void *client_data
, time_t timeout
)
105 fde_t
*F
= comm_locate_fd(fd
);
111 if(type
& COMM_SELECT_READ
)
113 F
->read_handler
= handler
;
114 F
->read_data
= client_data
;
115 select_update_selectfds(fd
, COMM_SELECT_READ
, handler
);
117 if(type
& COMM_SELECT_WRITE
)
119 F
->write_handler
= handler
;
120 F
->write_data
= client_data
;
121 select_update_selectfds(fd
, COMM_SELECT_WRITE
, handler
);
124 F
->timeout
= CurrentTime
+ (timeout
/ 1000);
128 * Check all connections for new connections and input data that is to be
129 * processed. Also check for connections with data queued and whether we can
140 comm_select(unsigned long delay
)
148 /* Copy over the read/write sets so we don't have to rebuild em */
149 memcpy(&tmpreadfds
, &select_readfds
, sizeof(fd_set
));
150 memcpy(&tmpwritefds
, &select_writefds
, sizeof(fd_set
));
155 to
.tv_usec
= delay
* 1000;
156 num
= select(highest_fd
+ 1, &tmpreadfds
, &tmpwritefds
, NULL
, &to
);
159 if(ignoreErrno(errno
))
171 /* XXX we *could* optimise by falling out after doing num fds ... */
172 for (fd
= 0; fd
< highest_fd
+ 1; fd
++)
174 F
= comm_locate_fd(fd
);
176 if(FD_ISSET(fd
, &tmpreadfds
))
178 hdl
= F
->read_handler
;
179 F
->read_handler
= NULL
;
181 hdl(fd
, F
->read_data
);
184 if(F
->flags
.open
== 0)
185 continue; /* Read handler closed us..go on */
187 if(FD_ISSET(fd
, &tmpwritefds
))
189 hdl
= F
->write_handler
;
190 F
->write_handler
= NULL
;
192 hdl(fd
, F
->write_data
);
195 if(F
->read_handler
== NULL
)
196 select_update_selectfds(fd
, COMM_SELECT_READ
, NULL
);
197 if(F
->write_handler
== NULL
)
198 select_update_selectfds(fd
, COMM_SELECT_WRITE
, NULL
);