Generic __longjmp.c.
[kopensolaris-gnu/glibc.git] / resolv / res_data.c
index a9f5a2a..1beea1d 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$BINDId: res_data.c,v 8.17 1999/10/13 17:11:31 vixie Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -31,13 +31,14 @@ static const char rcsid[] = "$Id$";
 #include <ctype.h>
 #include <netdb.h>
 #include <resolv.h>
+#ifdef BIND_UPDATE
+#include <res_update.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
-#undef _res
-
 const char *_res_opcodes[] = {
        "QUERY",
        "IQUERY",
@@ -56,9 +57,10 @@ const char *_res_opcodes[] = {
        "ZONEINIT",
        "ZONEREF",
 };
+libresolv_hidden_data_def (_res_opcodes)
 
 #ifdef BIND_UPDATE
-const char *_res_sectioncodes[] = {
+const char *_res_sectioncodes[] attribute_hidden = {
        "ZONE",
        "PREREQUISITES",
        "UPDATE",
@@ -67,11 +69,10 @@ const char *_res_sectioncodes[] = {
 #endif
 
 #ifndef __BIND_NOSTATIC
-
 #ifdef _LIBC
-extern struct __res_state _res;
+/* The definition has been moved to res_libc.c.  */
 #else
-/* The declaration has been moved to res_libc.c.  */
+#undef _res
 struct __res_state _res
 # if defined(__BIND_RES_TEXT)
        = { RES_TIMEOUT, }      /* Motorola, et al. */
@@ -80,12 +81,13 @@ struct __res_state _res
 #endif
 
 /* Proto. */
-
+#ifndef _LIBC
 int  res_ourserver_p(const res_state, const struct sockaddr_in *);
 void res_pquery(const res_state, const u_char *, int, FILE *);
+#endif
 
 #ifndef _LIBC
-/* Moved to res_libc.c since res_init should go into libc.so but the
+/* Moved to res_libc.c since res_init() should go into libc.so but the
    rest of this file not.  */
 int
 res_init(void) {
@@ -137,14 +139,16 @@ void
 fp_query(const u_char *msg, FILE *file) {
        fp_nquery(msg, PACKETSZ, file);
 }
+libresolv_hidden_def (fp_query)
 
 void
 fp_nquery(const u_char *msg, int len, FILE *file) {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1)
+       if (__res_maybe_init (&_res, 0) == -1)
                return;
 
        res_pquery(&_res, msg, len, file);
 }
+libresolv_hidden_def (fp_nquery)
 
 int
 res_mkquery(int op,                    /* opcode of query */
@@ -156,7 +160,7 @@ res_mkquery(int op,                 /* opcode of query */
            u_char *buf,                /* buffer to put query */
            int buflen)                 /* size of buffer */
 {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
                return (-1);
        }
@@ -168,7 +172,7 @@ res_mkquery(int op,                 /* opcode of query */
 #ifdef BIND_UPDATE
 int
 res_mkupdate(ns_updrec *rrecp_in, u_char *buf, int buflen) {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
                return (-1);
        }
@@ -183,7 +187,7 @@ res_query(const char *name, /* domain name */
          u_char *answer,       /* buffer to put answer */
          int anslen)           /* size of answer buffer */
 {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
                return (-1);
        }
@@ -202,12 +206,12 @@ res_send_setrhook(res_send_rhook hook) {
 
 int
 res_isourserver(const struct sockaddr_in *inp) {
-       return (res_ourserver_p(&_res, inp));
+       return (res_ourserver_p(&_res, (const struct sockaddr_in6 *) inp));
 }
 
 int
 res_send(const u_char *buf, int buflen, u_char *ans, int anssiz) {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                /* errno should have been set by res_init() in this case. */
                return (-1);
        }
@@ -220,7 +224,7 @@ int
 res_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key,
               u_char *ans, int anssiz)
 {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                /* errno should have been set by res_init() in this case. */
                return (-1);
        }
@@ -231,13 +235,26 @@ res_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key,
 
 void
 res_close(void) {
-       res_nclose(&_res);
+#ifdef _LIBC
+       /*
+        * Some stupid programs out there call res_close() before res_init().
+        * Since _res._vcsock isn't explicitly initialized, these means that
+        * we could do a close(0), which might lead to some security problems.
+        * Therefore we check if res_init() was called before by looking at
+        * the RES_INIT bit in _res.options.  If it hasn't been set we bail out
+        * early.  */
+       if ((_res.options & RES_INIT) == 0)
+         return;
+#endif
+       /* We don't free the name server addresses because we never
+          did it and it would be done implicitly on shutdown.  */
+       __res_iclose(&_res, false);
 }
 
 #ifdef BIND_UPDATE
 int
 res_update(ns_updrec *rrecp_in) {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
                return (-1);
        }
@@ -252,7 +269,7 @@ res_search(const char *name,        /* domain name */
           u_char *answer,      /* buffer to put answer */
           int anslen)          /* size of answer */
 {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
                return (-1);
        }
@@ -267,7 +284,7 @@ res_querydomain(const char *name,
                u_char *answer,         /* buffer to put answer */
                int anslen)             /* size of answer */
 {
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 1) == -1) {
                RES_SET_H_ERRNO(&_res, NETDB_INTERNAL);
                return (-1);
        }
@@ -283,6 +300,7 @@ hostalias(const char *name) {
 
        return (res_hostalias(&_res, name, abuf, sizeof abuf));
 }
+libresolv_hidden_def (hostalias)
 
 #ifdef ultrix
 int
@@ -302,3 +320,17 @@ local_hostname_length(const char *hostname) {
 #endif /*ultrix*/
 
 #endif
+\f
+
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libresolv, GLIBC_2_0, GLIBC_2_2)
+# undef res_mkquery
+# undef res_query
+# undef res_querydomain
+# undef res_search
+weak_alias (__res_mkquery, res_mkquery);
+weak_alias (__res_query, res_query);
+weak_alias (__res_querydomain, res_querydomain);
+weak_alias (__res_search, res_search);
+#endif