Back to index

glibc  2.9
Defines | Functions
res_mkquery.c File Reference
#include <sys/types.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <netdb.h>
#include <resolv.h>
#include <stdio.h>
#include <string.h>

Go to the source code of this file.

Defines

#define T_OPT   41

Functions

int res_nmkquery (res_state statp, int op, const char *dname, int class, int type, const u_char *data, int datalen, const u_char *newrr_in, u_char *buf, int buflen)
 libresolv_hidden_def (res_nmkquery)

Define Documentation

#define T_OPT   41

Function Documentation

Definition at line 215 of file res_mkquery.c.

{
       u_int16_t flags = 0;

#ifdef DEBUG
       if ((statp->options & RES_DEBUG) != 0U)
              printf(";; res_nopt()\n");
#endif

       HEADER *hp = (HEADER *) buf;
       u_char *cp = buf + n0;
       u_char *ep = buf + buflen;

       if ((ep - cp) < 1 + RRFIXEDSZ)
              return -1;

       *cp++ = 0;    /* "." */

       NS_PUT16(T_OPT, cp); /* TYPE */
       NS_PUT16(anslen & 0xffff, cp);     /* CLASS = UDP payload size */
       *cp++ = NOERROR;     /* extended RCODE */
       *cp++ = 0;           /* EDNS version */
       /* XXX Once we support DNSSEC we change the flag value here.  */
       NS_PUT16(flags, cp);
       NS_PUT16(0, cp);     /* RDLEN */
       hp->arcount = htons(ntohs(hp->arcount) + 1);

       return cp - buf;
}

Here is the call graph for this function:

int res_nmkquery ( res_state  statp,
int  op,
const char *  dname,
int  class,
int  type,
const u_char data,
int  datalen,
const u_char newrr_in,
u_char buf,
int  buflen 
)

Definition at line 96 of file res_mkquery.c.

{
       register HEADER *hp;
       register u_char *cp;
       register int n;
       u_char *dnptrs[20], **dpp, **lastdnptr;

#ifdef DEBUG
       if (statp->options & RES_DEBUG)
              printf(";; res_nmkquery(%s, %s, %s, %s)\n",
                     _res_opcodes[op], dname, p_class(class), p_type(type));
#endif
       /*
        * Initialize header fields.
        */
       if ((buf == NULL) || (buflen < HFIXEDSZ))
              return (-1);
       memset(buf, 0, HFIXEDSZ);
       hp = (HEADER *) buf;
       /* We randomize the IDs every time.  The old code just
          incremented by one after the initial randomization which
          still predictable if the application does multiple
          requests.  */
       int randombits;
       do
         {
#ifdef RANDOM_BITS
           RANDOM_BITS (randombits);
#else
           struct timeval tv;
           __gettimeofday (&tv, NULL);
           randombits = (tv.tv_sec << 8) ^ tv.tv_usec;
#endif
         }
       while ((randombits & 0xffff) == 0);
       statp->id = (statp->id + randombits) & 0xffff;
       hp->id = statp->id;
       hp->opcode = op;
       hp->rd = (statp->options & RES_RECURSE) != 0;
       hp->rcode = NOERROR;
       cp = buf + HFIXEDSZ;
       buflen -= HFIXEDSZ;
       dpp = dnptrs;
       *dpp++ = buf;
       *dpp++ = NULL;
       lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0];
       /*
        * perform opcode specific processing
        */
       switch (op) {
       case NS_NOTIFY_OP:
              if ((buflen -= QFIXEDSZ + (data == NULL ? 0 : RRFIXEDSZ)) < 0)
                     return (-1);
              goto compose;

       case QUERY:
              if ((buflen -= QFIXEDSZ) < 0)
                     return (-1);
       compose:
              n = ns_name_compress(dname, cp, buflen,
                                 (const u_char **) dnptrs,
                                 (const u_char **) lastdnptr);
              if (n < 0)
                     return (-1);
              cp += n;
              buflen -= n;
              NS_PUT16 (type, cp);
              NS_PUT16 (class, cp);
              hp->qdcount = htons(1);
              if (op == QUERY || data == NULL)
                     break;
              /*
               * Make an additional record for completion domain.
               */
              n = ns_name_compress((char *)data, cp, buflen,
                                 (const u_char **) dnptrs,
                                 (const u_char **) lastdnptr);
              if (__builtin_expect (n < 0, 0))
                     return (-1);
              cp += n;
              buflen -= n;
              NS_PUT16 (T_NULL, cp);
              NS_PUT16 (class, cp);
              NS_PUT32 (0, cp);
              NS_PUT16 (0, cp);
              hp->arcount = htons(1);
              break;

       case IQUERY:
              /*
               * Initialize answer section
               */
              if (__builtin_expect (buflen < 1 + RRFIXEDSZ + datalen, 0))
                     return (-1);
              *cp++ = '\0'; /* no domain name */
              NS_PUT16 (type, cp);
              NS_PUT16 (class, cp);
              NS_PUT32 (0, cp);
              NS_PUT16 (datalen, cp);
              if (datalen) {
                     memcpy(cp, data, datalen);
                     cp += datalen;
              }
              hp->ancount = htons(1);
              break;

       default:
              return (-1);
       }
       return (cp - buf);
}

Here is the call graph for this function: