1 /**
2  * @file res.c  Get DNS Server IP using resolv
3  *
4  * Copyright (C) 2010 Creytiv.com
5  */
6 #define _BSD_SOURCE 1
7 #define _DEFAULT_SOURCE 1
8 #include <sys/types.h>
9 #include <netinet/in.h>
10 #include <arpa/nameser.h>
11 #include <resolv.h>
12 #include <string.h>
13 #include <re_types.h>
14 #include <re_fmt.h>
15 #include <re_mbuf.h>
16 #include <re_list.h>
17 #include <re_sa.h>
18 #include <re_dns.h>
19 #include "dns.h"
20 
21 
get_resolv_dns(char * domain,size_t dsize,struct sa * nsv,uint32_t * n)22 int get_resolv_dns(char *domain, size_t dsize, struct sa *nsv, uint32_t *n)
23 {
24 	struct __res_state state;
25 	uint32_t i;
26 	int ret, err;
27 
28 #ifdef OPENBSD
29 	ret = res_init();
30 	state = _res;
31 #else
32 	memset(&state, 0, sizeof(state));
33 	ret = res_ninit(&state);
34 #endif
35 	if (0 != ret)
36 		return ENOENT;
37 
38 	if (state.dnsrch[0])
39 		str_ncpy(domain, state.dnsrch[0], dsize);
40 	else if ((char *)state.defdname)
41 		str_ncpy(domain, state.defdname, dsize);
42 
43 	if (!state.nscount) {
44 		err = ENOENT;
45 		goto out;
46 	}
47 
48 	err = 0;
49 	for (i=0; i<min(*n, (uint32_t)state.nscount) && !err; i++) {
50 		struct sockaddr_in *addr = &state.nsaddr_list[i];
51 		err |= sa_set_sa(&nsv[i], (struct sockaddr *)addr);
52 	}
53 	if (err)
54 		goto out;
55 
56 	*n = i;
57 
58  out:
59 #ifdef OPENBSD
60 #else
61 	res_nclose(&state);
62 #endif
63 
64 	return err;
65 }
66