aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/test_options.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/test_options.c')
-rw-r--r--src/microhttpd/test_options.c176
1 files changed, 169 insertions, 7 deletions
diff --git a/src/microhttpd/test_options.c b/src/microhttpd/test_options.c
index deff9b92..7be7666d 100644
--- a/src/microhttpd/test_options.c
+++ b/src/microhttpd/test_options.c
@@ -70,50 +70,212 @@ test_wrap_loc (const char *test_name, unsigned int (*test)(void))
70 70
71 71
72/** 72/**
73 * Test daemon initialization with the MHD_OPTION_SOCK_ADDR option 73 * Test daemon initialization with the MHD_OPTION_SOCK_ADDR or
74 * the MHD_OPTION_SOCK_ADDR_LEN options
74 */ 75 */
75static unsigned int 76static unsigned int
76test_ip_addr_option (void) 77test_ip_addr_option (void)
77{ 78{
78 struct MHD_Daemon *d; 79 struct MHD_Daemon *d;
80 const union MHD_DaemonInfo *dinfo;
79 struct sockaddr_in daemon_ip_addr; 81 struct sockaddr_in daemon_ip_addr;
82 uint16_t port4;
80#if defined(HAVE_INET6) && defined(USE_IPV6_TESTING) 83#if defined(HAVE_INET6) && defined(USE_IPV6_TESTING)
81 struct sockaddr_in6 daemon_ip_addr6; 84 struct sockaddr_in6 daemon_ip_addr6;
85 uint16_t port6;
82#endif 86#endif
87 unsigned int ret;
83 88
84 memset (&daemon_ip_addr, 0, sizeof (struct sockaddr_in)); 89 memset (&daemon_ip_addr, 0, sizeof (struct sockaddr_in));
85 daemon_ip_addr.sin_family = AF_INET; 90 daemon_ip_addr.sin_family = AF_INET;
86 daemon_ip_addr.sin_port = 0; 91 daemon_ip_addr.sin_port = 0;
87 daemon_ip_addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); 92 daemon_ip_addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
93 port4 = 0;
88 94
89#if defined(HAVE_INET6) && defined(USE_IPV6_TESTING) 95#if defined(HAVE_INET6) && defined(USE_IPV6_TESTING)
90 memset (&daemon_ip_addr6, 0, sizeof (struct sockaddr_in6)); 96 memset (&daemon_ip_addr6, 0, sizeof (struct sockaddr_in6));
91 daemon_ip_addr6.sin6_family = AF_INET6; 97 daemon_ip_addr6.sin6_family = AF_INET6;
92 daemon_ip_addr6.sin6_port = 0; 98 daemon_ip_addr6.sin6_port = 0;
93 daemon_ip_addr6.sin6_addr = in6addr_loopback; 99 daemon_ip_addr6.sin6_addr = in6addr_loopback;
100 port6 = 0;
94#endif 101#endif
95 102
103 ret = 0;
104
105 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
106 NULL, NULL, &ahc_echo, NULL,
107 MHD_OPTION_SOCK_ADDR, &daemon_ip_addr,
108 MHD_OPTION_END);
109
110 if (d == 0)
111 return 1;
112
113 dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
114 if (NULL == dinfo)
115 ret |= 1 << 1;
116 else
117 port4 = dinfo->port;
118
119 MHD_stop_daemon (d);
120
121
122 daemon_ip_addr.sin_port = htons (port4);
123 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
124 NULL, NULL, &ahc_echo, NULL,
125 MHD_OPTION_SOCK_ADDR_LEN,
126 (socklen_t) sizeof(daemon_ip_addr), &daemon_ip_addr,
127 MHD_OPTION_END);
128
129 if (d == 0)
130 return 1;
131
132 dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
133 if (NULL == dinfo)
134 ret |= 1 << 1;
135 else if (port4 != dinfo->port)
136 ret |= 1 << 2;
137
138 MHD_stop_daemon (d);
139
140
141 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
142 NULL, NULL, &ahc_echo, NULL,
143 MHD_OPTION_SOCK_ADDR_LEN,
144 (socklen_t) (sizeof(daemon_ip_addr) / 2),
145 &daemon_ip_addr,
146 MHD_OPTION_END);
147
148 if (NULL != d)
149 {
150 MHD_stop_daemon (d);
151 return 1 << 3;
152 }
153
154#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
155
156 daemon_ip_addr.sin_len = (socklen_t) sizeof(daemon_ip_addr);
96 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0, 157 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
97 NULL, NULL, &ahc_echo, NULL, MHD_OPTION_SOCK_ADDR, 158 NULL, NULL, &ahc_echo, NULL,
98 &daemon_ip_addr, MHD_OPTION_END); 159 MHD_OPTION_SOCK_ADDR_LEN,
160 (socklen_t) sizeof(daemon_ip_addr), &daemon_ip_addr,
161 MHD_OPTION_END);
99 162
100 if (d == 0) 163 if (d == 0)
101 return 1; 164 return 1;
102 165
166 dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
167 if (NULL == dinfo)
168 ret |= 1 << 1;
169 else if (port4 != dinfo->port)
170 ret |= 1 << 2;
171
103 MHD_stop_daemon (d); 172 MHD_stop_daemon (d);
104 173
174
175 daemon_ip_addr.sin_len = (socklen_t) (sizeof(daemon_ip_addr) / 2);
176 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
177 NULL, NULL, &ahc_echo, NULL,
178 MHD_OPTION_SOCK_ADDR_LEN,
179 (socklen_t) sizeof(daemon_ip_addr), &daemon_ip_addr,
180 MHD_OPTION_END);
181
182 if (NULL != d)
183 {
184 MHD_stop_daemon (d);
185 return 1 << 3;
186 }
187
188#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
189
190
105#if defined(HAVE_INET6) && defined(USE_IPV6_TESTING) 191#if defined(HAVE_INET6) && defined(USE_IPV6_TESTING)
106 d = MHD_start_daemon (MHD_USE_ERROR_LOG | MHD_USE_IPv6, 0, 192 d = MHD_start_daemon (MHD_USE_ERROR_LOG | MHD_USE_IPv6, 0,
107 NULL, NULL, &ahc_echo, NULL, MHD_OPTION_SOCK_ADDR, 193 NULL, NULL, &ahc_echo, NULL,
108 &daemon_ip_addr6, MHD_OPTION_END); 194 MHD_OPTION_SOCK_ADDR, &daemon_ip_addr6,
195 MHD_OPTION_END);
109 196
110 if (d == 0) 197 if (d == 0)
111 return 1; 198 return 1;
112 199
200 dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
201 if (NULL == dinfo)
202 ret |= 1 << 1;
203 else
204 port6 = dinfo->port;
205
113 MHD_stop_daemon (d); 206 MHD_stop_daemon (d);
114#endif
115 207
116 return 0; 208
209 daemon_ip_addr6.sin6_port = htons (port6);
210 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
211 NULL, NULL, &ahc_echo, NULL,
212 MHD_OPTION_SOCK_ADDR_LEN,
213 (socklen_t) sizeof(daemon_ip_addr6), &daemon_ip_addr6,
214 MHD_OPTION_END);
215
216 if (d == 0)
217 return 1;
218
219 dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
220 if (NULL == dinfo)
221 ret |= 1 << 1;
222 else if (port6 != dinfo->port)
223 ret |= 1 << 2;
224
225 MHD_stop_daemon (d);
226
227
228 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
229 NULL, NULL, &ahc_echo, NULL,
230 MHD_OPTION_SOCK_ADDR_LEN,
231 (socklen_t) (sizeof(daemon_ip_addr6) / 2),
232 &daemon_ip_addr6,
233 MHD_OPTION_END);
234
235 if (NULL != d)
236 {
237 MHD_stop_daemon (d);
238 return 1 << 3;
239 }
240
241#if defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN)
242
243 daemon_ip_addr6.sin6_len = (socklen_t) sizeof(daemon_ip_addr6);
244 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
245 NULL, NULL, &ahc_echo, NULL,
246 MHD_OPTION_SOCK_ADDR_LEN,
247 (socklen_t) sizeof(daemon_ip_addr6), &daemon_ip_addr6,
248 MHD_OPTION_END);
249
250 if (d == 0)
251 return 1;
252
253 dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
254 if (NULL == dinfo)
255 ret |= 1 << 1;
256 else if (port6 != dinfo->port)
257 ret |= 1 << 2;
258
259 MHD_stop_daemon (d);
260
261
262 daemon_ip_addr6.sin6_len = (socklen_t) (sizeof(daemon_ip_addr6) / 2);
263 d = MHD_start_daemon (MHD_USE_ERROR_LOG, 0,
264 NULL, NULL, &ahc_echo, NULL,
265 MHD_OPTION_SOCK_ADDR_LEN,
266 (socklen_t) sizeof(daemon_ip_addr6), &daemon_ip_addr6,
267 MHD_OPTION_END);
268
269 if (NULL != d)
270 {
271 MHD_stop_daemon (d);
272 return 1 << 3;
273 }
274
275#endif /* HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN */
276#endif /* HAVE_INET6 && USE_IPV6_TESTING */
277
278 return ret;
117} 279}
118 280
119 281