Remove uses of __P and __PMT.
[kopensolaris-gnu/glibc.git] / resolv / gethnamaddr.c
index 4484b81..1a4b08e 100644 (file)
@@ -68,6 +68,8 @@ static char rcsid[] = "$Id$";
 #include <errno.h>
 #include <syslog.h>
 
+#define RESOLVSORT
+
 #ifndef LOG_AUTH
 # define LOG_AUTH 0
 #endif
@@ -106,17 +108,17 @@ 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 > 1024
+#if PACKETSZ > 65536
 #define        MAXPACKET       PACKETSZ
 #else
-#define        MAXPACKET       1024
+#define        MAXPACKET       65536
 #endif
 
 /* As per RFC 1034 and 1035 a host name cannot exceed 255 octets in length.  */
@@ -141,7 +143,7 @@ extern int h_errno;
 
 #ifdef DEBUG
 static void
-dprintf(msg, num)
+Dprintf(msg, num)
        char *msg;
        int num;
 {
@@ -153,7 +155,7 @@ dprintf(msg, num)
        }
 }
 #else
-# define dprintf(msg, num) /*nada*/
+# define Dprintf(msg, num) /*nada*/
 #endif
 
 #define BOUNDED_INCR(x) \
@@ -191,7 +193,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;
@@ -259,11 +261,11 @@ getanswer(answer, anslen, qname, qtype)
                }
                cp += n;                        /* name */
                BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ);
-               type = _getshort(cp);
-               cp += INT16SZ;                  /* type */
-               class = _getshort(cp);
-               cp += INT16SZ + INT32SZ;        /* class, TTL */
-               n = _getshort(cp);
+               type = ns_get16(cp);
+               cp += INT16SZ;                  /* type */
+               class = ns_get16(cp);
+               cp += INT16SZ + INT32SZ;        /* class, TTL */
+               n = ns_get16(cp);
                cp += INT16SZ;                  /* len */
                BOUNDS_CHECK(cp, n);
                erdata = cp + n;
@@ -420,22 +422,26 @@ getanswer(answer, anslen, qname, qtype)
                                buflen -= nn;
                        }
 
+                       /* XXX: when incrementing bp, we have to decrement
+                        * buflen by the same amount --okir */
+                       buflen -= sizeof(align) - ((u_long)bp % sizeof(align));
+
                        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;
                                continue;
                        }
-                       bcopy(cp, *hap++ = bp, n);
+                       memmove(*hap++ = bp, cp, n);
                        bp += n;
                        buflen -= n;
                        cp += n;
@@ -487,10 +493,10 @@ gethostbyname(name)
 {
        struct hostent *hp;
 
-       if ((_res.options & RES_INIT) == 0 && res_init() == -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)
@@ -504,13 +510,19 @@ 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;
+       struct hostent *ret;
        extern struct hostent *_gethtbyname2();
 
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 0) == -1) {
                __set_h_errno (NETDB_INTERNAL);
                return (NULL);
        }
@@ -609,28 +621,42 @@ gethostbyname2(name, af)
                                break;
                }
 
-       if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) {
-               dprintf("res_search 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;
 }
 
 struct hostent *
 gethostbyaddr(addr, len, af)
-       const char *addr;       /* XXX should have been def'd as u_char! */
-       size_t len;
+       const void *addr;
+       socklen_t len;
        int af;
 {
        const u_char *uaddr = (const u_char *)addr;
        static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
        static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
-       int n, size;
-       querybuf buf;
+       int n;
+       socklen_t size;
+       union
+       {
+         querybuf *buf;
+         u_char *ptr;
+       } buf;
+       querybuf *orig_buf;
        register struct hostent *hp;
-       char qbuf[MAXDNAME+1], *qp;
+       char qbuf[MAXDNAME+1], *qp = NULL;
 #ifdef SUNSECURITY
        register struct hostent *rhp;
        char **haddr;
@@ -639,7 +665,7 @@ gethostbyaddr(addr, len, af)
 #endif /*SUNSECURITY*/
        extern struct hostent *_gethtbyaddr();
 
-       if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+       if (__res_maybe_init (&_res, 0) == -1) {
                __set_h_errno (NETDB_INTERNAL);
                return (NULL);
        }
@@ -684,19 +710,34 @@ gethostbyaddr(addr, len, af)
                                       uaddr[n] & 0xf,
                                       (uaddr[n] >> 4) & 0xf));
                }
-               strcpy(qp, "ip6.int");
+               strcpy(qp, "ip6.arpa");
                break;
        default:
                abort();
        }
-       n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
+
+       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 = __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_query 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) {
@@ -732,7 +773,7 @@ gethostbyaddr(addr, len, af)
 #endif /*SUNSECURITY*/
        hp->h_addrtype = af;
        hp->h_length = len;
-       bcopy(addr, host_addr, len);
+       memmove(host_addr, addr, len);
        h_addr_ptrs[0] = (char *)host_addr;
        h_addr_ptrs[1] = NULL;
        if (af == AF_INET && (_res.options & RES_USE_INET6)) {
@@ -893,14 +934,14 @@ map_v4v6_address(src, dst)
        int i;
 
        /* Stash a temporary copy so our caller can update in place. */
-       bcopy(src, tmp, INADDRSZ);
+       memcpy(tmp, src, INADDRSZ);
        /* Mark this ipv6 addr as a mapped ipv4. */
        for (i = 0; i < 10; i++)
                *p++ = 0x00;
        *p++ = 0xff;
        *p++ = 0xff;
        /* Retrieve the saved copy and we're done. */
-       bcopy(tmp, (void*)p, INADDRSZ);
+       memcpy((void*)p, tmp, INADDRSZ);
 }
 
 static void