diff options
Diffstat (limited to 'src/microhttpd/test_options.c')
-rw-r--r-- | src/microhttpd/test_options.c | 176 |
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 | */ |
75 | static unsigned int | 76 | static unsigned int |
76 | test_ip_addr_option (void) | 77 | test_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 | ||