diff options
Diffstat (limited to 'adns-0.6/src/poll.c')
-rw-r--r-- | adns-0.6/src/poll.c | 131 |
1 files changed, 0 insertions, 131 deletions
diff --git a/adns-0.6/src/poll.c b/adns-0.6/src/poll.c deleted file mode 100644 index 45dc437..0000000 --- a/adns-0.6/src/poll.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * poll.c - * - wrappers for poll(2) - */ -/* - * This file is - * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk> - * - * It is part of adns, which is - * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk> - * Copyright (C) 1999 Tony Finch <dot@dotat.at> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <limits.h> -#include <string.h> - -#include "internal.h" - -#ifdef HAVE_POLL - -int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io, int *timeout_io, - const struct timeval *now) { - 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; -} - -void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds, - const struct timeval *now) { - struct timeval tv_buf; - - adns__consistency(ads,0,cc_entex); - adns__must_gettimeofday(ads,&now,&tv_buf); - if (now) { - adns__timeouts(ads, 1, 0,0, *now); - adns__fdevents(ads, fds,nfds, 0,0,0,0, *now,0); - } - adns__consistency(ads,0,cc_entex); -} - -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; -} - -#endif |