projects
/
gnulib.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cosl: Simplify for platforms where 'long double' == 'double'.
[gnulib.git]
/
lib
/
inet_pton.c
diff --git
a/lib/inet_pton.c
b/lib/inet_pton.c
index
f2b58bb
..
cb1a872
100644
(file)
--- 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
/* 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-2011 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
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
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
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 <http://www.gnu.org/licenses/>. */
/*
* Copyright (c) 1996,1999 by Internet Software Consortium.
/*
* Copyright (c) 1996,1999 by Internet Software Consortium.
@@
-32,24
+32,30
@@
* SOFTWARE.
*/
* SOFTWARE.
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include <config.h>
/* Specification. */
/* Specification. */
-#include
"inet_pton.h"
+#include
<arpa/inet.h>
-#include <ctype.h>
-#include <string.h>
-#include <errno.h>
+#if HAVE_DECL_INET_PTON
-#ifndef EAFNOSUPPORT
-# define EAFNOSUPPORT EINVAL
-#endif
+# undef inet_pton
+
+int
+rpl_inet_pton (int af, const char *restrict src, void *restrict dst)
+{
+ return inet_pton (af, src, dst);
+}
-#define NS_INADDRSZ 4
-#define NS_IN6ADDRSZ 16
-#define NS_INT16SZ 2
+#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
/*
* WARNING: Don't even consider trying to compile this on a system where
@@
-57,20
+63,20
@@
*/
static int inet_pton4 (const char *src, unsigned char *dst);
*/
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);
static int inet_pton6 (const char *src, unsigned char *dst);
-#endif
+#
endif
/* int
* inet_pton(af, src, 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:
* 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:
* author:
- * Paul Vixie, 1996.
+ *
Paul Vixie, 1996.
*/
int
inet_pton (int af, const char *restrict src, void *restrict dst)
*/
int
inet_pton (int af, const char *restrict src, void *restrict dst)
@@
-80,10
+86,10
@@
inet_pton (int af, const char *restrict src, void *restrict dst)
case AF_INET:
return (inet_pton4 (src, dst));
case AF_INET:
return (inet_pton4 (src, dst));
-#
if HAVE_IPV4
+#
if HAVE_IPV6
case AF_INET6:
return (inet_pton6 (src, dst));
case AF_INET6:
return (inet_pton6 (src, dst));
-#endif
+#
endif
default:
errno = EAFNOSUPPORT;
default:
errno = EAFNOSUPPORT;
@@
-94,14
+100,14
@@
inet_pton (int af, const char *restrict src, void *restrict dst)
/* int
* inet_pton4(src, 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:
* return:
- * 1 if `src' is a valid dotted quad, else 0.
+ *
1 if `src' is a valid dotted quad, else 0.
* notice:
* notice:
- * does not touch `dst' unless it's returning 1.
+ *
does not touch `dst' unless it's returning 1.
* author:
* author:
- * Paul Vixie, 1996.
+ *
Paul Vixie, 1996.
*/
static int
inet_pton4 (const char *restrict src, unsigned char *restrict dst)
*/
static int
inet_pton4 (const char *restrict src, unsigned char *restrict dst)
@@
-116,30
+122,30
@@
inet_pton4 (const char *restrict src, unsigned char *restrict dst)
{
if (ch >= '0' && ch <= '9')
{
if (ch >= '0' && ch <= '9')
- {
- unsigned new = *tp * 10 + (ch - '0');
+
{
+
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;
- }
- }
+
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)
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
else
- return (0);
+
return (0);
}
if (octets < 4)
return (0);
}
if (octets < 4)
return (0);
@@
-147,20
+153,20
@@
inet_pton4 (const char *restrict src, unsigned char *restrict dst)
return (1);
}
return (1);
}
-#if HAVE_IPV6
+#
if HAVE_IPV6
/* int
* inet_pton6(src, 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:
* 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:
* 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:
* credit:
- * inspired by Mark Andrews.
+ *
inspired by Mark Andrews.
* author:
* author:
- * Paul Vixie, 1996.
+ *
Paul Vixie, 1996.
*/
static int
inet_pton6 (const char *restrict src, unsigned char *restrict dst)
*/
static int
inet_pton6 (const char *restrict src, unsigned char *restrict dst)
@@
-181,55
+187,55
@@
inet_pton6 (const char *restrict src, unsigned char *restrict dst)
curtok = src;
saw_xdigit = 0;
val = 0;
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)
{
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 == ':')
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) &&
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);
}
if (saw_xdigit)
{
if (tp + NS_INT16SZ > endp)
- return (0);
+
return (0);
*tp++ = (u_char) (val >> 8) & 0xff;
*tp++ = (u_char) val & 0xff;
}
*tp++ = (u_char) (val >> 8) & 0xff;
*tp++ = (u_char) val & 0xff;
}
@@
-243,12
+249,12
@@
inet_pton6 (const char *restrict src, unsigned char *restrict dst)
int i;
if (tp == endp)
int i;
if (tp == endp)
- return (0);
+
return (0);
for (i = 1; i <= n; i++)
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)
tp = endp;
}
if (tp != endp)
@@
-256,4
+262,7
@@
inet_pton6 (const char *restrict src, unsigned char *restrict dst)
memcpy (dst, tmp, NS_IN6ADDRSZ);
return (1);
}
memcpy (dst, tmp, NS_IN6ADDRSZ);
return (1);
}
+
+# endif
+
#endif
#endif