Mercurial > hg > octave-lyh > gnulib-hg
changeset 6435:be00741570b7
Fix inet_ntop on mingw32.
author | Simon Josefsson <simon@josefsson.org> |
---|---|
date | Fri, 28 Oct 2005 13:53:31 +0000 |
parents | 78b571271328 |
children | fca6cdd9520b |
files | lib/ChangeLog lib/inet_ntop.c lib/inet_ntop.h m4/ChangeLog m4/inet_ntop.m4 |
diffstat | 5 files changed, 165 insertions(+), 115 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,5 +1,11 @@ 2005-10-28 Simon Josefsson <jas@extundo.com> + * inet_ntop.h, inet_ntop.c: Make it work under mingw32: Add + "restrict" keywords, as per POSIX. Protect the function + declaration around HAVE_DECL_INET_NTOP rather than HAVE_INET_NTOP. + Don't use K&R prototypes. Check the sprintf return values. + Re-define EAFNOSUPPORT if not present. Indent. + * md5.h, md5.c: Simplify buffer handling visavi alignment, suggested by Bruno Haible <bruno@clisp.org>.
--- a/lib/inet_ntop.c +++ b/lib/inet_ntop.c @@ -1,6 +1,22 @@ +/* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form + Copyright (c) 2005 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. */ + /* * Copyright (c) 1996-1999 by Internet Software Consortium. - * Copyright (c) 2005 Free Software Foundation, Inc. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -27,6 +43,10 @@ #include <string.h> #include <errno.h> +#ifndef EAFNOSUPPORT +# define EAFNOSUPPORT EINVAL +#endif + #define NS_IN6ADDRSZ 16 #define NS_INT16SZ 2 @@ -34,7 +54,7 @@ * 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. */ -typedef int verify_int_size[2 * sizeof(int) - 7]; +typedef int verify_int_size[2 * sizeof (int) - 7]; #if HAVE_IPV4 static const char *inet_ntop4 (const unsigned char *src, char *dst, socklen_t size); @@ -53,28 +73,26 @@ * Paul Vixie, 1996. */ const char * -inet_ntop(af, src, dst, size) - int af; - const void *src; - char *dst; - socklen_t size; +inet_ntop (int af, const void *restrict src, + char *restrict dst, socklen_t cnt) { - switch (af) { - + switch (af) + { #if HAVE_IPV4 - case AF_INET: - return (inet_ntop4(src, dst, size)); + case AF_INET: + return (inet_ntop4 (src, dst, cnt)); #endif #if HAVE_IPV6 - case AF_INET6: - return (inet_ntop6(src, dst, size)); + case AF_INET6: + return (inet_ntop6 (src, dst, cnt)); #endif - default: - errno = EAFNOSUPPORT; - return (NULL); - } - /* NOTREACHED */ + + default: + errno = EAFNOSUPPORT; + return (NULL); + } + /* NOTREACHED */ } #if HAVE_IPV4 @@ -91,19 +109,22 @@ * Paul Vixie, 1996. */ static const char * -inet_ntop4(src, dst, size) - const unsigned char *src; - char *dst; - socklen_t size; +inet_ntop4 (const unsigned char *src, char *dst, socklen_t size) { - static const char fmt[] = "%u.%u.%u.%u"; - char tmp[sizeof "255.255.255.255"]; + char tmp[sizeof "255.255.255.255"]; + int len; + + len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]); + if (len < 0) + return NULL; - if (sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) > size) { - errno = ENOSPC; - return (NULL); - } - return strcpy(dst, tmp); + if (len > size) + { + errno = ENOSPC; + return NULL; + } + + return strcpy (dst, tmp); } #endif @@ -117,93 +138,108 @@ * Paul Vixie, 1996. */ static const char * -inet_ntop6(src, dst, size) - const unsigned char *src; - char *dst; - socklen_t size; +inet_ntop6 (const unsigned char *src, char *dst, socklen_t size) { - /* - * Note that int32_t and int16_t need only be "at least" large enough - * to contain a value of the specified size. On some systems, like - * Crays, there is no such thing as an integer variable with 16 bits. - * Keep this in mind if you think this function should have been coded - * to use pointer overlays. All the world's not a VAX. - */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; - struct { int base, len; } best, cur; - unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; - int i; + /* + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. + */ + char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; + struct + { + int base, len; + } best, cur; + unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; + int i; - /* - * Preprocess: - * Copy the input (bytewise) array into a wordwise array. - * Find the longest run of 0x00's in src[] for :: shorthanding. - */ - memset(words, '\0', sizeof words); - for (i = 0; i < NS_IN6ADDRSZ; i += 2) - words[i / 2] = (src[i] << 8) | src[i + 1]; - best.base = -1; - cur.base = -1; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - if (words[i] == 0) { - if (cur.base == -1) - cur.base = i, cur.len = 1; - else - cur.len++; - } else { - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - cur.base = -1; - } - } + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + memset (words, '\0', sizeof words); + for (i = 0; i < NS_IN6ADDRSZ; i += 2) + words[i / 2] = (src[i] << 8) | src[i + 1]; + best.base = -1; + cur.base = -1; + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) + { + if (words[i] == 0) + { + if (cur.base == -1) + cur.base = i, cur.len = 1; + else + cur.len++; + } + else + { + if (cur.base != -1) + { + if (best.base == -1 || cur.len > best.len) + best = cur; + cur.base = -1; + } } - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - } - if (best.base != -1 && best.len < 2) - best.base = -1; + } + if (cur.base != -1) + { + if (best.base == -1 || cur.len > best.len) + best = cur; + } + if (best.base != -1 && best.len < 2) + best.base = -1; - /* - * Format the result. - */ - tp = tmp; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && - i < (best.base + best.len)) { - if (i == best.base) - *tp++ = ':'; - continue; - } - /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) - *tp++ = ':'; - /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && - (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { - if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) - return (NULL); - tp += strlen(tp); - break; - } - tp += sprintf(tp, "%x", words[i]); + /* + * Format the result. + */ + tp = tmp; + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) + { + /* Are we inside the best run of 0x00's? */ + if (best.base != -1 && i >= best.base && i < (best.base + best.len)) + { + if (i == best.base) + *tp++ = ':'; + continue; } - /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == - (NS_IN6ADDRSZ / NS_INT16SZ)) - *tp++ = ':'; - *tp++ = '\0'; + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) + *tp++ = ':'; + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && + (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) + { + if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp))) + return (NULL); + tp += strlen (tp); + break; + } + { + int len = sprintf (tp, "%x", words[i]); + if (len < 0) + return NULL; + tp += len; + } + } + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == + (NS_IN6ADDRSZ / NS_INT16SZ)) + *tp++ = ':'; + *tp++ = '\0'; - /* - * Check for overflow, copy, and we're done. - */ - if ((socklen_t)(tp - tmp) > size) { - errno = ENOSPC; - return (NULL); - } - return strcpy(dst, tmp); + /* + * Check for overflow, copy, and we're done. + */ + if ((socklen_t) (tp - tmp) > size) + { + errno = ENOSPC; + return NULL; + } + + return strcpy (dst, tmp); } #endif
--- a/lib/inet_ntop.h +++ b/lib/inet_ntop.h @@ -16,9 +16,12 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif /* Converts an internet address from internal format to a printable, presentable format. @@ -36,6 +39,7 @@ For more details, see the POSIX:2001 specification <http://www.opengroup.org/susv3xsh/inet_ntop.html>. */ -#if !HAVE_INET_NTOP /* not already defined and declared in <arpa/inet.h> ? */ -extern const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); +#ifndef HAVE_DECL_INET_NTOP +extern const char *inet_ntop (int af, const void *restrict src, + char *restrict dst, socklen_t cnt); #endif