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:
parent
bb2b79b44e
commit
a3a44da128
7 changed files with 40 additions and 95 deletions
25
mk/re.mk
25
mk/re.mk
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue