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