Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / native_client_sdk / src / libraries / nacl_io / syscalls / socket / inet_aton.c
blob7c4542b9d2791a34777ff186a3e7907184a21f0e
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.
5 #include "nacl_io/ossocket.h"
7 #if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)
9 #include <stdio.h>
10 #include <string.h>
11 #include <limits.h>
13 int 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);
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;
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;
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;
45 matched = sscanf(cp, "%u%n", &p1, &consumed);
46 if (strlen(cp) == consumed && matched == 1) {
47 inp->s_addr = htonl(p1);
48 return 1;
51 // Failure
52 return 0;
55 #endif // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)