1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "nacl_io/ossocket.h" 6 7#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) 8 9#include <stdio.h> 10#include <string.h> 11#include <limits.h> 12 13int inet_aton(const char *cp, struct in_addr *inp) { 14 unsigned int p1 = 0, p2 = 0, p3 = 0, p4 = 0; 15 int consumed = 0; 16 int matched = sscanf(cp, "%u.%u.%u.%u%n", &p1, &p2, &p3, &p4, 17 &consumed); 18 19 if (strlen(cp) == consumed && matched == 4) { 20 if ((p1 | p2 | p3 | p4) <= UCHAR_MAX) { 21 in_addr_t host_order_addr = (p1 << 24) | (p2 << 16) | (p3 << 8) | p4; 22 inp->s_addr = htonl(host_order_addr); 23 return 1; 24 } 25 } 26 27 matched = sscanf(cp, "%u.%u.%u%n", &p1, &p2, &p3, &consumed); 28 if (strlen(cp) == consumed && matched == 3) { 29 if ((p1 | p2) <= UCHAR_MAX && p3 <= USHRT_MAX) { 30 in_addr_t host_order_addr = (p1 << 24) | (p2 << 16) | p3; 31 inp->s_addr = htonl(host_order_addr); 32 return 1; 33 } 34 } 35 36 matched = sscanf(cp, "%u.%u%n", &p1, &p2, &consumed); 37 if (strlen(cp) == consumed && matched == 2) { 38 if (p1 <= UCHAR_MAX && p1 <= 1 << 24) { 39 in_addr_t host_order_addr = (p1 << 24) | p2; 40 inp->s_addr = htonl(host_order_addr); 41 return 1; 42 } 43 } 44 45 matched = sscanf(cp, "%u%n", &p1, &consumed); 46 if (strlen(cp) == consumed && matched == 1) { 47 inp->s_addr = htonl(p1); 48 return 1; 49 } 50 51 // Failure 52 return 0; 53} 54 55#endif // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) 56