* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
+#include "adnshost.h"
void sysfail(const char *what, int errnoval) {
fprintf(stderr,"adnshost failed: %s: %s\n",what,strerror(errnoval));
exit(10);
}
+void usageerr(const char *fmt, ...) {
+ va_list al;
+ fputs("adnshost usage error: ",stderr);
+ va_start(al,fmt);
+ vfprintf(stderr,fmt,al);
+ va_end(al);
+ putc('\n',stderr);
+ exit(11);
+}
+
+void outerr(void) {
+ sysfail("write to stdout",errno);
+}
+
static void domain_do_arg(const char *domain) {
if (ov_pipe) usageerr("-f/--pipe not consistent with domains on command line");
- domain_do(arg);
+ ensure_adns_init();
+ query_do(domain);
}
-static void of_type(const struct optinfo *oi, const char *arg) { abort(); }
+void *xmalloc(size_t sz) {
+ void *p;
+
+ p= malloc(sz); if (!p) sysfail("malloc",sz);
+ return p;
+}
+
+char *xstrsave(const char *str) {
+ char *p;
+
+ p= xmalloc(strlen(str)+1);
+ strcpy(p,str);
+ return p;
+}
+
+void of_type(const struct optioninfo *oi, const char *arg) { abort(); }
+
+int rcode;
+
+void setnonblock(int fd, int nonblock) { }
+
+static void read_query(void) { abort(); }
int main(int argc, const char *const *argv) {
const char *arg;
- const
+ const struct optioninfo *oip;
+ struct timeval *tv, tvbuf;
+ adns_query qu;
+ void *qun_v;
+ adns_answer *answer;
+ int r, maxfd, invert;
+ fd_set readfds, writefds, exceptfds;
- while (arg= *++argv) {
- if (arg[0] != '-') {
- if (arg[1] == '-') {
- oip= opt_findl(arg+2);
+ while ((arg= *++argv)) {
+ if (arg[0] == '-' || arg[0] == '+') {
+ if (arg[0] == '-' && arg[1] == '-') {
+ if (!strncmp(arg,"--no-",5)) {
+ invert= 1;
+ oip= opt_findl(arg+5);
+ } else {
+ invert= 0;
+ oip= opt_findl(arg+2);
+ }
if (oip->type == ot_funcarg) {
arg= *++argv;
if (!arg) usageerr("option --%s requires a value argument",oip->lopt);
} else {
arg= 0;
}
- opt_do(oip,arg);
- } else if (arg[1] == 0) {
+ opt_do(oip,arg,invert);
+ } else if (arg[0] == '-' && arg[1] == 0) {
arg= *++argv;
if (!arg) usageerr("option `-' must be followed by a domain");
domain_do_arg(arg);
} else { /* arg[1] != '-', != '\0' */
+ invert= (arg[0] == '+');
++arg;
while (*arg) {
oip= opt_finds(&arg);
arg= *++argv;
if (!arg) usageerr("option -%s requires a value argument",oip->sopt);
}
+ opt_do(oip,arg,invert);
arg= "";
} else {
- arg= 0;
+ opt_do(oip,0,invert);
}
- opt_do(oip,arg);
}
}
} else { /* arg[0] != '-' */
domain_do_arg(arg);
}
}
- abort();
+
+ if (!ov_pipe && !ads) usageerr("no domains given, and -f/--pipe not used; try --help");
+
+ for (;;) {
+ for (;;) {
+ qu= ov_asynch ? 0 : outstanding.head ? outstanding.head->qu : 0;
+ r= adns_check(ads,&qu,&answer,&qun_v);
+ if (r == EAGAIN) break;
+ if (r == ESRCH) { if (!ov_pipe) goto x_quit; else break; }
+ assert(!r);
+ query_done(qun_v,answer);
+ }
+ maxfd= 0;
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ FD_ZERO(&exceptfds);
+ if (ov_pipe) {
+ maxfd= 1;
+ FD_SET(0,&readfds);
+ }
+ tv= 0;
+ adns_beforeselect(ads, &maxfd, &readfds,&writefds,&exceptfds, &tv,&tvbuf,0);
+ r= select(maxfd, &readfds,&writefds,&exceptfds, tv);
+ if (r == -1) {
+ if (errno == EINTR) continue;
+ sysfail("select",errno);
+ }
+ adns_afterselect(ads, maxfd, &readfds,&writefds,&exceptfds, 0);
+ if (ov_pipe && FD_ISSET(0,&readfds)) read_query();
+ }
+x_quit:
+ if (fclose(stdout)) outerr();
+ exit(rcode);
}