X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Finet_pton.c;h=e9703a797ec1eaaa743c807706340b74e3cac15b;hb=7ef6c64e210ac0979d7e8ac69bc5b5208c2405ab;hp=a9c9bafdef18fc307bc4c6fe71a3ab49c8427cd3;hpb=9de26050ef8a950fd62ebadeeab2eb7505631028;p=gnulib.git diff --git a/lib/inet_pton.c b/lib/inet_pton.c index a9c9bafde..e9703a797 100644 --- a/lib/inet_pton.c +++ b/lib/inet_pton.c @@ -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 @@ -37,13 +37,25 @@ /* Specification. */ #include -#include -#include -#include +#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 +# include +# include + +# 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 @@ -51,20 +63,20 @@ */ 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