1511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* 2511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Copyright (c) 1983, 1993 3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * The Regents of the University of California. All rights reserved. 4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * All rights reserved. 5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Redistribution and use in source and binary forms, with or without 7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * modification, are permitted provided that the following conditions 8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * are met: 9511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 1. Redistributions of source code must retain the above copyright 10511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * notice, this list of conditions and the following disclaimer. 11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 2. Redistributions in binary form must reproduce the above copyright 12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * notice, this list of conditions and the following disclaimer in the 13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * documentation and/or other materials provided with the distribution. 14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 3. All advertising materials mentioning features or use of this software 15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * must display the following acknowledgement: 16511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * This product includes software developed by the University of 17511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * California, Berkeley and its contributors. 18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 4. Neither the name of the University nor the names of its contributors 19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * may be used to endorse or promote products derived from this software 20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * without specific prior written permission. 21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * SUCH DAMAGE. 33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if defined(LIBC_SCCS) && !defined(lint) 36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char sccsid[] = "@(#)inet_network.c 8.1 (Berkeley) 6/4/93"; 37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* LIBC_SCCS and not lint */ 38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include "inetprivate.h" 40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* 42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Internet network address interpretation routine. 43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * The library routines call this routine to interpret 44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * network numbers. 45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallu_int32_t 47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallinet_network(const char *cp) 48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{ 49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall register u_long val, base, n; 50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall register char c; 51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall u_long parts[4], *pp = parts; 52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall register int i; 53511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallagain: 55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Collect number up to ``.''. 57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Values are specified as for C: 58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 0x=hex, 0=octal, other=decimal. 59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall val = 0; base = 10; 61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall /* 62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * The 4.4BSD version of this file also accepts 'x__' as a hexa 63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * number. I don't think this is correct. -- Uli 64511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */ 65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (*cp == '0') { 66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (*++cp == 'x' || *cp == 'X') 67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall base = 16, cp++; 68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall else 69511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall base = 8; 70511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 71511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall while ((c = *cp)) { 72511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (isdigit(c)) { 73511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall val = (val * base) + (c - '0'); 74511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cp++; 75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall continue; 76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (base == 16 && isxdigit(c)) { 78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); 79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall cp++; 80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall continue; 81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall break; 83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (*cp == '.') { 85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (pp >= parts + 4) 86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (INADDR_NONE); 87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *pp++ = val, cp++; 88511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall goto again; 89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (*cp && !isspace(*cp)) 91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (INADDR_NONE); 92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *pp++ = val; 93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall n = pp - parts; 94511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (n > 4) 95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (INADDR_NONE); 96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall for (val = 0, i = 0; i < (int)n; i++) { 97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall val <<= 8; 98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall val |= parts[i] & 0xff; 99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall return (val); 101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall} 102