11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*	$OpenBSD: inet_addr.c,v 1.9 2005/08/06 20:30:03 espie Exp $	*/
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1983, 1990, 1993
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    The Regents of the University of California.  All rights reserved.
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met:
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer.
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer in the
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    documentation and/or other materials provided with the distribution.
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 3. Neither the name of the University nor the names of its contributors
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    may be used to endorse or promote products derived from this software
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    without specific prior written permission.
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * SUCH DAMAGE.
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * -
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Portions Copyright (c) 1993 by Digital Equipment Corporation.
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Permission to use, copy, modify, and distribute this software for any
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * purpose with or without fee is hereby granted, provided that the above
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * copyright notice and this permission notice appear in all copies, and that
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * the name of Digital Equipment Corporation not be used in advertising or
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * publicity pertaining to distribution of the document or software without
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * specific, written prior permission.
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * SOFTWARE.
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * -
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * --Copyright--
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* OPENBSD ORIGINAL: lib/libc/net/inet_addr.c */
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h"
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if !defined(HAVE_INET_ATON)
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/types.h>
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/param.h>
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <netinet/in.h>
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <arpa/inet.h>
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <ctype.h>
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if 0
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Ascii internet address interpretation routine.
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * The value returned is in network order.
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodin_addr_t
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodinet_addr(const char *cp)
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	struct in_addr val;
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (inet_aton(cp, &val))
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (val.s_addr);
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (INADDR_NONE);
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Check whether "cp" is a valid ascii representation
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * of an Internet address and convert to a binary address.
831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Returns 1 if the address is valid, 0 if not.
841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * This replaces inet_addr, the return value from which
851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * cannot distinguish between failure and a local broadcast address.
861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint
881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodinet_aton(const char *cp, struct in_addr *addr)
891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int32_t val;
911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int base, n;
921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char c;
931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int parts[4];
941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int *pp = parts;
951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	c = *cp;
971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	for (;;) {
981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		/*
991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		 * Collect number up to ``.''.
1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		 * Values are specified as for C:
1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		 * 0x=hex, 0=octal, isdigit=decimal.
1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		 */
1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if (!isdigit(c))
1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			return (0);
1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		val = 0; base = 10;
1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if (c == '0') {
1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			c = *++cp;
1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			if (c == 'x' || c == 'X')
1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				base = 16, c = *++cp;
1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			else
1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				base = 8;
1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		}
1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		for (;;) {
1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			if (isascii(c) && isdigit(c)) {
1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				val = (val * base) + (c - '0');
1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				c = *++cp;
1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			} else if (base == 16 && isascii(c) && isxdigit(c)) {
1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				val = (val << 4) |
1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood					(c + 10 - (islower(c) ? 'a' : 'A'));
1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				c = *++cp;
1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			} else
1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				break;
1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		}
1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if (c == '.') {
1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			/*
1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			 * Internet format:
1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			 *	a.b.c.d
1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			 *	a.b.c	(with c treated as 16 bits)
1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			 *	a.b	(with b treated as 24 bits)
1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			 */
1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			if (pp >= parts + 3)
1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				return (0);
1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			*pp++ = val;
1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			c = *++cp;
1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		} else
1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			break;
1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/*
1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	 * Check for trailing characters.
1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	 */
1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (c != '\0' && (!isascii(c) || !isspace(c)))
1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (0);
1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/*
1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	 * Concoct the address according to
1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	 * the number of parts specified.
1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	 */
1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	n = pp - parts + 1;
1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	switch (n) {
1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case 0:
1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (0);		/* initial nondigit */
1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case 1:				/* a -- 32 bits */
1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		break;
1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case 2:				/* a.b -- 8.24 bits */
1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if ((val > 0xffffff) || (parts[0] > 0xff))
1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			return (0);
1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		val |= parts[0] << 24;
1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		break;
1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case 3:				/* a.b.c -- 8.8.16 bits */
1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if ((val > 0xffff) || (parts[0] > 0xff) || (parts[1] > 0xff))
1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			return (0);
1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		val |= (parts[0] << 24) | (parts[1] << 16);
1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		break;
1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case 4:				/* a.b.c.d -- 8.8.8.8 bits */
1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if ((val > 0xff) || (parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff))
1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			return (0);
1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		break;
1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (addr)
1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		addr->s_addr = htonl(val);
1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (1);
1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !defined(HAVE_INET_ATON) */
180