/*-1* SPDX-License-Identifier: BSD-3-Clause2*3* Copyright (c) 1983, 19934* The Regents of the University of California. All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14* 3. Neither the name of the University nor the names of its contributors15* may be used to endorse or promote products derived from this software16* without specific prior written permission.17*18* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND19* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE20* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE21* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE22* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL23* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS24* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)25* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT26* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY27* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF28* SUCH DAMAGE.29*/3031#include "port_before.h"3233#include <sys/types.h>34#include <netinet/in.h>35#include <arpa/inet.h>36#include <ctype.h>3738#include "port_after.h"3940/*%41* Internet network address interpretation routine.42* The library routines call this routine to interpret43* network numbers.44*/45in_addr_t46inet_network(const char *cp)47{48in_addr_t val, base, n;49char c;50in_addr_t parts[4], *pp = parts;51int i, digit;5253again:54val = 0; base = 10; digit = 0;55if (*cp == '0')56digit = 1, base = 8, cp++;57if (*cp == 'x' || *cp == 'X')58base = 16, cp++;59while ((c = *cp) != 0) {60if (isdigit((unsigned char)c)) {61if (base == 8U && (c == '8' || c == '9'))62return (INADDR_NONE);63val = (val * base) + (c - '0');64cp++;65digit = 1;66continue;67}68if (base == 16U && isxdigit((unsigned char)c)) {69val = (val << 4) +70(c + 10 - (islower((unsigned char)c) ? 'a' : 'A'));71cp++;72digit = 1;73continue;74}75break;76}77if (!digit)78return (INADDR_NONE);79if (pp >= parts + 4 || val > 0xffU)80return (INADDR_NONE);81if (*cp == '.') {82*pp++ = val, cp++;83goto again;84}85if (*cp && !isspace(*cp&0xff))86return (INADDR_NONE);87*pp++ = val;88n = pp - parts;89if (n > 4U)90return (INADDR_NONE);91for (val = 0, i = 0; i < n; i++) {92val <<= 8;93val |= parts[i] & 0xff;94}95return (val);96}9798/*99* Weak aliases for applications that use certain private entry points,100* and fail to include <arpa/inet.h>.101*/102#undef inet_network103__weak_reference(__inet_network, inet_network);104105/*! \file */106107108