
"Daniel P. Berrange" <berrange@redhat.com> wrote:
On Wed, Aug 06, 2008 at 09:10:04AM +0200, Jim Meyering wrote:
"Daniel P. Berrange" <berrange@redhat.com> wrote:
On Tue, Aug 05, 2008 at 01:52:58PM +0200, Jim Meyering wrote:
Atsushi SAKAI <sakaia@jp.fujitsu.com> wrote: ...
network_conf.c:290: warning: implicit declaration of function `inet_aton' network_conf.c:290: warning: nested extern declaration of `inet_aton'
We can/should use inet_pton instead. Then, not only do we use what seems to be the preferred interface, but there is a gnulib module by the same name that can come into play if it too is missing.
Even better would be to use getaddrinfo() with AI_NUMERIC, since we already require getaddrinfo() to work on Windows for the remote driver
Dan,
If you don't object, I'll go for the simpler interface (and smaller change). However I've just noticed that that will require an adjustment of the gnulib license for the inet_pton module. But that shouldn't be a problem, since the code in question is glibc-derived.
Yep, fine by me.
Ok. Here's the complete patch, including the new file from gnulib. I've verified that a freshly-cloned directory passes ./autogen && make && make check Ha! But it failed "make syntax-check" due to the use of ctype's tolower in inet_pton.c. I'm fixing that in gnulib now, since it can/should be c_tolower. Here's the fix prior to the s/tolower/c_tolower/ inet_pton.c change (it also does s/<ctype/<c-ctype/). I'll wait until gnulib is fixed before committing here.
From 45a33378a90fac3058360ba92ff0afca3e03df73 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyering@redhat.com> Date: Wed, 6 Aug 2008 11:36:14 +0200 Subject: [PATCH] work around MinGW build failure due to its lack of inet_aton
Use inet_pton instead; pull in gnulib's module by the same name. * src/network_conf.c (virNetworkDefParseXML): Use inet_pton, rather than inet_aton. * bootstrap (modules): Add inet_pton. * gnulib/lib/inet_pton.c: New file, from gnulib. --- ChangeLog | 9 ++ bootstrap | 1 + gnulib/lib/inet_pton.c | 257 ++++++++++++++++++++++++++++++++++++++++++++++++ src/network_conf.c | 4 +- 4 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 gnulib/lib/inet_pton.c diff --git a/ChangeLog b/ChangeLog index 133bde6..d066751 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-08-06 Jim Meyering <meyering@redhat.com> + + work around MinGW build failure due to its lack of inet_aton + Use inet_pton instead; pull in gnulib's module by the same name. + * src/network_conf.c (virNetworkDefParseXML): Use inet_pton, + rather than inet_aton. + * bootstrap (modules): Add inet_pton. + * gnulib/lib/inet_pton.c: New file, from gnulib. + Tue Aug 5 10:43:42 CEST 2008 Jim Meyering <meyering@redhat.com> make distclean: remove generated source files diff --git a/bootstrap b/bootstrap index bc1c352..70b9a05 100755 --- a/bootstrap +++ b/bootstrap @@ -69,6 +69,7 @@ c-ctype getaddrinfo getpass gettext +inet_pton mktempd physmem poll diff --git a/gnulib/lib/inet_pton.c b/gnulib/lib/inet_pton.c new file mode 100644 index 0000000..3e92631 --- /dev/null +++ b/gnulib/lib/inet_pton.c @@ -0,0 +1,257 @@ +/* inet_pton.c -- convert IPv4 and IPv6 addresses from text to binary form + + Copyright (C) 2006, 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 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 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* + * Copyright (c) 1996,1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +#include <config.h> + +/* Specification. */ +#include <arpa/inet.h> + +#include <ctype.h> +#include <string.h> +#include <errno.h> + +#ifndef EAFNOSUPPORT +# define EAFNOSUPPORT EINVAL +#endif + +#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 + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static int inet_pton4 (const char *src, unsigned char *dst); +#if HAVE_IPV6 +static int inet_pton6 (const char *src, unsigned char *dst); +#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). + * 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) + * author: + * Paul Vixie, 1996. + */ +int +inet_pton (int af, const char *restrict src, void *restrict dst) +{ + switch (af) + { + case AF_INET: + return (inet_pton4 (src, dst)); + +#if HAVE_IPV6 + case AF_INET6: + return (inet_pton6 (src, dst)); +#endif + + default: + errno = EAFNOSUPPORT; + return (-1); + } + /* NOTREACHED */ +} + +/* int + * inet_pton4(src, dst) + * 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. + * notice: + * does not touch `dst' unless it's returning 1. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton4 (const char *restrict src, unsigned char *restrict dst) +{ + int saw_digit, octets, ch; + unsigned char tmp[NS_INADDRSZ], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') + { + + 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; + } + } + else if (ch == '.' && saw_digit) + { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } + else + return (0); + } + if (octets < 4) + return (0); + memcpy (dst, tmp, NS_INADDRSZ); + return (1); +} + +#if HAVE_IPV6 + +/* int + * inet_pton6(src, dst) + * convert presentation level address to network order binary form. + * return: + * 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. + * credit: + * inspired by Mark Andrews. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton6 (const char *restrict src, unsigned char *restrict dst) +{ + static const char xdigits[] = "0123456789abcdef"; + unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; + const char *curtok; + int ch, saw_xdigit; + unsigned val; + + tp = memset (tmp, '\0', NS_IN6ADDRSZ); + endp = tp + NS_IN6ADDRSZ; + colonp = NULL; + /* Leading :: requires some special handling. */ + if (*src == ':') + if (*++src != ':') + return (0); + curtok = src; + saw_xdigit = 0; + val = 0; + while ((ch = 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; + } + 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; + } + if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && + 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); + *tp++ = (u_char) (val >> 8) & 0xff; + *tp++ = (u_char) val & 0xff; + } + if (colonp != NULL) + { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + int i; + + if (tp == endp) + return (0); + for (i = 1; i <= n; i++) + { + endp[-i] = colonp[n - i]; + colonp[n - i] = 0; + } + tp = endp; + } + if (tp != endp) + return (0); + memcpy (dst, tmp, NS_IN6ADDRSZ); + return (1); +} +#endif diff --git a/src/network_conf.c b/src/network_conf.c index 10c9dca..f70c73d 100644 --- a/src/network_conf.c +++ b/src/network_conf.c @@ -286,13 +286,13 @@ virNetworkDefParseXML(virConnectPtr conn, char *netaddr; xmlNodePtr dhcp; - if (!inet_aton(def->ipAddress, &inaddress)) { + if (inet_pton(AF_INET, def->ipAddress, &inaddress) <= 0) { virNetworkReportError(conn, VIR_ERR_INTERNAL_ERROR, _("cannot parse IP address '%s'"), def->ipAddress); goto error; } - if (!inet_aton(def->netmask, &innetmask)) { + if (inet_pton(AF_INET, def->netmask, &innetmask) <= 0) { virNetworkReportError(conn, VIR_ERR_INTERNAL_ERROR, _("cannot parse netmask '%s'"), def->netmask); -- 1.6.0.rc1.74.ga559e