mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
search path processing is now done in the server
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: lwresutil.c,v 1.23 2000/08/01 01:32:29 tale Exp $ */
|
/* $Id: lwresutil.c,v 1.24 2000/10/28 00:37:52 bwelling Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@@ -112,25 +112,6 @@ lwres_addr_parse(lwres_buffer_t *b, lwres_addr_t *addr)
|
|||||||
return (LWRES_R_SUCCESS);
|
return (LWRES_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
count_dots(const char *name, unsigned int *ndots, unsigned int *last_was_dot)
|
|
||||||
{
|
|
||||||
const char *p;
|
|
||||||
|
|
||||||
p = name;
|
|
||||||
*ndots = 0;
|
|
||||||
*last_was_dot = 0;
|
|
||||||
|
|
||||||
while (*p != 0) {
|
|
||||||
if (*p++ == '.') {
|
|
||||||
(*ndots)++;
|
|
||||||
*last_was_dot = 1;
|
|
||||||
} else {
|
|
||||||
*last_was_dot = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lwres_result_t
|
lwres_result_t
|
||||||
lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
|
lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
|
||||||
lwres_uint32_t addrtypes, lwres_gabnresponse_t **structp)
|
lwres_uint32_t addrtypes, lwres_gabnresponse_t **structp)
|
||||||
@@ -143,30 +124,14 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
|
|||||||
lwres_lwpacket_t pkt;
|
lwres_lwpacket_t pkt;
|
||||||
lwres_uint32_t serial;
|
lwres_uint32_t serial;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
int current_suffix;
|
|
||||||
unsigned int ndots;
|
|
||||||
unsigned int last_was_dot;
|
|
||||||
unsigned int exact_first;
|
|
||||||
char target_name[1024];
|
char target_name[1024];
|
||||||
unsigned int target_length;
|
unsigned int target_length;
|
||||||
unsigned int tried_exact;
|
|
||||||
unsigned int tried_search;
|
|
||||||
|
|
||||||
REQUIRE(ctx != NULL);
|
REQUIRE(ctx != NULL);
|
||||||
REQUIRE(name != NULL);
|
REQUIRE(name != NULL);
|
||||||
REQUIRE(addrtypes != 0);
|
REQUIRE(addrtypes != 0);
|
||||||
REQUIRE(structp != NULL && *structp == NULL);
|
REQUIRE(structp != NULL && *structp == NULL);
|
||||||
|
|
||||||
count_dots(name, &ndots, &last_was_dot);
|
|
||||||
if (last_was_dot || (ndots >= ctx->confdata.ndots))
|
|
||||||
exact_first = 1;
|
|
||||||
else
|
|
||||||
exact_first = 0;
|
|
||||||
|
|
||||||
current_suffix = 0;
|
|
||||||
tried_exact = 0;
|
|
||||||
tried_search = 0;
|
|
||||||
|
|
||||||
b_in.base = NULL;
|
b_in.base = NULL;
|
||||||
b_out.base = NULL;
|
b_out.base = NULL;
|
||||||
response = NULL;
|
response = NULL;
|
||||||
@@ -179,49 +144,10 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* First, if the name ends in a dot, do an exact search. Lie and
|
|
||||||
* pretend we have already done a search.
|
|
||||||
*/
|
|
||||||
if (last_was_dot)
|
|
||||||
tried_search = 1;
|
|
||||||
|
|
||||||
next_suffix:
|
|
||||||
|
|
||||||
if (tried_exact && tried_search) {
|
|
||||||
ret = LWRES_R_NOTFOUND;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try the exact search first. If this fails, try the
|
|
||||||
* search list.
|
|
||||||
*/
|
|
||||||
if (exact_first && !tried_exact) {
|
|
||||||
tried_exact = 1;
|
|
||||||
target_length = strlen(name);
|
target_length = strlen(name);
|
||||||
if (target_length >= sizeof(target_name))
|
if (target_length >= sizeof(target_name))
|
||||||
goto next_suffix;
|
return (LWRES_R_FAILURE);
|
||||||
strcpy(target_name, name); /* strcpy is safe */
|
strcpy(target_name, name); /* strcpy is safe */
|
||||||
} else {
|
|
||||||
INSIST(!tried_search);
|
|
||||||
if (current_suffix >= ctx->confdata.searchnxt) {
|
|
||||||
tried_search = 1;
|
|
||||||
exact_first = 1;
|
|
||||||
goto next_suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
target_length = strlen(name)
|
|
||||||
+ strlen(ctx->confdata.search[current_suffix])
|
|
||||||
+ 1;
|
|
||||||
if (target_length >= sizeof(target_name)) {
|
|
||||||
current_suffix++;
|
|
||||||
goto next_suffix; /* XXXMLG */
|
|
||||||
}
|
|
||||||
sprintf(target_name, "%s.%s", /* sprintf is safe */
|
|
||||||
name, ctx->confdata.search[current_suffix]);
|
|
||||||
current_suffix++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up our request and render it to a buffer.
|
* Set up our request and render it to a buffer.
|
||||||
@@ -269,9 +195,6 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name,
|
|||||||
b_out.base = NULL;
|
b_out.base = NULL;
|
||||||
b_out.length = 0;
|
b_out.length = 0;
|
||||||
|
|
||||||
if (pkt.result == LWRES_R_NOTFOUND)
|
|
||||||
goto next_suffix;
|
|
||||||
|
|
||||||
if (pkt.result != LWRES_R_SUCCESS) {
|
if (pkt.result != LWRES_R_SUCCESS) {
|
||||||
ret = pkt.result;
|
ret = pkt.result;
|
||||||
goto out;
|
goto out;
|
||||||
|
Reference in New Issue
Block a user