1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#include <usual/socket.h>
#include <string.h>
#include "test_common.h"
static const char *ntop(int af, const void *src)
{
static char buf[128];
const char *res;
res = inet_ntop(af, src, buf, sizeof(buf));
return res ? res : "NULL";
}
static void test_ntop(void *z)
{
static const uint8_t data[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
str_check(ntop(AF_INET, data), "1.2.3.4");
str_check(ntop(AF_INET6, data), "102:304:506:708:90a:b0c:d0e:f10");
end:;
}
static const char *pton(int af, const char *s)
{
static char str[128];
unsigned char buf[128];
int res;
int len = (af == AF_INET) ? 4 : 16;
memset(buf, 0xCC, sizeof(buf));
res = inet_pton(af, s, buf);
if (res < 0) return "EAFBAD";
if (res == 0) return "FAIL";
if (buf[len] != 0xCC || buf[len + 1] != 0xCC)
return "EOVER";
if (buf[len - 1] == 0xCC || buf[0] == 0xCC)
return "EUNDER";
s = inet_ntop(af, buf, str, sizeof(str));
return s ? s : "NULL";
}
static void test_pton(void *z)
{
str_check(pton(AF_INET, "127.0.0.255"), "127.0.0.255");
str_check(pton(AF_INET, "127.0.0"), "FAIL");
str_check(pton(AF_INET, "127.1.1.a"), "FAIL");
str_check(pton(AF_INET, "127.1.1.300"), "FAIL");
str_check(pton(AF_INET6, "0001:0002:ffff:4444:5555:6666:7777:8888"), "1:2:ffff:4444:5555:6666:7777:8888");
str_check(pton(AF_INET6, "::"), "::");
str_check(pton(AF_INET6, "F00F::5060"), "f00f::5060");
str_check(pton(AF_INET6, "F00F::127.0.0.1"), "f00f::7f00:1");
str_check(pton(AF_INET6, "::1:2:3:4:5:6:7:8"), "FAIL");
end:;
}
struct testcase_t socket_tests[] = {
{ "inet_ntop", test_ntop },
{ "inet_pton", test_pton },
END_OF_TESTCASES
};
|