Remove Name_Service definition.
[kopensolaris-gnu/glibc.git] / resolv / gethnamaddr.c
index 1ab102b..7be2315 100644 (file)
@@ -51,7 +51,6 @@
 
 #if defined(LIBC_SCCS) && !defined(lint)
 static char sccsid[] = "@(#)gethostnamadr.c    8.1 (Berkeley) 6/4/93";
-static char rcsid[] = "$Id$";
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -108,11 +107,11 @@ static u_char host_addr[16];      /* IPv4 or IPv6 */
 static FILE *hostf = NULL;
 static int stayopen = 0;
 
-static void map_v4v6_address __P((const char *src, char *dst));
-static void map_v4v6_hostent __P((struct hostent *hp, char **bp, int *len));
+static void map_v4v6_address (const char *src, char *dst) __THROW;
+static void map_v4v6_hostent (struct hostent *hp, char **bp, int *len) __THROW;
 
 #ifdef RESOLVSORT
-extern void addrsort __P((char **, int));
+extern void addrsort (char **, int) __THROW;
 #endif
 
 #if PACKETSZ > 65536
@@ -143,7 +142,7 @@ extern int h_errno;
 
 #ifdef DEBUG
 static void
-dprintf(msg, num)
+Dprintf(msg, num)
        char *msg;
        int num;
 {
@@ -155,7 +154,7 @@ dprintf(msg, num)
        }
 }
 #else
-# define dprintf(msg, num) /*nada*/
+# define Dprintf(msg, num) /*nada*/
 #endif
 
 #define BOUNDED_INCR(x) \
@@ -177,11 +176,7 @@ dprintf(msg, num)
 
 
 static struct hostent *
-getanswer(answer, anslen, qname, qtype)
-       const querybuf *answer;
-       int anslen;
-       const char *qname;
-       int qtype;
+getanswer (const querybuf *answer, int anslen, const char *qname, int qtype)
 {
        register const HEADER *hp;
        register const u_char *cp;
@@ -193,7 +188,7 @@ getanswer(answer, anslen, qname, qtype)
        int toobig = 0;
        char tbuf[MAXDNAME];
        const char *tname;
-       int (*name_ok) __P((const char *));
+       int (*name_ok) (const char *);
 
        tname = qname;
        host.h_name = NULL;
@@ -262,9 +257,9 @@ getanswer(answer, anslen, qname, qtype)
                cp += n;                        /* name */
                BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ);
                type = ns_get16(cp);
-               cp += INT16SZ;                  /* type */
+               cp += INT16SZ;                  /* type */
                class = ns_get16(cp);
-               cp += INT16SZ + INT32SZ;        /* class, TTL */
+               cp += INT16SZ + INT32SZ;        /* class, TTL */
                n = ns_get16(cp);
                cp += INT16SZ;                  /* len */
                BOUNDS_CHECK(cp, n);
@@ -429,13 +424,13 @@ getanswer(answer, anslen, qname, qtype)
                        bp += sizeof(align) - ((u_long)bp % sizeof(align));
 
                        if (bp + n >= &hostbuf[sizeof hostbuf]) {
-                               dprintf("size (%d) too big\n", n);
+                               Dprintf("size (%d) too big\n", n);
                                had_error++;
                                continue;
                        }
                        if (hap >= &h_addr_ptrs[MAXADDRS-1]) {
                                if (!toobig++) {
-                                       dprintf("Too many addresses (%d)\n",
+                                       Dprintf("Too many addresses (%d)\n",
                                                MAXADDRS);
                                }
                                cp += n;
@@ -487,16 +482,19 @@ getanswer(answer, anslen, qname, qtype)
        return (NULL);
 }
 
+extern struct hostent *gethostbyname2(const char *name, int af);
+libresolv_hidden_proto (gethostbyname2)
+
 struct hostent *
 gethostbyname(name)
        const char *name;
 {
        struct hostent *hp;
 
-       if ((_res.options & RES_INIT) == 0 && __res_ninit(&_res) == -1) {
+       if (__res_maybe_init (&_res, 0) == -1) {
                __set_h_errno (NETDB_INTERNAL);
                return (NULL);
-       }
+       }
        if (_res.options & RES_USE_INET6) {
                hp = gethostbyname2(name, AF_INET6);
                if (hp)
@@ -510,13 +508,18 @@ gethostbyname2(name, af)
        const char *name;
        int af;
 {
-       querybuf buf;
+       union
+       {
+         querybuf *buf;
+         u_char *ptr;
+       } buf;
+       querybuf *origbuf;
        register const char *cp;
        char *bp;
        int n, size, type, len;
-       extern struct hostent *_gethtbyname2();
+       struct hostent *ret;
 
-       if ((_res.options & RES_INIT) == 0 && __res_ninit(&_res) == -1) {
+       if (__res_maybe_init (&_res, 0) == -1) {
                __set_h_errno (NETDB_INTERNAL);
                return (NULL);
        }
@@ -615,14 +618,23 @@ gethostbyname2(name, af)
                                break;
                }
 
-       if ((n = res_nsearch(&_res, name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) {
-               dprintf("res_nsearch failed (%d)\n", n);
+       buf.buf = origbuf = (querybuf *) alloca (1024);
+
+       if ((n = __libc_res_nsearch(&_res, name, C_IN, type, buf.buf->buf, 1024,
+                                   &buf.ptr)) < 0) {
+               if (buf.buf != origbuf)
+                       free (buf.buf);
+               Dprintf("res_nsearch failed (%d)\n", n);
                if (errno == ECONNREFUSED)
                        return (_gethtbyname2(name, af));
                return (NULL);
        }
-       return (getanswer(&buf, n, name, type));
+       ret = getanswer(buf.buf, n, name, type);
+       if (buf.buf != origbuf)
+               free (buf.buf);
+       return ret;
 }
+libresolv_hidden_def (gethostbyname2)
 
 struct hostent *
 gethostbyaddr(addr, len, af)
@@ -635,7 +647,12 @@ gethostbyaddr(addr, len, af)
        static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
        int n;
        socklen_t size;
-       querybuf buf;
+       union
+       {
+         querybuf *buf;
+         u_char *ptr;
+       } buf;
+       querybuf *orig_buf;
        register struct hostent *hp;
        char qbuf[MAXDNAME+1], *qp = NULL;
 #ifdef SUNSECURITY
@@ -644,9 +661,8 @@ gethostbyaddr(addr, len, af)
        u_long old_options;
        char hname2[MAXDNAME+1];
 #endif /*SUNSECURITY*/
-       extern struct hostent *_gethtbyaddr();
 
-       if ((_res.options & RES_INIT) == 0 && __res_ninit(&_res) == -1) {
+       if (__res_maybe_init (&_res, 0) == -1) {
                __set_h_errno (NETDB_INTERNAL);
                return (NULL);
        }
@@ -696,18 +712,29 @@ gethostbyaddr(addr, len, af)
        default:
                abort();
        }
-       n = res_nquery(&_res, qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
-       if (n < 0 && af == AF_INET6) {
+
+       buf.buf = orig_buf = (querybuf *) alloca (1024);
+
+       n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf, 1024,
+                             &buf.ptr);
+       if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0) {
                strcpy(qp, "ip6.int");
-               n = res_nquery(&_res, qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
+               n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf,
+                                     buf.buf != orig_buf ? MAXPACKET : 1024,
+                                     &buf.ptr);
        }
        if (n < 0) {
-               dprintf("res_nquery failed (%d)\n", n);
+               if (buf.buf != orig_buf)
+                       free (buf.buf);
+               Dprintf("res_nquery failed (%d)\n", n);
                if (errno == ECONNREFUSED)
                        return (_gethtbyaddr(addr, len, af));
                return (NULL);
        }
-       if (!(hp = getanswer(&buf, n, qbuf, T_PTR)))
+       hp = getanswer(buf.buf, n, qbuf, T_PTR);
+       if (buf.buf != orig_buf)
+               free (buf.buf);
+       if (!hp)
                return (NULL);  /* h_errno was set by getanswer() */
 #ifdef SUNSECURITY
        if (af == AF_INET) {
@@ -765,6 +792,7 @@ _sethtent(f)
                rewind(hostf);
        stayopen = f;
 }
+libresolv_hidden_def (_sethtent)
 
 void
 _endhtent()
@@ -839,12 +867,12 @@ _gethtent()
        __set_h_errno (NETDB_SUCCESS);
        return (&host);
 }
+libresolv_hidden_def (_gethtent)
 
 struct hostent *
 _gethtbyname(name)
        const char *name;
 {
-       extern struct hostent *_gethtbyname2();
        struct hostent *hp;
 
        if (_res.options & RES_USE_INET6) {
@@ -877,6 +905,7 @@ _gethtbyname2(name, af)
        _endhtent();
        return (p);
 }
+libresolv_hidden_def (_gethtbyname2)
 
 struct hostent *
 _gethtbyaddr(addr, len, af)
@@ -893,6 +922,7 @@ _gethtbyaddr(addr, len, af)
        _endhtent();
        return (p);
 }
+libresolv_hidden_def (_gethtbyaddr)
 
 static void
 map_v4v6_address(src, dst)