165e96449SHajimu UMEMOTO /* 265e96449SHajimu UMEMOTO * Copyright (c) 1983, 1990, 1993 365e96449SHajimu UMEMOTO * The Regents of the University of California. All rights reserved. 465e96449SHajimu UMEMOTO * 565e96449SHajimu UMEMOTO * Redistribution and use in source and binary forms, with or without 665e96449SHajimu UMEMOTO * modification, are permitted provided that the following conditions 765e96449SHajimu UMEMOTO * are met: 865e96449SHajimu UMEMOTO * 1. Redistributions of source code must retain the above copyright 965e96449SHajimu UMEMOTO * notice, this list of conditions and the following disclaimer. 1065e96449SHajimu UMEMOTO * 2. Redistributions in binary form must reproduce the above copyright 1165e96449SHajimu UMEMOTO * notice, this list of conditions and the following disclaimer in the 1265e96449SHajimu UMEMOTO * documentation and/or other materials provided with the distribution. 13*fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 1465e96449SHajimu UMEMOTO * may be used to endorse or promote products derived from this software 1565e96449SHajimu UMEMOTO * without specific prior written permission. 1665e96449SHajimu UMEMOTO * 1765e96449SHajimu UMEMOTO * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1865e96449SHajimu UMEMOTO * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1965e96449SHajimu UMEMOTO * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2065e96449SHajimu UMEMOTO * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2165e96449SHajimu UMEMOTO * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2265e96449SHajimu UMEMOTO * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2365e96449SHajimu UMEMOTO * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2465e96449SHajimu UMEMOTO * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2565e96449SHajimu UMEMOTO * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2665e96449SHajimu UMEMOTO * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2765e96449SHajimu UMEMOTO * SUCH DAMAGE. 2865e96449SHajimu UMEMOTO */ 2965e96449SHajimu UMEMOTO 3065e96449SHajimu UMEMOTO /* 3165e96449SHajimu UMEMOTO * Portions Copyright (c) 1993 by Digital Equipment Corporation. 3265e96449SHajimu UMEMOTO * 3365e96449SHajimu UMEMOTO * Permission to use, copy, modify, and distribute this software for any 3465e96449SHajimu UMEMOTO * purpose with or without fee is hereby granted, provided that the above 3565e96449SHajimu UMEMOTO * copyright notice and this permission notice appear in all copies, and that 3665e96449SHajimu UMEMOTO * the name of Digital Equipment Corporation not be used in advertising or 3765e96449SHajimu UMEMOTO * publicity pertaining to distribution of the document or software without 3865e96449SHajimu UMEMOTO * specific, written prior permission. 3965e96449SHajimu UMEMOTO * 4065e96449SHajimu UMEMOTO * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 4165e96449SHajimu UMEMOTO * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 4265e96449SHajimu UMEMOTO * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 4365e96449SHajimu UMEMOTO * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 4465e96449SHajimu UMEMOTO * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 4565e96449SHajimu UMEMOTO * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 4665e96449SHajimu UMEMOTO * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 4765e96449SHajimu UMEMOTO * SOFTWARE. 4865e96449SHajimu UMEMOTO */ 4965e96449SHajimu UMEMOTO 5065e96449SHajimu UMEMOTO /* 5165e96449SHajimu UMEMOTO * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 5265e96449SHajimu UMEMOTO * Portions Copyright (c) 1996-1999 by Internet Software Consortium. 5365e96449SHajimu UMEMOTO * 5465e96449SHajimu UMEMOTO * Permission to use, copy, modify, and distribute this software for any 5565e96449SHajimu UMEMOTO * purpose with or without fee is hereby granted, provided that the above 5665e96449SHajimu UMEMOTO * copyright notice and this permission notice appear in all copies. 5765e96449SHajimu UMEMOTO * 5865e96449SHajimu UMEMOTO * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 5965e96449SHajimu UMEMOTO * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 6065e96449SHajimu UMEMOTO * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 6165e96449SHajimu UMEMOTO * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 6265e96449SHajimu UMEMOTO * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 6365e96449SHajimu UMEMOTO * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 6465e96449SHajimu UMEMOTO * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 6565e96449SHajimu UMEMOTO */ 6665e96449SHajimu UMEMOTO 6765e96449SHajimu UMEMOTO #if defined(LIBC_SCCS) && !defined(lint) 6865e96449SHajimu UMEMOTO static const char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93"; 69046c3635SPedro F. Giffuni static const char rcsid[] = "$Id: inet_addr.c,v 1.5 2005/04/27 04:56:19 sra Exp $"; 7065e96449SHajimu UMEMOTO #endif /* LIBC_SCCS and not lint */ 71ab96eeabSHajimu UMEMOTO #include <sys/cdefs.h> 72ab96eeabSHajimu UMEMOTO __FBSDID("$FreeBSD$"); 7365e96449SHajimu UMEMOTO 7465e96449SHajimu UMEMOTO #include "port_before.h" 7565e96449SHajimu UMEMOTO 7665e96449SHajimu UMEMOTO #include <sys/param.h> 7765e96449SHajimu UMEMOTO 7865e96449SHajimu UMEMOTO #include <netinet/in.h> 7965e96449SHajimu UMEMOTO #include <arpa/inet.h> 8065e96449SHajimu UMEMOTO 8165e96449SHajimu UMEMOTO #include <ctype.h> 8265e96449SHajimu UMEMOTO 8365e96449SHajimu UMEMOTO #include "port_after.h" 8465e96449SHajimu UMEMOTO 85dde4a85dSHajimu UMEMOTO /*% 8665e96449SHajimu UMEMOTO * Ascii internet address interpretation routine. 8765e96449SHajimu UMEMOTO * The value returned is in network order. 8865e96449SHajimu UMEMOTO */ 89ab96eeabSHajimu UMEMOTO in_addr_t /* XXX should be struct in_addr :( */ 9065e96449SHajimu UMEMOTO inet_addr(const char *cp) { 9165e96449SHajimu UMEMOTO struct in_addr val; 9265e96449SHajimu UMEMOTO 9365e96449SHajimu UMEMOTO if (inet_aton(cp, &val)) 9465e96449SHajimu UMEMOTO return (val.s_addr); 9565e96449SHajimu UMEMOTO return (INADDR_NONE); 9665e96449SHajimu UMEMOTO } 9765e96449SHajimu UMEMOTO 98dde4a85dSHajimu UMEMOTO /*% 9965e96449SHajimu UMEMOTO * Check whether "cp" is a valid ascii representation 10065e96449SHajimu UMEMOTO * of an Internet address and convert to a binary address. 10165e96449SHajimu UMEMOTO * Returns 1 if the address is valid, 0 if not. 10265e96449SHajimu UMEMOTO * This replaces inet_addr, the return value from which 10365e96449SHajimu UMEMOTO * cannot distinguish between failure and a local broadcast address. 10465e96449SHajimu UMEMOTO */ 10565e96449SHajimu UMEMOTO int 10665e96449SHajimu UMEMOTO inet_aton(const char *cp, struct in_addr *addr) { 10765e96449SHajimu UMEMOTO u_long val; 10865e96449SHajimu UMEMOTO int base, n; 10965e96449SHajimu UMEMOTO char c; 11065e96449SHajimu UMEMOTO u_int8_t parts[4]; 11165e96449SHajimu UMEMOTO u_int8_t *pp = parts; 11265e96449SHajimu UMEMOTO int digit; 11365e96449SHajimu UMEMOTO 11465e96449SHajimu UMEMOTO c = *cp; 11565e96449SHajimu UMEMOTO for (;;) { 11665e96449SHajimu UMEMOTO /* 11765e96449SHajimu UMEMOTO * Collect number up to ``.''. 11865e96449SHajimu UMEMOTO * Values are specified as for C: 11965e96449SHajimu UMEMOTO * 0x=hex, 0=octal, isdigit=decimal. 12065e96449SHajimu UMEMOTO */ 12165e96449SHajimu UMEMOTO if (!isdigit((unsigned char)c)) 12265e96449SHajimu UMEMOTO return (0); 12365e96449SHajimu UMEMOTO val = 0; base = 10; digit = 0; 12465e96449SHajimu UMEMOTO if (c == '0') { 12565e96449SHajimu UMEMOTO c = *++cp; 12665e96449SHajimu UMEMOTO if (c == 'x' || c == 'X') 12765e96449SHajimu UMEMOTO base = 16, c = *++cp; 12865e96449SHajimu UMEMOTO else { 12965e96449SHajimu UMEMOTO base = 8; 13065e96449SHajimu UMEMOTO digit = 1 ; 13165e96449SHajimu UMEMOTO } 13265e96449SHajimu UMEMOTO } 13365e96449SHajimu UMEMOTO for (;;) { 13465e96449SHajimu UMEMOTO if (isascii(c) && isdigit((unsigned char)c)) { 13565e96449SHajimu UMEMOTO if (base == 8 && (c == '8' || c == '9')) 13665e96449SHajimu UMEMOTO return (0); 13765e96449SHajimu UMEMOTO val = (val * base) + (c - '0'); 13865e96449SHajimu UMEMOTO c = *++cp; 13965e96449SHajimu UMEMOTO digit = 1; 14065e96449SHajimu UMEMOTO } else if (base == 16 && isascii(c) && 14165e96449SHajimu UMEMOTO isxdigit((unsigned char)c)) { 14265e96449SHajimu UMEMOTO val = (val << 4) | 14365e96449SHajimu UMEMOTO (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); 14465e96449SHajimu UMEMOTO c = *++cp; 14565e96449SHajimu UMEMOTO digit = 1; 14665e96449SHajimu UMEMOTO } else 14765e96449SHajimu UMEMOTO break; 14865e96449SHajimu UMEMOTO } 14965e96449SHajimu UMEMOTO if (c == '.') { 15065e96449SHajimu UMEMOTO /* 15165e96449SHajimu UMEMOTO * Internet format: 15265e96449SHajimu UMEMOTO * a.b.c.d 15365e96449SHajimu UMEMOTO * a.b.c (with c treated as 16 bits) 15465e96449SHajimu UMEMOTO * a.b (with b treated as 24 bits) 15565e96449SHajimu UMEMOTO */ 15665e96449SHajimu UMEMOTO if (pp >= parts + 3 || val > 0xffU) 15765e96449SHajimu UMEMOTO return (0); 15865e96449SHajimu UMEMOTO *pp++ = val; 15965e96449SHajimu UMEMOTO c = *++cp; 16065e96449SHajimu UMEMOTO } else 16165e96449SHajimu UMEMOTO break; 16265e96449SHajimu UMEMOTO } 16365e96449SHajimu UMEMOTO /* 16465e96449SHajimu UMEMOTO * Check for trailing characters. 16565e96449SHajimu UMEMOTO */ 16665e96449SHajimu UMEMOTO if (c != '\0' && (!isascii(c) || !isspace((unsigned char)c))) 16765e96449SHajimu UMEMOTO return (0); 16865e96449SHajimu UMEMOTO /* 16965e96449SHajimu UMEMOTO * Did we get a valid digit? 17065e96449SHajimu UMEMOTO */ 17165e96449SHajimu UMEMOTO if (!digit) 17265e96449SHajimu UMEMOTO return (0); 17365e96449SHajimu UMEMOTO /* 17465e96449SHajimu UMEMOTO * Concoct the address according to 17565e96449SHajimu UMEMOTO * the number of parts specified. 17665e96449SHajimu UMEMOTO */ 17765e96449SHajimu UMEMOTO n = pp - parts + 1; 17865e96449SHajimu UMEMOTO switch (n) { 179dde4a85dSHajimu UMEMOTO case 1: /*%< a -- 32 bits */ 18065e96449SHajimu UMEMOTO break; 18165e96449SHajimu UMEMOTO 182dde4a85dSHajimu UMEMOTO case 2: /*%< a.b -- 8.24 bits */ 18365e96449SHajimu UMEMOTO if (val > 0xffffffU) 18465e96449SHajimu UMEMOTO return (0); 18565e96449SHajimu UMEMOTO val |= parts[0] << 24; 18665e96449SHajimu UMEMOTO break; 18765e96449SHajimu UMEMOTO 188dde4a85dSHajimu UMEMOTO case 3: /*%< a.b.c -- 8.8.16 bits */ 18965e96449SHajimu UMEMOTO if (val > 0xffffU) 19065e96449SHajimu UMEMOTO return (0); 19165e96449SHajimu UMEMOTO val |= (parts[0] << 24) | (parts[1] << 16); 19265e96449SHajimu UMEMOTO break; 19365e96449SHajimu UMEMOTO 194dde4a85dSHajimu UMEMOTO case 4: /*%< a.b.c.d -- 8.8.8.8 bits */ 19565e96449SHajimu UMEMOTO if (val > 0xffU) 19665e96449SHajimu UMEMOTO return (0); 19765e96449SHajimu UMEMOTO val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); 19865e96449SHajimu UMEMOTO break; 19965e96449SHajimu UMEMOTO } 20065e96449SHajimu UMEMOTO if (addr != NULL) 20165e96449SHajimu UMEMOTO addr->s_addr = htonl(val); 20265e96449SHajimu UMEMOTO return (1); 20365e96449SHajimu UMEMOTO } 204ab96eeabSHajimu UMEMOTO 205ab96eeabSHajimu UMEMOTO /* 206ab96eeabSHajimu UMEMOTO * Weak aliases for applications that use certain private entry points, 207ab96eeabSHajimu UMEMOTO * and fail to include <arpa/inet.h>. 208ab96eeabSHajimu UMEMOTO */ 209ab96eeabSHajimu UMEMOTO #undef inet_addr 210ab96eeabSHajimu UMEMOTO __weak_reference(__inet_addr, inet_addr); 211ab96eeabSHajimu UMEMOTO #undef inet_aton 212ab96eeabSHajimu UMEMOTO __weak_reference(__inet_aton, inet_aton); 213dde4a85dSHajimu UMEMOTO 214dde4a85dSHajimu UMEMOTO /*! \file */ 215