blob: 15f7d1d7f9109346b61e7c1eb8832e32c438b415 [file] [log] [blame]
#include <resolv.h>
#include <string.h>
#include <time.h>
#include "libc.h"
int __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) {
int id, i, j;
unsigned char q[280];
struct timespec ts;
size_t l = strnlen(dname, 255);
int n;
if (l && dname[l - 1] == '.')
l--;
n = 17 + l + !!l;
if (l > 253 || buflen < n || op > 15u || class > 255u || type > 255u)
return -1;
/* Construct query template - ID will be filled later */
memset(q, 0, n);
q[2] = op * 8 + 1;
q[5] = 1;
memcpy((char*)q + 13, dname, l);
for (i = 13; q[i]; i = j + 1) {
for (j = i; q[j] && q[j] != '.'; j++)
;
if (j - i - 1u > 62u)
return -1;
q[i - 1] = j - i;
}
q[i + 1] = type;
q[i + 3] = class;
/* Make a reasonably unpredictable id */
clock_gettime(CLOCK_REALTIME, &ts);
id = ts.tv_nsec + ts.tv_nsec / 65536UL & 0xffff;
q[0] = id / 256;
q[1] = id;
memcpy(buf, q, n);
return n;
}
weak_alias(__res_mkquery, res_mkquery);