
1: /* 2: * Copyright (c) 1983, 1990, 1993 3: * The Regents of the University of California. All rights reserved. 4: * 5: * Redistribution and use in source and binary forms, with or without 6: * modification, are permitted provided that the following conditions 7: * are met: 8: * 1. Redistributions of source code must retain the above copyright 9: * notice, this list of conditions and the following disclaimer. 10: * 2. Redistributions in binary form must reproduce the above copyright 11: * notice, this list of conditions and the following disclaimer in the 12: * documentation and/or other materials provided with the distribution. 13: * 4. Neither the name of the University nor the names of its contributors 14: * may be used to endorse or promote products derived from this software 15: * without specific prior written permission. 16: * 17: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27: * SUCH DAMAGE. 28: */ 29: 30: /* 31: * Portions Copyright (c) 1993 by Digital Equipment Corporation. 32: * 33: * Permission to use, copy, modify, and distribute this software for any 34: * purpose with or without fee is hereby granted, provided that the above 35: * copyright notice and this permission notice appear in all copies, and that 36: * the name of Digital Equipment Corporation not be used in advertising or 37: * publicity pertaining to distribution of the document or software without 38: * specific, written prior permission. 39: * 40: * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 41: * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 42: * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 43: * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 44: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 45: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 46: * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 47: * SOFTWARE. 48: */ 49: 50: /* 51: * Portions Copyright (c) 1996-1999 by Internet Software Consortium. 52: * 53: * Permission to use, copy, modify, and distribute this software for any 54: * purpose with or without fee is hereby granted, provided that the above 55: * copyright notice and this permission notice appear in all copies. 56: * 57: * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 58: * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 59: * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 60: * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 61: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 62: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 63: * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 64: * SOFTWARE. 65: */ 66: 67: #if defined(LIBC_SCCS) && !defined(lint) 68: static const char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93"; 69: static const char rcsid[] = "$BINDId: inet_addr.c,v 8.11 1999/10/13 16:39:25 vixie Exp $"; 70: #endif /* LIBC_SCCS and not lint */ 71: 72: #include <sys/types.h> 73: #include <sys/param.h> 74: 75: #include <netinet/in.h> 76: #include <arpa/inet.h> 77: 78: #include <ctype.h> 79: 80: #ifdef _LIBC 81: # include <endian.h> 82: # include <stdint.h> 83: # include <stdlib.h> 84: # include <limits.h> 85: # include <errno.h> 86: #endif 87: 88: /* 89: * Ascii internet address interpretation routine. 90: * The value returned is in network order. 91: */ 92: in_addr_t 93: inet_addr(const char *cp) { 94: struct in_addr val; 95: 96: if (__inet_aton(cp, &val)) 97: return (val.s_addr); 98: return (INADDR_NONE); 99: } 100: 101: /* 102: * Check whether "cp" is a valid ascii representation 103: * of an Internet address and convert to a binary address. 104: * Returns 1 if the address is valid, 0 if not. 105: * This replaces inet_addr, the return value from which 106: * cannot distinguish between failure and a local broadcast address. 107: */ 108: int 109: __inet_aton(const char *cp, struct in_addr *addr) 110: { 111: static const in_addr_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff }; 112: in_addr_t val; 113: #ifndef _LIBC 114: int base; 115: #endif 116: char c; 117: union iaddr { 118: uint8_t bytes[4]; 119: uint32_t word; 120: } res; 121: uint8_t *pp = res.bytes; 122: int digit; 123: 124: #ifdef _LIBC 125: int saved_errno = errno; 126: __set_errno (0); 127: #endif 128: 129: res.word = 0; 130: 131: c = *cp; 132: for (;;) { 133: /* 134: * Collect number up to ``.''. 135: * Values are specified as for C: 136: * 0x=hex, 0=octal, isdigit=decimal. 137: */ 138: if (!isdigit(c)) 139: goto ret_0; 140: #ifdef _LIBC 141: { 142: char *endp; 143: unsigned long ul = strtoul (cp, (char **) &endp, 0); 144: if (ul == ULONG_MAX && errno == ERANGE) 145: goto ret_0; 146: if (ul > 0xfffffffful) 147: goto ret_0; 148: val = ul; 149: digit = cp != endp; 150: cp = endp; 151: } 152: c = *cp; 153: #else 154: val = 0; base = 10; digit = 0; 155: if (c == '0') { 156: c = *++cp; 157: if (c == 'x' || c == 'X') 158: base = 16, c = *++cp; 159: else { 160: base = 8; 161: digit = 1 ; 162: } 163: } 164: for (;;) { 165: if (isascii(c) && isdigit(c)) { 166: if (base == 8 && (c == '8' || c == '9')) 167: return (0); 168: val = (val * base) + (c - '0'); 169: c = *++cp; 170: digit = 1; 171: } else if (base == 16 && isascii(c) && isxdigit(c)) { 172: val = (val << 4) | 173: (c + 10 - (islower(c) ? 'a' : 'A')); 174: c = *++cp; 175: digit = 1; 176: } else 177: break; 178: } 179: #endif 180: if (c == '.') { 181: /* 182: * Internet format: 183: * a.b.c.d 184: * a.b.c (with c treated as 16 bits) 185: * a.b (with b treated as 24 bits) 186: */ 187: if (pp > res.bytes + 2 || val > 0xff) 188: goto ret_0; 189: *pp++ = val; 190: c = *++cp; 191: } else 192: break; 193: } 194: /* 195: * Check for trailing characters. 196: */ 197: if (c != '\0' && (!isascii(c) || !isspace(c))) 198: goto ret_0; 199: /* 200: * Did we get a valid digit? 201: */ 202: if (!digit) 203: goto ret_0; 204: 205: /* Check whether the last part is in its limits depending on 206: the number of parts in total. */ 207: if (val > max[pp - res.bytes]) 208: goto ret_0; 209: 210: if (addr != NULL) 211: addr->s_addr = res.word | htonl (val); 212: 213: #ifdef _LIBC 214: __set_errno (saved_errno); 215: #endif 216: return (1); 217: 218: ret_0: 219: #ifdef _LIBC 220: __set_errno (saved_errno); 221: #endif 222: return (0); 223: } 224: weak_alias (__inet_aton, inet_aton) 225: libc_hidden_def (__inet_aton) 226: libc_hidden_weak (inet_aton)