1 #include "libc.h"
2 #include <resolv.h>
3 #include <string.h>
4 #include <time.h>
5 
__res_mkquery(int op,const char * dname,int class,int type,const unsigned char * data,int datalen,const unsigned char * newrr,unsigned char * buf,int buflen)6 int __res_mkquery(int op, const char* dname, int class, int type, const unsigned char* data,
7                   int datalen, const unsigned char* newrr, unsigned char* buf, int buflen) {
8     int id, i, j;
9     unsigned char q[280];
10     struct timespec ts;
11     size_t l = strnlen(dname, 255);
12     int n;
13 
14     if (l && dname[l - 1] == '.')
15         l--;
16     n = 17 + l + !!l;
17     if (l > 253 || buflen < n || op > 15u || class > 255u || type > 255u)
18         return -1;
19 
20     /* Construct query template - ID will be filled later */
21     memset(q, 0, n);
22     q[2] = op * 8 + 1;
23     q[5] = 1;
24     memcpy((char*)q + 13, dname, l);
25     for (i = 13; q[i]; i = j + 1) {
26         for (j = i; q[j] && q[j] != '.'; j++)
27             ;
28         if (j - i - 1u > 62u)
29             return -1;
30         q[i - 1] = j - i;
31     }
32     q[i + 1] = type;
33     q[i + 3] = class;
34 
35     /* Make a reasonably unpredictable id */
36     clock_gettime(CLOCK_REALTIME, &ts);
37     id = (ts.tv_nsec + ts.tv_nsec / 65536UL) & 0xffff;
38     q[0] = id / 256;
39     q[1] = id;
40 
41     memcpy(buf, q, n);
42     return n;
43 }
44 
45 weak_alias(__res_mkquery, res_mkquery);
46