mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-12 14:21:18 +08:00
2005-06-15 Jakub Jelinek <jakub@redhat.com>
[BZ #1088] * hesiod/hesiod.c (hesiod_init): Don't check for ctx->classes[0] == 0 or both classes equal here. (parse_config_file): If both classes are equal, clear the second one. 2005-06-08 Karl Kelley <kekelley@iastate.edu> [BZ #1088] * hesiod/hesiod_p.h (struct hesiod_p): Add classes array. * hesiod/hesiod.c (hesiod_init): Initialize classes. Fail if no valid classes were given or if both are equal. (hesiod_resolve): Use ctx->classes instead of hardcoded C_IN and C_HS order. (parse_config_file): Handle classes keyword. * hesiod/README.hesiod: Mention addition of the classes keyword.
This commit is contained in:
parent
58f03486fe
commit
8a3c12adff
@ -83,6 +83,9 @@ hesiod_init(void **context) {
|
||||
ctx->LHS = NULL;
|
||||
ctx->RHS = NULL;
|
||||
ctx->res = NULL;
|
||||
/* Set default query classes. */
|
||||
ctx->classes[0] = C_IN;
|
||||
ctx->classes[1] = C_HS;
|
||||
|
||||
configname = __secure_getenv("HESIOD_CONFIG");
|
||||
if (!configname)
|
||||
@ -234,15 +237,12 @@ hesiod_resolve(void *context, const char *name, const char *type) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((retvec = get_txt_records(ctx, C_IN, bindname))) {
|
||||
free(bindname);
|
||||
return (retvec);
|
||||
}
|
||||
retvec = get_txt_records(ctx, ctx->classes[0], bindname);
|
||||
|
||||
if (retvec == NULL && (errno == ENOENT || errno == ECONNREFUSED) && ctx->classes[1])
|
||||
retvec = get_txt_records(ctx, ctx->classes[1], bindname);
|
||||
|
||||
if (errno != ENOENT && errno != ECONNREFUSED)
|
||||
return (NULL);
|
||||
|
||||
retvec = get_txt_records(ctx, C_HS, bindname);
|
||||
free(bindname);
|
||||
return (retvec);
|
||||
}
|
||||
@ -261,7 +261,6 @@ hesiod_free_list(void *context, char **list) {
|
||||
*/
|
||||
static int
|
||||
parse_config_file(struct hesiod_p *ctx, const char *filename) {
|
||||
char *key, *data, *cp, **cpp;
|
||||
char buf[MAXDNAME+7];
|
||||
FILE *fp;
|
||||
|
||||
@ -272,6 +271,9 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
|
||||
free(ctx->RHS);
|
||||
free(ctx->LHS);
|
||||
ctx->RHS = ctx->LHS = 0;
|
||||
/* Set default query classes. */
|
||||
ctx->classes[0] = C_IN;
|
||||
ctx->classes[1] = C_HS;
|
||||
|
||||
/*
|
||||
* Now open and parse the file...
|
||||
@ -280,6 +282,8 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
|
||||
return (-1);
|
||||
|
||||
while (fgets(buf, sizeof(buf), fp) != NULL) {
|
||||
char *key, *data, *cp, **cpp;
|
||||
|
||||
cp = buf;
|
||||
if (*cp == '#' || *cp == '\n' || *cp == '\r')
|
||||
continue;
|
||||
@ -297,17 +301,36 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
|
||||
cp++;
|
||||
*cp++ = '\0';
|
||||
|
||||
if (strcmp(key, "lhs") == 0)
|
||||
cpp = NULL;
|
||||
if (strcasecmp(key, "lhs") == 0)
|
||||
cpp = &ctx->LHS;
|
||||
else if (strcmp(key, "rhs") == 0)
|
||||
else if (strcasecmp(key, "rhs") == 0)
|
||||
cpp = &ctx->RHS;
|
||||
else
|
||||
continue;
|
||||
|
||||
*cpp = malloc(strlen(data) + 1);
|
||||
if (!*cpp)
|
||||
goto cleanup;
|
||||
strcpy(*cpp, data);
|
||||
if (cpp) {
|
||||
*cpp = strdup(data);
|
||||
if (!*cpp)
|
||||
goto cleanup;
|
||||
} else if (strcasecmp(key, "classes") == 0) {
|
||||
int n = 0;
|
||||
while (*data && n < 2) {
|
||||
cp = strchrnul(data, ',');
|
||||
if (*cp != '\0')
|
||||
*cp++ = '\0';
|
||||
if (strcasecmp(data, "IN") == 0)
|
||||
ctx->classes[n++] = C_IN;
|
||||
else if (strcasecmp(data, "HS") == 0)
|
||||
ctx->classes[n++] = C_HS;
|
||||
data = cp;
|
||||
}
|
||||
if (n == 0) {
|
||||
/* Restore the default. Better than
|
||||
nother at all. */
|
||||
ctx->classes[0] = C_IN;
|
||||
ctx->classes[1] = C_HS;
|
||||
} else if (n == 1
|
||||
|| ctx->classes[0] == ctx->classes[1])
|
||||
ctx->classes[1] = 0;
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
return (0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user