chiark / gitweb /
+ * Understand and sort of check OpenBSD `lookup' resolv.conf directive.
[adns.git] / src / query.c
index a720f2058226990a92b596bb1f0dc5852da80d36..2bb52361720842c151ca43e73b2a2ae1c4e5ddb1 100644 (file)
@@ -10,7 +10,7 @@
  *
  *  It is part of adns, which is
  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- *    Copyright (C) 1999 Tony Finch <dot@dotat.at>
+ *    Copyright (C) 1999-2000 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
@@ -157,8 +157,8 @@ void adns__search_next(adns_state ads, adns_query qu, struct timeval now) {
   } else {
     if (qu->search_pos >= ads->nsearchlist) {
       if (qu->search_doneabs) {
+       qu->search_vb.used= qu->search_origlen;
        stat= adns_s_nxdomain; goto x_fail;
-       return;
       } else {
        nextentry= 0;
        qu->search_doneabs= 1;
@@ -171,9 +171,8 @@ void adns__search_next(adns_state ads, adns_query qu, struct timeval now) {
   qu->search_vb.used= qu->search_origlen;
   if (nextentry) {
     if (!adns__vbuf_append(&qu->search_vb,".",1) ||
-       !adns__vbuf_appendstr(&qu->search_vb,nextentry)) {
-      stat= adns_s_nomemory; goto x_fail;
-    }
+       !adns__vbuf_appendstr(&qu->search_vb,nextentry))
+      goto x_nomemory;
   }
 
   free(qu->query_dgram);
@@ -181,7 +180,9 @@ void adns__search_next(adns_state ads, adns_query qu, struct timeval now) {
 
   query_simple(ads,qu, qu->search_vb.buf, qu->search_vb.used, qu->typei, qu->flags, now);
   return;
-  
+
+x_nomemory:
+  stat= adns_s_nomemory;
 x_fail:
   adns__query_fail(qu,stat);
 }
@@ -190,6 +191,8 @@ static int save_owner(adns_query qu, const char *owner, int ol) {
   /* Returns 1 if OK, otherwise there was no memory. */
   adns_answer *ans;
 
+  if (!(qu->flags & adns_qf_owner)) return 1;
+
   ans= qu->answer;
   assert(!ans->owner);
 
@@ -374,6 +377,7 @@ void adns__transfer_interim(adns_query from, adns_query to, void *block, size_t
   LIST_UNLINK(from->allocations,an);
   LIST_LINK_TAIL(to->allocations,an);
 
+  sz= MEM_ROUND(sz);
   from->interim_allocd -= sz;
   to->interim_allocd += sz;
 
@@ -422,6 +426,7 @@ static void free_query_allocs(adns_query qu) {
   adns__vbuf_free(&qu->vb);
   adns__vbuf_free(&qu->search_vb);
   free(qu->query_dgram);
+  qu->query_dgram= 0;
 }
 
 void adns_cancel(adns_query qu) {
@@ -506,8 +511,7 @@ void adns__query_done(adns_query qu) {
   qu->id= -1;
   ans= qu->answer;
 
-  if (qu->flags & adns_qf_owner && qu->flags & adns_qf_search &&
-      ans->status != adns_s_nomemory) {
+  if (qu->flags & adns_qf_search && ans->status != adns_s_nomemory) {
     if (!save_owner(qu, qu->search_vb.buf, qu->search_vb.used)) {
       adns__query_fail(qu,adns_s_nomemory);
       return;