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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
#include <stdbool.h>
#include <stdio.h>
#include <ifaddrs.h>
#include <stdint.h>
/* Internal definitions used in the libc code. */
#define __getservbyname_r getservbyname_r
#define __socket socket
#define __getsockname getsockname
#define __inet_aton inet_aton
#define __gethostbyaddr_r gethostbyaddr_r
#define __gethostbyname2_r gethostbyname2_r
#define __qsort_r qsort_r
void
attribute_hidden
__check_pf (bool *p1, bool *p2, struct in6addrinfo **in6ai, size_t *in6ailen)
{
*p1 = *p2 = true;
*in6ai = NULL;
*in6ailen = 0;
}
void
attribute_hidden
__free_in6ai (struct in6addrinfo *ai)
{
}
void
attribute_hidden
__check_native (uint32_t a1_index, int *a1_native,
uint32_t a2_index, int *a2_native)
{
}
int
attribute_hidden
__idna_to_ascii_lz (const char *input, char **output, int flags)
{
return 0;
}
int
attribute_hidden
__idna_to_unicode_lzlz (const char *input, char **output, int flags)
{
*output = NULL;
return 0;
}
void
attribute_hidden
_res_hconf_init (void)
{
}
#undef USE_NSCD
#include "../sysdeps/posix/getaddrinfo.c"
service_user *__nss_hosts_database attribute_hidden;
/* This is the beginning of the real test code. The above defines
(among other things) the function rfc3484_sort. */
#if __BYTE_ORDER == __BIG_ENDIAN
# define h(n) n
#else
# define h(n) __bswap_constant_32 (n)
#endif
ssize_t
__getline (char **lineptr, size_t *n, FILE *s)
{
*lineptr = NULL;
*n = 0;
return 0;
}
static int
do_test (void)
{
labels = default_labels;
precedence = default_precedence;
scopes = default_scopes;
struct sockaddr_in so1;
so1.sin_family = AF_INET;
so1.sin_addr.s_addr = h (0xc0a85f19);
/* Clear the rest of the structure to avoid warnings. */
memset (so1.sin_zero, '\0', sizeof (so1.sin_zero));
struct sockaddr_in sa1;
sa1.sin_family = AF_INET;
sa1.sin_addr.s_addr = h (0xe0a85f19);
struct addrinfo ai1;
ai1.ai_family = AF_INET;
ai1.ai_addr = (struct sockaddr *) &sa1;
struct sockaddr_in6 so2;
so2.sin6_family = AF_INET6;
so2.sin6_addr.s6_addr32[0] = h (0xfec01234);
so2.sin6_addr.s6_addr32[1] = 1;
so2.sin6_addr.s6_addr32[2] = 1;
so2.sin6_addr.s6_addr32[3] = 1;
struct sockaddr_in6 sa2;
sa2.sin6_family = AF_INET6;
sa2.sin6_addr.s6_addr32[0] = h (0x07d10001);
sa2.sin6_addr.s6_addr32[1] = 1;
sa2.sin6_addr.s6_addr32[2] = 1;
sa2.sin6_addr.s6_addr32[3] = 1;
struct addrinfo ai2;
ai2.ai_family = AF_INET6;
ai2.ai_addr = (struct sockaddr *) &sa2;
struct sort_result results[2];
size_t order[2];
results[0].dest_addr = &ai1;
results[0].got_source_addr = true;
results[0].source_addr_len = sizeof (so1);
results[0].source_addr_flags = 0;
results[0].prefixlen = 16;
results[0].index = 0;
memcpy (&results[0].source_addr, &so1, sizeof (so1));
order[0] = 0;
results[1].dest_addr = &ai2;
results[1].got_source_addr = true;
results[1].source_addr_len = sizeof (so2);
results[1].source_addr_flags = 0;
results[1].prefixlen = 16;
results[1].index = 0;
memcpy (&results[1].source_addr, &so2, sizeof (so2));
order[1] = 1;
struct sort_result_combo combo = { .results = results, .nresults = 2 };
qsort_r (order, 2, sizeof (order[0]), rfc3484_sort, &combo);
int result = 0;
if (results[order[0]].dest_addr->ai_family == AF_INET6)
{
puts ("wrong order in first test");
result |= 1;
}
/* And again, this time with the reverse starting order. */
results[1].dest_addr = &ai1;
results[1].got_source_addr = true;
results[1].source_addr_len = sizeof (so1);
results[1].source_addr_flags = 0;
results[1].prefixlen = 16;
results[1].index = 0;
memcpy (&results[1].source_addr, &so1, sizeof (so1));
order[1] = 1;
results[0].dest_addr = &ai2;
results[0].got_source_addr = true;
results[0].source_addr_len = sizeof (so2);
results[0].source_addr_flags = 0;
results[0].prefixlen = 16;
results[0].index = 0;
memcpy (&results[0].source_addr, &so2, sizeof (so2));
order[0] = 0;
qsort_r (order, 2, sizeof (order[0]), rfc3484_sort, &combo);
if (results[order[0]].dest_addr->ai_family == AF_INET6)
{
puts ("wrong order in second test");
result |= 1;
}
return result;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
|