#include "prx/libc/include/general/VabiMacros.hpp" #include #include #include #include #include extern "C" { int APS5_VABI __inet_pton_nid_postfix(int, const char*, void*); const char* APS5_VABI __inet_ntop_nid_postfix(int, const void*, char*, std::uint32_t); int APS5_VABI inet_pton_nid_postfix(int, const char*, void*); const char* APS5_VABI inet_ntop_nid_postfix(int, const void*, char*, std::uint32_t); int* APS5_VABI __error_nid_postfix(); } static void Require(bool value) { if (!value) std::abort(); } using Ntop = const char* (APS5_VABI *)(int, const void*, char*, std::uint32_t); struct PtonCase { bool plain; int family; const char* text; int result; int error; const char* bytes; }; struct NtopCase { bool plain; int family; const char* source; std::uint32_t size; bool succeeds; int error; const char* bytes; std::size_t lastTouched; }; struct PadCase { int family; const char* source; std::uint32_t size; std::size_t lastTouched; }; static const PtonCase ConsolePton[] = { {false, 2, "1.2.3.4", 1, 0, "01020304aaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "0.0.0.0", 1, 0, "00000000aaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "255.255.255.255", 1, 0, "ffffffffaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "256.1.1.1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.04", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "001.002.003.004", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.0", 1, 0, "01020300aaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "127.1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.4.5", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1..2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, " 1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.4 ", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "0x1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.-1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.4/24", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "::1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::", 1, 0, "00000000000000000000000000000000"}, {false, 28, "::1", 1, 0, "00000000000000000000000000000001"}, {false, 28, "1::", 1, 0, "00010000000000000000000000000000"}, {false, 28, "1:2:3:4:5:6:7:8", 1, 0, "00010002000300040005000600070008"}, {false, 28, "1:2:3:4:5:6:7::", 1, 0, "00010002000300040005000600070000"}, {false, 28, "::2:3:4:5:6:7:8", 1, 0, "00000002000300040005000600070008"}, {false, 28, "1::2:3:4:5:6:7", 1, 0, "00010000000200030004000500060007"}, {false, 28, "1:2:3:4:5:6:7:8:9", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1::2::3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::ffff:1.2.3.4", 1, 0, "00000000000000000000ffff01020304"}, {false, 28, "::1.2.3.4", 1, 0, "00000000000000000000000001020304"}, {false, 28, "1:2:3:4:5:6:1.2.3.4", 1, 0, "00010002000300040005000601020304"}, {false, 28, "1:2:3:4:5:6:7:1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "fe80::1%eth0", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "FE80::ABCD", 1, 0, "fe80000000000000000000000000abcd"}, {false, 28, "12345::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "00001::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1:2:3:4:5:6:7:8:", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, ":1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "0:0:0:0:0:0:0:0", 1, 0, "00000000000000000000000000000000"}, {false, 28, "1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, ":", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, ":::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 9999, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 0, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "192.0.2.17", 1, 0, "c0000211aaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "256.1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.4.5", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.4.", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, " 1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "0x1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1..3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "1.2.3.-4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 2, "255.0.7.100", 1, 0, "ff000764aaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "2001:db8::17", 1, 0, "20010db8000000000000000000000017"}, {false, 28, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::ffff:192.0.2.17", 1, 0, "00000000000000000000ffffc0000211"}, {false, 28, "::ffff:01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::ffff:1.2.3.04", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1:2:3:4:5:6:7:8::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::1:2:3:4:5:6:7:8", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1::2::3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, ":::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, ":1::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1::2:", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, ":1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1:2:3:4:5:6:7:8:9", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "12345::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "fe80::1%eth0", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1.2.3.4::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::1.2.3.4:1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "::g", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1:2:3:4:5:6:1.2.3.4:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1:2:3:4:5:6:7:1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 28, "1:2:3:4:5:6:7::", 1, 0, "00010002000300040005000600070000"}, {false, 28, "ABCD:ef01::1", 1, 0, "abcdef01000000000000000000000001"}, {false, 28, "::ffff:0.0.0.1", 1, 0, "00000000000000000000ffff00000001"}, {false, 28, "::ffff:0:1:0", 1, 0, "0000000000000000ffff000000010000"}, {false, 28, "::1", 1, 0, "00000000000000000000000000000001"}, {false, 28, "::", 1, 0, "00000000000000000000000000000000"}, {false, 28, "1::", 1, 0, "00010000000000000000000000000000"}, {false, 28, "::2", 1, 0, "00000000000000000000000000000002"}, {false, 28, "::1.2.3.4", 1, 0, "00000000000000000000000001020304"}, {false, 28, "1:0:0:2:0:0:0:3", 1, 0, "00010000000000020000000000000003"}, {false, 28, "1:0:2:0:3:0:4:0", 1, 0, "00010000000200000003000000040000"}, {false, 28, "0:0:1:0:0:2:0:0", 1, 0, "00000000000100000000000200000000"}, {false, 28, "::ffff:1.2.3.4", 1, 0, "00000000000000000000ffff01020304"}, {false, 28, "2001:DB8::17", 1, 0, "20010db8000000000000000000000017"}, {false, 28, "0:0:0:0:0:0:1:0", 1, 0, "00000000000000000000000000010000"}, {false, 28, "::1:0", 1, 0, "00000000000000000000000000010000"}, {false, 28, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 1, 0, "ffffffffffffffffffffffffffffffff"}, {false, 10, "::1", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {false, 9999, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "192.0.2.17", 1, 0, "c0000211aaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "256.1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "1.2.3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "1.2.3.4.5", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "1.2.3.4.", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, " 1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "0x1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "1..3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "1.2.3.-4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 2, "255.0.7.100", 1, 0, "ff000764aaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "2001:db8::17", 1, 0, "20010db8000000000000000000000017"}, {true, 28, "not-an-address", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "::ffff:192.0.2.17", 1, 0, "00000000000000000000ffffc0000211"}, {true, 28, "::ffff:01.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "::ffff:1.2.3.04", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1:2:3:4:5:6:7:8::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "::1:2:3:4:5:6:7:8", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1::2::3", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, ":::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, ":1::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1::2:", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, ":1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1:2:3:4:5:6:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1:2:3:4:5:6:7:8:9", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "12345::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "fe80::1%eth0", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1.2.3.4::", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "::1.2.3.4:1", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "::g", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1:2:3:4:5:6:1.2.3.4:7", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1:2:3:4:5:6:7:1.2.3.4", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "", 0, 0, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 28, "1:2:3:4:5:6:7::", 1, 0, "00010002000300040005000600070000"}, {true, 28, "ABCD:ef01::1", 1, 0, "abcdef01000000000000000000000001"}, {true, 28, "::ffff:0.0.0.1", 1, 0, "00000000000000000000ffff00000001"}, {true, 28, "::ffff:0:1:0", 1, 0, "0000000000000000ffff000000010000"}, {true, 28, "::1", 1, 0, "00000000000000000000000000000001"}, {true, 28, "::", 1, 0, "00000000000000000000000000000000"}, {true, 28, "1::", 1, 0, "00010000000000000000000000000000"}, {true, 28, "::2", 1, 0, "00000000000000000000000000000002"}, {true, 28, "::1.2.3.4", 1, 0, "00000000000000000000000001020304"}, {true, 28, "1:0:0:2:0:0:0:3", 1, 0, "00010000000000020000000000000003"}, {true, 28, "1:0:2:0:3:0:4:0", 1, 0, "00010000000200000003000000040000"}, {true, 28, "0:0:1:0:0:2:0:0", 1, 0, "00000000000100000000000200000000"}, {true, 28, "::ffff:1.2.3.4", 1, 0, "00000000000000000000ffff01020304"}, {true, 28, "2001:DB8::17", 1, 0, "20010db8000000000000000000000017"}, {true, 28, "0:0:0:0:0:0:1:0", 1, 0, "00000000000000000000000000010000"}, {true, 28, "::1:0", 1, 0, "00000000000000000000000000010000"}, {true, 28, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 1, 0, "ffffffffffffffffffffffffffffffff"}, {true, 10, "::1", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, {true, 9999, "1.2.3.4", -1, 47, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, }; static const NtopCase ConsoleNtop[] = { {false, 2, "01020304", 16, true, 0, "312e322e332e34005a5a5a5a5a5a5a5a", 0}, {false, 2, "00000000", 16, true, 0, "302e302e302e30005a5a5a5a5a5a5a5a", 0}, {false, 2, "ffffffff", 16, true, 0, "3235352e3235352e3235352e32353500", 0}, {false, 2, "01020304", 8, true, 0, "312e322e332e3400", 0}, {false, 2, "01020304", 7, false, 28, "5a5a5a5a5a5a5a", 0}, {false, 2, "01020304", 0, false, 28, "", 0}, {false, 28, "00000000000000000000000000000000", 46, true, 0, "3a3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00000000000000000000000000000001", 46, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00010000000000000000000000000000", 46, true, 0, "313a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00010000000000020000000000000003", 46, true, 0, "313a303a303a323a3a33000000000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00010000000000020000000000030004", 46, true, 0, "313a3a323a303a303a333a3400000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00010000000200030004000500060007", 46, true, 0, "313a303a323a333a343a353a363a3700000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00000000000000000000ffff01020304", 46, true, 0, "3a3a666666663a312e322e332e340000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00000000000000000000000001020304", 46, true, 0, "3a3a312e322e332e3400000000000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00000000000000000000000000000002", 46, true, 0, "3a3a3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00000000000000000000ffff00000000", 46, true, 0, "3a3a666666663a302e302e302e300000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "0000000000000000ffff000001020304", 46, true, 0, "3a3a666666663a303a3130323a333034000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "abcd0000000000000000000000000000", 46, true, 0, "616263643a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000", 0}, {false, 28, "00000000000000000000000000000001", 4, true, 0, "3a3a3100", 0}, {false, 28, "00000000000000000000000000000001", 3, false, 28, "5a5a5a", 0}, {false, 28, "ffffffffffffffffffffffffffffffff", 46, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600000000000000", 0}, {false, 28, "ffffffffffffffffffffffffffffffff", 40, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600", 0}, {false, 28, "ffffffffffffffffffffffffffffffff", 39, false, 28, "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", 0}, {false, 28, "00000000000000000000ffffffffffff", 46, true, 0, "3a3a666666663a3235352e3235352e3235352e323535000000000000000000000000000000000000000000000000", 0}, {false, 9999, "01020304000000000000000000000000", 16, false, 47, "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a", 0}, {false, 2, "c0000211", 64, true, 0, "3139322e302e322e313700", 11}, {false, 2, "c0000211", 11, true, 0, "3139322e302e322e313700", 11}, {false, 2, "c0000211", 10, false, 28, "", 0}, {false, 2, "c0000211", 1, false, 28, "", 0}, {false, 2, "ff000764", 64, true, 0, "3235352e302e372e31303000", 12}, {false, 2, "ff000764", 12, true, 0, "3235352e302e372e31303000", 12}, {false, 2, "ff000764", 11, false, 28, "", 0}, {false, 2, "ff000764", 1, false, 28, "", 0}, {false, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13}, {false, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0}, {false, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0}, {false, 28, "00000000000000000000ffffc0000211", 64, true, 0, "3a3a666666663a3139322e302e322e31370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000ffffc0000211", 18, true, 0, "3a3a666666663a3139322e302e322e313700", 18}, {false, 28, "00000000000000000000ffffc0000211", 17, false, 28, "", 0}, {false, 28, "00000000000000000000ffffc0000211", 1, false, 28, "", 0}, {false, 28, "00010002000300040005000600070000", 64, true, 0, "313a323a333a343a353a363a373a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00010002000300040005000600070000", 16, true, 0, "313a323a333a343a353a363a373a3000", 16}, {false, 28, "00010002000300040005000600070000", 15, false, 28, "", 0}, {false, 28, "00010002000300040005000600070000", 1, false, 28, "", 0}, {false, 28, "abcdef01000000000000000000000001", 64, true, 0, "616263643a656630313a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "abcdef01000000000000000000000001", 13, true, 0, "616263643a656630313a3a3100", 13}, {false, 28, "abcdef01000000000000000000000001", 12, false, 28, "", 0}, {false, 28, "abcdef01000000000000000000000001", 1, false, 28, "", 0}, {false, 28, "00000000000000000000ffff00000001", 64, true, 0, "3a3a666666663a302e302e302e310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000ffff00000001", 15, true, 0, "3a3a666666663a302e302e302e3100", 15}, {false, 28, "00000000000000000000ffff00000001", 14, false, 28, "", 0}, {false, 28, "00000000000000000000ffff00000001", 1, false, 28, "", 0}, {false, 28, "0000000000000000ffff000000010000", 64, true, 0, "3a3a666666663a303a313a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "0000000000000000ffff000000010000", 13, true, 0, "3a3a666666663a303a313a3000", 13}, {false, 28, "0000000000000000ffff000000010000", 12, false, 28, "", 0}, {false, 28, "0000000000000000ffff000000010000", 1, false, 28, "", 0}, {false, 28, "00000000000000000000000000000001", 64, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000000000000001", 4, true, 0, "3a3a3100", 4}, {false, 28, "00000000000000000000000000000001", 3, false, 28, "", 0}, {false, 28, "00000000000000000000000000000001", 1, false, 28, "", 0}, {false, 28, "00000000000000000000000000000000", 64, true, 0, "3a3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000000000000000", 3, true, 0, "3a3a00", 3}, {false, 28, "00000000000000000000000000000000", 2, false, 28, "", 0}, {false, 28, "00000000000000000000000000000000", 1, false, 28, "", 0}, {false, 28, "00010000000000000000000000000000", 64, true, 0, "313a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00010000000000000000000000000000", 4, true, 0, "313a3a00", 4}, {false, 28, "00010000000000000000000000000000", 3, false, 28, "", 0}, {false, 28, "00010000000000000000000000000000", 1, false, 28, "", 0}, {false, 28, "00000000000000000000000000000002", 64, true, 0, "3a3a3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000000000000002", 4, true, 0, "3a3a3200", 4}, {false, 28, "00000000000000000000000000000002", 3, false, 28, "", 0}, {false, 28, "00000000000000000000000000000002", 1, false, 28, "", 0}, {false, 28, "00000000000000000000000001020304", 64, true, 0, "3a3a312e322e332e3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000000001020304", 10, true, 0, "3a3a312e322e332e3400", 10}, {false, 28, "00000000000000000000000001020304", 9, false, 28, "", 0}, {false, 28, "00000000000000000000000001020304", 1, false, 28, "", 0}, {false, 28, "00010000000000020000000000000003", 64, true, 0, "313a303a303a323a3a33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00010000000000020000000000000003", 11, true, 0, "313a303a303a323a3a3300", 11}, {false, 28, "00010000000000020000000000000003", 10, false, 28, "", 0}, {false, 28, "00010000000000020000000000000003", 1, false, 28, "", 0}, {false, 28, "00010000000200000003000000040000", 64, true, 0, "313a303a323a303a333a303a343a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00010000000200000003000000040000", 16, true, 0, "313a303a323a303a333a303a343a3000", 16}, {false, 28, "00010000000200000003000000040000", 15, false, 28, "", 0}, {false, 28, "00010000000200000003000000040000", 1, false, 28, "", 0}, {false, 28, "00000000000100000000000200000000", 64, true, 0, "3a3a313a303a303a323a303a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000100000000000200000000", 14, true, 0, "3a3a313a303a303a323a303a3000", 14}, {false, 28, "00000000000100000000000200000000", 13, false, 28, "", 0}, {false, 28, "00000000000100000000000200000000", 1, false, 28, "", 0}, {false, 28, "00000000000000000000ffff01020304", 64, true, 0, "3a3a666666663a312e322e332e340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000ffff01020304", 15, true, 0, "3a3a666666663a312e322e332e3400", 15}, {false, 28, "00000000000000000000ffff01020304", 14, false, 28, "", 0}, {false, 28, "00000000000000000000ffff01020304", 1, false, 28, "", 0}, {false, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13}, {false, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0}, {false, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0}, {false, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10}, {false, 28, "00000000000000000000000000010000", 9, false, 28, "", 0}, {false, 28, "00000000000000000000000000010000", 1, false, 28, "", 0}, {false, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {false, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10}, {false, 28, "00000000000000000000000000010000", 9, false, 28, "", 0}, {false, 28, "00000000000000000000000000010000", 1, false, 28, "", 0}, {false, 28, "ffffffffffffffffffffffffffffffff", 64, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600000000000000000000000000000000000000000000000000", 64}, {false, 28, "ffffffffffffffffffffffffffffffff", 40, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600", 40}, {false, 28, "ffffffffffffffffffffffffffffffff", 39, false, 28, "", 0}, {false, 28, "ffffffffffffffffffffffffffffffff", 1, false, 28, "", 0}, {false, 10, "01020304", 64, false, 47, "", 0}, {false, 9999, "01020304", 64, false, 47, "", 0}, {true, 2, "c0000211", 64, true, 0, "3139322e302e322e313700", 11}, {true, 2, "c0000211", 11, true, 0, "3139322e302e322e313700", 11}, {true, 2, "c0000211", 10, false, 28, "", 0}, {true, 2, "c0000211", 1, false, 28, "", 0}, {true, 2, "ff000764", 64, true, 0, "3235352e302e372e31303000", 12}, {true, 2, "ff000764", 12, true, 0, "3235352e302e372e31303000", 12}, {true, 2, "ff000764", 11, false, 28, "", 0}, {true, 2, "ff000764", 1, false, 28, "", 0}, {true, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13}, {true, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0}, {true, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0}, {true, 28, "00000000000000000000ffffc0000211", 64, true, 0, "3a3a666666663a3139322e302e322e31370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000ffffc0000211", 18, true, 0, "3a3a666666663a3139322e302e322e313700", 18}, {true, 28, "00000000000000000000ffffc0000211", 17, false, 28, "", 0}, {true, 28, "00000000000000000000ffffc0000211", 1, false, 28, "", 0}, {true, 28, "00010002000300040005000600070000", 64, true, 0, "313a323a333a343a353a363a373a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00010002000300040005000600070000", 16, true, 0, "313a323a333a343a353a363a373a3000", 16}, {true, 28, "00010002000300040005000600070000", 15, false, 28, "", 0}, {true, 28, "00010002000300040005000600070000", 1, false, 28, "", 0}, {true, 28, "abcdef01000000000000000000000001", 64, true, 0, "616263643a656630313a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "abcdef01000000000000000000000001", 13, true, 0, "616263643a656630313a3a3100", 13}, {true, 28, "abcdef01000000000000000000000001", 12, false, 28, "", 0}, {true, 28, "abcdef01000000000000000000000001", 1, false, 28, "", 0}, {true, 28, "00000000000000000000ffff00000001", 64, true, 0, "3a3a666666663a302e302e302e310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000ffff00000001", 15, true, 0, "3a3a666666663a302e302e302e3100", 15}, {true, 28, "00000000000000000000ffff00000001", 14, false, 28, "", 0}, {true, 28, "00000000000000000000ffff00000001", 1, false, 28, "", 0}, {true, 28, "0000000000000000ffff000000010000", 64, true, 0, "3a3a666666663a303a313a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "0000000000000000ffff000000010000", 13, true, 0, "3a3a666666663a303a313a3000", 13}, {true, 28, "0000000000000000ffff000000010000", 12, false, 28, "", 0}, {true, 28, "0000000000000000ffff000000010000", 1, false, 28, "", 0}, {true, 28, "00000000000000000000000000000001", 64, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000000000000001", 4, true, 0, "3a3a3100", 4}, {true, 28, "00000000000000000000000000000001", 3, false, 28, "", 0}, {true, 28, "00000000000000000000000000000001", 1, false, 28, "", 0}, {true, 28, "00000000000000000000000000000000", 64, true, 0, "3a3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000000000000000", 3, true, 0, "3a3a00", 3}, {true, 28, "00000000000000000000000000000000", 2, false, 28, "", 0}, {true, 28, "00000000000000000000000000000000", 1, false, 28, "", 0}, {true, 28, "00010000000000000000000000000000", 64, true, 0, "313a3a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00010000000000000000000000000000", 4, true, 0, "313a3a00", 4}, {true, 28, "00010000000000000000000000000000", 3, false, 28, "", 0}, {true, 28, "00010000000000000000000000000000", 1, false, 28, "", 0}, {true, 28, "00000000000000000000000000000002", 64, true, 0, "3a3a3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000000000000002", 4, true, 0, "3a3a3200", 4}, {true, 28, "00000000000000000000000000000002", 3, false, 28, "", 0}, {true, 28, "00000000000000000000000000000002", 1, false, 28, "", 0}, {true, 28, "00000000000000000000000001020304", 64, true, 0, "3a3a312e322e332e3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000000001020304", 10, true, 0, "3a3a312e322e332e3400", 10}, {true, 28, "00000000000000000000000001020304", 9, false, 28, "", 0}, {true, 28, "00000000000000000000000001020304", 1, false, 28, "", 0}, {true, 28, "00010000000000020000000000000003", 64, true, 0, "313a303a303a323a3a33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00010000000000020000000000000003", 11, true, 0, "313a303a303a323a3a3300", 11}, {true, 28, "00010000000000020000000000000003", 10, false, 28, "", 0}, {true, 28, "00010000000000020000000000000003", 1, false, 28, "", 0}, {true, 28, "00010000000200000003000000040000", 64, true, 0, "313a303a323a303a333a303a343a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00010000000200000003000000040000", 16, true, 0, "313a303a323a303a333a303a343a3000", 16}, {true, 28, "00010000000200000003000000040000", 15, false, 28, "", 0}, {true, 28, "00010000000200000003000000040000", 1, false, 28, "", 0}, {true, 28, "00000000000100000000000200000000", 64, true, 0, "3a3a313a303a303a323a303a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000100000000000200000000", 14, true, 0, "3a3a313a303a303a323a303a3000", 14}, {true, 28, "00000000000100000000000200000000", 13, false, 28, "", 0}, {true, 28, "00000000000100000000000200000000", 1, false, 28, "", 0}, {true, 28, "00000000000000000000ffff01020304", 64, true, 0, "3a3a666666663a312e322e332e340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000ffff01020304", 15, true, 0, "3a3a666666663a312e322e332e3400", 15}, {true, 28, "00000000000000000000ffff01020304", 14, false, 28, "", 0}, {true, 28, "00000000000000000000ffff01020304", 1, false, 28, "", 0}, {true, 28, "20010db8000000000000000000000017", 64, true, 0, "323030313a6462383a3a313700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "20010db8000000000000000000000017", 13, true, 0, "323030313a6462383a3a313700", 13}, {true, 28, "20010db8000000000000000000000017", 12, false, 28, "", 0}, {true, 28, "20010db8000000000000000000000017", 1, false, 28, "", 0}, {true, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10}, {true, 28, "00000000000000000000000000010000", 9, false, 28, "", 0}, {true, 28, "00000000000000000000000000010000", 1, false, 28, "", 0}, {true, 28, "00000000000000000000000000010000", 64, true, 0, "3a3a302e312e302e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 64}, {true, 28, "00000000000000000000000000010000", 10, true, 0, "3a3a302e312e302e3000", 10}, {true, 28, "00000000000000000000000000010000", 9, false, 28, "", 0}, {true, 28, "00000000000000000000000000010000", 1, false, 28, "", 0}, {true, 28, "ffffffffffffffffffffffffffffffff", 64, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600000000000000000000000000000000000000000000000000", 64}, {true, 28, "ffffffffffffffffffffffffffffffff", 40, true, 0, "666666663a666666663a666666663a666666663a666666663a666666663a666666663a6666666600", 40}, {true, 28, "ffffffffffffffffffffffffffffffff", 39, false, 28, "", 0}, {true, 28, "ffffffffffffffffffffffffffffffff", 1, false, 28, "", 0}, {true, 10, "01020304", 64, false, 47, "", 0}, {true, 9999, "01020304", 64, false, 47, "", 0}, {false, 28, "00000000000000000000000000000001", 65, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65}, {false, 2, "01020304", 65, true, 0, "312e322e332e3400", 8}, {false, 28, "00000000000000000000000000000001", 128, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 128}, {false, 2, "01020304", 128, true, 0, "312e322e332e3400", 8}, {false, 28, "00000000000000000000000000000001", 1024, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1024}, {false, 2, "01020304", 1024, true, 0, "312e322e332e3400", 8}, {false, 28, "00000000000000000000000000000001", 4096, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 4096}, {false, 2, "01020304", 4096, true, 0, "312e322e332e3400", 8}, {false, 28, "00000000000000000000000000000001", 65536, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65536}, {false, 2, "01020304", 65536, true, 0, "312e322e332e3400", 8}, {true, 28, "00000000000000000000000000000001", 65, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65}, {true, 2, "01020304", 65, true, 0, "312e322e332e3400", 8}, {true, 28, "00000000000000000000000000000001", 128, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 128}, {true, 2, "01020304", 128, true, 0, "312e322e332e3400", 8}, {true, 28, "00000000000000000000000000000001", 1024, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1024}, {true, 2, "01020304", 1024, true, 0, "312e322e332e3400", 8}, {true, 28, "00000000000000000000000000000001", 4096, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 4096}, {true, 2, "01020304", 4096, true, 0, "312e322e332e3400", 8}, {true, 28, "00000000000000000000000000000001", 65536, true, 0, "3a3a3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 65536}, {true, 2, "01020304", 65536, true, 0, "312e322e332e3400", 8}, }; static const PadCase ConsolePaddingBoth[] = { {28, "00000000000000000000000000000001", 4, 4}, {28, "00000000000000000000000000000001", 5, 5}, {28, "00000000000000000000000000000001", 16, 16}, {28, "00000000000000000000000000000001", 45, 45}, {28, "00000000000000000000000000000001", 46, 46}, {28, "00000000000000000000000000000001", 47, 47}, {28, "00000000000000000000000000000001", 64, 64}, {28, "ffffffffffffffffffffffffffffffff", 64, 64}, {2, "01020304", 8, 8}, {2, "01020304", 16, 8}, {2, "01020304", 64, 8}, }; static const PadCase ConsolePaddingLarge[] = { {28, "00000000000000000000000000000001", 65, 65}, {28, "00000000000000000000000000000001", 128, 128}, {28, "00000000000000000000000000000001", 1024, 1024}, {28, "00000000000000000000000000000001", 4096, 4096}, {28, "00000000000000000000000000000001", 65536, 65536}, {2, "01020304", 65, 8}, {2, "01020304", 128, 8}, {2, "01020304", 1024, 8}, {2, "01020304", 4096, 8}, {2, "01020304", 65536, 8}, }; static const PadCase ConsolePaddingUnderscored[] = { {28, "00000000000000000000000000000001", 64, 64}, {28, "00000000000000000000000000000001", 65, 65}, {28, "00000000000000000000000000000001", 128, 128}, {28, "00000000000000000000000000000001", 256, 256}, {28, "00000000000000000000000000000001", 1024, 1024}, {2, "01020304", 64, 8}, {2, "01020304", 65, 8}, {2, "01020304", 128, 8}, {2, "01020304", 256, 8}, {2, "01020304", 1024, 8}, }; static unsigned HexValue(char digit) { return digit <= '9' ? static_cast(digit - '0') : static_cast(digit - 'a' + 10); } static std::size_t FromHex(const char* hex, unsigned char* out) { std::size_t index = 0; for (; hex[2 * index]; ++index) out[index] = static_cast(HexValue(hex[2 * index]) << 4 | HexValue(hex[2 * index + 1])); return index; } static bool SameBytes(const void* data, const char* hex) { const auto* bytes = static_cast(data); for (std::size_t index = 0; hex[2 * index]; ++index) if (bytes[index] != (HexValue(hex[2 * index]) << 4 | HexValue(hex[2 * index + 1]))) return false; return true; } template static bool Throws(TCall call) { try { call(); } catch (const std::runtime_error&) { return true; } return false; } static char Wide[70000]; static void CheckConsolePton() { for (const PtonCase& sample : ConsolePton) { unsigned char destination[16]; std::memset(destination, 0xAA, sizeof(destination)); *__error_nid_postfix() = 0; const int result = sample.plain ? inet_pton_nid_postfix(sample.family, sample.text, destination) : __inet_pton_nid_postfix(sample.family, sample.text, destination); Require(result == sample.result); Require(*__error_nid_postfix() == sample.error); Require(SameBytes(destination, sample.bytes)); } } static void CheckConsoleNtop() { for (const NtopCase& sample : ConsoleNtop) { unsigned char source[16]{}; FromHex(sample.source, source); std::memset(Wide, 'Z', sizeof(Wide)); *__error_nid_postfix() = 0; const char* result = sample.plain ? inet_ntop_nid_postfix(sample.family, source, Wide, sample.size) : __inet_ntop_nid_postfix(sample.family, source, Wide, sample.size); Require(result == (sample.succeeds ? Wide : nullptr)); Require(*__error_nid_postfix() == sample.error); Require(SameBytes(Wide, sample.bytes)); if (!sample.lastTouched && sample.succeeds) continue; const std::size_t shown = std::strlen(sample.bytes) / 2; for (std::size_t index = shown; index < sample.lastTouched; ++index) Require(Wide[index] != 'Z'); for (std::size_t index = sample.lastTouched; index < sizeof(Wide); ++index) Require(Wide[index] == 'Z'); } } static void CheckConsolePadding(const PadCase* samples, std::size_t count, Ntop ntop) { for (std::size_t sample = 0; sample < count; ++sample) { unsigned char source[16]{}; FromHex(samples[sample].source, source); std::memset(Wide, 'Z', sizeof(Wide)); Require(ntop(samples[sample].family, source, Wide, samples[sample].size) == Wide); for (std::size_t index = std::strlen(Wide); index < samples[sample].lastTouched; ++index) Require(Wide[index] == '\0'); for (std::size_t index = samples[sample].lastTouched; index < sizeof(Wide); ++index) Require(Wide[index] == 'Z'); } } static void CheckNullPointers() { const unsigned char loopback[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; const unsigned char quad[16] = {1, 2, 3, 4}; unsigned char bytes[16]{}; char text[64]; Require(Throws([&] { __inet_ntop_nid_postfix(28, nullptr, text, sizeof(text)); })); Require(Throws([&] { __inet_ntop_nid_postfix(2, nullptr, text, sizeof(text)); })); Require(Throws([&] { __inet_ntop_nid_postfix(28, loopback, nullptr, 46); })); Require(Throws([&] { __inet_ntop_nid_postfix(2, quad, nullptr, 16); })); Require(Throws([&] { inet_ntop_nid_postfix(28, nullptr, text, sizeof(text)); })); Require(Throws([&] { inet_ntop_nid_postfix(28, loopback, nullptr, 46); })); Require(Throws([&] { __inet_ntop_nid_postfix(2, nullptr, text, 0); })); Require(Throws([&] { __inet_ntop_nid_postfix(28, nullptr, text, 1); })); Require(Throws([&] { inet_ntop_nid_postfix(2, nullptr, text, 0); })); Require(Throws([&] { inet_ntop_nid_postfix(28, nullptr, text, 1); })); for (Ntop ntop : {__inet_ntop_nid_postfix, inet_ntop_nid_postfix}) { *__error_nid_postfix() = 0; Require(ntop(28, loopback, nullptr, 3) == nullptr && *__error_nid_postfix() == 28); *__error_nid_postfix() = 0; Require(ntop(2, quad, nullptr, 7) == nullptr && *__error_nid_postfix() == 28); *__error_nid_postfix() = 0; Require(ntop(2, quad, nullptr, 0) == nullptr && *__error_nid_postfix() == 28); } Require(Throws([&] { __inet_pton_nid_postfix(2, nullptr, bytes); })); Require(Throws([&] { __inet_pton_nid_postfix(28, nullptr, bytes); })); Require(Throws([&] { __inet_pton_nid_postfix(2, "1.2.3.4", nullptr); })); Require(Throws([&] { __inet_pton_nid_postfix(28, "::1", nullptr); })); Require(Throws([&] { inet_pton_nid_postfix(2, nullptr, bytes); })); Require(Throws([&] { inet_pton_nid_postfix(2, "1.2.3.4", nullptr); })); *__error_nid_postfix() = 0; Require(__inet_pton_nid_postfix(2, "1.2.3", nullptr) == 0 && *__error_nid_postfix() == 0); Require(__inet_pton_nid_postfix(28, "zzz", nullptr) == 0 && *__error_nid_postfix() == 0); Require(__inet_pton_nid_postfix(2, "", nullptr) == 0 && *__error_nid_postfix() == 0); Require(inet_pton_nid_postfix(2, "1.2.3", nullptr) == 0 && *__error_nid_postfix() == 0); Require(inet_pton_nid_postfix(28, "zzz", nullptr) == 0 && *__error_nid_postfix() == 0); Require(inet_pton_nid_postfix(2, "", nullptr) == 0 && *__error_nid_postfix() == 0); *__error_nid_postfix() = 0; Require(__inet_ntop_nid_postfix(9999, nullptr, text, sizeof(text)) == nullptr && *__error_nid_postfix() == 47); *__error_nid_postfix() = 0; Require(__inet_ntop_nid_postfix(9999, bytes, nullptr, 46) == nullptr && *__error_nid_postfix() == 47); *__error_nid_postfix() = 0; Require(__inet_pton_nid_postfix(9999, nullptr, bytes) == -1 && *__error_nid_postfix() == 47); *__error_nid_postfix() = 0; Require(__inet_pton_nid_postfix(9999, "1.2.3.4", nullptr) == -1 && *__error_nid_postfix() == 47); *__error_nid_postfix() = 0; Require(inet_ntop_nid_postfix(9999, nullptr, text, sizeof(text)) == nullptr && *__error_nid_postfix() == 47); *__error_nid_postfix() = 0; Require(inet_ntop_nid_postfix(9999, quad, nullptr, 46) == nullptr && *__error_nid_postfix() == 47); *__error_nid_postfix() = 0; Require(inet_pton_nid_postfix(9999, nullptr, bytes) == -1 && *__error_nid_postfix() == 47); *__error_nid_postfix() = 0; Require(inet_pton_nid_postfix(9999, "1.2.3.4", nullptr) == -1 && *__error_nid_postfix() == 47); } static void CheckErrnoKept() { unsigned char bytes[16]{}; char text[64]; *__error_nid_postfix() = 13; Require(__inet_pton_nid_postfix(2, "1.2.3.4", bytes) == 1 && *__error_nid_postfix() == 13); Require(__inet_pton_nid_postfix(2, "1.2.3", bytes) == 0 && *__error_nid_postfix() == 13); Require(__inet_pton_nid_postfix(28, "::1", bytes) == 1 && *__error_nid_postfix() == 13); Require(__inet_ntop_nid_postfix(2, bytes, text, sizeof(text)) == text && *__error_nid_postfix() == 13); } int main() { for (int family : {2, 28}) { const char* input = family == 2 ? "192.0.2.17" : "2001:db8::17"; std::array address{}; Require(__inet_pton_nid_postfix(family, input, address.data()) == 1); char output[64]{}; Require(__inet_ntop_nid_postfix(family, address.data(), output, sizeof(output)) == output); Require(std::strcmp(input, output) == 0); output[0] = 'x'; Require(__inet_ntop_nid_postfix(family, address.data(), output, 1) == nullptr); Require(*__error_nid_postfix() == 28 && output[0] == 'x'); const auto original = address; Require(__inet_pton_nid_postfix(family, "not-an-address", address.data()) == 0); Require(address == original); } std::array address{}; Require(__inet_pton_nid_postfix(10, "::1", address.data()) == -1); Require(*__error_nid_postfix() == 47); // Linux AF_INET6 is not PS5 AF_INET6 Require(__inet_pton_nid_postfix(2, "256.1.2.3", address.data()) == 0); Require(__inet_pton_nid_postfix(28, "::ffff:192.0.2.17", address.data()) == 1); Require(address[10] == 255 && address[11] == 255 && address[12] == 192 && address[15] == 17); for (const char* rejected : {"01.2.3.4", "1.2.3", "1.2.3.4.5", "1.2.3.4.", " 1.2.3.4", "0x1.2.3.4", "1..3.4", "1.2.3.-4"}) { address.fill(0xA5); Require(__inet_pton_nid_postfix(2, rejected, address.data()) == 0); Require(address[0] == 0xA5); } for (const char* rejected : {"::ffff:01.2.3.4", "::ffff:1.2.3.04", "1:2:3:4:5:6:7:8::", "::1:2:3:4:5:6:7:8", "1::2::3", ":::", ":1::", "1::2:", ":1:2:3:4:5:6:7", "1:2:3:4:5:6:7", "1:2:3:4:5:6:7:8:9", "12345::", "fe80::1%eth0", "1.2.3.4::", "::1.2.3.4:1", "::g", "1:2:3:4:5:6:1.2.3.4:7", "1:2:3:4:5:6:7:1.2.3.4", ""}) { address.fill(0xA5); Require(__inet_pton_nid_postfix(28, rejected, address.data()) == 0); Require(address[0] == 0xA5 && address[15] == 0xA5); } Require(__inet_pton_nid_postfix(28, "1:2:3:4:5:6:7::", address.data()) == 1); Require(address[13] == 7 && address[14] == 0 && address[1] == 1); Require(__inet_pton_nid_postfix(28, "ABCD:ef01::1", address.data()) == 1); Require(address[0] == 0xAB && address[1] == 0xCD && address[2] == 0xEF && address[3] == 0x01 && address[15] == 1); struct Text { const char* bytesAsText; const char* expected; }; const Text samples[] = { {"::ffff:0.0.0.1", "::ffff:0.0.0.1"}, {"::ffff:0:1:0", "::ffff:0:1:0"}, {"::1", "::1"}, {"::", "::"}, {"1::", "1::"}, {"::2", "::2"}, {"::1.2.3.4", "::1.2.3.4"}, {"1:0:0:2:0:0:0:3", "1:0:0:2::3"}, {"1:0:2:0:3:0:4:0", "1:0:2:0:3:0:4:0"}, {"0:0:1:0:0:2:0:0", "::1:0:0:2:0:0"}, {"::ffff:1.2.3.4", "::ffff:1.2.3.4"}, {"2001:DB8::17", "2001:db8::17"}}; for (const Text& sample : samples) { Require(__inet_pton_nid_postfix(28, sample.bytesAsText, address.data()) == 1); char output[64]{}; Require(__inet_ntop_nid_postfix(28, address.data(), output, sizeof(output)) == output); Require(std::strcmp(output, sample.expected) == 0); const auto length = std::strlen(sample.expected); std::memset(output, 'x', sizeof(output)); Require(__inet_ntop_nid_postfix(28, address.data(), output, static_cast(length + 1)) == output); Require(std::strcmp(output, sample.expected) == 0); std::memset(output, 'x', sizeof(output)); *__error_nid_postfix() = 0; Require(__inet_ntop_nid_postfix(28, address.data(), output, static_cast(length)) == nullptr); Require(*__error_nid_postfix() == 28 && output[0] == 'x'); } address.fill(0xFF); char widest[64]{}; Require(__inet_ntop_nid_postfix(28, address.data(), widest, sizeof(widest)) == widest); Require(std::strcmp(widest, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") == 0); const unsigned char fourth[4] = {255, 0, 7, 100}; Require(__inet_ntop_nid_postfix(2, fourth, widest, 12) == widest && std::strcmp(widest, "255.0.7.100") == 0); Require(__inet_ntop_nid_postfix(2, fourth, widest, 11) == nullptr && *__error_nid_postfix() == 28); Require(__inet_ntop_nid_postfix(10, fourth, widest, sizeof(widest)) == nullptr && *__error_nid_postfix() == 47); CheckConsolePton(); CheckConsoleNtop(); CheckConsolePadding(ConsolePaddingBoth, sizeof(ConsolePaddingBoth) / sizeof(ConsolePaddingBoth[0]), __inet_ntop_nid_postfix); CheckConsolePadding(ConsolePaddingBoth, sizeof(ConsolePaddingBoth) / sizeof(ConsolePaddingBoth[0]), inet_ntop_nid_postfix); CheckConsolePadding(ConsolePaddingUnderscored, sizeof(ConsolePaddingUnderscored) / sizeof(ConsolePaddingUnderscored[0]), __inet_ntop_nid_postfix); CheckConsolePadding(ConsolePaddingLarge, sizeof(ConsolePaddingLarge) / sizeof(ConsolePaddingLarge[0]), __inet_ntop_nid_postfix); CheckConsolePadding(ConsolePaddingLarge, sizeof(ConsolePaddingLarge) / sizeof(ConsolePaddingLarge[0]), inet_ntop_nid_postfix); CheckNullPointers(); CheckErrnoKept(); }