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