(hesiod_init): Initialize classes. Fail if no
authordrepper <drepper>
Wed, 15 Jun 2005 04:13:45 +0000 (04:13 +0000)
committerdrepper <drepper>
Wed, 15 Jun 2005 04:13:45 +0000 (04:13 +0000)
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/hesiod.c

index 7fffb31..e0ce510 100644 (file)
@@ -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)
@@ -123,7 +126,7 @@ hesiod_init(void **context) {
         * If there is no default hesiod realm set, we return an
         * error.
         */
-       if (!ctx->RHS) {
+       if (!ctx->RHS || ctx->classes[0] == 0 || ctx->classes[0] == ctx->classes[1]) {
                __set_errno(ENOEXEC);
                goto cleanup;
        }
@@ -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,35 @@ 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[1] = 0;
+               }
        }
        fclose(fp);
        return (0);