X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/b57f37fb6a4d30ac9aaba3bbca06f5a3307c804a..6f187f63b510ade944b8b3704727eeff3f0d31ca:/libratbox/src/devpoll.c diff --git a/libratbox/src/devpoll.c b/libratbox/src/devpoll.c index 162130f..58770d9 100644 --- a/libratbox/src/devpoll.c +++ b/libratbox/src/devpoll.c @@ -22,32 +22,29 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA * - * $Id: devpoll.c 25038 2008-01-23 16:03:08Z androsyn $ */ #include #include #include #include -#if defined(HAVE_DEVPOLL) && (HAVE_DEVPOLL_H) +#if defined(HAVE_DEVPOLL) && (HAVE_SYS_DEVPOLL_H) #include - -static void devpoll_update_events(int, short, PF *); static int dpfd; static int maxfd; static short *fdmask; -static void devpoll_update_events(int, short, PF *); +static void devpoll_update_events(rb_fde_t *, short, PF *); static void devpoll_write_update(int, int); -int +int rb_setup_fd_devpoll(rb_fde_t *F) { - return 0; + return 0; } - - + + /* * Write an update to the devpoll filter. * See, we end up having to do a seperate (?) remove before we do an @@ -68,17 +65,18 @@ devpoll_write_update(int fd, int events) /* Write the thing to our poll fd */ retval = write(dpfd, &pollfds[0], sizeof(struct pollfd)); if(retval != sizeof(struct pollfd)) - rb_lib_log("devpoll_write_update: dpfd write failed %d: %s", errno, strerror(errno)); + rb_lib_log("devpoll_write_update: dpfd write failed %d: %s", errno, + strerror(errno)); /* Done! */ } static void -devpoll_update_events(int fd, short filter, PF * handler) +devpoll_update_events(rb_fde_t *F, short filter, PF * handler) { int update_required = 0; + int fd = rb_get_fd(F); int cur_mask = fdmask[fd]; PF *cur_handler; - fdmask[fd] = 0; switch (filter) { @@ -150,9 +148,10 @@ rb_init_netio_devpoll(void) { return errno; } - maxfd = getdtablesize() - 2; /* This makes more sense than HARD_FDLIMIT */ + maxfd = getdtablesize() - 2; /* This makes more sense than HARD_FDLIMIT */ fdmask = rb_malloc(sizeof(fdmask) * maxfd + 1); rb_open(dpfd, RB_FD_UNKNOWN, "/dev/poll file descriptor"); + return 0; } /* @@ -162,20 +161,19 @@ rb_init_netio_devpoll(void) * and deregister interest in a pending IO state for a given FD. */ void -rb_setselect_devpoll(rb_fde_t *F, unsigned int type, PF * handler, - void *client_data) +rb_setselect_devpoll(rb_fde_t *F, unsigned int type, PF * handler, void *client_data) { lrb_assert(IsFDOpen(F)); if(type & RB_SELECT_READ) { - devpoll_update_events(fd, RB_SELECT_READ, handler); + devpoll_update_events(F, RB_SELECT_READ, handler); F->read_handler = handler; F->read_data = client_data; } if(type & RB_SELECT_WRITE) { - devpoll_update_events(fd, RB_SELECT_WRITE, handler); + devpoll_update_events(F, RB_SELECT_WRITE, handler); F->write_handler = handler; F->write_data = client_data; } @@ -205,7 +203,7 @@ rb_select_devpoll(long delay) do { - for (;;) + for(;;) { dopoll.dp_timeout = delay; dopoll.dp_nfds = maxfd; @@ -223,14 +221,13 @@ rb_select_devpoll(long delay) if(num == 0) continue; - for (i = 0; i < num; i++) + for(i = 0; i < num; i++) { int fd = dopoll.dp_fds[i].fd; PF *hdl = NULL; rb_fde_t *F = rb_find_fd(fd); - if((dopoll.dp_fds[i]. - revents & (POLLRDNORM | POLLIN | POLLHUP | - POLLERR)) + if((dopoll.dp_fds[i].revents & (POLLRDNORM | POLLIN | POLLHUP | + POLLERR)) && (dopoll.dp_fds[i].events & (POLLRDNORM | POLLIN))) { if((hdl = F->read_handler) != NULL) @@ -243,16 +240,14 @@ rb_select_devpoll(long delay) * poll set *if* the handler changes state (active -> * NULL or vice versa.) */ - devpoll_update_events(fd, - RB_SELECT_READ, F->read_handler); + devpoll_update_events(F, RB_SELECT_READ, F->read_handler); } } if(!IsFDOpen(F)) continue; /* Read handler closed us..go on to do something more useful */ - if((dopoll.dp_fds[i]. - revents & (POLLWRNORM | POLLOUT | POLLHUP | - POLLERR)) + if((dopoll.dp_fds[i].revents & (POLLWRNORM | POLLOUT | POLLHUP | + POLLERR)) && (dopoll.dp_fds[i].events & (POLLWRNORM | POLLOUT))) { if((hdl = F->write_handler) != NULL) @@ -260,7 +255,7 @@ rb_select_devpoll(long delay) F->write_handler = NULL; hdl(F, F->write_data); /* See above similar code in the read case */ - devpoll_update_events(fd, + devpoll_update_events(F, RB_SELECT_WRITE, F->write_handler); } @@ -268,13 +263,13 @@ rb_select_devpoll(long delay) } return RB_OK; } - while (0); + while(0); /* XXX Get here, we broke! */ return 0; } #else /* /dev/poll not supported */ -int +int rb_init_netio_devpoll(void) { return ENOSYS; @@ -301,4 +296,3 @@ rb_setup_fd_devpoll(rb_fde_t *F) return -1; } #endif -