chiark / gitweb /
Update wishlist items and add purpose comment to adns.h.
[adns.git] / src / query.c
index e90d45c85955f497fac368c5e703671aec5a60f2..545feec27414567527ef56cae967a72d6bffd568 100644 (file)
@@ -5,7 +5,7 @@
  * - query submission and cancellation (user-visible and internal)
  */
 /*
- *  This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson
+ *  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
  *  
  *  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
@@ -78,7 +78,7 @@ int adns__internal_submit(adns_state ads, adns_query *query_r,
   if (qumsg_vb->used) {
     qu->query_dgram= malloc(qumsg_vb->used);
     if (!qu->query_dgram) {
-      adns__query_fail(qu,adns_s_nolocalmem);
+      adns__query_fail(qu,adns_s_nomemory);
       return adns_s_ok;
     }
     memcpy(qu->query_dgram,qumsg_vb->buf,qumsg_vb->used);
@@ -101,7 +101,7 @@ int adns__internal_submit(adns_state ads, adns_query *query_r,
   free(qu);
  x_nomemory:
   adns__vbuf_free(qumsg_vb);
-  return adns_s_nolocalmem;
+  return adns_s_nomemory;
 }
 
 int adns_submit(adns_state ads,
@@ -118,7 +118,7 @@ int adns_submit(adns_state ads,
   struct timeval now;
 
   typei= adns__findtype(type);
-  if (!typei) return adns_s_notimplemented;
+  if (!typei) return adns_s_unknownrrtype;
   
   ctx.ext= context;
   ctx.callback= 0;
@@ -130,7 +130,7 @@ int adns_submit(adns_state ads,
   adns__vbuf_init(&vb);
 
   ol= strlen(owner);
-  if (ol<=1 || ol>DNS_MAXDOMAIN+1) { stat= adns_s_domaintoolong; goto xit; }
+  if (ol<=1 || ol>DNS_MAXDOMAIN+1) { stat= adns_s_querydomaintoolong; goto xit; }
                                 
   if (owner[ol-1]=='.' && owner[ol-2]!='\\') { flags &= ~adns_qf_search; ol--; }
 
@@ -210,9 +210,19 @@ void *adns__alloc_final(adns_query qu, size_t sz) {
   return rp;
 }
 
+static void cancel_children(adns_query qu) {
+  adns_query cqu, ncqu;
+
+  for (cqu= qu->children.head; cqu; cqu= ncqu) {
+    ncqu= cqu->siblings.next;
+    adns_cancel(cqu);
+  }
+  LIST_INIT(qu->children);
+}
+
 void adns__reset_cnameonly(adns_query qu) {
-  /* fixme: cancel children */
   assert(!qu->final_allocspace);
+  cancel_children(qu);
   qu->answer->nrrs= 0;
   qu->answer->rrs= 0;
   qu->interim_allocd= qu->answer->cname ? MEM_ROUND(strlen(qu->answer->cname)+1) : 0;
@@ -220,12 +230,8 @@ void adns__reset_cnameonly(adns_query qu) {
 
 static void free_query_allocs(adns_query qu) {
   allocnode *an, *ann;
-  adns_query cqu, ncqu;
 
-  for (cqu= qu->children.head; cqu; cqu= ncqu) {
-    ncqu= cqu->siblings.next;
-    adns_cancel(cqu);
-  }
+  cancel_children(qu);
   for (an= qu->allocations.head; an; an= ann) { ann= an->next; free(an); }
   adns__vbuf_free(&qu->vb);
 }
@@ -275,7 +281,7 @@ static void makefinal_query(adns_query qu) {
   return;
   
  x_nomem:
-  qu->answer->status= adns_s_nolocalmem;
+  qu->answer->status= adns_s_nomemory;
   qu->answer->cname= 0;
   adns__reset_cnameonly(qu);
   free_query_allocs(qu);
@@ -290,11 +296,13 @@ void adns__query_done(adns_query qu) {
 
   if (ans->nrrs && qu->typei->diff_needswap) {
     if (!adns__vbuf_ensure(&qu->vb,qu->typei->rrsz)) {
-      adns__query_fail(qu,adns_s_nolocalmem);
+      adns__query_fail(qu,adns_s_nomemory);
       return;
     }
     adns__isort(ans->rrs.bytes, ans->nrrs, ans->rrsz,
-               qu->vb.buf, qu->typei->diff_needswap);
+               qu->vb.buf,
+               (int(*)(void*, const void*, const void*))qu->typei->diff_needswap,
+               qu->ads);
   }
 
   parent= qu->parent;