Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / native_client_sdk / src / libraries / nacl_io / syscalls / socket / inet_aton.c
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
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);
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__)