- for (qi=0; qi<qc; qi++) {
- fdom_split(fdomlist[qi],&domain,&qflags);
-
- for (ti=0; ti<tc; ti++) {
- qu= qus[qi*tc+ti];
- if (!qu) continue;
-
- r= adns_wait(ads,&qu,&ans,0);
- if (r) failure("wait",r);
+ for (;;) {
+ for (qi=0; qi<qc; qi++) {
+ for (ti=0; ti<tc; ti++) {
+ mc= &mcs[qi*tc+ti];
+ mc->found= 0;
+ }
+ }
+ for (adns_forallqueries_begin(ads);
+ (qu= adns_forallqueries_next(ads,&mcr));
+ ) {
+ mc= mcr;
+ assert(qu == mc->qu);
+ assert(!mc->doneyet);
+ mc->found= 1;
+ }
+ mcw= 0;
+ for (qi=0; qi<qc; qi++) {
+ for (ti=0; ti<tc; ti++) {
+ mc= &mcs[qi*tc+ti];
+ if (mc->doneyet) continue;
+ assert(mc->found);
+ if (!mcw) mcw= mc;
+ }
+ }
+ if (!mcw) break;
+
+ mc= mcw;
+ qu= mcw->qu;
+
+ if (strchr(owninitflags,'p')) {
+ for (;;) {
+ r= adns_check(ads,&qu,&ans,&mcr);
+ if (r != EWOULDBLOCK) break;
+ for (;;) {
+ npollfds= npollfdsavail;
+ timeout= -1;
+ r= adns_beforepoll(ads, pollfds, &npollfds, &timeout, 0);
+ if (r != ERANGE) break;
+ pollfds= realloc(pollfds,sizeof(*pollfds)*npollfds);
+ if (!pollfds) failure_errno("realloc pollfds",errno);
+ npollfdsavail= npollfds;
+ }
+ if (r) failure_errno("beforepoll",r);
+ r= poll(pollfds,npollfds,timeout);
+ if (r == -1) failure_errno("poll",errno);
+ adns_afterpoll(ads,pollfds, r?npollfds:0, 0);
+ }
+ } else {
+ r= adns_wait(ads,&qu,&ans,&mcr);
+ }
+ if (r) failure_errno("wait/check",r);
+
+ assert(mcr==mc);
+ fdom_split(mc->fdom,&domain,&qflags,ownflags,sizeof(ownflags));