int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io, int *timeout_io, const struct timeval *now) { #ifdef HAVE_POLL struct timeval tv_nowbuf, tv_tobuf, *tv_to; int space, found, timeout_ms, r; struct pollfd fds_tmp[MAX_POLLFDS]; adns__consistency(ads,0,cc_entex); if (timeout_io) { adns__must_gettimeofday(ads,&now,&tv_nowbuf); if (!now) { *nfds_io= 0; r= 0; goto xit; } timeout_ms= *timeout_io; if (timeout_ms == -1) { tv_to= 0; } else { tv_tobuf.tv_sec= timeout_ms / 1000; tv_tobuf.tv_usec= (timeout_ms % 1000)*1000; tv_to= &tv_tobuf; } adns__timeouts(ads, 0, &tv_to,&tv_tobuf, *now); if (tv_to) { assert(tv_to == &tv_tobuf); timeout_ms= (tv_tobuf.tv_usec+999)/1000; assert(tv_tobuf.tv_sec < (INT_MAX-timeout_ms)/1000); timeout_ms += tv_tobuf.tv_sec*1000; } else { timeout_ms= -1; } *timeout_io= timeout_ms; } space= *nfds_io; if (space >= MAX_POLLFDS) { found= adns__pollfds(ads,fds); *nfds_io= found; } else { found= adns__pollfds(ads,fds_tmp); *nfds_io= found; if (space < found) { r= ERANGE; goto xit; } memcpy(fds,fds_tmp,sizeof(struct pollfd)*found); } r= 0; xit: adns__consistency(ads,0,cc_entex); return r; #else errno = ENOSYS; return -1; #endif }
/* void dns_select(void) * Input: None. * Output: None * Side effects: Re-register ADNS fds with the fd system. Also calls the * callbacks into core ircd. */ void dns_select(void) { struct adns_pollfd pollfds[MAXFD_POLL]; int npollfds, i, fd; adns__consistency(dns_state, 0, cc_entex); npollfds = adns__pollfds(dns_state, pollfds); for (i = 0; i < npollfds; i++) { fd = pollfds[i].fd; if(pollfds[i].events & ADNS_POLLIN) comm_setselect(fd, FDLIST_SERVER, COMM_SELECT_READ, dns_readable, NULL); if(pollfds[i].events & ADNS_POLLOUT) comm_setselect(fd, FDLIST_SERVICE, COMM_SELECT_WRITE, dns_writeable, NULL); } }
/* void dns_select(void) * Input: None. * Output: None * Side effects: Re-register ADNS fds with the fd system. Also calls the * callbacks into core ircd. */ void dns_select(void) { struct adns_pollfd pollfds[MAXFD_POLL]; int npollfds, i, fd; adns__consistency(dns_state,0,cc_entex); npollfds = adns__pollfds(dns_state, pollfds); for(i = 0; i < npollfds; i++) { fd = pollfds[i].fd; if (pollfds[i].events & ADNS_POLLIN) comm_setselect(fd, FDLIST_SERVER, COMM_SELECT_READ, dns_readable, NULL, 0); if (pollfds[i].events & ADNS_POLLOUT) comm_setselect(fd, FDLIST_SERVICE, COMM_SELECT_WRITE, dns_writeable, NULL, 0); } /* Call our callbacks, now that they may have some relevant data... */ /* *dns_do_callbacks(); */ }