示例#1
0
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
}
示例#2
0
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;
}
示例#3
0
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;
}