int restore_dns_fds(dns_state dctx __attribute__ ((unused)),const evhandler *evh){ #ifndef LIBTORQUE_WITHOUT_ADNS int nfds,to = 0,r,ret = 0; struct pollfd pfds[4]; // FIXME factor this out, share with load_dns_fds() nfds = sizeof(pfds) / sizeof(*pfds); if( (r = adns_beforepoll(dctx,pfds,&nfds,&to,NULL)) ){ if(r == ERANGE){ // FIXME go back with more space } return -1; } while(nfds--){ int flags = 0; flags |= pfds[nfds].events & (POLLIN | POLLPRI) ? EVREAD : 0; flags |= pfds[nfds].events & POLLOUT ? EVWRITE : 0; ret |= restorefd(evh,pfds[nfds].fd,flags); } return ret; #else if(!evh){ return -1; } return 0; #endif }
int adns_wait_poll(adns_state ads, adns_query *query_io, adns_answer **answer_r, void **context_r) { int r, nfds, to; struct pollfd fds[MAX_POLLFDS]; adns__consistency(ads,0,cc_entex); for (;;) { r= adns__internal_check(ads,query_io,answer_r,context_r); if (r != EAGAIN) goto xit; nfds= MAX_POLLFDS; to= -1; adns_beforepoll(ads,fds,&nfds,&to,0); r= poll(fds,nfds,to); if (r == -1) { if (errno == EINTR) { if (ads->iflags & adns_if_eintr) { r= EINTR; goto xit; } } else { adns__diag(ads,-1,0,"poll failed in wait: %s",strerror(errno)); adns_globalsystemfailure(ads); } } else { assert(r >= 0); adns_afterpoll(ads,fds,nfds,0); } } xit: adns__consistency(ads,0,cc_entex); return r; }
int load_dns_fds(torque_ctx *ctx,dns_state *dctx,const evqueue *evq){ #ifndef LIBTORQUE_WITHOUT_ADNS struct pollfd pfds[4]; int nfds,to = 0,r; nfds = sizeof(pfds) / sizeof(*pfds); if( (r = adns_beforepoll(ctx->evq.dnsctx,pfds,&nfds,&to,NULL)) ){ if(r == ERANGE){ // FIXME go back with more space } return -1; } while(nfds--){ if(add_fd_to_evhandler(ctx,evq,pfds[nfds].fd, pfds[nfds].events & (POLLIN | POLLPRI) ? adns_rx_callback : NULL, pfds[nfds].events & POLLOUT ? adns_tx_callback : NULL,*dctx, EVONESHOT)){ // FIXME return -1; } } #else if(!ctx || !evq || !dctx){ return -1; } #endif return 0; }