* - simple test program, not part of the library
*/
/*
- * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+ * 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
# define OUTPUTSTREAM stdout
#endif
+struct myctx {
+ adns_query qu;
+ int doneyet, found;
+ const char *fdom;
+};
+
+static struct myctx *mcs;
+static adns_state ads;
+static adns_rrtype *types_a;
+
+static void quitnow(int rc) NONRETURNING;
+static void quitnow(int rc) {
+ free(mcs);
+ free(types_a);
+ if (ads) adns_finish(ads);
+
+ exit(rc);
+}
+
#ifndef HAVE_POLL
#undef poll
int poll(struct pollfd *ufds, int nfds, int timeout) {
fputs("poll(2) not supported on this system\n",stderr);
- exit(5);
+ quitnow(5);
}
#define adns_beforepoll(a,b,c,d,e) 0
#define adns_afterpoll(a,b,c,d) 0
static void failure_status(const char *what, adns_status st) NONRETURNING;
static void failure_status(const char *what, adns_status st) {
fprintf(stderr,"adns failure: %s: %s\n",what,adns_strerror(st));
- exit(2);
+ quitnow(2);
}
static void failure_errno(const char *what, int errnoval) NONRETURNING;
static void failure_errno(const char *what, int errnoval) {
fprintf(stderr,"adns failure: %s: errno=%d\n",what,errnoval);
- exit(2);
+ quitnow(2);
}
static void usageerr(const char *why) NONRETURNING;
" 4 usage error\n"
" 5 operation not supported on this system\n",
why);
- exit(4);
+ quitnow(4);
}
static const adns_rrtype defaulttypes[]= {
if (*ep == ',' && strchr(ep,'/')) {
ep++;
while (*ep != '/') {
- if (--ownflags_l <= 0) { fputs("too many flags\n",stderr); exit(3); }
+ if (--ownflags_l <= 0) { fputs("too many flags\n",stderr); quitnow(3); }
*ownflags++= *ep++;
}
}
}
int main(int argc, char *const *argv) {
- struct myctx {
- adns_query qu;
- int doneyet, found;
- const char *fdom;
- };
-
- adns_state ads;
adns_query qu;
- struct myctx *mcs, *mc, *mcw;
+ struct myctx *mc, *mcw;
void *mcr;
adns_answer *ans;
const char *initstring, *rrtn, *fmtn;
const char *const *fdomlist, *domain;
char *show, *cp;
- int len, i, qc, qi, tc, ti, ch, qflags, initflagsnum, npollfds, npollfdsavail, timeout;
- struct pollfd *pollfds;
+ int len, i, qc, qi, tc, ti, ch, qflags, initflagsnum;
adns_status ri;
int r;
const adns_rrtype *types;
struct timeval now;
- adns_rrtype *types_a;
char ownflags[10];
char *ep;
const char *initflags, *owninitflags;
for (cp= argv[1]+1, tc=1; (ch= *cp); cp++)
if (ch==',') tc++;
types_a= malloc(sizeof(*types_a)*(tc+1));
- if (!types_a) { perror("malloc types"); exit(3); }
+ if (!types_a) { perror("malloc types"); quitnow(3); }
for (cp= argv[1]+1, ti=0; ti<tc; ti++) {
types_a[ti]= strtoul(cp,&cp,10);
if ((ch= *cp)) {
cp++;
}
}
- *cp++= adns_r_none;
+ types_a[ti]= adns_r_none;
types= types_a;
argv++;
} else {
+ types_a= 0;
types= defaulttypes;
}
for (qc=0; fdomlist[qc]; qc++);
for (tc=0; types[tc] != adns_r_none; tc++);
- mcs= malloc(sizeof(*mcs)*qc*tc);
- if (!mcs) { perror("malloc mcs"); exit(3); }
+ mcs= malloc(tc ? sizeof(*mcs)*qc*tc : 1);
+ if (!mcs) { perror("malloc mcs"); quitnow(3); }
if (initstring) {
r= adns_init_strcfg(&ads,
- (adns_if_debug|adns_if_noautosys)^initflagsnum,
+ (adns_if_debug|adns_if_noautosys|adns_if_checkc_freq)
+ ^initflagsnum,
stdout,initstring);
} else {
r= adns_init(&ads,
}
if (r) failure_errno("init",r);
- npollfdsavail= 0;
- pollfds= 0;
-
for (qi=0; qi<qc; qi++) {
fdom_split(fdomlist[qi],&domain,&qflags,ownflags,sizeof(ownflags));
if (!consistsof(ownflags,"a")) usageerr("unknown ownqueryflag");
}
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);
- }
+ r= adns_wait_poll(ads,&qu,&ans,&mcr);
} else {
r= adns_wait(ads,&qu,&ans,&mcr);
}
fdom_split(mc->fdom,&domain,&qflags,ownflags,sizeof(ownflags));
- if (gettimeofday(&now,0)) { perror("gettimeofday"); exit(3); }
+ if (gettimeofday(&now,0)) { perror("gettimeofday"); quitnow(3); }
ri= adns_rr_info(ans->type, &rrtn,&fmtn,&len, 0,0);
fprintf(stdout, "%s flags %d type ",domain,qflags);
mc->doneyet= 1;
}
- free(mcs);
- adns_finish(ads);
-
- exit(0);
+ quitnow(0);
}