xref: /curl/CMake/CurlTests.c (revision 03e7dff8)
1 /***************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
9  *
10  * This software is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution. The terms
12  * are also available at https://curl.se/docs/copyright.html.
13  *
14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15  * copies of the Software, and permit persons to whom the Software is
16  * furnished to do so, under the terms of the COPYING file.
17  *
18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19  * KIND, either express or implied.
20  *
21  * SPDX-License-Identifier: curl
22  *
23  ***************************************************************************/
24 
25 #ifdef HAVE_FCNTL_O_NONBLOCK
26 /* headers for FCNTL_O_NONBLOCK test */
27 #include <sys/types.h>
28 #include <unistd.h>
29 #include <fcntl.h>
30 /* */
31 #if defined(sun) || defined(__sun__) || \
32     defined(__SUNPRO_C) || defined(__SUNPRO_CC)
33 # if defined(__SVR4) || defined(__srv4__)
34 #  define PLATFORM_SOLARIS
35 # else
36 #  define PLATFORM_SUNOS4
37 # endif
38 #endif
39 #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)
40 # define PLATFORM_AIX_V3
41 #endif
42 /* */
43 #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3)
44 #error "O_NONBLOCK does not work on this platform"
45 #endif
46 
main(void)47 int main(void)
48 {
49   /* O_NONBLOCK source test */
50   int flags = 0;
51   if(0 != fcntl(0, F_SETFL, flags | O_NONBLOCK))
52     return 1;
53   return 0;
54 }
55 #endif
56 
57 /* tests for gethostbyname_r */
58 #if defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT) || \
59     defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) || \
60     defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)
61 #   define _REENTRANT
62     /* no idea whether _REENTRANT is always set, just invent a new flag */
63 #   define TEST_GETHOSTBYFOO_REENTRANT
64 #endif
65 #if defined(HAVE_GETHOSTBYNAME_R_3) || \
66     defined(HAVE_GETHOSTBYNAME_R_5) || \
67     defined(HAVE_GETHOSTBYNAME_R_6) || \
68     defined(TEST_GETHOSTBYFOO_REENTRANT)
69 #include <sys/types.h>
70 #include <netdb.h>
main(void)71 int main(void)
72 {
73   char *address = "example.com";
74   int length = 0;
75   int type = 0;
76   struct hostent h;
77   int rc = 0;
78 #if defined(HAVE_GETHOSTBYNAME_R_3) || \
79     defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT)
80   struct hostent_data hdata;
81 #elif defined(HAVE_GETHOSTBYNAME_R_5) || \
82       defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) || \
83       defined(HAVE_GETHOSTBYNAME_R_6) || \
84       defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)
85   char buffer[8192];
86   int h_errnop;
87   struct hostent *hp;
88 #endif
89 
90 #if   defined(HAVE_GETHOSTBYNAME_R_3) || \
91       defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT)
92   rc = gethostbyname_r(address, &h, &hdata);
93 #elif defined(HAVE_GETHOSTBYNAME_R_5) || \
94       defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT)
95   rc = gethostbyname_r(address, &h, buffer, 8192, &h_errnop);
96   (void)hp; /* not used for test */
97 #elif defined(HAVE_GETHOSTBYNAME_R_6) || \
98       defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)
99   rc = gethostbyname_r(address, &h, buffer, 8192, &hp, &h_errnop);
100 #endif
101 
102   (void)length;
103   (void)type;
104   (void)rc;
105   return 0;
106 }
107 #endif
108 
109 #ifdef HAVE_IN_ADDR_T
110 #include <sys/types.h>
111 #include <sys/socket.h>
112 #include <arpa/inet.h>
main(void)113 int main(void)
114 {
115   if((in_addr_t *) 0)
116     return 0;
117   if(sizeof(in_addr_t))
118     return 0;
119   ;
120   return 0;
121 }
122 #endif
123 
124 #ifdef HAVE_BOOL_T
125 #ifdef HAVE_SYS_TYPES_H
126 #include <sys/types.h>
127 #endif
128 #ifdef HAVE_STDBOOL_H
129 #include <stdbool.h>
130 #endif
main(void)131 int main(void)
132 {
133   if(sizeof(bool *))
134     return 0;
135   ;
136   return 0;
137 }
138 #endif
139 
140 #ifdef STDC_HEADERS
141 #include <stdlib.h>
142 #include <stdarg.h>
143 #include <string.h>
144 #include <float.h>
main(void)145 int main(void) { return 0; }
146 #endif
147 
148 #ifdef HAVE_FILE_OFFSET_BITS
149 #ifdef _FILE_OFFSET_BITS
150 #undef _FILE_OFFSET_BITS
151 #endif
152 #define _FILE_OFFSET_BITS 64
153 #include <sys/types.h>
154  /* Check that off_t can represent 2**63 - 1 correctly.
155     We can't simply define LARGE_OFF_T to be 9223372036854775807,
156     since some C++ compilers masquerading as C compilers
157     incorrectly reject 9223372036854775807.  */
158 #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
159   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
160                        && LARGE_OFF_T % 2147483647 == 1)
161                       ? 1 : -1];
main(void)162 int main(void) { ; return 0; }
163 #endif
164 
165 #ifdef HAVE_IOCTLSOCKET
166 /* includes start */
167 #ifdef _WIN32
168 #  ifndef WIN32_LEAN_AND_MEAN
169 #    define WIN32_LEAN_AND_MEAN
170 #  endif
171 #  include <winsock2.h>
172 #endif
main(void)173 int main(void)
174 {
175   /* ioctlsocket source code */
176   int socket;
177   unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
178   ;
179   return 0;
180 }
181 
182 #endif
183 
184 #ifdef HAVE_IOCTLSOCKET_CAMEL
185 /* includes start */
186 #ifdef _WIN32
187 #  ifndef WIN32_LEAN_AND_MEAN
188 #    define WIN32_LEAN_AND_MEAN
189 #  endif
190 #  include <winsock2.h>
191 #endif
main(void)192 int main(void)
193 {
194   /* IoctlSocket source code */
195   if(0 != IoctlSocket(0, 0, 0))
196     return 1;
197   ;
198   return 0;
199 }
200 #endif
201 
202 #ifdef HAVE_IOCTLSOCKET_CAMEL_FIONBIO
203 /* includes start */
204 #ifdef _WIN32
205 #  ifndef WIN32_LEAN_AND_MEAN
206 #    define WIN32_LEAN_AND_MEAN
207 #  endif
208 #  include <winsock2.h>
209 #endif
main(void)210 int main(void)
211 {
212   /* IoctlSocket source code */
213   long flags = 0;
214   if(0 != IoctlSocket(0, FIONBIO, &flags))
215     return 1;
216   ;
217   return 0;
218 }
219 #endif
220 
221 #ifdef HAVE_IOCTLSOCKET_FIONBIO
222 /* includes start */
223 #ifdef _WIN32
224 #  ifndef WIN32_LEAN_AND_MEAN
225 #    define WIN32_LEAN_AND_MEAN
226 #  endif
227 #  include <winsock2.h>
228 #endif
main(void)229 int main(void)
230 {
231   int flags = 0;
232   if(0 != ioctlsocket(0, FIONBIO, &flags))
233     return 1;
234   ;
235   return 0;
236 }
237 #endif
238 
239 #ifdef HAVE_IOCTL_FIONBIO
240 /* headers for FIONBIO test */
241 /* includes start */
242 #ifdef HAVE_SYS_TYPES_H
243 #  include <sys/types.h>
244 #endif
245 #ifdef HAVE_UNISTD_H
246 #  include <unistd.h>
247 #endif
248 #ifdef HAVE_SYS_SOCKET_H
249 #  include <sys/socket.h>
250 #endif
251 #ifdef HAVE_SYS_IOCTL_H
252 #  include <sys/ioctl.h>
253 #endif
254 #ifdef HAVE_STROPTS_H
255 #  include <stropts.h>
256 #endif
main(void)257 int main(void)
258 {
259   int flags = 0;
260   if(0 != ioctl(0, FIONBIO, &flags))
261     return 1;
262   ;
263   return 0;
264 }
265 #endif
266 
267 #ifdef HAVE_IOCTL_SIOCGIFADDR
268 /* headers for FIONBIO test */
269 /* includes start */
270 #ifdef HAVE_SYS_TYPES_H
271 #  include <sys/types.h>
272 #endif
273 #ifdef HAVE_UNISTD_H
274 #  include <unistd.h>
275 #endif
276 #ifdef HAVE_SYS_SOCKET_H
277 #  include <sys/socket.h>
278 #endif
279 #ifdef HAVE_SYS_IOCTL_H
280 #  include <sys/ioctl.h>
281 #endif
282 #ifdef HAVE_STROPTS_H
283 #  include <stropts.h>
284 #endif
285 #include <net/if.h>
main(void)286 int main(void)
287 {
288   struct ifreq ifr;
289   if(0 != ioctl(0, SIOCGIFADDR, &ifr))
290     return 1;
291   ;
292   return 0;
293 }
294 #endif
295 
296 #ifdef HAVE_SETSOCKOPT_SO_NONBLOCK
297 /* includes start */
298 #ifdef _WIN32
299 #  ifndef WIN32_LEAN_AND_MEAN
300 #    define WIN32_LEAN_AND_MEAN
301 #  endif
302 #  include <winsock2.h>
303 #endif
304 /* includes start */
305 #ifdef HAVE_SYS_TYPES_H
306 #  include <sys/types.h>
307 #endif
308 #ifdef HAVE_SYS_SOCKET_H
309 #  include <sys/socket.h>
310 #endif
311 /* includes end */
main(void)312 int main(void)
313 {
314   if(0 != setsockopt(0, SOL_SOCKET, SO_NONBLOCK, 0, 0))
315     return 1;
316   ;
317   return 0;
318 }
319 #endif
320 
321 #ifdef HAVE_GLIBC_STRERROR_R
322 #include <string.h>
323 #include <errno.h>
324 
check(char c)325 void check(char c) {}
326 
main(void)327 int main(void)
328 {
329   char buffer[1024];
330   /* This will not compile if strerror_r does not return a char* */
331   check(strerror_r(EACCES, buffer, sizeof(buffer))[0]);
332   return 0;
333 }
334 #endif
335 
336 #ifdef HAVE_POSIX_STRERROR_R
337 #include <string.h>
338 #include <errno.h>
339 
340 /* float, because a pointer can't be implicitly cast to float */
check(float f)341 void check(float f) {}
342 
main(void)343 int main(void)
344 {
345   char buffer[1024];
346   /* This will not compile if strerror_r does not return an int */
347   check(strerror_r(EACCES, buffer, sizeof(buffer)));
348   return 0;
349 }
350 #endif
351 
352 #ifdef HAVE_FSETXATTR_6
353 #include <sys/xattr.h> /* header from libc, not from libattr */
main(void)354 int main(void)
355 {
356   fsetxattr(0, 0, 0, 0, 0, 0);
357   return 0;
358 }
359 #endif
360 
361 #ifdef HAVE_FSETXATTR_5
362 #include <sys/xattr.h> /* header from libc, not from libattr */
main(void)363 int main(void)
364 {
365   fsetxattr(0, 0, 0, 0, 0);
366   return 0;
367 }
368 #endif
369 
370 #ifdef HAVE_CLOCK_GETTIME_MONOTONIC
371 #include <time.h>
main(void)372 int main(void)
373 {
374   struct timespec ts = {0, 0};
375   clock_gettime(CLOCK_MONOTONIC, &ts);
376   return 0;
377 }
378 #endif
379 
380 #ifdef HAVE_BUILTIN_AVAILABLE
main(void)381 int main(void)
382 {
383   if(__builtin_available(macOS 10.12, *)) {}
384   return 0;
385 }
386 #endif
387 
388 #ifdef HAVE_ATOMIC
389 /* includes start */
390 #ifdef HAVE_SYS_TYPES_H
391 #  include <sys/types.h>
392 #endif
393 #ifdef HAVE_UNISTD_H
394 #  include <unistd.h>
395 #endif
396 #ifdef HAVE_STDATOMIC_H
397 #  include <stdatomic.h>
398 #endif
399 /* includes end */
400 
main(void)401 int main(void)
402 {
403   _Atomic int i = 1;
404   i = 0;  /* Force an atomic-write operation. */
405   return i;
406 }
407 #endif
408 
409 #ifdef HAVE_WIN32_WINNT
410 /* includes start */
411 #ifdef _WIN32
412 #  ifndef WIN32_LEAN_AND_MEAN
413 #    define WIN32_LEAN_AND_MEAN
414 #  endif
415 #  ifndef NOGDI
416 #    define NOGDI
417 #  endif
418 #  include <windows.h>
419 #endif
420 /* includes end */
421 
422 #define enquote(x) #x
423 #define expand(x) enquote(x)
424 #pragma message("_WIN32_WINNT=" expand(_WIN32_WINNT))
425 
main(void)426 int main(void)
427 {
428   return 0;
429 }
430 #endif
431