X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Finet_pton.c;h=d8a2dee0ff485f137d8f68ede866a157b2f9c57c;hb=a731808a4ac512228e870d5f443b91557f418559;hp=f2b58bb633a9bc0d9c52389c9d066c68dd6ecf1e;hpb=cf357e415055e3979d0f0d72b3046022f4bb7812;p=gnulib.git diff --git a/lib/inet_pton.c b/lib/inet_pton.c index f2b58bb63..d8a2dee0f 100644 --- a/lib/inet_pton.c +++ b/lib/inet_pton.c @@ -1,10 +1,11 @@ /* inet_pton.c -- convert IPv4 and IPv6 addresses from text to binary form - Copyright (c) 2006 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + Copyright (C) 2006, 2008, 2009, 2010 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -12,8 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* * Copyright (c) 1996,1999 by Internet Software Consortium. @@ -32,21 +32,15 @@ * SOFTWARE. */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include /* Specification. */ -#include "inet_pton.h" +#include -#include +#include #include #include -#ifndef EAFNOSUPPORT -# define EAFNOSUPPORT EINVAL -#endif - #define NS_INADDRSZ 4 #define NS_IN6ADDRSZ 16 #define NS_INT16SZ 2 @@ -63,14 +57,14 @@ static int inet_pton6 (const char *src, unsigned char *dst); /* 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) @@ -80,7 +74,7 @@ inet_pton (int af, const char *restrict src, void *restrict dst) case AF_INET: return (inet_pton4 (src, dst)); -#if HAVE_IPV4 +#if HAVE_IPV6 case AF_INET6: return (inet_pton6 (src, dst)); #endif @@ -94,14 +88,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) @@ -116,30 +110,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); @@ -151,16 +145,16 @@ inet_pton4 (const char *restrict src, unsigned char *restrict dst) /* 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,55 +175,55 @@ inet_pton6 (const char *restrict src, unsigned char *restrict dst) curtok = src; saw_xdigit = 0; val = 0; - while ((ch = tolower (*src++)) != '\0') + while ((ch = c_tolower (*src++)) != '\0') { const char *pch; 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; } @@ -243,12 +237,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)