1047866672c66e51b557721cf50ba101305c252d2Elliott Hughes/* 2047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * Copyright (C) 2015 The Android Open Source Project 3047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * 4047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * you may not use this file except in compliance with the License. 6047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * You may obtain a copy of the License at 7047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * 8047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * 10047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * See the License for the specific language governing permissions and 14047866672c66e51b557721cf50ba101305c252d2Elliott Hughes * limitations under the License. 15047866672c66e51b557721cf50ba101305c252d2Elliott Hughes */ 16047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 17047866672c66e51b557721cf50ba101305c252d2Elliott Hughes#include <arpa/inet.h> 18047866672c66e51b557721cf50ba101305c252d2Elliott Hughes#include <netinet/in.h> 19047866672c66e51b557721cf50ba101305c252d2Elliott Hughes#include <stdlib.h> 20047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 21047866672c66e51b557721cf50ba101305c252d2Elliott Hughes#include "private/ErrnoRestorer.h" 22047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 23047866672c66e51b557721cf50ba101305c252d2Elliott Hughes// The difference between inet_network(3) and inet_addr(3) is that 24047866672c66e51b557721cf50ba101305c252d2Elliott Hughes// inet_network uses host order and inet_addr network order. 25047866672c66e51b557721cf50ba101305c252d2Elliott Hughesin_addr_t inet_network(const char* cp) { 26047866672c66e51b557721cf50ba101305c252d2Elliott Hughes in_addr_t network_order = inet_addr(cp); 27047866672c66e51b557721cf50ba101305c252d2Elliott Hughes return ntohl(network_order); 28047866672c66e51b557721cf50ba101305c252d2Elliott Hughes} 29047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 30047866672c66e51b557721cf50ba101305c252d2Elliott Hughesin_addr_t inet_addr(const char* cp) { 31047866672c66e51b557721cf50ba101305c252d2Elliott Hughes in_addr addr; 32047866672c66e51b557721cf50ba101305c252d2Elliott Hughes return inet_aton(cp, &addr) ? addr.s_addr : INADDR_NONE; 33047866672c66e51b557721cf50ba101305c252d2Elliott Hughes} 34047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 35047866672c66e51b557721cf50ba101305c252d2Elliott Hughesint inet_aton(const char* cp, in_addr* addr) { 36047866672c66e51b557721cf50ba101305c252d2Elliott Hughes ErrnoRestorer errno_restorer; 37047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 38047866672c66e51b557721cf50ba101305c252d2Elliott Hughes unsigned long parts[4]; 39047866672c66e51b557721cf50ba101305c252d2Elliott Hughes size_t i; 40047866672c66e51b557721cf50ba101305c252d2Elliott Hughes for (i = 0; i < 4; ++i) { 41047866672c66e51b557721cf50ba101305c252d2Elliott Hughes char* end; 427b77cb35aff34ff56a0b63517267c6203f9d1119Elliott Hughes errno = 0; 43047866672c66e51b557721cf50ba101305c252d2Elliott Hughes parts[i] = strtoul(cp, &end, 0); 447b77cb35aff34ff56a0b63517267c6203f9d1119Elliott Hughes if (errno != 0 || end == cp || (*end != '.' && *end != '\0')) return 0; 45047866672c66e51b557721cf50ba101305c252d2Elliott Hughes if (*end == '\0') break; 46047866672c66e51b557721cf50ba101305c252d2Elliott Hughes cp = end + 1; 47047866672c66e51b557721cf50ba101305c252d2Elliott Hughes } 48047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 49047866672c66e51b557721cf50ba101305c252d2Elliott Hughes uint32_t result = 0; 50047866672c66e51b557721cf50ba101305c252d2Elliott Hughes if (i == 0) { 51047866672c66e51b557721cf50ba101305c252d2Elliott Hughes // a (a 32-bit). 52047866672c66e51b557721cf50ba101305c252d2Elliott Hughes if (parts[0] > 0xffffffff) return 0; 53047866672c66e51b557721cf50ba101305c252d2Elliott Hughes result = parts[0]; 54047866672c66e51b557721cf50ba101305c252d2Elliott Hughes } else if (i == 1) { 55047866672c66e51b557721cf50ba101305c252d2Elliott Hughes // a.b (b 24-bit). 56047866672c66e51b557721cf50ba101305c252d2Elliott Hughes if (parts[0] > 0xff || parts[1] > 0xffffff) return 0; 57047866672c66e51b557721cf50ba101305c252d2Elliott Hughes result = (parts[0] << 24) | parts[1]; 58047866672c66e51b557721cf50ba101305c252d2Elliott Hughes } else if (i == 2) { 59047866672c66e51b557721cf50ba101305c252d2Elliott Hughes // a.b.c (c 16-bit). 60047866672c66e51b557721cf50ba101305c252d2Elliott Hughes if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xffff) return 0; 61047866672c66e51b557721cf50ba101305c252d2Elliott Hughes result = (parts[0] << 24) | (parts[1] << 16) | parts[2]; 62047866672c66e51b557721cf50ba101305c252d2Elliott Hughes } else if (i == 3) { 63047866672c66e51b557721cf50ba101305c252d2Elliott Hughes // a.b.c.d (d 8-bit). 64047866672c66e51b557721cf50ba101305c252d2Elliott Hughes if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff || parts[3] > 0xff) return 0; 65047866672c66e51b557721cf50ba101305c252d2Elliott Hughes result = (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]; 66047866672c66e51b557721cf50ba101305c252d2Elliott Hughes } else { 67047866672c66e51b557721cf50ba101305c252d2Elliott Hughes return 0; 68047866672c66e51b557721cf50ba101305c252d2Elliott Hughes } 69047866672c66e51b557721cf50ba101305c252d2Elliott Hughes 70047866672c66e51b557721cf50ba101305c252d2Elliott Hughes if (addr != nullptr) addr->s_addr = htonl(result); 71047866672c66e51b557721cf50ba101305c252d2Elliott Hughes return 1; 72047866672c66e51b557721cf50ba101305c252d2Elliott Hughes} 73