- MKQUERY_ADDW(id);
- MKQUERY_ADDB(0x01); /* QR=Q(0), OPCODE=QUERY(0000), !AA, !TC, RD */
- MKQUERY_ADDB(0x00); /* !RA, Z=000, RCODE=NOERROR(0000) */
- MKQUERY_ADDW(1); /* QDCOUNT=1 */
- MKQUERY_ADDW(0); /* ANCOUNT=0 */
- MKQUERY_ADDW(0); /* NSCOUNT=0 */
- MKQUERY_ADDW(0); /* ARCOUNT=0 */
- p= owner; pe= owner+ol;
- nlabs= 0;
- if (!*p) return adns_s_invaliddomain;
- do {
- ll= 0;
- while (p!=pe && (c= *p++)!='.') {
- if (c=='\\') {
- if (!(flags & adns_f_anyquote)) return adns_s_invaliddomain;
- if (ctype_digit(p[0])) {
- if (ctype_digit(p[1]) && ctype_digit(p[2])) {
- c= (*p++ - '0')*100 + (*p++ - '0')*10 + (*p++ - '0');
- if (c >= 256) return adns_s_invaliddomain;
- } else {
- return adns_s_invaliddomain;
- }
- } else if (!(c= *p++)) {
- return adns_s_invaliddomain;
- }
- }
- if (!(flags & adns_f_anyquote)) {
- if (ctype_digit(c) || c == '-') {
- if (!ll) return adns_s_invaliddomain;
- } else if ((c < 'a' || c > 'z') && (c < 'A' && c > 'Z')) {
- return adns_s_invaliddomain;
- }
- }
- if (ll == sizeof(label)) return adns_s_invaliddomain;
- label[ll++]= c;
- }
- if (!ll) return adns_s_invaliddomain;
- if (nlabs++ > 63) return adns_s_invaliddomain;
- MKQUERY_ADDB(ll);
- memcpy(nqbuf,label,ll); nqbuf+= ll;
- } while (p!=pe);
-
- MKQUERY_ADDB(0);
- MKQUERY_ADDW(type & adns__rrt_typemask); /* QTYPE */
- MKQUERY_ADDW(1); /* QCLASS=IN */
-
- *qml_r= nqbuf - ads->qbuf;
+ qu->id= id;
+ qu->flags= flags;
+ qu->udpretries= 0;
+ qu->udpnextserver= 0;
+ qu->udpsent= qu->tcpfailed= 0;
+ timerclear(&qu->timeout);
+ memcpy(&qu->context,ctx,sizeof(qu->context));
+
+ qu->answer->status= adns_s_ok;
+ qu->answer->cname= 0;
+ qu->answer->type= typei->type;
+ qu->answer->nrrs= 0;
+ qu->answer->rrs= 0;
+ qu->answer->rrsz= typei->rrsz;
+
+ *query_r= qu;
+
+ qu->query_dgram= malloc(qumsg_vb->used);
+ if (!qu->query_dgram) {
+ adns__query_fail(qu,adns_s_nolocalmem);
+ return adns_s_ok;
+ }
+ memcpy(qu->query_dgram,qumsg_vb->buf,qumsg_vb->used);
+ qu->vb= *qumsg_vb;
+ adns__vbuf_init(qumsg_vb);