X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=src%2Fsubmit.c;h=d29a14044911b27b7cdadf81606bc8acc0abed0d;hp=f2fd72c3f6fd7bf52919f3edc0822da407c7e1be;hb=0ba0614a998909d8b4f51988d7a8af3ba369a5d9;hpb=4bec51a44bf61bca32e7b947f20b1e7d0f971b94;ds=sidebyside diff --git a/src/submit.c b/src/submit.c index f2fd72c..d29a140 100644 --- a/src/submit.c +++ b/src/submit.c @@ -1,39 +1,48 @@ /**/ -#include "adns-internal.h" +#include +#include +#include + +#include + +#include "internal.h" static adns_query allocquery(adns_state ads, const char *owner, int ol, - int qml, int id, adns_rrtype type, - adns_queryflags flags, void *context) { + int id, const typeinfo *typei, + adns_queryflags flags, const qcontext *ctx) { + /* Query message used is the one assembled in ads->rqbuf */ adns_query qu; - unsigned char *qm; - - qu= malloc(sizeof(*qu)+ol+1+qml); if (!qu) return 0; + + qu= malloc(sizeof(*qu)+ol+1+ads->rqbuf.used); if (!qu) return 0; + qu->state= query_udp; qu->next= qu->back= qu->parent= 0; - qu->children.head= qu->children.tail= 0; + LIST_INIT(qu->children); qu->siblings.next= qu->siblings.back= 0; + qu->typei= typei; + adns__vbuf_init(&qu->answer); qu->id= id; - qu->type= type; - qu->answer= 0; qu->flags= flags; - qu->context= context; qu->udpretries= 0; - qu->sentudp= qu->senttcp= 0; - qu->nextserver= 0; + qu->udpnextserver= 0; + qu->udpsent= qu->tcpfailed= 0; + timerclear(&qu->timeout); + memcpy(&qu->context,ctx,sizeof(qu->context)); memcpy(qu->owner,owner,ol); qu->owner[ol]= 0; - qu->querymsg= qm= qu->owner+ol+1; - memcpy(qm,ads->qbuf,qml); - qu->querylen= qml; + qu->querymsg= qu->owner+ol+1; + memcpy(qu->owner+ol+1,ads->rqbuf.buf,ads->rqbuf.used); + qu->querylen= ads->rqbuf.used; return qu; } -static int failsubmit(adns_state ads, void *context, adns_query *query_r, +static int failsubmit(adns_state ads, const qcontext *ctx, adns_query *query_r, adns_rrtype type, adns_queryflags flags, int id, adns_status stat) { adns_query qu; - qu= allocquery(ads,0,0,0,id,type,flags,context); if (!qu) return errno; - query_fail(ads,qu,stat); + ads->rqbuf.used= 0; + qu= allocquery(ads,0,0,id,type,flags,ctx); if (!qu) return errno; + adns__query_fail(ads,qu,stat); *query_r= qu; return 0; } @@ -46,25 +55,30 @@ int adns_submit(adns_state ads, adns_query *query_r) { adns_query qu; adns_status stat; - int ol, id, qml; + int ol, id, r; + qcontext ctx; + struct timeval now; + const typeinfo typei; + ctx.ext= context; id= ads->nextid++; + r= gettimeofday(&now,0); if (r) return errno; + + typei= findtype(type); + if (!typei) return failsubmit(ads,context,query_r,0,flags,id,adns_s_notimplemented); + ol= strlen(owner); if (ol<=1 || ol>MAXDNAME+1) - return failsubmit(ads,context,query_r,type,flags,id,adns_s_invaliddomain); - if (owner[ol-1]=='.' && owner[ol-2]!='\\') { flags &= ~adns_f_search; ol--; } + return failsubmit(ads,context,query_r,0,flags,id,adns_s_invaliddomain); + if (owner[ol-1]=='.' && owner[ol-2]!='\\') { flags &= ~adns_qf_search; ol--; } - stat= adns__mkquery(ads,owner,ol,id,type,flags,&qml); + stat= adns__mkquery(ads,owner,ol,id,type,flags); if (stat) return failsubmit(ads,context,query_r,type,flags,id,stat); - - qu= allocquery(ads,owner,ol,qml,id,type,flags,context); if (!qu) return errno; - if (qu->flags & adns_f_usevc) qu->udpretries= -1; - LIST_LINK_TAIL(ads->tosend,qu); - - r= gettimeofday(&now,0); if (r) return; - quproc_tosend(ads,qu,now); - autosys(ads,now); + + qu= allocquery(ads,owner,ol,id,typei,flags,&ctx); if (!qu) return errno; + adns__query_udp(ads,qu,now); + adns__autosys(ads,now); *query_r= qu; return 0; @@ -89,5 +103,5 @@ int adns_synchronous(adns_state ads, } void adns_cancel(adns_state ads, adns_query query) { - abort(); /* FIXME */ + abort(); /* fixme */ }