static adns_status mkquery_header(adns_state ads, vbuf * vb, int *id_r,
				  int qdlen)
{
	int id;
	byte *rqp;

	if (!adns__vbuf_ensure(vb, DNS_HDRSIZE + qdlen + 4))
		return adns_s_nomemory;

	vb->used = 0;
	MKQUERY_START(vb);

	*id_r = id = (ads->nextid++) & 0x0ffff;
	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 */

	MKQUERY_STOP(vb);

	return adns_s_ok;
}
Exemple #2
0
adns_status adns__mkquery_frdgram(adns_state ads, vbuf *vb, int *id_r,
				  const byte *qd_dgram, int qd_dglen, int qd_begin,
				  adns_rrtype type, adns_queryflags flags) {
  byte *rqp;
  findlabel_state fls;
  int lablen, labstart;
  adns_status st;

  st= mkquery_header(ads,vb,id_r,qd_dglen); if (st) return st;

  MKQUERY_START(vb);

  adns__findlabel_start(&fls,ads,-1,0,qd_dgram,qd_dglen,qd_dglen,qd_begin,0);
  for (;;) {
    st= adns__findlabel_next(&fls,&lablen,&labstart); assert(!st);
    if (!lablen) break;
    assert(lablen<255);
    MKQUERY_ADDB(lablen);
    memcpy(rqp,qd_dgram+labstart,lablen);
    rqp+= lablen;
  }
  MKQUERY_ADDB(0);

  MKQUERY_STOP(vb);
  
  st= mkquery_footer(vb,type);
  
  return adns_s_ok;
}
Exemple #3
0
adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r,
			  const char *owner, int ol,
			  const typeinfo *typei, adns_queryflags flags) {
  int ll, c, nbytes;
  byte label[255], *rqp;
  const char *p, *pe;
  adns_status st;

  st= mkquery_header(ads,vb,id_r,ol+2); if (st) return st;
  
  MKQUERY_START(vb);

  p= owner; pe= owner+ol;
  nbytes= 0;
  while (p!=pe) {
    ll= 0;
    while (p!=pe && (c= *p++)!='.') {
      if (c=='\\') {
	if (!(flags & adns_qf_quoteok_query)) return adns_s_querydomaininvalid;
	if (ctype_digit(p[0])) {
	  if (ctype_digit(p[1]) && ctype_digit(p[2])) {
            c = (*p++ - '0')*100;
            c += (*p++ - '0')*10;
            c += (*p++ - '0');
	    if (c >= 256) return adns_s_querydomaininvalid;
	  } else {
	    return adns_s_querydomaininvalid;
	  }
	} else if (!(c= *p++)) {
	  return adns_s_querydomaininvalid;
	}
      }
      if (!(flags & adns_qf_quoteok_query)) {
	if (c == '-') {
	  if (!ll) return adns_s_querydomaininvalid;
	} else if (!ctype_alpha(c) && !ctype_digit(c)) {
	  return adns_s_querydomaininvalid;
	}
      }
      if (ll == sizeof(label)) return adns_s_querydomaininvalid;
      label[ll++]= c;
    }
    if (!ll) return adns_s_querydomaininvalid;
    if (ll > DNS_MAXLABEL) return adns_s_querydomaintoolong;
    nbytes+= ll+1;
    if (nbytes >= DNS_MAXDOMAIN) return adns_s_querydomaintoolong;
    MKQUERY_ADDB(ll);
    memcpy(rqp,label,ll); rqp+= ll;
  }
  MKQUERY_ADDB(0);

  MKQUERY_STOP(vb);
  
  st= mkquery_footer(vb,typei->type);
  
  return adns_s_ok;
}