]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - hesiod/hesiod.c
Regenerate charmap-kw.h, locfile-kw.h
[thirdparty/glibc.git] / hesiod / hesiod.c
index e0ce510866f0c4793be70177d6c1339510c57ce9..bfb95633e352d029b0ffcc3436712e9b205c832b 100644 (file)
@@ -1,6 +1,19 @@
-#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$BINDId: hesiod.c,v 1.21 2000/02/28 14:51:08 vixie Exp $";
-#endif
+/* Copyright (C) 1997-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
 /*
  * Copyright (c) 1996,1999 by Internet Software Consortium.
@@ -46,24 +59,14 @@ static const char rcsid[] = "$BINDId: hesiod.c,v 1.21 2000/02/28 14:51:08 vixie
 
 #include "hesiod.h"
 #include "hesiod_p.h"
-#undef DEF_RHS
 
 #define _PATH_HESIOD_CONF "/etc/hesiod.conf"
 
 /* Forward */
 
-int            hesiod_init(void **context);
-void           hesiod_end(void *context);
-char *         hesiod_to_bind(void *context, const char *name,
-                              const char *type);
-char **                hesiod_resolve(void *context, const char *name,
-                              const char *type);
-void           hesiod_free_list(void *context, char **list);
-
 static int     parse_config_file(struct hesiod_p *ctx, const char *filename);
 static char ** get_txt_records(struct hesiod_p *ctx, int class,
                                const char *name);
-static int     init(struct hesiod_p *ctx);
 
 /* Public */
 
@@ -82,34 +85,21 @@ 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");
+       configname = __libc_secure_getenv("HESIOD_CONFIG");
        if (!configname)
          configname = _PATH_HESIOD_CONF;
        if (parse_config_file(ctx, configname) < 0) {
-#ifdef DEF_RHS
-               /*
-                * Use compiled in defaults.
-                */
-               ctx->LHS = malloc(strlen(DEF_LHS)+1);
-               ctx->RHS = malloc(strlen(DEF_RHS)+1);
-               if (ctx->LHS == 0 || ctx->RHS == 0)
-                       goto cleanup;
-               strcpy(ctx->LHS, DEF_LHS);
-               strcpy(ctx->RHS, DEF_RHS);
-#else
                goto cleanup;
-#endif
        }
        /*
         * The default RHS can be overridden by an environment
         * variable.
         */
-       if ((cp = __secure_getenv("HES_DOMAIN")) != NULL) {
+       if ((cp = __libc_secure_getenv("HES_DOMAIN")) != NULL) {
                free(ctx->RHS);
                ctx->RHS = malloc(strlen(cp)+2);
                if (!ctx->RHS)
@@ -126,16 +116,11 @@ hesiod_init(void **context) {
         * If there is no default hesiod realm set, we return an
         * error.
         */
-       if (!ctx->RHS || ctx->classes[0] == 0 || ctx->classes[0] == ctx->classes[1]) {
+       if (!ctx->RHS) {
                __set_errno(ENOEXEC);
                goto cleanup;
        }
 
-#if 0
-       if (res_ninit(ctx->res) < 0)
-               goto cleanup;
-#endif
-
        *context = ctx;
        return (0);
 
@@ -152,12 +137,8 @@ hesiod_end(void *context) {
        struct hesiod_p *ctx = (struct hesiod_p *) context;
        int save_errno = errno;
 
-       if (ctx->res)
-               res_nclose(ctx->res);
        free(ctx->RHS);
        free(ctx->LHS);
-       if (ctx->res && ctx->free_res)
-               (*ctx->free_res)(ctx->res);
        free(ctx);
        __set_errno(save_errno);
 }
@@ -232,10 +213,6 @@ hesiod_resolve(void *context, const char *name, const char *type) {
 
        if (bindname == NULL)
                return (NULL);
-       if (init(ctx) == -1) {
-               free(bindname);
-               return (NULL);
-       }
 
        retvec = get_txt_records(ctx, ctx->classes[0], bindname);
 
@@ -278,7 +255,7 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
        /*
         * Now open and parse the file...
         */
-       if (!(fp = fopen(filename, "r")))
+       if (!(fp = fopen(filename, "rce")))
                return (-1);
 
        while (fgets(buf, sizeof(buf), fp) != NULL) {
@@ -327,7 +304,8 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
                                   nother at all.  */
                                ctx->classes[0] = C_IN;
                                ctx->classes[1] = C_HS;
-                       } else if (n == 1)
+                       } else if (n == 1
+                                  || ctx->classes[0] == ctx->classes[1])
                                ctx->classes[1] = 0;
                }
        }
@@ -364,13 +342,13 @@ get_txt_records(struct hesiod_p *ctx, int class, const char *name) {
        /*
         * Construct the query and send it.
         */
-       n = res_nmkquery(ctx->res, QUERY, name, class, T_TXT, NULL, 0,
+       n = res_mkquery(QUERY, name, class, T_TXT, NULL, 0,
                         NULL, qbuf, MAX_HESRESP);
        if (n < 0) {
                __set_errno(EMSGSIZE);
                return (NULL);
        }
-       n = res_nsend(ctx->res, qbuf, n, abuf, MAX_HESRESP);
+       n = res_send(qbuf, n, abuf, MAX_HESRESP);
        if (n < 0) {
                __set_errno(ECONNREFUSED);
                return (NULL);
@@ -420,7 +398,7 @@ get_txt_records(struct hesiod_p *ctx, int class, const char *name) {
                cp += INT16SZ + INT32SZ;        /* skip the ttl, too */
                rr.dlen = ns_get16(cp);
                cp += INT16SZ;
-               if (cp + rr.dlen > eom) {
+               if (rr.dlen == 0 || cp + rr.dlen > eom) {
                        __set_errno(EMSGSIZE);
                        goto cleanup;
                }
@@ -463,50 +441,3 @@ get_txt_records(struct hesiod_p *ctx, int class, const char *name) {
        free(list);
        return (NULL);
 }
-
-struct __res_state *
-__hesiod_res_get(void *context) {
-       struct hesiod_p *ctx = context;
-
-       if (!ctx->res) {
-               struct __res_state *res;
-               res = (struct __res_state *)calloc(1, sizeof *res);
-               if (res == NULL)
-                       return (NULL);
-               __hesiod_res_set(ctx, res, free);
-       }
-
-       return (ctx->res);
-}
-
-void
-__hesiod_res_set(void *context, struct __res_state *res,
-                void (*free_res)(void *)) {
-       struct hesiod_p *ctx = context;
-
-       if (ctx->res && ctx->free_res) {
-               res_nclose(ctx->res);
-               if ((ctx->res->options & RES_INIT) && ctx->res->nscount > 0) {
-                       for (int ns = 0; ns < MAXNS; ns++) {
-                               free (ctx->res->_u._ext.nsaddrs[ns]);
-                               ctx->res->_u._ext.nsaddrs[ns] = NULL;
-                       }
-               }
-               (*ctx->free_res)(ctx->res);
-       }
-
-       ctx->res = res;
-       ctx->free_res = free_res;
-}
-
-static int
-init(struct hesiod_p *ctx) {
-
-       if (!ctx->res && !__hesiod_res_get(ctx))
-               return (-1);
-
-       if (__res_maybe_init (ctx->res, 0) == -1)
-               return (-1);
-
-       return (0);
-}