diff --git a/bin/named/zoneconf.c b/bin/named/zoneconf.c index e97e07bf11..1abda59f32 100644 --- a/bin/named/zoneconf.c +++ b/bin/named/zoneconf.c @@ -96,15 +96,11 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac, isc_int32_t maxxfr; isc_int32_t idle; in_port_t port; - isc_sockaddr_t sockaddr_any; struct in_addr in4addr_any; + isc_sockaddr_t sockaddr_any4; - if (isc_net_probeipv6() == ISC_R_SUCCESS) - isc_sockaddr_fromin6(&sockaddr_any, &in6addr_any, 0); - else { - in4addr_any.s_addr = INADDR_ANY; - isc_sockaddr_fromin(&sockaddr_any, &in4addr_any, 0); - } + in4addr_any.s_addr = htonl(INADDR_ANY); + isc_sockaddr_fromin(&sockaddr_any4, &in4addr_any, 0); dns_zone_setclass(zone, czone->zclass); @@ -253,10 +249,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac, dns_zone_setmaxxfrin(zone, MAX_XFER_TIME); result = dns_c_zone_gettransfersource(czone, &sockaddr); - if (result == ISC_R_SUCCESS) - dns_zone_setxfrsource(zone, &sockaddr); - else - dns_zone_setxfrsource(zone, &sockaddr_any); + if (result != ISC_R_SUCCESS) { + result = dns_c_ctx_gettransfersource(cctx, &sockaddr); + if (result != ISC_R_SUCCESS) { + sockaddr = sockaddr_any4; + } + } + dns_zone_setxfrsource4(zone, &sockaddr); result = dns_c_zone_getmaxtransidlein(czone, &idle); if (result == ISC_R_SUCCESS) @@ -323,10 +322,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac, dns_zone_setmaxxfrin(zone, MAX_XFER_TIME); result = dns_c_zone_gettransfersource(czone, &sockaddr); - if (result == ISC_R_SUCCESS) - dns_zone_setxfrsource(zone, &sockaddr); - else - dns_zone_setxfrsource(zone, &sockaddr_any); + if (result != ISC_R_SUCCESS) { + result = dns_c_ctx_gettransfersource(cctx, &sockaddr); + if (result != ISC_R_SUCCESS) { + sockaddr = sockaddr_any4; + } + } + dns_zone_setxfrsource4(zone, &sockaddr); result = dns_c_zone_getmaxtransidlein(czone, &idle); if (result == ISC_R_SUCCESS) diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index 6c00920b20..83bac41985 100644 --- a/lib/dns/include/dns/zone.h +++ b/lib/dns/include/dns/zone.h @@ -422,9 +422,9 @@ void dns_zone_setrefresh(dns_zone_t *zone, isc_uint32_t refresh, */ isc_result_t -dns_zone_setxfrsource(dns_zone_t *zone, isc_sockaddr_t *xfrsource); +dns_zone_setxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource); /* - * Set the source address to be used in zone transfers. + * Set the source address to be used in IPv4 zone transfers. * * Require: * 'zone' to be a valid initalised zone. @@ -435,10 +435,33 @@ dns_zone_setxfrsource(dns_zone_t *zone, isc_sockaddr_t *xfrsource); */ isc_sockaddr_t * -dns_zone_getxfrsource(dns_zone_t *zone); +dns_zone_getxfrsource4(dns_zone_t *zone); /* - * Returns the source address set by a previous dns_zone_setxfrsource - * call. If dns_zone_setxfrsource the in6addr_any port 0 is returned. + * Returns the source address set by a previous dns_zone_setxfrsource4 + * call, or the default of inaddr_any, port 0. + * + * Require: + * 'zone' to be a valid initalised zone. + */ + +isc_result_t +dns_zone_setxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource); +/* + * Set the source address to be used in IPv6 zone transfers. + * + * Require: + * 'zone' to be a valid initalised zone. + * 'xfrsource' to contain the address. + * + * Returns: + * DNS_R_SUCCESS + */ + +isc_sockaddr_t * +dns_zone_getxfrsource6(dns_zone_t *zone); +/* + * Returns the source address set by a previous dns_zone_setxfrsource6 + * call, or the default of in6addr_any, port 0. * * Require: * 'zone' to be a valid initalised zone. diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 728fb60357..06850a0e99 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: xfrin.c,v 1.42 2000/01/31 15:10:29 tale Exp $ */ + /* $Id: xfrin.c,v 1.43 2000/01/31 18:00:05 gson Exp $ */ #include @@ -666,8 +666,17 @@ xfrin_create(isc_mem_t *mctx, xfrin_timeout, xfr, &xfr->timer)); xfr->masteraddr = *masteraddr; - /* XXX global, too */ - xfr->sourceaddr = *dns_zone_getxfrsource(zone); + + switch (isc_sockaddr_pf(masteraddr)) { + case PF_INET: + xfr->sourceaddr = *dns_zone_getxfrsource4(zone); + break; + case PF_INET6: + xfr->sourceaddr = *dns_zone_getxfrsource6(zone); + break; + default: + INSIST(0); + } isc_buffer_init(&xfr->qbuffer, xfr->qbuffer_data, sizeof(xfr->qbuffer_data), @@ -685,7 +694,7 @@ isc_result_t xfrin_start(dns_xfrin_ctx_t *xfr) { isc_result_t result; CHECK(isc_socket_create(xfr->socketmgr, - isc_sockaddr_pf(&xfr->masteraddr), + isc_sockaddr_pf(&xfr->sourceaddr), isc_sockettype_tcp, &xfr->socket)); CHECK(isc_socket_bind(xfr->socket, &xfr->sourceaddr)); diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 1edf29be85..ed0d1d69f2 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: zone.c,v 1.74 2000/01/31 07:45:18 marka Exp $ */ + /* $Id: zone.c,v 1.75 2000/01/31 18:00:02 gson Exp $ */ #include @@ -142,7 +142,8 @@ struct dns_zone { unsigned int notifycnt; isc_sockaddr_t notifyfrom; isc_task_t * task; - isc_sockaddr_t xfrsource; + isc_sockaddr_t xfrsource4; + isc_sockaddr_t xfrsource6; dns_xfrin_ctx_t * xfr; /* Access Control Lists */ dns_acl_t *update_acl; @@ -249,12 +250,16 @@ isc_result_t dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) { isc_result_t result; dns_zone_t *zone; - isc_sockaddr_t sockaddr_any; - + isc_sockaddr_t sockaddr_any4; + isc_sockaddr_t sockaddr_any6; + struct in_addr in4addr_any; + REQUIRE(zonep != NULL && *zonep == NULL); REQUIRE(mctx != NULL); - isc_sockaddr_fromin6(&sockaddr_any, &in6addr_any, 0); + in4addr_any.s_addr = htonl(INADDR_ANY); + isc_sockaddr_fromin(&sockaddr_any4, &in4addr_any, 0); + isc_sockaddr_fromin6(&sockaddr_any6, &in6addr_any, 0); zone = isc_mem_get(mctx, sizeof *zone); if (zone == NULL) @@ -316,7 +321,8 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) { zone->idlein = DNS_DEFAULT_IDLEIN; zone->idleout = DNS_DEFAULT_IDLEOUT; ISC_LIST_INIT(zone->checkservers); - zone->xfrsource = sockaddr_any; + zone->xfrsource4 = sockaddr_any4; + zone->xfrsource6 = sockaddr_any6; zone->xfr = NULL; zone->maxxfrin = MAX_XFER_TIME; zone->maxxfrout = MAX_XFER_TIME; @@ -1389,20 +1395,37 @@ dns_zone_cleardbargs(dns_zone_t *zone) { } isc_result_t -dns_zone_setxfrsource(dns_zone_t *zone, isc_sockaddr_t *xfrsource) { +dns_zone_setxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource) { REQUIRE(DNS_ZONE_VALID(zone)); LOCK(&zone->lock); - zone->xfrsource = *xfrsource; + zone->xfrsource4 = *xfrsource; UNLOCK(&zone->lock); return (DNS_R_SUCCESS); } isc_sockaddr_t * -dns_zone_getxfrsource(dns_zone_t *zone) { +dns_zone_getxfrsource4(dns_zone_t *zone) { REQUIRE(DNS_ZONE_VALID(zone)); - return (&zone->xfrsource); + return (&zone->xfrsource4); +} + +isc_result_t +dns_zone_setxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource) { + REQUIRE(DNS_ZONE_VALID(zone)); + + LOCK(&zone->lock); + zone->xfrsource6 = *xfrsource; + UNLOCK(&zone->lock); + + return (DNS_R_SUCCESS); +} + +isc_sockaddr_t * +dns_zone_getxfrsource6(dns_zone_t *zone) { + REQUIRE(DNS_ZONE_VALID(zone)); + return (&zone->xfrsource6); } isc_result_t @@ -1859,8 +1882,9 @@ dns_zone_notify(dns_zone_t *zone) { * Enqueue notify request. */ for (i = 0; i < zone->notifycnt; i++) { + /* XXX IPv6 */ (void)dns_notify(origin, &zone->notify[i], dns_rdatatype_soa, - zone->rdclass, &zone->xfrsource, zone->mctx); + zone->rdclass, &zone->xfrsource4, zone->mctx); } dns_db_currentversion(zone->top, &version); @@ -1915,10 +1939,11 @@ dns_zone_notify(dns_zone_t *zone) { break; } if (i == zone->notifycnt) { + /* XXX IPv6 */ (void)dns_notify(origin, &addr, dns_rdatatype_soa, zone->rdclass, - &zone->xfrsource, zone->mctx); + &zone->xfrsource4, zone->mctx); } result = dns_rdataset_next(&ardset); } @@ -2780,7 +2805,10 @@ dns_zone_equal(dns_zone_t *oldzone, dns_zone_t *newzone) { if (strcmp(oldzone->db_argv[i], newzone->db_argv[i]) != 0) goto false; - if (!isc_sockaddr_equal(&oldzone->xfrsource, &newzone->xfrsource)) + if (!isc_sockaddr_equal(&oldzone->xfrsource4, &newzone->xfrsource4)) + goto false; + + if (!isc_sockaddr_equal(&oldzone->xfrsource6, &newzone->xfrsource6)) goto false; for (i = 0; i < oldzone->notifycnt; i++) diff --git a/lib/dns/zoneconf.c b/lib/dns/zoneconf.c index e97e07bf11..1abda59f32 100644 --- a/lib/dns/zoneconf.c +++ b/lib/dns/zoneconf.c @@ -96,15 +96,11 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac, isc_int32_t maxxfr; isc_int32_t idle; in_port_t port; - isc_sockaddr_t sockaddr_any; struct in_addr in4addr_any; + isc_sockaddr_t sockaddr_any4; - if (isc_net_probeipv6() == ISC_R_SUCCESS) - isc_sockaddr_fromin6(&sockaddr_any, &in6addr_any, 0); - else { - in4addr_any.s_addr = INADDR_ANY; - isc_sockaddr_fromin(&sockaddr_any, &in4addr_any, 0); - } + in4addr_any.s_addr = htonl(INADDR_ANY); + isc_sockaddr_fromin(&sockaddr_any4, &in4addr_any, 0); dns_zone_setclass(zone, czone->zclass); @@ -253,10 +249,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac, dns_zone_setmaxxfrin(zone, MAX_XFER_TIME); result = dns_c_zone_gettransfersource(czone, &sockaddr); - if (result == ISC_R_SUCCESS) - dns_zone_setxfrsource(zone, &sockaddr); - else - dns_zone_setxfrsource(zone, &sockaddr_any); + if (result != ISC_R_SUCCESS) { + result = dns_c_ctx_gettransfersource(cctx, &sockaddr); + if (result != ISC_R_SUCCESS) { + sockaddr = sockaddr_any4; + } + } + dns_zone_setxfrsource4(zone, &sockaddr); result = dns_c_zone_getmaxtransidlein(czone, &idle); if (result == ISC_R_SUCCESS) @@ -323,10 +322,13 @@ dns_zone_configure(dns_c_ctx_t *cctx, dns_aclconfctx_t *ac, dns_zone_setmaxxfrin(zone, MAX_XFER_TIME); result = dns_c_zone_gettransfersource(czone, &sockaddr); - if (result == ISC_R_SUCCESS) - dns_zone_setxfrsource(zone, &sockaddr); - else - dns_zone_setxfrsource(zone, &sockaddr_any); + if (result != ISC_R_SUCCESS) { + result = dns_c_ctx_gettransfersource(cctx, &sockaddr); + if (result != ISC_R_SUCCESS) { + sockaddr = sockaddr_any4; + } + } + dns_zone_setxfrsource4(zone, &sockaddr); result = dns_c_zone_getmaxtransidlein(czone, &idle); if (result == ISC_R_SUCCESS)