(arg_service_list): Reduce size of svcs and mark const.
[kopensolaris-gnu/glibc.git] / resolv / inet_pton.c
index d9e1f1d..c507013 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (c) 1996 by Internet Software Consortium.
+/*
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +16,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$Id$";
+static const char rcsid[] = "$BINDId: inet_pton.c,v 1.7 1999/10/13 16:39:28 vixie Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/param.h>
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/param.h>
@@ -24,17 +25,17 @@ static char rcsid[] = "$Id$";
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <arpa/nameser.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <arpa/nameser.h>
+#include <ctype.h>
 #include <string.h>
 #include <errno.h>
 #include <string.h>
 #include <errno.h>
-#include <conf/portability.h>
 
 /*
  * WARNING: Don't even consider trying to compile this on a system where
  * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.
  */
 
 
 /*
  * WARNING: Don't even consider trying to compile this on a system where
  * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.
  */
 
-static int inet_pton4 __P((const char *src, u_char *dst)) internal_function;
-static int inet_pton6 __P((const char *src, u_char *dst)) internal_function;
+static int inet_pton4 (const char *src, u_char *dst) internal_function;
+static int inet_pton6 (const char *src, u_char *dst) internal_function;
 
 /* int
  * inet_pton(af, src, dst)
 
 /* int
  * inet_pton(af, src, dst)
@@ -64,10 +65,12 @@ inet_pton(af, src, dst)
        }
        /* NOTREACHED */
 }
        }
        /* NOTREACHED */
 }
+libc_hidden_def (inet_pton)
 
 /* int
  * inet_pton4(src, dst)
 
 /* int
  * inet_pton4(src, dst)
- *     like inet_aton() but without all the hexadecimal and shorthand.
+ *     like inet_aton() but without all the hexadecimal, octal (with the
+ *     exception of 0) and shorthand.
  * return:
  *     1 if `src' is a valid dotted quad, else 0.
  * notice:
  * return:
  *     1 if `src' is a valid dotted quad, else 0.
  * notice:
@@ -82,7 +85,7 @@ inet_pton4(src, dst)
        u_char *dst;
 {
        int saw_digit, octets, ch;
        u_char *dst;
 {
        int saw_digit, octets, ch;
-       u_char tmp[INADDRSZ], *tp;
+       u_char tmp[NS_INADDRSZ], *tp;
 
        saw_digit = 0;
        octets = 0;
 
        saw_digit = 0;
        octets = 0;
@@ -92,6 +95,8 @@ inet_pton4(src, dst)
                if (ch >= '0' && ch <= '9') {
                        u_int new = *tp * 10 + (ch - '0');
 
                if (ch >= '0' && ch <= '9') {
                        u_int new = *tp * 10 + (ch - '0');
 
+                       if (saw_digit && *tp == 0)
+                               return (0);
                        if (new > 255)
                                return (0);
                        *tp = new;
                        if (new > 255)
                                return (0);
                        *tp = new;
@@ -110,8 +115,7 @@ inet_pton4(src, dst)
        }
        if (octets < 4)
                return (0);
        }
        if (octets < 4)
                return (0);
-
-       memcpy(dst, tmp, INADDRSZ);
+       memcpy(dst, tmp, NS_INADDRSZ);
        return (1);
 }
 
        return (1);
 }
 
@@ -135,13 +139,13 @@ inet_pton6(src, dst)
        u_char *dst;
 {
        static const char xdigits[] = "0123456789abcdef";
        u_char *dst;
 {
        static const char xdigits[] = "0123456789abcdef";
-       u_char tmp[IN6ADDRSZ], *tp, *endp, *colonp;
+       u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
        const char *curtok;
        int ch, saw_xdigit;
        u_int val;
 
        const char *curtok;
        int ch, saw_xdigit;
        u_int val;
 
-       tp = memset(tmp, '\0', IN6ADDRSZ);
-       endp = tp + IN6ADDRSZ;
+       tp = memset(tmp, '\0', NS_IN6ADDRSZ);
+       endp = tp + NS_IN6ADDRSZ;
        colonp = NULL;
        /* Leading :: requires some special handling. */
        if (*src == ':')
        colonp = NULL;
        /* Leading :: requires some special handling. */
        if (*src == ':')
@@ -169,8 +173,10 @@ inet_pton6(src, dst)
                                        return (0);
                                colonp = tp;
                                continue;
                                        return (0);
                                colonp = tp;
                                continue;
+                       } else if (*src == '\0') {
+                               return (0);
                        }
                        }
-                       if (tp + INT16SZ > endp)
+                       if (tp + NS_INT16SZ > endp)
                                return (0);
                        *tp++ = (u_char) (val >> 8) & 0xff;
                        *tp++ = (u_char) val & 0xff;
                                return (0);
                        *tp++ = (u_char) (val >> 8) & 0xff;
                        *tp++ = (u_char) val & 0xff;
@@ -178,16 +184,16 @@ inet_pton6(src, dst)
                        val = 0;
                        continue;
                }
                        val = 0;
                        continue;
                }
-               if (ch == '.' && ((tp + INADDRSZ) <= endp) &&
+               if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
                    inet_pton4(curtok, tp) > 0) {
                    inet_pton4(curtok, tp) > 0) {
-                       tp += INADDRSZ;
+                       tp += NS_INADDRSZ;
                        saw_xdigit = 0;
                        break;  /* '\0' was seen by inet_pton4(). */
                }
                return (0);
        }
        if (saw_xdigit) {
                        saw_xdigit = 0;
                        break;  /* '\0' was seen by inet_pton4(). */
                }
                return (0);
        }
        if (saw_xdigit) {
-               if (tp + INT16SZ > endp)
+               if (tp + NS_INT16SZ > endp)
                        return (0);
                *tp++ = (u_char) (val >> 8) & 0xff;
                *tp++ = (u_char) val & 0xff;
                        return (0);
                *tp++ = (u_char) (val >> 8) & 0xff;
                *tp++ = (u_char) val & 0xff;
@@ -200,6 +206,8 @@ inet_pton6(src, dst)
                const int n = tp - colonp;
                int i;
 
                const int n = tp - colonp;
                int i;
 
+               if (tp == endp)
+                       return (0);
                for (i = 1; i <= n; i++) {
                        endp[- i] = colonp[n - i];
                        colonp[n - i] = 0;
                for (i = 1; i <= n; i++) {
                        endp[- i] = colonp[n - i];
                        colonp[n - i] = 0;
@@ -208,6 +216,6 @@ inet_pton6(src, dst)
        }
        if (tp != endp)
                return (0);
        }
        if (tp != endp)
                return (0);
-       memcpy(dst, tmp, IN6ADDRSZ);
+       memcpy(dst, tmp, NS_IN6ADDRSZ);
        return (1);
 }
        return (1);
 }