mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
564. [func] Add sortlist support to lwresd.
This commit is contained in:
2
CHANGES
2
CHANGES
@@ -1,4 +1,6 @@
|
|||||||
|
|
||||||
|
564. [func] Add sortlist support to lwresd.
|
||||||
|
|
||||||
563. [func] New public functions dns_rdatatype_format() and
|
563. [func] New public functions dns_rdatatype_format() and
|
||||||
dns_rdataclass_format(), for convenient formatting
|
dns_rdataclass_format(), for convenient formatting
|
||||||
of rdata type/class mnemonics in log messages.
|
of rdata type/class mnemonics in log messages.
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
# $Id: Makefile.in,v 1.59 2000/11/15 00:36:41 gson Exp $
|
# $Id: Makefile.in,v 1.60 2000/11/15 23:56:19 bwelling Exp $
|
||||||
|
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
@@ -53,7 +53,7 @@ OBJS = aclconf.@O@ client.@O@ interfacemgr.@O@ listenlist.@O@ \
|
|||||||
omapiconf.@O@ query.@O@ server.@O@ sortlist.@O@ \
|
omapiconf.@O@ query.@O@ server.@O@ sortlist.@O@ \
|
||||||
tkeyconf.@O@ tsigconf.@O@ update.@O@ xfrout.@O@ \
|
tkeyconf.@O@ tsigconf.@O@ update.@O@ xfrout.@O@ \
|
||||||
zoneconf.@O@ \
|
zoneconf.@O@ \
|
||||||
lwresd.@O@ lwdclient.@O@ lwderror.@O@ lwdgabn.@O@ \
|
lwaddr.@O@ lwresd.@O@ lwdclient.@O@ lwderror.@O@ lwdgabn.@O@ \
|
||||||
lwdgnba.@O@ lwdgrbn.@O@ lwdnoop.@O@ lwsearch.@O@
|
lwdgnba.@O@ lwdgrbn.@O@ lwdnoop.@O@ lwsearch.@O@
|
||||||
|
|
||||||
UOBJS = unix/os.@O@
|
UOBJS = unix/os.@O@
|
||||||
@@ -63,7 +63,7 @@ SRCS = aclconf.c client.c interfacemgr.c listenlist.c \
|
|||||||
omapiconf.c query.c server.c sortlist.c \
|
omapiconf.c query.c server.c sortlist.c \
|
||||||
tkeyconf.c tsigconf.c update.c xfrout.c \
|
tkeyconf.c tsigconf.c update.c xfrout.c \
|
||||||
zoneconf.c \
|
zoneconf.c \
|
||||||
lwresd.c lwdclient.c lwderror.c lwdgabn.c \
|
lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \
|
||||||
lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c
|
lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c
|
||||||
|
|
||||||
@BIND9_MAKE_RULES@
|
@BIND9_MAKE_RULES@
|
||||||
|
33
bin/named/include/named/lwaddr.h
Normal file
33
bin/named/include/named/lwaddr.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2000 Internet Software Consortium.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
|
||||||
|
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||||
|
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||||
|
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: lwaddr.h,v 1.1 2000/11/15 23:56:23 bwelling Exp $ */
|
||||||
|
|
||||||
|
#include <lwres/lwres.h>
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_netaddr_fromlwresaddr(isc_netaddr_t *na, lwres_addr_t *la);
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_sockaddr_fromlwresaddr(isc_sockaddr_t *sa, lwres_addr_t *la,
|
||||||
|
in_port_t port);
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_lwresaddr_fromnetaddr(lwres_addr_t *la, isc_netaddr_t *na);
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_lwresaddr_fromsockaddr(lwres_addr_t *la, isc_sockaddr_t *sa);
|
92
bin/named/lwaddr.c
Normal file
92
bin/named/lwaddr.c
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2000 Internet Software Consortium.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
|
||||||
|
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||||
|
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||||
|
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: lwaddr.c,v 1.1 2000/11/15 23:56:20 bwelling Exp $ */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <isc/result.h>
|
||||||
|
#include <isc/netaddr.h>
|
||||||
|
#include <isc/sockaddr.h>
|
||||||
|
|
||||||
|
#include <lwres/lwres.h>
|
||||||
|
|
||||||
|
#include <named/lwaddr.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert addresses from lwres to isc format.
|
||||||
|
*/
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_netaddr_fromlwresaddr(isc_netaddr_t *na, lwres_addr_t *la) {
|
||||||
|
if (la->family != LWRES_ADDRTYPE_V4 && la->family != LWRES_ADDRTYPE_V6)
|
||||||
|
return (ISC_R_FAMILYNOSUPPORT);
|
||||||
|
|
||||||
|
if (la->family == LWRES_ADDRTYPE_V4) {
|
||||||
|
struct in_addr ina;
|
||||||
|
memcpy(&ina.s_addr, la->address, 4);
|
||||||
|
isc_netaddr_fromin(na, &ina);
|
||||||
|
} else {
|
||||||
|
struct in6_addr ina6;
|
||||||
|
memcpy(&ina6.s6_addr, la->address, 16);
|
||||||
|
isc_netaddr_fromin6(na, &ina6);
|
||||||
|
}
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_sockaddr_fromlwresaddr(isc_sockaddr_t *sa, lwres_addr_t *la,
|
||||||
|
in_port_t port)
|
||||||
|
{
|
||||||
|
isc_netaddr_t na;
|
||||||
|
isc_result_t result;
|
||||||
|
|
||||||
|
result = lwaddr_netaddr_fromlwresaddr(&na, la);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
return (result);
|
||||||
|
isc_sockaddr_fromnetaddr(sa, &na, port);
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert addresses from isc to lwres format.
|
||||||
|
*/
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_lwresaddr_fromnetaddr(lwres_addr_t *la, isc_netaddr_t *na) {
|
||||||
|
if (na->family != AF_INET && na->family != AF_INET6)
|
||||||
|
return (ISC_R_FAMILYNOSUPPORT);
|
||||||
|
|
||||||
|
if (na->family == AF_INET) {
|
||||||
|
la->family = LWRES_ADDRTYPE_V4;
|
||||||
|
la->length = 4;
|
||||||
|
memcpy(la->address, &na->type.in, 4);
|
||||||
|
} else {
|
||||||
|
la->family = LWRES_ADDRTYPE_V6;
|
||||||
|
la->length = 16;
|
||||||
|
memcpy(la->address, &na->type.in, 16);
|
||||||
|
}
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
lwaddr_lwresaddr_fromsockaddr(lwres_addr_t *la, isc_sockaddr_t *sa) {
|
||||||
|
isc_netaddr_t na;
|
||||||
|
isc_netaddr_fromsockaddr(&na, sa);
|
||||||
|
return (lwaddr_lwresaddr_fromnetaddr(la, &na));
|
||||||
|
}
|
@@ -15,10 +15,14 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: lwdgabn.c,v 1.9 2000/10/31 22:39:26 bwelling Exp $ */
|
/* $Id: lwdgabn.c,v 1.10 2000/11/15 23:56:20 bwelling Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <isc/netaddr.h>
|
||||||
|
#include <isc/sockaddr.h>
|
||||||
#include <isc/socket.h>
|
#include <isc/socket.h>
|
||||||
#include <isc/string.h> /* Required for HP/UX (and others?) */
|
#include <isc/string.h> /* Required for HP/UX (and others?) */
|
||||||
#include <isc/util.h>
|
#include <isc/util.h>
|
||||||
@@ -28,9 +32,11 @@
|
|||||||
#include <dns/result.h>
|
#include <dns/result.h>
|
||||||
|
|
||||||
#include <named/types.h>
|
#include <named/types.h>
|
||||||
|
#include <named/lwaddr.h>
|
||||||
#include <named/lwdclient.h>
|
#include <named/lwdclient.h>
|
||||||
#include <named/lwresd.h>
|
#include <named/lwresd.h>
|
||||||
#include <named/lwsearch.h>
|
#include <named/lwsearch.h>
|
||||||
|
#include <named/sortlist.h>
|
||||||
|
|
||||||
#define NEED_V4(c) ((((c)->find_wanted & LWRES_ADDRTYPE_V4) != 0) \
|
#define NEED_V4(c) ((((c)->find_wanted & LWRES_ADDRTYPE_V4) != 0) \
|
||||||
&& ((c)->v4find == NULL))
|
&& ((c)->v4find == NULL))
|
||||||
@@ -65,8 +71,7 @@ setup_addresses(ns_lwdclient_t *client, dns_adbfind_t *find, unsigned int at) {
|
|||||||
lwres_addr_t *addr;
|
lwres_addr_t *addr;
|
||||||
int af;
|
int af;
|
||||||
const struct sockaddr *sa;
|
const struct sockaddr *sa;
|
||||||
const struct sockaddr_in *sin;
|
isc_result_t result;
|
||||||
const struct sockaddr_in6 *sin6;
|
|
||||||
|
|
||||||
if (at == DNS_ADBFIND_INET)
|
if (at == DNS_ADBFIND_INET)
|
||||||
af = AF_INET;
|
af = AF_INET;
|
||||||
@@ -81,22 +86,9 @@ setup_addresses(ns_lwdclient_t *client, dns_adbfind_t *find, unsigned int at) {
|
|||||||
|
|
||||||
addr = &client->addrs[client->gabn.naddrs];
|
addr = &client->addrs[client->gabn.naddrs];
|
||||||
|
|
||||||
switch (sa->sa_family) {
|
result = lwaddr_lwresaddr_fromsockaddr(addr, &ai->sockaddr);
|
||||||
case AF_INET:
|
if (result != ISC_R_SUCCESS)
|
||||||
sin = &ai->sockaddr.type.sin;
|
|
||||||
addr->family = LWRES_ADDRTYPE_V4;
|
|
||||||
memcpy(addr->address, &sin->sin_addr, 4);
|
|
||||||
addr->length = 4;
|
|
||||||
break;
|
|
||||||
case AF_INET6:
|
|
||||||
sin6 = &ai->sockaddr.type.sin6;
|
|
||||||
addr->family = LWRES_ADDRTYPE_V6;
|
|
||||||
memcpy(addr->address, &sin6->sin6_addr, 16);
|
|
||||||
addr->length = 16;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto next;
|
goto next;
|
||||||
}
|
|
||||||
|
|
||||||
ns_lwdclient_log(50, "adding address %p, family %d, length %d",
|
ns_lwdclient_log(50, "adding address %p, family %d, length %d",
|
||||||
addr->address, addr->family, addr->length);
|
addr->address, addr->family, addr->length);
|
||||||
@@ -110,6 +102,62 @@ setup_addresses(ns_lwdclient_t *client, dns_adbfind_t *find, unsigned int at) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
isc_netaddr_t address;
|
||||||
|
int rank;
|
||||||
|
} rankedaddress;
|
||||||
|
|
||||||
|
static int
|
||||||
|
addr_compare(const void *av, const void *bv) {
|
||||||
|
const rankedaddress *a = (const rankedaddress *) av;
|
||||||
|
const rankedaddress *b = (const rankedaddress *) bv;
|
||||||
|
return (a->rank - b->rank);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sort_addresses(ns_lwdclient_t *client) {
|
||||||
|
unsigned int naddrs;
|
||||||
|
rankedaddress *addrs;
|
||||||
|
isc_netaddr_t remote;
|
||||||
|
dns_addressorderfunc_t order;
|
||||||
|
void *arg;
|
||||||
|
ns_lwresd_t *lwresd = client->clientmgr->listener->manager;
|
||||||
|
unsigned int i;
|
||||||
|
isc_result_t result;
|
||||||
|
|
||||||
|
naddrs = client->gabn.naddrs;
|
||||||
|
|
||||||
|
if (naddrs <= 1 || lwresd->view->sortlist == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
addrs = isc_mem_get(lwresd->mctx, sizeof(rankedaddress) * naddrs);
|
||||||
|
if (addrs == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
isc_netaddr_fromsockaddr(&remote, &client->address);
|
||||||
|
ns_sortlist_byaddrsetup(lwresd->view->sortlist,
|
||||||
|
&remote, &order, &arg);
|
||||||
|
if (order == NULL) {
|
||||||
|
isc_mem_put(lwresd->mctx, addrs,
|
||||||
|
sizeof(rankedaddress) * naddrs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (i = 0; i < naddrs; i++) {
|
||||||
|
result = lwaddr_netaddr_fromlwresaddr(&addrs[i].address,
|
||||||
|
&client->addrs[i]);
|
||||||
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
|
addrs[i].rank = (*order)(&addrs[i].address, arg);
|
||||||
|
}
|
||||||
|
qsort(addrs, naddrs, sizeof(rankedaddress), addr_compare);
|
||||||
|
for (i = 0; i < naddrs; i++) {
|
||||||
|
result = lwaddr_lwresaddr_fromnetaddr(&client->addrs[i],
|
||||||
|
&addrs[i].address);
|
||||||
|
INSIST(result == ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
isc_mem_put(lwresd->mctx, addrs, sizeof(rankedaddress) * naddrs);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
generate_reply(ns_lwdclient_t *client) {
|
generate_reply(ns_lwdclient_t *client) {
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
@@ -175,16 +223,15 @@ generate_reply(ns_lwdclient_t *client) {
|
|||||||
client->pkt.authlength = 0;
|
client->pkt.authlength = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there are no addresses, return incomplete or failure , depending
|
* If there are no addresses, return failure.
|
||||||
* on whether or not there are aliases.
|
|
||||||
*/
|
*/
|
||||||
if (client->gabn.naddrs != 0)
|
if (client->gabn.naddrs != 0)
|
||||||
client->pkt.result = LWRES_R_SUCCESS;
|
client->pkt.result = LWRES_R_SUCCESS;
|
||||||
else if (client->gabn.naliases != 0)
|
|
||||||
client->pkt.result = LWRES_R_INCOMPLETE;
|
|
||||||
else
|
else
|
||||||
client->pkt.result = LWRES_R_NOTFOUND;
|
client->pkt.result = LWRES_R_NOTFOUND;
|
||||||
|
|
||||||
|
sort_addresses(client);
|
||||||
|
|
||||||
lwres = lwres_gabnresponse_render(cm->lwctx, &client->gabn,
|
lwres = lwres_gabnresponse_render(cm->lwctx, &client->gabn,
|
||||||
&client->pkt, &lwb);
|
&client->pkt, &lwb);
|
||||||
if (lwres != LWRES_R_SUCCESS)
|
if (lwres != LWRES_R_SUCCESS)
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: lwresd.c,v 1.25 2000/11/04 01:11:27 bwelling Exp $ */
|
/* $Id: lwresd.c,v 1.26 2000/11/15 23:56:21 bwelling Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main program for the Lightweight Resolver Daemon.
|
* Main program for the Lightweight Resolver Daemon.
|
||||||
@@ -45,6 +45,7 @@
|
|||||||
|
|
||||||
#include <named/globals.h>
|
#include <named/globals.h>
|
||||||
#include <named/log.h>
|
#include <named/log.h>
|
||||||
|
#include <named/lwaddr.h>
|
||||||
#include <named/lwresd.h>
|
#include <named/lwresd.h>
|
||||||
#include <named/lwdclient.h>
|
#include <named/lwdclient.h>
|
||||||
#include <named/lwsearch.h>
|
#include <named/lwsearch.h>
|
||||||
@@ -89,6 +90,70 @@ ns__lwresd_memfree(void *arg, void *mem, size_t size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define CHECK(op) \
|
||||||
|
do { result = (op); \
|
||||||
|
if (result != ISC_R_SUCCESS) goto cleanup; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
parse_sortlist(lwres_conf_t *lwc, isc_mem_t *mctx,
|
||||||
|
dns_c_ipmatchlist_t **sortlist)
|
||||||
|
{
|
||||||
|
dns_c_ipmatchlist_t *inner = NULL, *middle = NULL, *outer = NULL;
|
||||||
|
dns_c_ipmatchelement_t *element = NULL;
|
||||||
|
int i;
|
||||||
|
isc_result_t result;
|
||||||
|
|
||||||
|
REQUIRE(sortlist != NULL && *sortlist == NULL);
|
||||||
|
|
||||||
|
REQUIRE (lwc->sortlistnxt > 0);
|
||||||
|
|
||||||
|
CHECK(dns_c_ipmatchlist_new(mctx, &middle));
|
||||||
|
|
||||||
|
CHECK(dns_c_ipmatchany_new(mctx, &element));
|
||||||
|
ISC_LIST_APPEND(middle->elements, element, next);
|
||||||
|
element = NULL;
|
||||||
|
|
||||||
|
CHECK(dns_c_ipmatchlist_new(mctx, &inner));
|
||||||
|
for (i = 0; i < lwc->sortlistnxt; i++) {
|
||||||
|
isc_sockaddr_t sa;
|
||||||
|
isc_netaddr_t ma;
|
||||||
|
unsigned int mask;
|
||||||
|
|
||||||
|
CHECK(lwaddr_sockaddr_fromlwresaddr(&sa,
|
||||||
|
&lwc->sortlist[i].addr,
|
||||||
|
0));
|
||||||
|
CHECK(lwaddr_netaddr_fromlwresaddr(&ma,
|
||||||
|
&lwc->sortlist[i].mask));
|
||||||
|
CHECK(isc_netaddr_masktoprefixlen(&ma, &mask));
|
||||||
|
CHECK(dns_c_ipmatchpattern_new(mctx, &element, sa, mask));
|
||||||
|
ISC_LIST_APPEND(inner->elements, element, next);
|
||||||
|
element = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECK(dns_c_ipmatchindirect_new(mctx, &element, inner, NULL));
|
||||||
|
dns_c_ipmatchlist_detach(&inner);
|
||||||
|
ISC_LIST_APPEND(middle->elements, element, next);
|
||||||
|
element = NULL;
|
||||||
|
|
||||||
|
CHECK(dns_c_ipmatchlist_new(mctx, &outer));
|
||||||
|
CHECK(dns_c_ipmatchindirect_new(mctx, &element, middle, NULL));
|
||||||
|
dns_c_ipmatchlist_detach(&middle);
|
||||||
|
ISC_LIST_APPEND(outer->elements, element, next);
|
||||||
|
|
||||||
|
*sortlist = outer;
|
||||||
|
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
cleanup:
|
||||||
|
if (inner != NULL)
|
||||||
|
dns_c_ipmatchlist_detach(&inner);
|
||||||
|
if (outer != NULL)
|
||||||
|
dns_c_ipmatchlist_detach(&outer);
|
||||||
|
if (element != NULL)
|
||||||
|
dns_c_ipmatchelement_delete(mctx, &element);
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert a resolv.conf file into a config structure.
|
* Convert a resolv.conf file into a config structure.
|
||||||
*/
|
*/
|
||||||
@@ -106,24 +171,27 @@ ns_lwresd_parseresolvconf(isc_mem_t *mctx, dns_c_ctx_t **ctxp) {
|
|||||||
dns_c_lwres_t *lwres = NULL;
|
dns_c_lwres_t *lwres = NULL;
|
||||||
dns_c_search_t *search = NULL;
|
dns_c_search_t *search = NULL;
|
||||||
dns_c_searchlist_t *searchlist = NULL;
|
dns_c_searchlist_t *searchlist = NULL;
|
||||||
|
dns_c_ipmatchlist_t *sortlist = NULL;
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
lwres_result_t lwresult;
|
lwres_result_t lwresult;
|
||||||
struct in_addr localhost;
|
struct in_addr localhost;
|
||||||
|
|
||||||
result = dns_c_ctx_new(mctx, &ctx);
|
CHECK(dns_c_ctx_new(mctx, &ctx));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
lwctx = NULL;
|
lwctx = NULL;
|
||||||
lwresult = lwres_context_create(&lwctx, mctx, ns__lwresd_memalloc,
|
lwresult = lwres_context_create(&lwctx, mctx, ns__lwresd_memalloc,
|
||||||
ns__lwresd_memfree,
|
ns__lwresd_memfree,
|
||||||
LWRES_CONTEXT_SERVERMODE);
|
LWRES_CONTEXT_SERVERMODE);
|
||||||
if (lwresult != LWRES_R_SUCCESS)
|
if (lwresult != LWRES_R_SUCCESS) {
|
||||||
|
result = ISC_R_NOMEMORY;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
lwresult = lwres_conf_parse(lwctx, lwresd_g_resolvconffile);
|
lwresult = lwres_conf_parse(lwctx, lwresd_g_resolvconffile);
|
||||||
if (lwresult != LWRES_R_SUCCESS)
|
if (lwresult != LWRES_R_SUCCESS) {
|
||||||
|
result = DNS_R_SYNTAX;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
lwc = lwres_conf_get(lwctx);
|
lwc = lwres_conf_get(lwctx);
|
||||||
INSIST(lwc != NULL);
|
INSIST(lwc != NULL);
|
||||||
@@ -132,9 +200,7 @@ ns_lwresd_parseresolvconf(isc_mem_t *mctx, dns_c_ctx_t **ctxp) {
|
|||||||
* Build the list of forwarders.
|
* Build the list of forwarders.
|
||||||
*/
|
*/
|
||||||
if (lwc->nsnext > 0) {
|
if (lwc->nsnext > 0) {
|
||||||
result = dns_c_iplist_new(mctx, lwc->nsnext, &forwarders);
|
CHECK(dns_c_iplist_new(mctx, lwc->nsnext, &forwarders));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (ns_g_port != 0)
|
if (ns_g_port != 0)
|
||||||
port = ns_g_port;
|
port = ns_g_port;
|
||||||
@@ -142,39 +208,24 @@ ns_lwresd_parseresolvconf(isc_mem_t *mctx, dns_c_ctx_t **ctxp) {
|
|||||||
port = 53;
|
port = 53;
|
||||||
|
|
||||||
for (i = 0 ; i < lwc->nsnext ; i++) {
|
for (i = 0 ; i < lwc->nsnext ; i++) {
|
||||||
if (lwc->nameservers[i].family != LWRES_ADDRTYPE_V4 &&
|
CHECK(lwaddr_sockaddr_fromlwresaddr(
|
||||||
lwc->nameservers[i].family != LWRES_ADDRTYPE_V6)
|
&sa,
|
||||||
continue;
|
&lwc->nameservers[i],
|
||||||
|
port));
|
||||||
if (lwc->nameservers[i].family == LWRES_ADDRTYPE_V4) {
|
|
||||||
struct in_addr ina;
|
|
||||||
memcpy(&ina.s_addr,
|
|
||||||
lwc->nameservers[i].address, 4);
|
|
||||||
isc_sockaddr_fromin(&sa, &ina, port);
|
|
||||||
} else {
|
|
||||||
struct in6_addr ina6;
|
|
||||||
memcpy(&ina6.s6_addr,
|
|
||||||
lwc->nameservers[i].address, 16);
|
|
||||||
isc_sockaddr_fromin6(&sa, &ina6, port);
|
|
||||||
}
|
|
||||||
#ifndef NOMINUM_PUBLIC
|
|
||||||
result = dns_c_iplist_append(forwarders, sa, NULL);
|
|
||||||
#else /* NOMINUM_PUBLIC */
|
|
||||||
result = dns_c_iplist_append(forwarders, sa);
|
|
||||||
#endif /* NOMINUM_PUBLIC */
|
|
||||||
if (result != ISC_R_SUCCESS)
|
if (result != ISC_R_SUCCESS)
|
||||||
goto cleanup;
|
continue;
|
||||||
|
#ifndef NOMINUM_PUBLIC
|
||||||
|
CHECK(dns_c_iplist_append(forwarders, sa, NULL));
|
||||||
|
#else /* NOMINUM_PUBLIC */
|
||||||
|
CHECK(dns_c_iplist_append(forwarders, sa));
|
||||||
|
#endif /* NOMINUM_PUBLIC */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (forwarders->nextidx != 0) {
|
if (forwarders->nextidx != 0) {
|
||||||
result = dns_c_ctx_setforwarders(ctx, ISC_FALSE,
|
CHECK(dns_c_ctx_setforwarders(ctx, ISC_FALSE,
|
||||||
forwarders);
|
forwarders));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
forwarders = NULL;
|
forwarders = NULL;
|
||||||
result = dns_c_ctx_setforward(ctx, dns_c_forw_first);
|
CHECK(dns_c_ctx_setforward(ctx, dns_c_forw_first));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,26 +233,25 @@ ns_lwresd_parseresolvconf(isc_mem_t *mctx, dns_c_ctx_t **ctxp) {
|
|||||||
* Build the search path
|
* Build the search path
|
||||||
*/
|
*/
|
||||||
if (lwc->searchnxt > 0) {
|
if (lwc->searchnxt > 0) {
|
||||||
result = dns_c_searchlist_new(mctx, &searchlist);
|
CHECK(dns_c_searchlist_new(mctx, &searchlist));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
for (i = 0; i < lwc->searchnxt; i++) {
|
for (i = 0; i < lwc->searchnxt; i++) {
|
||||||
search = NULL;
|
search = NULL;
|
||||||
result = dns_c_search_new(mctx, lwc->search[i],
|
CHECK(dns_c_search_new(mctx, lwc->search[i], &search));
|
||||||
&search);
|
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
dns_c_searchlist_append(searchlist, search);
|
dns_c_searchlist_append(searchlist, search);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result = dns_c_lwreslist_new(mctx, &lwreslist);
|
/*
|
||||||
if (result != ISC_R_SUCCESS)
|
* Build the sortlist
|
||||||
goto cleanup;
|
*/
|
||||||
|
if (lwc->sortlistnxt > 0) {
|
||||||
|
CHECK(parse_sortlist(lwc, mctx, &sortlist));
|
||||||
|
CHECK(dns_c_ctx_setsortlist(ctx, sortlist));
|
||||||
|
dns_c_ipmatchlist_detach(&sortlist);
|
||||||
|
}
|
||||||
|
|
||||||
result = dns_c_lwres_new(mctx, &lwres);
|
CHECK(dns_c_lwreslist_new(mctx, &lwreslist));
|
||||||
if (result != ISC_R_SUCCESS)
|
CHECK(dns_c_lwres_new(mctx, &lwres));
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
port = lwresd_g_listenport;
|
port = lwresd_g_listenport;
|
||||||
if (port == 0)
|
if (port == 0)
|
||||||
@@ -211,57 +261,29 @@ ns_lwresd_parseresolvconf(isc_mem_t *mctx, dns_c_ctx_t **ctxp) {
|
|||||||
localhost.s_addr = htonl(INADDR_LOOPBACK);
|
localhost.s_addr = htonl(INADDR_LOOPBACK);
|
||||||
isc_sockaddr_fromin(&sa, &localhost, port);
|
isc_sockaddr_fromin(&sa, &localhost, port);
|
||||||
} else {
|
} else {
|
||||||
if (lwc->lwservers[0].family != LWRES_ADDRTYPE_V4 &&
|
CHECK(lwaddr_sockaddr_fromlwresaddr(&sa, &lwc->lwservers[0],
|
||||||
lwc->lwservers[0].family != LWRES_ADDRTYPE_V6)
|
port));
|
||||||
{
|
|
||||||
result = ISC_R_FAMILYNOSUPPORT;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lwc->lwservers[0].family == LWRES_ADDRTYPE_V4) {
|
|
||||||
struct in_addr ina;
|
|
||||||
memcpy(&ina.s_addr, lwc->lwservers[0].address, 4);
|
|
||||||
isc_sockaddr_fromin(&sa, &ina, port);
|
|
||||||
} else {
|
|
||||||
struct in6_addr ina6;
|
|
||||||
memcpy(&ina6.s6_addr, lwc->lwservers[0].address, 16);
|
|
||||||
isc_sockaddr_fromin6(&sa, &ina6, port);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result = dns_c_iplist_new(mctx, 1, &locallist);
|
CHECK(dns_c_iplist_new(mctx, 1, &locallist));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
#ifndef NOMINUM_PUBLIC
|
#ifndef NOMINUM_PUBLIC
|
||||||
result = dns_c_iplist_append(locallist, sa, NULL);
|
CHECK(dns_c_iplist_append(locallist, sa, NULL));
|
||||||
#else /* NOMINUM_PUBLIC */
|
#else /* NOMINUM_PUBLIC */
|
||||||
result = dns_c_iplist_append(locallist, sa);
|
CHECK(dns_c_iplist_append(locallist, sa));
|
||||||
#endif /* NOMINUM_PUBLIC */
|
#endif /* NOMINUM_PUBLIC */
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
result = dns_c_lwres_setlistenon(lwres, locallist);
|
CHECK(dns_c_lwres_setlistenon(lwres, locallist));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
dns_c_iplist_detach(&locallist);
|
dns_c_iplist_detach(&locallist);
|
||||||
|
|
||||||
result = dns_c_lwres_setsearchlist(lwres, searchlist);
|
CHECK(dns_c_lwres_setsearchlist(lwres, searchlist));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
searchlist = NULL;
|
searchlist = NULL;
|
||||||
|
|
||||||
result = dns_c_lwres_setndots(lwres, lwc->ndots);
|
CHECK(dns_c_lwres_setndots(lwres, lwc->ndots));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
result = dns_c_lwreslist_append(lwreslist, lwres);
|
CHECK(dns_c_lwreslist_append(lwreslist, lwres));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
lwres = NULL;
|
lwres = NULL;
|
||||||
|
|
||||||
result = dns_c_ctx_setlwres(ctx, lwreslist);
|
CHECK(dns_c_ctx_setlwres(ctx, lwreslist));
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto cleanup;
|
|
||||||
lwreslist = NULL;
|
lwreslist = NULL;
|
||||||
|
|
||||||
*ctxp = ctx;
|
*ctxp = ctx;
|
||||||
@@ -276,6 +298,8 @@ ns_lwresd_parseresolvconf(isc_mem_t *mctx, dns_c_ctx_t **ctxp) {
|
|||||||
dns_c_iplist_detach(&locallist);
|
dns_c_iplist_detach(&locallist);
|
||||||
if (searchlist != NULL)
|
if (searchlist != NULL)
|
||||||
dns_c_searchlist_delete(&searchlist);
|
dns_c_searchlist_delete(&searchlist);
|
||||||
|
if (sortlist != NULL)
|
||||||
|
dns_c_ipmatchlist_detach(&sortlist);
|
||||||
if (lwres != NULL)
|
if (lwres != NULL)
|
||||||
dns_c_lwres_delete(&lwres);
|
dns_c_lwres_delete(&lwres);
|
||||||
if (lwreslist != NULL)
|
if (lwreslist != NULL)
|
||||||
|
@@ -41,6 +41,7 @@
|
|||||||
./bin/named/include/named/listenlist.h C 2000
|
./bin/named/include/named/listenlist.h C 2000
|
||||||
./bin/named/include/named/log.h C 1999,2000
|
./bin/named/include/named/log.h C 1999,2000
|
||||||
./bin/named/include/named/logconf.h C 1999,2000
|
./bin/named/include/named/logconf.h C 1999,2000
|
||||||
|
./bin/named/include/named/lwaddr.h C 2000
|
||||||
./bin/named/include/named/lwdclient.h C 2000
|
./bin/named/include/named/lwdclient.h C 2000
|
||||||
./bin/named/include/named/lwresd.h C 2000
|
./bin/named/include/named/lwresd.h C 2000
|
||||||
./bin/named/include/named/lwsearch.h C 2000
|
./bin/named/include/named/lwsearch.h C 2000
|
||||||
@@ -57,6 +58,7 @@
|
|||||||
./bin/named/listenlist.c C 2000
|
./bin/named/listenlist.c C 2000
|
||||||
./bin/named/log.c C 1999,2000
|
./bin/named/log.c C 1999,2000
|
||||||
./bin/named/logconf.c C 1999,2000
|
./bin/named/logconf.c C 1999,2000
|
||||||
|
./bin/named/lwaddr.c C 2000
|
||||||
./bin/named/lwdclient.c C 2000
|
./bin/named/lwdclient.c C 2000
|
||||||
./bin/named/lwderror.c C 2000
|
./bin/named/lwderror.c C 2000
|
||||||
./bin/named/lwdgabn.c C 2000
|
./bin/named/lwdgabn.c C 2000
|
||||||
|
Reference in New Issue
Block a user