aboutsummaryrefslogtreecommitdiff
blob: 8c64ac59ff5777ce3b7e0fb504415a75652808da (plain)
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"