diff options
author | peter <peter@FreeBSD.org> | 1996-01-13 09:03:58 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1996-01-13 09:03:58 +0000 |
commit | 05184daaef969978db8f5aa4df2c3c5edac44c51 (patch) | |
tree | 1aa115c29231422c8a28d2fe8a54407622c4698e /lib/libc/net/inet_addr.c | |
parent | 6ba0bb5bfcd0dcb90300a37b199f1bef4c8e2490 (diff) | |
download | FreeBSD-src-05184daaef969978db8f5aa4df2c3c5edac44c51.zip FreeBSD-src-05184daaef969978db8f5aa4df2c3c5edac44c51.tar.gz |
The last of the bind-4.9.3-REL resolver merges.
Diffstat (limited to 'lib/libc/net/inet_addr.c')
-rw-r--r-- | lib/libc/net/inet_addr.c | 78 |
1 files changed, 53 insertions, 25 deletions
diff --git a/lib/libc/net/inet_addr.c b/lib/libc/net/inet_addr.c index f69d0fc..a1ac899 100644 --- a/lib/libc/net/inet_addr.c +++ b/lib/libc/net/inet_addr.c @@ -1,7 +1,9 @@ /* + * ++Copyright++ 1983, 1990, 1993 + * - * Copyright (c) 1983, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * + * The Regents of the University of California. All rights reserved. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -12,12 +14,12 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. + * This product includes software developed by the University of + * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -29,10 +31,31 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * 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, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION 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. + * - + * --Copyright-- */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93"; +static char rcsid[] = "$Id$"; #endif /* LIBC_SCCS and not lint */ #include <sys/param.h> @@ -55,7 +78,7 @@ inet_addr(cp) return (INADDR_NONE); } -/* +/* * Check whether "cp" is a valid ascii representation * of an Internet address and convert to a binary address. * Returns 1 if the address is valid, 0 if not. @@ -73,50 +96,52 @@ inet_aton(cp, addr) u_int parts[4]; register u_int *pp = parts; + c = *cp; for (;;) { /* * Collect number up to ``.''. * Values are specified as for C: - * 0x=hex, 0=octal, other=decimal. + * 0x=hex, 0=octal, isdigit=decimal. */ + if (!isdigit(c)) + return (0); val = 0; base = 10; - if (*cp == '0') { - if (*++cp == 'x' || *cp == 'X') - base = 16, cp++; + if (c == '0') { + c = *++cp; + if (c == 'x' || c == 'X') + base = 16, c = *++cp; else base = 8; } - while ((c = *cp) != '\0') { + for (;;) { if (isascii(c) && isdigit(c)) { val = (val * base) + (c - '0'); - cp++; - continue; - } - if (base == 16 && isascii(c) && isxdigit(c)) { - val = (val << 4) + + c = *++cp; + } else if (base == 16 && isascii(c) && isxdigit(c)) { + val = (val << 4) | (c + 10 - (islower(c) ? 'a' : 'A')); - cp++; - continue; - } - break; + c = *++cp; + } else + break; } - if (*cp == '.') { + if (c == '.') { /* * Internet format: * a.b.c.d - * a.b.c (with c treated as 16-bits) + * a.b.c (with c treated as 16 bits) * a.b (with b treated as 24 bits) */ - if (pp >= parts + 3 || val > 0xff) + if (pp >= parts + 3) return (0); - *pp++ = val, cp++; + *pp++ = val; + c = *++cp; } else break; } /* * Check for trailing characters. */ - if (*cp && (!isascii(*cp) || !isspace(*cp))) + if (c != '\0' && (!isascii(c) || !isspace(c))) return (0); /* * Concoct the address according to @@ -125,6 +150,9 @@ inet_aton(cp, addr) n = pp - parts + 1; switch (n) { + case 0: + return (0); /* initial nondigit */ + case 1: /* a -- 32 bits */ break; |