not implemented things -> assert !implemented
[adns] / client / adh-main.c
index 7c43d1e..289f0d4 100644 (file)
@@ -43,9 +43,14 @@ void usageerr(const char *fmt, ...) {
   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(domain);
+  ensure_adns_init();
+  query_do(domain);
 }
 
 void *xmalloc(size_t sz) {
@@ -63,28 +68,47 @@ char *xstrsave(const char *str) {
   return p;
 }
 
-void of_type(const struct optioninfo *oi, const char *arg) { abort(); }
+void of_type(const struct optioninfo *oi, const char *arg) { assert(!"implemented"); }
+
+int rcode;
+
+void setnonblock(int fd, int nonblock) { }
+
+static void read_query(void) { assert(!"implemented"); }
 
 int main(int argc, const char *const *argv) {
   const char *arg;
   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);
+    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);
@@ -93,16 +117,48 @@ int main(int argc, const char *const *argv) {
              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);
 }