73 #ifndef MAXHOSTNAMELEN 74 # define MAXHOSTNAMELEN 256 118 static int dns_lookup_int(
const char *,
int,
int, time_t,
int,
140 struct stot *p = stot;
142 for (p = stot; p->st_name != NULL; p++)
143 if (strcasecmp(name, p->st_name) == 0)
167 struct stot *p = stot;
169 for (p = stot; p->st_name != NULL; p++)
170 if (type == p->st_type)
216 memset(r, 0,
sizeof (*r));
251 memset(reply, 0,
sizeof (*reply));
259 status = dn_expand(data, data + len, p, host,
sizeof host);
275 while (p < data + len)
277 int type,
class, ttl, size, txtlen;
279 status = dn_expand(data, data + len, p, host,
sizeof host);
290 if (p + size > data + len)
298 "ERROR: DNS RDLENGTH=%d > data len=%ld", size, len - (p - data));
308 memset(*rr, 0,
sizeof (**rr));
309 (*rr)->rr_domain = strdup(host);
310 if ((*rr)->rr_domain == NULL)
315 (*rr)->rr_type = type;
316 (*rr)->rr_class =
class;
318 (*rr)->rr_size = size;
324 status = dn_expand(data, data + len, p, host,
sizeof host);
330 (*rr)->rr_u.rr_txt = strdup(host);
331 if ((*rr)->rr_u.rr_txt == NULL)
340 status = dn_expand(data, data + len, p + 2, host,
sizeof host);
346 l = strlen(host) + 1;
348 (
MX_RECORD_T *) malloc(
sizeof (*((*rr)->rr_u.rr_mx)) + l);
349 if ((*rr)->rr_u.rr_mx == NULL)
354 (*rr)->rr_u.rr_mx->mx_r_preference = (p[0] << 8) | p[1];
355 (void)
strlcpy((*rr)->rr_u.rr_mx->mx_r_domain, host, l);
359 status = dn_expand(data, data + len, p + 6, host,
sizeof host);
365 l = strlen(host) + 1;
367 malloc(
sizeof (*((*rr)->rr_u.rr_srv)) + l);
368 if ((*rr)->rr_u.rr_srv == NULL)
373 (*rr)->rr_u.rr_srv->srv_r_priority = (p[0] << 8) | p[1];
374 (*rr)->rr_u.rr_srv->srv_r_weight = (p[2] << 8) | p[3];
375 (*rr)->rr_u.rr_srv->srv_r_port = (p[4] << 8) | p[5];
376 (void)
strlcpy((*rr)->rr_u.rr_srv->srv_r_target, host, l);
395 "ERROR: DNS TXT record size=%d <= text len=%d", size, txtlen);
399 (*rr)->rr_u.rr_txt = (
char *) malloc(txtlen + 1);
400 if ((*rr)->rr_u.rr_txt == NULL)
405 (void)
strlcpy((*rr)->rr_u.rr_txt, (
char *) p + 1, txtlen + 1);
409 (*rr)->rr_u.rr_data = (
unsigned char *) malloc(size);
410 if ((*rr)->rr_u.rr_data == NULL)
415 (void)
memcpy((*rr)->rr_u.rr_data, p, size);
442 #if HAVE_RES_NQUERY || HAVE___RES_NQUERY 446 static pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;
451 # define DNS_INIT_LOCK() MUTEX_LOCK(&mutex) 452 # define DNS_INIT_UNLOCK() MUTEX_UNLOCK(&mutex) 455 # define DNS_UNLOCK() 459 # define DNS_INIT_LOCK() 460 # define DNS_INIT_UNLOCK() 462 #if !BSD_RES_THREAD_SAFE 464 # define DNS_LOCK() MUTEX_LOCK(&mutex) 465 # define DNS_UNLOCK() MUTEX_UNLOCK(&mutex) 469 # define DNS_UNLOCK() 478 # define STATPM (*statp) 479 # define MAC_H_ERRNO (statp->res_h_errno) 482 # define MAC_H_ERRNO h_errno 485 #define SM_SET_H_ERRNO(i) {MAC_H_ERRNO = (i);} 488 # define jc_res_query(st,a,b,c,d,e) res_nquery(st, a, b, c, d, e) 489 #elif HAVE___RES_NQUERY 490 # define jc_res_query(st,a,b,c,d,e) __res_nquery(st, a, b, c, d, e) 492 # define jc_res_query(st,a,b,c,d,e) res_query(a, b, c, d, e) 496 # define jc_res_init(st) res_ninit(st) 497 #elif HAVE___RES_NINIT 498 # define jc_res_init(st) __res_ninit(st) 500 # define jc_res_init(st) 504 # define jc_res_close() res_nclose(st) 505 #elif HAVE___RES_NQUERY 506 # define jc_res_close() __res_nclose(st) 508 # define jc_res_close() 513 dns_lookup_int(
domain, rr_class, rr_type, retrans, retry, r)
522 unsigned char reply[2048];
525 time_t save_retrans = 0;
529 static bool statok =
FALSE;
530 static struct __res_state statrs;
531 struct __res_state statr;
532 res_state statp = &statr;
534 static bool statok =
FALSE;
551 memset(&statrs, 0,
sizeof (statrs));
571 save_retrans =
STATPM.retrans;
577 save_retry =
STATPM.retry;
594 STATPM.retrans = save_retrans;
597 STATPM.retry = save_retry;
642 const char *type_name;
657 memset(r, 0,
sizeof (*r));
663 ZE_LogMsgError(0,
"dns_lookup: unknown resource type: %s", type_name);
667 result = dns_lookup_int(
domain, C_IN, type, retrans, retry, r);
#define ZE_LogMsgError(level,...)
int dns_lookup(char *domain, const char *type_name, time_t retrans, int retry, DNS_REPLY_T *r) const
union resource_record::@0 rr_u
const char * dns_type_to_string(int type)
#define DNS_INIT_UNLOCK()
#define ZE_MessageInfo(level,...)
void dns_free_data(DNS_REPLY_T *r)
int parse_dns_reply(DNS_REPLY_T *reply, unsigned char *data, long len)
#define SM_SET_H_ERRNO(i)
int dns_string_to_type(char *name) const
#define jc_res_query(st, a, b, c, d, e)