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
|
#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
};
|