dns: use re-entrant resolv api for NetBSD

This commit is contained in:
Richard Aas 2014-08-28 11:13:45 +00:00
parent d492f6f76f
commit db82f644d6
2 changed files with 60 additions and 0 deletions

View file

@ -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
View 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;
}