NEWS.stable: log cherry-pick [e446f25]->[c092018] relocatable-shell: Update suggested...
[gnulib.git] / lib / inet_pton.c
index a9c9baf..e9703a7 100644 (file)
@@ -1,6 +1,6 @@
 /* inet_pton.c -- convert IPv4 and IPv6 addresses from text to binary form
 
-   Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2008-2014 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 /* Specification.  */
 #include <arpa/inet.h>
 
-#include <c-ctype.h>
-#include <string.h>
-#include <errno.h>
+#if HAVE_DECL_INET_PTON
 
-#define NS_INADDRSZ 4
-#define NS_IN6ADDRSZ 16
-#define NS_INT16SZ 2
+# undef inet_pton
+
+int
+rpl_inet_pton (int af, const char *restrict src, void *restrict dst)
+{
+  return inet_pton (af, src, dst);
+}
+
+#else
+
+# include <c-ctype.h>
+# include <string.h>
+# include <errno.h>
+
+# define NS_INADDRSZ 4
+# define NS_IN6ADDRSZ 16
+# define NS_INT16SZ 2
 
 /*
  * WARNING: Don't even consider trying to compile this on a system where
  */
 
 static int inet_pton4 (const char *src, unsigned char *dst);
-#if HAVE_IPV6
+# if HAVE_IPV6
 static int inet_pton6 (const char *src, unsigned char *dst);
-#endif
+# endif
 
 /* int
  * inet_pton(af, src, dst)
- *     convert from presentation format (which usually means ASCII printable)
- *     to network format (which is usually some kind of binary format).
+ *      convert from presentation format (which usually means ASCII printable)
+ *      to network format (which is usually some kind of binary format).
  * return:
- *     1 if the address was valid for the specified address family
- *     0 if the address wasn't valid (`dst' is untouched in this case)
- *     -1 if some other error occurred (`dst' is untouched in this case, too)
+ *      1 if the address was valid for the specified address family
+ *      0 if the address wasn't valid ('dst' is untouched in this case)
+ *      -1 if some other error occurred ('dst' is untouched in this case, too)
  * author:
- *     Paul Vixie, 1996.
+ *      Paul Vixie, 1996.
  */
 int
 inet_pton (int af, const char *restrict src, void *restrict dst)
@@ -74,10 +86,10 @@ inet_pton (int af, const char *restrict src, void *restrict dst)
     case AF_INET:
       return (inet_pton4 (src, dst));
 
-#if HAVE_IPV6
+# if HAVE_IPV6
     case AF_INET6:
       return (inet_pton6 (src, dst));
-#endif
+# endif
 
     default:
       errno = EAFNOSUPPORT;
@@ -88,14 +100,14 @@ inet_pton (int af, const char *restrict src, void *restrict dst)
 
 /* int
  * inet_pton4(src, dst)
- *     like inet_aton() but without all the hexadecimal, octal (with the
- *     exception of 0) 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.
+ *      1 if 'src' is a valid dotted quad, else 0.
  * notice:
- *     does not touch `dst' unless it's returning 1.
+ *      does not touch 'dst' unless it's returning 1.
  * author:
- *     Paul Vixie, 1996.
+ *      Paul Vixie, 1996.
  */
 static int
 inet_pton4 (const char *restrict src, unsigned char *restrict dst)
@@ -110,30 +122,30 @@ inet_pton4 (const char *restrict src, unsigned char *restrict dst)
     {
 
       if (ch >= '0' && ch <= '9')
-       {
-         unsigned new = *tp * 10 + (ch - '0');
-
-         if (saw_digit && *tp == 0)
-           return (0);
-         if (new > 255)
-           return (0);
-         *tp = new;
-         if (!saw_digit)
-           {
-             if (++octets > 4)
-               return (0);
-             saw_digit = 1;
-           }
-       }
+        {
+          unsigned new = *tp * 10 + (ch - '0');
+
+          if (saw_digit && *tp == 0)
+            return (0);
+          if (new > 255)
+            return (0);
+          *tp = new;
+          if (!saw_digit)
+            {
+              if (++octets > 4)
+                return (0);
+              saw_digit = 1;
+            }
+        }
       else if (ch == '.' && saw_digit)
-       {
-         if (octets == 4)
-           return (0);
-         *++tp = 0;
-         saw_digit = 0;
-       }
+        {
+          if (octets == 4)
+            return (0);
+          *++tp = 0;
+          saw_digit = 0;
+        }
       else
-       return (0);
+        return (0);
     }
   if (octets < 4)
     return (0);
@@ -141,20 +153,20 @@ inet_pton4 (const char *restrict src, unsigned char *restrict dst)
   return (1);
 }
 
-#if HAVE_IPV6
+# if HAVE_IPV6
 
 /* int
  * inet_pton6(src, dst)
- *     convert presentation level address to network order binary form.
+ *      convert presentation level address to network order binary form.
  * return:
- *     1 if `src' is a valid [RFC1884 2.2] address, else 0.
+ *      1 if 'src' is a valid [RFC1884 2.2] address, else 0.
  * notice:
- *     (1) does not touch `dst' unless it's returning 1.
- *     (2) :: in a full address is silently ignored.
+ *      (1) does not touch 'dst' unless it's returning 1.
+ *      (2) :: in a full address is silently ignored.
  * credit:
- *     inspired by Mark Andrews.
+ *      inspired by Mark Andrews.
  * author:
- *     Paul Vixie, 1996.
+ *      Paul Vixie, 1996.
  */
 static int
 inet_pton6 (const char *restrict src, unsigned char *restrict dst)
@@ -181,49 +193,49 @@ inet_pton6 (const char *restrict src, unsigned char *restrict dst)
 
       pch = strchr (xdigits, ch);
       if (pch != NULL)
-       {
-         val <<= 4;
-         val |= (pch - xdigits);
-         if (val > 0xffff)
-           return (0);
-         saw_xdigit = 1;
-         continue;
-       }
+        {
+          val <<= 4;
+          val |= (pch - xdigits);
+          if (val > 0xffff)
+            return (0);
+          saw_xdigit = 1;
+          continue;
+        }
       if (ch == ':')
-       {
-         curtok = src;
-         if (!saw_xdigit)
-           {
-             if (colonp)
-               return (0);
-             colonp = tp;
-             continue;
-           }
-         else if (*src == '\0')
-           {
-             return (0);
-           }
-         if (tp + NS_INT16SZ > endp)
-           return (0);
-         *tp++ = (u_char) (val >> 8) & 0xff;
-         *tp++ = (u_char) val & 0xff;
-         saw_xdigit = 0;
-         val = 0;
-         continue;
-       }
+        {
+          curtok = src;
+          if (!saw_xdigit)
+            {
+              if (colonp)
+                return (0);
+              colonp = tp;
+              continue;
+            }
+          else if (*src == '\0')
+            {
+              return (0);
+            }
+          if (tp + NS_INT16SZ > endp)
+            return (0);
+          *tp++ = (u_char) (val >> 8) & 0xff;
+          *tp++ = (u_char) val & 0xff;
+          saw_xdigit = 0;
+          val = 0;
+          continue;
+        }
       if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
-         inet_pton4 (curtok, tp) > 0)
-       {
-         tp += NS_INADDRSZ;
-         saw_xdigit = 0;
-         break;                /* '\0' was seen by inet_pton4(). */
-       }
+          inet_pton4 (curtok, tp) > 0)
+        {
+          tp += NS_INADDRSZ;
+          saw_xdigit = 0;
+          break;                /* '\0' was seen by inet_pton4(). */
+        }
       return (0);
     }
   if (saw_xdigit)
     {
       if (tp + NS_INT16SZ > endp)
-       return (0);
+        return (0);
       *tp++ = (u_char) (val >> 8) & 0xff;
       *tp++ = (u_char) val & 0xff;
     }
@@ -237,12 +249,12 @@ inet_pton6 (const char *restrict src, unsigned char *restrict dst)
       int i;
 
       if (tp == endp)
-       return (0);
+        return (0);
       for (i = 1; i <= n; i++)
-       {
-         endp[-i] = colonp[n - i];
-         colonp[n - i] = 0;
-       }
+        {
+          endp[-i] = colonp[n - i];
+          colonp[n - i] = 0;
+        }
       tp = endp;
     }
   if (tp != endp)
@@ -250,4 +262,7 @@ inet_pton6 (const char *restrict src, unsigned char *restrict dst)
   memcpy (dst, tmp, NS_IN6ADDRSZ);
   return (1);
 }
+
+# endif
+
 #endif