diff options
author | Internet Software Consortium, Inc <@isc.org> | 2007-09-07 14:08:49 -0600 |
---|---|---|
committer | LaMont Jones <lamont@debian.org> | 2007-09-07 14:08:49 -0600 |
commit | a80776499e31c00d0c3afdfb4f27504ef56db751 (patch) | |
tree | 7e5c87c8d9e8434b27b662db6b3b13746b12d55a /bin | |
parent | d366f01c173d7934ac2d28ca66baff57a6baad7e (diff) | |
download | bind9-a80776499e31c00d0c3afdfb4f27504ef56db751.tar.gz |
9.1.1rc1
Diffstat (limited to 'bin')
-rw-r--r-- | bin/dig/dighost.c | 21 | ||||
-rw-r--r-- | bin/named/lwdgrbn.c | 4 | ||||
-rw-r--r-- | bin/named/lwresd.c | 154 | ||||
-rw-r--r-- | bin/nsupdate/nsupdate.c | 139 | ||||
-rw-r--r-- | bin/tests/Makefile.in | 7 | ||||
-rw-r--r-- | bin/tests/zone_test.c | 36 |
6 files changed, 208 insertions, 153 deletions
diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 6f313868..1c775964 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dighost.c,v 1.174.2.4 2001/01/12 20:39:06 bwelling Exp $ */ +/* $Id: dighost.c,v 1.174.2.5 2001/02/07 19:26:20 gson Exp $ */ /* * Notice to programmers: Do not use this code as an example of how to @@ -32,9 +32,6 @@ #include <netdb.h> #include <string.h> #include <limits.h> -#if (!(defined(HAVE_ADDRINFO) && defined(HAVE_GETADDRINFO))) -extern int h_errno; -#endif #include <dns/byaddr.h> #include <dns/fixedname.h> @@ -67,6 +64,18 @@ extern int h_errno; #include <dig/dig.h> +#ifdef HAVE_ADDRINFO +#ifdef HAVE_GETADDRINFO +#ifdef HAVE_GAISTRERROR +#define USE_GETADDRINFO +#endif +#endif +#endif + +#ifndef USE_GETADDRINFO +extern int h_errno; +#endif + ISC_LIST(dig_lookup_t) lookup_list; dig_serverlist_t server_list; ISC_LIST(dig_searchlist_t) search_list; @@ -2530,7 +2539,7 @@ void get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) { struct in_addr in4; struct in6_addr in6; -#if defined(HAVE_ADDRINFO) && defined(HAVE_GETADDRINFO) +#ifdef USE_GETADDRINFO struct addrinfo *res = NULL; int result; #else @@ -2548,7 +2557,7 @@ get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) { else if (inet_pton(AF_INET, host, &in4) == 1) isc_sockaddr_fromin(sockaddr, &in4, port); else { -#if defined(HAVE_ADDRINFO) && defined(HAVE_GETADDRINFO) +#ifdef USE_GETADDRINFO debug ("before getaddrinfo()"); is_blocking = ISC_TRUE; result = getaddrinfo(host, NULL, NULL, &res); diff --git a/bin/named/lwdgrbn.c b/bin/named/lwdgrbn.c index 9271d633..e96b456a 100644 --- a/bin/named/lwdgrbn.c +++ b/bin/named/lwdgrbn.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: lwdgrbn.c,v 1.6.2.1 2001/01/09 22:32:02 bwelling Exp $ */ +/* $Id: lwdgrbn.c,v 1.6.2.2 2001/01/23 02:05:11 gson Exp $ */ #include <config.h> @@ -265,7 +265,7 @@ lookup_done(isc_task_t *task, isc_event_t *event) { if (sigrdataset != NULL) { i = 0; - result = fill_array(&i, rdataset, grbn->nsigs, grbn->sigs, + result = fill_array(&i, sigrdataset, grbn->nsigs, grbn->sigs, grbn->siglen); if (result != ISC_R_SUCCESS || i != grbn->nsigs) goto out; diff --git a/bin/named/lwresd.c b/bin/named/lwresd.c index 994c03af..defa0b54 100644 --- a/bin/named/lwresd.c +++ b/bin/named/lwresd.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: lwresd.c,v 1.27.2.1 2001/01/09 22:32:05 bwelling Exp $ */ +/* $Id: lwresd.c,v 1.27.2.2 2001/01/19 02:37:51 gson Exp $ */ /* * Main program for the Lightweight Resolver Daemon. @@ -672,13 +672,70 @@ ns_lwreslistener_linkcm(ns_lwreslistener_t *listener, ns_lwdclientmgr_t *cm) { ISC_LIST_APPEND(listener->cmgrs, cm, link); } +static isc_result_t +configure_listener(isc_sockaddr_t *address, ns_lwresd_t *lwresd, + isc_mem_t *mctx, ns_lwreslistenerlist_t *newlisteners) +{ + ns_lwreslistener_t *listener, *oldlistener = NULL; + char socktext[ISC_SOCKADDR_FORMATSIZE]; + isc_result_t result; + + (void)find_listener(address, &oldlistener); + listener = NULL; + result = listener_create(mctx, lwresd, &listener); + if (result != ISC_R_SUCCESS) { + isc_sockaddr_format(address, socktext, sizeof(socktext)); + isc_log_write(ns_g_lctx, ISC_LOGCATEGORY_GENERAL, + NS_LOGMODULE_LWRESD, ISC_LOG_WARNING, + "lwres failed to configure %s: %s", + socktext, isc_result_totext(result)); + return (result); + } + + /* + * If there's already a listener, don't rebind the socket. + */ + if (oldlistener == NULL) { + result = listener_bind(listener, address); + if (result != ISC_R_SUCCESS) + return (result); + } else + listener_copysock(oldlistener, listener); + + result = listener_startclients(listener); + if (result != ISC_R_SUCCESS) { + isc_sockaddr_format(address, socktext, sizeof(socktext)); + isc_log_write(ns_g_lctx, ISC_LOGCATEGORY_GENERAL, + NS_LOGMODULE_LWRESD, ISC_LOG_WARNING, + "lwres: failed to start %s: %s", socktext, + isc_result_totext(result)); + ns_lwreslistener_detach(&listener); + return (result); + } + + if (oldlistener != NULL) { + /* + * Remove the old listener from the old list and shut it down. + */ + ISC_LIST_UNLINK(listeners, oldlistener, link); + listener_shutdown(oldlistener); + ns_lwreslistener_detach(&oldlistener); + } else { + isc_sockaddr_format(address, socktext, sizeof(socktext)); + isc_log_write(ns_g_lctx, ISC_LOGCATEGORY_GENERAL, + NS_LOGMODULE_LWRESD, ISC_LOG_NOTICE, + "lwres listening on %s", socktext); + } + + ISC_LIST_APPEND(*newlisteners, listener, link); + return (result); +} isc_result_t ns_lwresd_configure(isc_mem_t *mctx, dns_c_ctx_t *cctx) { dns_c_lwres_t *lwres = NULL; dns_c_lwreslist_t *list = NULL; ns_lwreslistener_t *listener; - ns_lwreslistener_t *oldlistener; ns_lwreslistenerlist_t newlisteners; isc_result_t result; char socktext[ISC_SOCKADDR_FORMATSIZE]; @@ -708,7 +765,6 @@ ns_lwresd_configure(isc_mem_t *mctx, dns_c_ctx_t *cctx) { lwres = dns_c_lwreslist_next(lwres)) { unsigned int i; - isc_sockaddr_t *address; ns_lwresd_t *lwresd; lwresd = NULL; @@ -716,79 +772,33 @@ ns_lwresd_configure(isc_mem_t *mctx, dns_c_ctx_t *cctx) { if (result != ISC_R_SUCCESS) return (result); - for (i = 0; i < lwres->listeners->nextidx; i++) { - address = &lwres->listeners->ips[i]; - oldlistener = NULL; - (void)find_listener(address, &oldlistener); - listener = NULL; - result = listener_create(mctx, lwresd, &listener); - if (result != ISC_R_SUCCESS) { - isc_sockaddr_format(address, socktext, - sizeof(socktext)); - isc_log_write(ns_g_lctx, - ISC_LOGCATEGORY_GENERAL, - NS_LOGMODULE_LWRESD, - ISC_LOG_WARNING, - "lwres failed to configure " - "%s: %s", - socktext, - isc_result_totext(result)); - ns_lwdmanager_detach(&lwresd); - return (result); - } - - /* - * If there's already a listener, don't rebind the - * socket. - */ - if (oldlistener == NULL) { - result = listener_bind(listener, address); - if (result != ISC_R_SUCCESS) { - ns_lwdmanager_detach(&lwresd); - return (result); - } - } else - listener_copysock(oldlistener, listener); - - result = listener_startclients(listener); - if (result != ISC_R_SUCCESS) { - isc_sockaddr_format(address, socktext, - sizeof(socktext)); - isc_log_write(ns_g_lctx, - ISC_LOGCATEGORY_GENERAL, - NS_LOGMODULE_LWRESD, - ISC_LOG_WARNING, - "lwres: failed to start %s: %s", - socktext, - isc_result_totext(result)); - ns_lwreslistener_detach(&listener); - ns_lwdmanager_detach(&lwresd); - return (result); - } - - if (oldlistener != NULL) { - /* - * Remove the old listener from the old - * list and shut it down. - */ - ISC_LIST_UNLINK(listeners, oldlistener, link); - listener_shutdown(oldlistener); - ns_lwreslistener_detach(&oldlistener); - } else { - isc_sockaddr_format(address, socktext, - sizeof(socktext)); - isc_log_write(ns_g_lctx, - ISC_LOGCATEGORY_GENERAL, - NS_LOGMODULE_LWRESD, - ISC_LOG_NOTICE, - "lwres listening on %s", - socktext); + if (lwres->listeners == NULL) { + struct in_addr localhost; + in_port_t port; + isc_sockaddr_t address; + + port = lwresd_g_listenport; + if (port == 0) + port = LWRES_UDP_PORT; + localhost.s_addr = htonl(INADDR_LOOPBACK); + isc_sockaddr_fromin(&address, &localhost, port); + result = configure_listener(&address, lwresd, + mctx, &newlisteners); + } else { + isc_sockaddr_t *address; + for (i = 0; i < lwres->listeners->nextidx; i++) { + address = &lwres->listeners->ips[i]; + result = configure_listener(address, lwresd, + mctx, + &newlisteners); + if (result != ISC_R_SUCCESS) + break; } - - ISC_LIST_APPEND(newlisteners, listener, link); } ns_lwdmanager_detach(&lwresd); + if (result != ISC_R_SUCCESS) + return (result); } /* diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index 77f9ed19..58a7293f 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nsupdate.c,v 1.75.2.1 2001/01/09 22:32:54 bwelling Exp $ */ +/* $Id: nsupdate.c,v 1.75.2.3 2001/02/07 19:26:22 gson Exp $ */ #include <config.h> @@ -26,10 +26,6 @@ #include <stdlib.h> #include <unistd.h> -#if (!(defined(HAVE_ADDRINFO) && defined(HAVE_GETADDRINFO))) -extern int h_errno; -#endif - #include <isc/app.h> #include <isc/base64.h> #include <isc/buffer.h> @@ -69,6 +65,18 @@ extern int h_errno; #include <lwres/lwres.h> #include <lwres/net.h> +#ifdef HAVE_ADDRINFO +#ifdef HAVE_GETADDRINFO +#ifdef HAVE_GAISTRERROR +#define USE_GETADDRINFO +#endif +#endif +#endif + +#ifndef USE_GETADDRINFO +extern int h_errno; +#endif + #define MAXCMD (4 * 1024) #define INITDATA (32 * 1024) #define MAXDATA (64 * 1024) @@ -355,6 +363,50 @@ shutdown_program(isc_task_t *task, isc_event_t *event) { isc_event_free(&event); isc_task_detach(&global_task); shuttingdown = ISC_TRUE; + + if (userserver != NULL) + isc_mem_put(mctx, userserver, sizeof(isc_sockaddr_t)); + + if (localaddr != NULL) + isc_mem_put(mctx, localaddr, sizeof(isc_sockaddr_t)); + + if (key != NULL) { + debug("Freeing key"); + dns_tsigkey_detach(&key); + } + + if (updatemsg != NULL) + dns_message_destroy(&updatemsg); + + if (is_dst_up) { + debug("Destroy DST lib"); + dst_lib_destroy(); + is_dst_up = ISC_FALSE; + } + + if (entp != NULL) { + debug("Detach from entropy"); + isc_entropy_detach(&entp); + } + + lwres_conf_clear(lwctx); + lwres_context_destroy(&lwctx); + + isc_mem_put(mctx, servers, ns_total * sizeof(isc_sockaddr_t)); + + ddebug("Shutting down request manager"); + dns_requestmgr_shutdown(requestmgr); + dns_requestmgr_detach(&requestmgr); + + ddebug("Freeing the dispatchers"); + if (have_ipv4) + dns_dispatch_detach(&dispatchv4); + if (have_ipv6) + dns_dispatch_detach(&dispatchv6); + + ddebug("Shutting down dispatch manager"); + dns_dispatchmgr_destroy(&dispatchmgr); + } static void @@ -493,7 +545,7 @@ static void get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) { struct in_addr in4; struct in6_addr in6; -#if defined(HAVE_ADDRINFO) && defined(HAVE_GETADDRINFO) +#ifdef USE_GETADDRINFO struct addrinfo *res = NULL; int result; #else @@ -506,7 +558,7 @@ get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) { else if (inet_pton(AF_INET, host, &in4) == 1) isc_sockaddr_fromin(sockaddr, &in4, port); else { -#if defined(HAVE_ADDRINFO) && defined(HAVE_GETADDRINFO) +#ifdef USE_GETADDRINFO result = getaddrinfo(host, NULL, NULL, &res); if (result != 0) { fatal("Couldn't find server '%s': %s", @@ -1185,12 +1237,22 @@ update_completed(isc_task_t *task, isc_event_t *event) { dns_requestevent_t *reqev = NULL; isc_result_t result; dns_message_t *rcvmsg = NULL; + dns_request_t *request; UNUSED(task); ddebug("update_completed()"); + REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE); reqev = (dns_requestevent_t *)event; + request = reqev->request; + + if (shuttingdown) { + dns_request_destroy(&request); + isc_event_free(&event); + return; + } + if (reqev->result != ISC_R_SUCCESS) { fprintf(stderr, "; Communication with server failed: %s\n", isc_result_totext(reqev->result)); @@ -1200,7 +1262,7 @@ update_completed(isc_task_t *task, isc_event_t *event) { result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &rcvmsg); check_result(result, "dns_message_create"); - result = dns_request_getresponse(reqev->request, rcvmsg, + result = dns_request_getresponse(request, rcvmsg, DNS_MESSAGEPARSE_PRESERVEORDER); check_result(result, "dns_request_getresponse"); if (rcvmsg->rcode != dns_rcode_noerror) @@ -1231,7 +1293,7 @@ update_completed(isc_task_t *task, isc_event_t *event) { } dns_message_destroy(&rcvmsg); done: - dns_request_destroy(&reqev->request); + dns_request_destroy(&request); isc_event_free(&event); done_update(); } @@ -1300,8 +1362,13 @@ recvsoa(isc_task_t *task, isc_event_t *event) { soaquery = reqinfo->msg; addr = reqinfo->addr; - isc_event_free(&event); - reqev = NULL; + if (shuttingdown) { + dns_request_destroy(&request); + dns_message_destroy(&soaquery); + isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t)); + isc_event_free(&event); + return; + } if (eresult != ISC_R_SUCCESS) { char addrbuf[ISC_SOCKADDR_FORMATSIZE]; @@ -1318,10 +1385,14 @@ recvsoa(isc_task_t *task, isc_event_t *event) { dns_message_renderreset(soaquery); sendrequest(localaddr, &servers[ns_inuse], soaquery, &request); isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t)); + isc_event_free(&event); return; } isc_mem_put(mctx, reqinfo, sizeof(nsu_requestinfo_t)); + isc_event_free(&event); + reqev = NULL; + ddebug("About to create rcvmsg"); result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &rcvmsg); check_result(result, "dns_message_create"); @@ -1553,49 +1624,6 @@ static void cleanup(void) { ddebug("cleanup()"); - if (userserver != NULL) - isc_mem_put(mctx, userserver, sizeof(isc_sockaddr_t)); - - if (localaddr != NULL) - isc_mem_put(mctx, localaddr, sizeof(isc_sockaddr_t)); - - if (key != NULL) { - debug("Freeing key"); - dns_tsigkey_detach(&key); - } - - if (updatemsg != NULL) - dns_message_destroy(&updatemsg); - - if (is_dst_up) { - debug("Destroy DST lib"); - dst_lib_destroy(); - is_dst_up = ISC_FALSE; - } - - if (entp != NULL) { - debug("Detach from entropy"); - isc_entropy_detach(&entp); - } - - lwres_conf_clear(lwctx); - lwres_context_destroy(&lwctx); - - isc_mem_put(mctx, servers, ns_total * sizeof(isc_sockaddr_t)); - - ddebug("Shutting down request manager"); - dns_requestmgr_shutdown(requestmgr); - dns_requestmgr_detach(&requestmgr); - - ddebug("Freeing the dispatchers"); - if (have_ipv4) - dns_dispatch_detach(&dispatchv4); - if (have_ipv6) - dns_dispatch_detach(&dispatchv6); - - ddebug("Shutting down dispatch manager"); - dns_dispatchmgr_destroy(&dispatchmgr); - ddebug("Shutting down task manager"); isc_taskmgr_destroy(&taskmgr); @@ -1620,6 +1648,9 @@ getinput(isc_task_t *task, isc_event_t *event) { UNUSED(task); + if (shuttingdown) + return; + if (global_event == NULL) global_event = event; diff --git a/bin/tests/Makefile.in b/bin/tests/Makefile.in index e1b2ebaf..51576b00 100644 --- a/bin/tests/Makefile.in +++ b/bin/tests/Makefile.in @@ -13,7 +13,7 @@ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.103.4.1 2001/01/09 22:32:59 bwelling Exp $ +# $Id: Makefile.in,v 1.103.4.2 2001/01/24 00:05:24 gson Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -84,7 +84,8 @@ XTARGETS = adb_test \ task_test \ timer_test \ tkey_test \ - wire_test + wire_test \ + zone_test # Alphabetically SRCS = adb_test.c \ @@ -298,7 +299,7 @@ gxba_test: gxba_test.@O@ ${LWRESDEPLIBS} ${LIBTOOL} ${CC} ${CFLAGS} -o $@ gxba_test.@O@ \ ${LWRESLIBS} ${ISCLIBS} ${LIBS} -sig0_test: sig0_test.@O@ ${DNSDEPLIBS} +sig0_test: sig0_test.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS} ${LIBTOOL} ${CC} ${CFLAGS} -o $@ sig0_test.@O@ \ ${DNSLIBS} ${ISCLIBS} ${LIBS} diff --git a/bin/tests/zone_test.c b/bin/tests/zone_test.c index 2d8b234f..540a67af 100644 --- a/bin/tests/zone_test.c +++ b/bin/tests/zone_test.c @@ -15,10 +15,14 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone_test.c,v 1.22.4.1 2001/01/09 22:34:04 bwelling Exp $ */ +/* $Id: zone_test.c,v 1.22.4.2 2001/01/24 00:05:23 gson Exp $ */ #include <config.h> +#include <sys/types.h> +#include <sys/time.h> + +#include <unistd.h> #include <stdlib.h> #include <isc/app.h> @@ -74,13 +78,14 @@ usage() { } static void -setup(char *zonename, char *filename, char *classname) { +setup(const char *zonename, const char *filename, const char *classname) { isc_result_t result; dns_rdataclass_t rdclass; - isc_textregion_t region; + isc_consttextregion_t region; isc_buffer_t buffer; dns_fixedname_t fixorigin; dns_name_t *origin; + const char *rbt = "rbt"; if (debug) fprintf(stderr, "loading \"%s\" from \"%s\" class \"%s\"\n", @@ -101,15 +106,16 @@ setup(char *zonename, char *filename, char *classname) { result = dns_zone_setorigin(zone, origin); ERRRET(result, "dns_zone_setorigin"); - result = dns_zone_setdbtype(zone, "rbt"); + result = dns_zone_setdbtype(zone, 1, &rbt); ERRRET(result, "dns_zone_setdatabase"); - result = dns_zone_setdatabase(zone, filename); - ERRRET(result, "dns_zone_setdatabase"); + result = dns_zone_setfile(zone, filename); + ERRRET(result, "dns_zone_setfile"); region.base = classname; region.length = strlen(classname); - result = dns_rdataclass_fromtext(&rdclass, ®ion); + result = dns_rdataclass_fromtext(&rdclass, + (isc_textregion_t *)®ion); ERRRET(result, "dns_rdataclass_fromtext"); dns_zone_setclass(zone, rdclass); @@ -228,18 +234,11 @@ query(void) { dns_db_detach(&db); } -static void -destroy(void) { - if (zone == NULL) - return; - dns_zone_detach(&zone); -} - int main(int argc, char **argv) { int c; char *filename = NULL; - char *classname = "IN"; + const char *classname = "IN"; while ((c = isc_commandline_parse(argc, argv, "cdf:m:qsMS")) != EOF) { switch (c) { @@ -293,8 +292,13 @@ main(int argc, char **argv) { filename = argv[isc_commandline_index]; setup(argv[isc_commandline_index], filename, classname); query(); - destroy(); + if (zone != NULL) + dns_zone_detach(&zone); + dns_zonemgr_shutdown(zonemgr); + dns_zonemgr_detach(&zonemgr); + isc_socketmgr_destroy(&socketmgr); isc_taskmgr_destroy(&taskmgr); + isc_timermgr_destroy(&timermgr); if (!quiet && stats) isc_mem_stats(mctx, stdout); isc_mem_destroy(&mctx); |