dns: use re-entrant resolv api for NetBSD
This commit is contained in:
parent
d492f6f76f
commit
db82f644d6
2 changed files with 60 additions and 0 deletions
|
@ -13,8 +13,12 @@ SRCS += dns/rr.c
|
|||
SRCS += dns/rrlist.c
|
||||
|
||||
ifneq ($(HAVE_LIBRESOLV),)
|
||||
ifeq ($(OS),netbsd)
|
||||
SRCS += dns/netbsd/srv.c
|
||||
else
|
||||
SRCS += dns/res.c
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS),win32)
|
||||
SRCS += dns/win32/srv.c
|
||||
|
|
56
src/dns/netbsd/srv.c
Normal file
56
src/dns/netbsd/srv.c
Normal file
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* @file netbsd/srv.c Get DNS Server IP using libresolv
|
||||
*
|
||||
* Copyright (C) 2010 Creytiv.com
|
||||
*/
|
||||
#define _BSD_SOURCE 1
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <resolv.h>
|
||||
#include <string.h>
|
||||
#include <re_types.h>
|
||||
#include <re_fmt.h>
|
||||
#include <re_mbuf.h>
|
||||
#include <re_list.h>
|
||||
#include <re_sa.h>
|
||||
#include <re_dns.h>
|
||||
#include "../dns.h"
|
||||
|
||||
|
||||
int get_resolv_dns(char *domain, size_t dsize, struct sa *nsv, uint32_t *n)
|
||||
{
|
||||
struct __res_state state;
|
||||
uint32_t i;
|
||||
int ret, err;
|
||||
|
||||
memset(&state, 0, sizeof(state));
|
||||
ret = res_ninit(&state);
|
||||
if (0 != ret)
|
||||
return ENOENT;
|
||||
|
||||
if (state.dnsrch[0])
|
||||
str_ncpy(domain, state.dnsrch[0], dsize);
|
||||
else if (state.defdname)
|
||||
str_ncpy(domain, state.defdname, dsize);
|
||||
|
||||
if (!state.nscount) {
|
||||
err = ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = 0;
|
||||
for (i=0; i<min(*n, (uint32_t)state.nscount) && !err; i++) {
|
||||
struct sockaddr_in *addr = &state.nsaddr_list[i];
|
||||
err |= sa_set_sa(&nsv[i], (struct sockaddr *)addr);
|
||||
}
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
*n = i;
|
||||
|
||||
out:
|
||||
res_nclose(&state);
|
||||
|
||||
return err;
|
||||
}
|
Loading…
Add table
Reference in a new issue