t2ex/bsd_source/lib/libc/src_bsd/arpa_inet/inet_addr.c | bare source | permlink (0.02 seconds) |
1: /* $OpenBSD: inet_addr.c,v 1.9 2005/08/06 20:30:03 espie Exp $ */ 2: 3: /* 4: * ++Copyright++ 1983, 1990, 1993 5: * - 6: * Copyright (c) 1983, 1990, 1993 7: * The Regents of the University of California. All rights reserved. 8: * 9: * Redistribution and use in source and binary forms, with or without 10: * modification, are permitted provided that the following conditions 11: * are met: 12: * 1. Redistributions of source code must retain the above copyright 13: * notice, this list of conditions and the following disclaimer. 14: * 2. Redistributions in binary form must reproduce the above copyright 15: * notice, this list of conditions and the following disclaimer in the 16: * documentation and/or other materials provided with the distribution. 17: * 3. Neither the name of the University nor the names of its contributors 18: * may be used to endorse or promote products derived from this software 19: * without specific prior written permission. 20: * 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31: * SUCH DAMAGE. 32: * - 33: * Portions Copyright (c) 1993 by Digital Equipment Corporation. 34: * 35: * Permission to use, copy, modify, and distribute this software for any 36: * purpose with or without fee is hereby granted, provided that the above 37: * copyright notice and this permission notice appear in all copies, and that 38: * the name of Digital Equipment Corporation not be used in advertising or 39: * publicity pertaining to distribution of the document or software without 40: * specific, written prior permission. 41: * 42: * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 43: * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 44: * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 45: * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 46: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 47: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 48: * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 49: * SOFTWARE. 50: * - 51: * --Copyright-- 52: */ 53: 54: #include <sys/types.h> 55: #include <sys/param.h> 56: #include <netinet/in.h> 57: #include <arpa/inet.h> 58: #include <ctype.h> 59: 60: /* 61: * Ascii internet address interpretation routine. 62: * The value returned is in network order. 63: */ 64: in_addr_t 65: inet_addr(const char *cp) 66: { 67: struct in_addr val; 68: 69: if (inet_aton(cp, &val)) 70: return (val.s_addr); 71: return (INADDR_NONE); 72: } 73: 74: /* 75: * Check whether "cp" is a valid ascii representation 76: * of an Internet address and convert to a binary address. 77: * Returns 1 if the address is valid, 0 if not. 78: * This replaces inet_addr, the return value from which 79: * cannot distinguish between failure and a local broadcast address. 80: */ 81: int 82: inet_aton(const char *cp, struct in_addr *addr) 83: { 84: in_addr_t val; 85: int base, n; 86: char c; 87: u_int parts[4]; 88: u_int *pp = parts; 89: 90: c = *cp; 91: for (;;) { 92: /* 93: * Collect number up to ``.''. 94: * Values are specified as for C: 95: * 0x=hex, 0=octal, isdigit=decimal. 96: */ 97: if (!isdigit(c)) 98: return (0); 99: val = 0; base = 10; 100: if (c == '0') { 101: c = *++cp; 102: if (c == 'x' || c == 'X') 103: base = 16, c = *++cp; 104: else 105: base = 8; 106: } 107: for (;;) { 108: if (isascii(c) && isdigit(c)) { 109: val = (val * base) + (c - '0'); 110: c = *++cp; 111: } else if (base == 16 && isascii(c) && isxdigit(c)) { 112: val = (val << 4) | 113: (c + 10 - (islower(c) ? 'a' : 'A')); 114: c = *++cp; 115: } else 116: break; 117: } 118: if (c == '.') { 119: /* 120: * Internet format: 121: * a.b.c.d 122: * a.b.c (with c treated as 16 bits) 123: * a.b (with b treated as 24 bits) 124: */ 125: if (pp >= parts + 3) 126: return (0); 127: *pp++ = val; 128: c = *++cp; 129: } else 130: break; 131: } 132: /* 133: * Check for trailing characters. 134: */ 135: if (c != '\0' && (!isascii(c) || !isspace(c))) 136: return (0); 137: /* 138: * Concoct the address according to 139: * the number of parts specified. 140: */ 141: n = pp - parts + 1; 142: switch (n) { 143: 144: case 0: 145: return (0); /* initial nondigit */ 146: 147: case 1: /* a -- 32 bits */ 148: break; 149: 150: case 2: /* a.b -- 8.24 bits */ 151: if ((val > 0xffffff) || (parts[0] > 0xff)) 152: return (0); 153: val |= parts[0] << 24; 154: break; 155: 156: case 3: /* a.b.c -- 8.8.16 bits */ 157: if ((val > 0xffff) || (parts[0] > 0xff) || (parts[1] > 0xff)) 158: return (0); 159: val |= (parts[0] << 24) | (parts[1] << 16); 160: break; 161: 162: case 4: /* a.b.c.d -- 8.8.8.8 bits */ 163: if ((val > 0xff) || (parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) 164: return (0); 165: val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); 166: break; 167: } 168: if (addr) 169: addr->s_addr = htonl(val); 170: return (1); 171: }