dns/resolv cleanup (#11)

* dns/resolv: res_ninit()/res_nclose()

* dns/resolv: mac os x fixes

* resolv: added fix for OpenBSD

* Add support for DragonFly BSD

* Solris needs libresolv (patch by Dmitrij D. Czarkoff)
This commit is contained in:
Richard Aas 2016-10-28 10:03:15 +02:00 committed by Alfred E. Heggestad
parent bb2b79b44e
commit a3a44da128
7 changed files with 40 additions and 95 deletions

View file

@ -221,7 +221,7 @@ BIN_SUFFIX :=
ifeq ($(OS),solaris)
CFLAGS += -fPIC -DSOLARIS
LIBS += -ldl -lsocket -lnsl
LIBS += -ldl -lresolv -lsocket -lnsl
LFLAGS += -fPIC
SH_LFLAGS += -G
MOD_LFLAGS +=
@ -245,6 +245,7 @@ ifneq (,$(findstring Apple, $(CC_LONGVER)))
CFLAGS += -Wshorten-64-to-32
endif
DFLAGS := -MD
LIBS += -lresolv
LFLAGS += -fPIC
SH_LFLAGS += -dynamiclib
ifeq ($(CC_NAME),gcc)
@ -281,6 +282,16 @@ ifeq ($(OS),freebsd)
AFLAGS := cru
HAVE_KQUEUE := 1
endif
ifeq ($(OS),dragonfly)
CFLAGS += -fPIC -DDRAGONFLY
LFLAGS += -fPIC
SH_LFLAGS += -shared
MOD_LFLAGS +=
APP_LFLAGS += -rdynamic
AR := ar
AFLAGS := cru
HAVE_KQUEUE := 1
endif
ifeq ($(OS),openbsd)
CFLAGS += -fPIC -DOPENBSD
LFLAGS += -fPIC
@ -535,15 +546,11 @@ HAVE_EPOLL := $(shell [ -f $(SYSROOT)/include/sys/epoll.h ] || \
[ -f $(SYSROOT)/include/$(MACHINE)/sys/epoll.h ] \
&& echo "1")
endif
ifneq ($(OS),openbsd)
HAVE_LIBRESOLV := $(shell [ -f $(SYSROOT)/include/resolv.h ] && echo "1")
endif
ifneq ($(HAVE_LIBRESOLV),)
CFLAGS += -DHAVE_LIBRESOLV
ifneq ($(OS),freebsd)
LIBS += -lresolv
endif
HAVE_RESOLV := $(shell [ -f $(SYSROOT)/include/resolv.h ] && echo "1")
ifneq ($(HAVE_RESOLV),)
CFLAGS += -DHAVE_RESOLV
endif
ifneq ($(HAVE_SYSLOG),)
CFLAGS += -DHAVE_SYSLOG

View file

@ -1,56 +0,0 @@
/**
* @file bsd/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;
}

View file

@ -5,7 +5,7 @@
*/
#ifdef HAVE_LIBRESOLV
#ifdef HAVE_RESOLV
int get_resolv_dns(char *domain, size_t dsize, struct sa *nsv, uint32_t *n);
#endif
#ifdef WIN32

View file

@ -12,13 +12,9 @@ SRCS += dns/ns.c
SRCS += dns/rr.c
SRCS += dns/rrlist.c
ifneq ($(HAVE_LIBRESOLV),)
ifeq ($(filter-out netbsd openbsd,$(OS)),)
SRCS += dns/bsd/srv.c
else
ifneq ($(HAVE_RESOLV),)
SRCS += dns/res.c
endif
endif
ifeq ($(OS),win32)
SRCS += dns/win32/srv.c

View file

@ -122,7 +122,7 @@ int dns_srv_get(char *domain, size_t dsize, struct sa *srvv, uint32_t *n)
/* Try them all in prioritized order */
#ifdef HAVE_LIBRESOLV
#ifdef HAVE_RESOLV
err = get_resolv_dns(domain, dsize, srvv, n);
if (!err)
return 0;

View file

@ -1,5 +1,5 @@
/**
* @file res.c Get DNS Server IP using libresolv
* @file res.c Get DNS Server IP using resolv
*
* Copyright (C) 2010 Creytiv.com
*/
@ -9,6 +9,7 @@
#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>
@ -18,41 +19,35 @@
#include "dns.h"
/**
* Generic way of fetching Nameserver IP-addresses, using libresolv
*
* @param domain Returned domain name
* @param dsize Size of domain name buffer
* @param nsv Returned nameservers
* @param n Nameservers capacity, actual on return
*
* @note we could use res_getservers() but it is not available on Linux
* @note only IPv4 is supported
*
* @return 0 if success, otherwise errorcode
*/
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;
#ifdef OPENBSD
ret = res_init();
state = _res;
#else
memset(&state, 0, sizeof(state));
ret = res_ninit(&state);
#endif
if (0 != ret)
return ENOENT;
if (_res.dnsrch[0])
str_ncpy(domain, _res.dnsrch[0], dsize);
else if ((char *)_res.defdname)
str_ncpy(domain, _res.defdname, dsize);
if (state.dnsrch[0])
str_ncpy(domain, state.dnsrch[0], dsize);
else if ((char *)state.defdname)
str_ncpy(domain, state.defdname, dsize);
if (!_res.nscount) {
if (!state.nscount) {
err = ENOENT;
goto out;
}
err = 0;
for (i=0; i<min(*n, (uint32_t)_res.nscount) && !err; i++) {
struct sockaddr_in *addr = &_res.nsaddr_list[i];
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)
@ -61,7 +56,10 @@ int get_resolv_dns(char *domain, size_t dsize, struct sa *nsv, uint32_t *n)
*n = i;
out:
res_close();
#ifdef OPENBSD
#else
res_nclose(&state);
#endif
return err;
}

View file

@ -26,7 +26,7 @@ static pthread_mutex_t *lockv;
static inline unsigned long threadid(void)
{
#if defined (DARWIN) || defined (FREEBSD) || defined (OPENBSD) || \
defined (NETBSD)
defined (NETBSD) || defined (DRAGONFLY)
return (unsigned long)(void *)pthread_self();
#else
return (unsigned long)pthread_self();