if (!tv_io) return;
rbuf= *tv_io;
- if (!rbuf) { *tvbuf= maxto; *tv_io= tvbuf; return; }
- if (timercmp(rbuf,&maxto,>)) *rbuf= maxto;
+ if (!rbuf) {
+ *tvbuf= maxto; *tv_io= tvbuf;
+ } else {
+ if (timercmp(rbuf,&maxto,>)) *rbuf= maxto;
+ }
+fprintf(stderr,"inter_maxto maxto=%ld.%06ld result=%ld.%06ld\n",
+ maxto.tv_sec,maxto.tv_usec,(**tv_io).tv_sec,(**tv_io).tv_usec);
}
static void inter_maxtoabs(struct timeval **tv_io, struct timeval *tvbuf,
struct timeval now, struct timeval maxtime) {
ldiv_t dr;
+fprintf(stderr,"inter_maxtoabs now=%ld.%06ld maxtime=%ld.%06ld\n",
+ now.tv_sec,now.tv_usec,maxtime.tv_sec,maxtime.tv_usec);
if (!tv_io) return;
- maxtime.tv_sec -= (now.tv_sec-1);
- maxtime.tv_usec += (1000-now.tv_usec);
- dr= ldiv(maxtime.tv_usec,1000);
+ maxtime.tv_sec -= (now.tv_sec+2);
+ maxtime.tv_usec -= (now.tv_usec-2000000);
+ dr= ldiv(maxtime.tv_usec,1000000);
maxtime.tv_sec += dr.quot;
- maxtime.tv_usec -= dr.rem;
+ maxtime.tv_usec -= dr.quot*1000000;
+ if (maxtime.tv_sec<0) timerclear(&maxtime);
inter_maxto(tv_io,tvbuf,maxtime);
}
struct timeval tvto_lr;
int r;
- r= gettimeofday(&now,0);
+fprintf(stderr,"adns_interest\n");
+
+r= gettimeofday(&now,0);
if (r) {
adns__warn(ads,-1,"gettimeofday failed - will sleep for a bit: %s",strerror(errno));
timerclear(&tvto_lr); timevaladd(&tvto_lr,LOCALRESOURCEMS);
for (;;) {
r= internal_check(ads,query_io,answer_r,context_r);
- if (r && r != EWOULDBLOCK) return r;
+ if (r != EWOULDBLOCK) return r;
maxfd= 0; tvp= 0;
FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds);
adns_interest(ads,&maxfd,&readfds,&writefds,&exceptfds,&tvp,&tvbuf);
/* Configuration and constants */
#define MAXSERVERS 5
-#define MAXUDPRETRIES 15
+#define MAXUDPRETRIES /*15*/5
#define UDPRETRYMS 2000
#define TCPMS 30000
#define LOCALRESOURCEMS 20
struct timeval tmp;
assert(ms>=0);
tmp= *tv_io;
- tmp.tv_usec += (ms%1000)*1000;
+ tmp.tv_usec += (ms%1000)*1000000;
tmp.tv_sec += ms/1000;
- if (tmp.tv_usec >= 1000) { tmp.tv_sec++; tmp.tv_usec -= 1000; }
+ if (tmp.tv_usec >= 1000000) { tmp.tv_sec++; tmp.tv_usec -= 1000; }
*tv_io= tmp;
}
#define MKQUERY_ADDB(b) *rqp++= (b)
#define MKQUERY_ADDW(w) (MKQUERY_ADDB(((w)>>8)&0x0ff), MKQUERY_ADDB((w)&0x0ff))
- if (!adns__vbuf_ensure(&ads->rqbuf,12+strlen(owner)+3)) return adns_s_nolocalmem;
+ if (!adns__vbuf_ensure(&ads->rqbuf,12+strlen(owner)+1+5)) return adns_s_nolocalmem;
rqp= ads->rqbuf.buf;
MKQUERY_ADDW(id);
MKQUERY_ADDW(1); /* QCLASS=IN */
ads->rqbuf.used= rqp - ads->rqbuf.buf;
- assert(ads->rqbuf.used < ads->rqbuf.avail);
+ assert(ads->rqbuf.used <= ads->rqbuf.avail);
return adns_s_ok;
}
static void ccf_search(adns_state ads, const char *fn, int lno, const char *buf) {
if (!buf) return;
- adns__diag(ads,-1,"warning - `search' ignored FIXME");
+ adns__diag(ads,-1,"warning - `search' ignored fixme");
}
static void ccf_sortlist(adns_state ads, const char *fn, int lno, const char *buf) {
- adns__diag(ads,-1,"warning - `sortlist' ignored FIXME");
+ adns__diag(ads,-1,"warning - `sortlist' ignored fixme");
}
static void ccf_options(adns_state ads, const char *fn, int lno, const char *buf) {
if (!buf) return;
- adns__diag(ads,-1,"warning - `options' ignored FIXME");
+ adns__diag(ads,-1,"warning - `options' ignored fixme");
}
static void ccf_clearnss(adns_state ads, const char *fn, int lno, const char *buf) {
ads->udpsocket= socket(AF_INET,SOCK_DGRAM,proto->p_proto);
if (ads->udpsocket<0) { r= errno; goto x_free; }
- /*fixme: nonblock */
+ r= adns__setnonblock(ads,ads->udpsocket);
+ if (r) { r= errno; goto x_closeudp; }
*ads_r= ads;
return 0;
+ x_closeudp:
+ close(ads->udpsocket);
x_free:
free(ads);
return r;
}
int adns_finish(adns_state ads) {
- abort(); /* FIXME */
+ abort(); /* fixme */
}
stat= adns__mkquery(ads,owner,ol,id,type,flags);
if (stat) return failsubmit(ads,context,query_r,type,flags,id,stat);
- qu= allocquery(ads,owner,ol,id,type,flags,context); if (!qu) return errno;
+ qu= allocquery(ads,owner,ol,id,type,flags,&ctx); if (!qu) return errno;
adns__query_udp(ads,qu,now);
adns__autosys(ads,now);
}
void adns_cancel(adns_state ads, adns_query query) {
- abort(); /* FIXME */
+ abort(); /* fixme */
}