1 /***************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) 1998 - 2020, 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  ***************************************************************************/
22 #ifdef TIME_WITH_SYS_TIME
23 /* Time with sys/time test */
24 
25 #include <sys/types.h>
26 #include <sys/time.h>
27 #include <time.h>
28 
29 int
main()30 main ()
31 {
32 if ((struct tm *) 0)
33 return 0;
34   ;
35   return 0;
36 }
37 
38 #endif
39 
40 #ifdef HAVE_FCNTL_O_NONBLOCK
41 
42 /* headers for FCNTL_O_NONBLOCK test */
43 #include <sys/types.h>
44 #include <unistd.h>
45 #include <fcntl.h>
46 /* */
47 #if defined(sun) || defined(__sun__) || \
48     defined(__SUNPRO_C) || defined(__SUNPRO_CC)
49 # if defined(__SVR4) || defined(__srv4__)
50 #  define PLATFORM_SOLARIS
51 # else
52 #  define PLATFORM_SUNOS4
53 # endif
54 #endif
55 #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)
56 # define PLATFORM_AIX_V3
57 #endif
58 /* */
59 #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
60 #error "O_NONBLOCK does not work on this platform"
61 #endif
62 
63 int
main()64 main ()
65 {
66       /* O_NONBLOCK source test */
67       int flags = 0;
68       if(0 != fcntl(0, F_SETFL, flags | O_NONBLOCK))
69           return 1;
70       return 0;
71 }
72 #endif
73 
74 /* tests for gethostbyaddr_r or gethostbyname_r */
75 #if defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT) || \
76     defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT) || \
77     defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT) || \
78     defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT) || \
79     defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) || \
80     defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)
81 #   define _REENTRANT
82     /* no idea whether _REENTRANT is always set, just invent a new flag */
83 #   define TEST_GETHOSTBYFOO_REENTRANT
84 #endif
85 #if defined(HAVE_GETHOSTBYADDR_R_5) || \
86     defined(HAVE_GETHOSTBYADDR_R_7) || \
87     defined(HAVE_GETHOSTBYADDR_R_8) || \
88     defined(HAVE_GETHOSTBYNAME_R_3) || \
89     defined(HAVE_GETHOSTBYNAME_R_5) || \
90     defined(HAVE_GETHOSTBYNAME_R_6) || \
91     defined(TEST_GETHOSTBYFOO_REENTRANT)
92 #include <sys/types.h>
93 #include <netdb.h>
main(void)94 int main(void)
95 {
96   char *address = "example.com";
97   int length = 0;
98   int type = 0;
99   struct hostent h;
100   int rc = 0;
101 #if defined(HAVE_GETHOSTBYADDR_R_5) || \
102     defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT) || \
103     \
104     defined(HAVE_GETHOSTBYNAME_R_3) || \
105     defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT)
106   struct hostent_data hdata;
107 #elif defined(HAVE_GETHOSTBYADDR_R_7) || \
108       defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT) || \
109       defined(HAVE_GETHOSTBYADDR_R_8) || \
110       defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT) || \
111       \
112       defined(HAVE_GETHOSTBYNAME_R_5) || \
113       defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT) || \
114       defined(HAVE_GETHOSTBYNAME_R_6) || \
115       defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)
116   char buffer[8192];
117   int h_errnop;
118   struct hostent *hp;
119 #endif
120 
121 #ifndef gethostbyaddr_r
122   (void)gethostbyaddr_r;
123 #endif
124 
125 #if   defined(HAVE_GETHOSTBYADDR_R_5) || \
126       defined(HAVE_GETHOSTBYADDR_R_5_REENTRANT)
127   rc = gethostbyaddr_r(address, length, type, &h, &hdata);
128   (void)rc;
129 #elif defined(HAVE_GETHOSTBYADDR_R_7) || \
130       defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT)
131   hp = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &h_errnop);
132   (void)hp;
133 #elif defined(HAVE_GETHOSTBYADDR_R_8) || \
134       defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT)
135   rc = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &hp, &h_errnop);
136   (void)rc;
137 #endif
138 
139 #if   defined(HAVE_GETHOSTBYNAME_R_3) || \
140       defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT)
141   rc = gethostbyname_r(address, &h, &hdata);
142 #elif defined(HAVE_GETHOSTBYNAME_R_5) || \
143       defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT)
144   rc = gethostbyname_r(address, &h, buffer, 8192, &h_errnop);
145   (void)hp; /* not used for test */
146 #elif defined(HAVE_GETHOSTBYNAME_R_6) || \
147       defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)
148   rc = gethostbyname_r(address, &h, buffer, 8192, &hp, &h_errnop);
149 #endif
150 
151   (void)length;
152   (void)type;
153   (void)rc;
154   return 0;
155 }
156 #endif
157 
158 #ifdef HAVE_SOCKLEN_T
159 #ifdef _WIN32
160 #include <ws2tcpip.h>
161 #else
162 #include <sys/types.h>
163 #include <sys/socket.h>
164 #endif
165 int
main()166 main ()
167 {
168 if ((socklen_t *) 0)
169   return 0;
170 if (sizeof (socklen_t))
171   return 0;
172   ;
173   return 0;
174 }
175 #endif
176 #ifdef HAVE_IN_ADDR_T
177 #include <sys/types.h>
178 #include <sys/socket.h>
179 #include <arpa/inet.h>
180 
181 int
main()182 main ()
183 {
184 if ((in_addr_t *) 0)
185   return 0;
186 if (sizeof (in_addr_t))
187   return 0;
188   ;
189   return 0;
190 }
191 #endif
192 
193 #ifdef HAVE_BOOL_T
194 #ifdef HAVE_SYS_TYPES_H
195 #include <sys/types.h>
196 #endif
197 #ifdef HAVE_STDBOOL_H
198 #include <stdbool.h>
199 #endif
200 int
main()201 main ()
202 {
203 if (sizeof (bool *) )
204   return 0;
205   ;
206   return 0;
207 }
208 #endif
209 
210 #ifdef STDC_HEADERS
211 #include <stdlib.h>
212 #include <stdarg.h>
213 #include <string.h>
214 #include <float.h>
main()215 int main() { return 0; }
216 #endif
217 #ifdef RETSIGTYPE_TEST
218 #include <sys/types.h>
219 #include <signal.h>
220 #ifdef signal
221 # undef signal
222 #endif
223 #ifdef __cplusplus
224 extern "C" void (*signal (int, void (*)(int)))(int);
225 #else
226 void (*signal ()) ();
227 #endif
228 
229 int
main()230 main ()
231 {
232   return 0;
233 }
234 #endif
235 #ifdef HAVE_INET_NTOA_R_DECL
236 #include <arpa/inet.h>
237 
238 typedef void (*func_type)();
239 
main()240 int main()
241 {
242 #ifndef inet_ntoa_r
243   func_type func;
244   func = (func_type)inet_ntoa_r;
245   (void)func;
246 #endif
247   return 0;
248 }
249 #endif
250 #ifdef HAVE_INET_NTOA_R_DECL_REENTRANT
251 #define _REENTRANT
252 #include <arpa/inet.h>
253 
254 typedef void (*func_type)();
255 
main()256 int main()
257 {
258 #ifndef inet_ntoa_r
259   func_type func;
260   func = (func_type)&inet_ntoa_r;
261   (void)func;
262 #endif
263   return 0;
264 }
265 #endif
266 #ifdef HAVE_GETADDRINFO
267 #include <netdb.h>
268 #include <sys/types.h>
269 #include <sys/socket.h>
270 
main(void)271 int main(void) {
272     struct addrinfo hints, *ai;
273     int error;
274 
275     memset(&hints, 0, sizeof(hints));
276     hints.ai_family = AF_UNSPEC;
277     hints.ai_socktype = SOCK_STREAM;
278 #ifndef getaddrinfo
279     (void)getaddrinfo;
280 #endif
281     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
282     if (error) {
283         return 1;
284     }
285     return 0;
286 }
287 #endif
288 #ifdef HAVE_FILE_OFFSET_BITS
289 #ifdef _FILE_OFFSET_BITS
290 #undef _FILE_OFFSET_BITS
291 #endif
292 #define _FILE_OFFSET_BITS 64
293 #include <sys/types.h>
294  /* Check that off_t can represent 2**63 - 1 correctly.
295     We can't simply define LARGE_OFF_T to be 9223372036854775807,
296     since some C++ compilers masquerading as C compilers
297     incorrectly reject 9223372036854775807.  */
298 #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
299   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
300                        && LARGE_OFF_T % 2147483647 == 1)
301                       ? 1 : -1];
main()302 int main () { ; return 0; }
303 #endif
304 #ifdef HAVE_IOCTLSOCKET
305 /* includes start */
306 #ifdef HAVE_WINDOWS_H
307 #  ifndef WIN32_LEAN_AND_MEAN
308 #    define WIN32_LEAN_AND_MEAN
309 #  endif
310 #  include <windows.h>
311 #  ifdef HAVE_WINSOCK2_H
312 #    include <winsock2.h>
313 #  else
314 #    ifdef HAVE_WINSOCK_H
315 #      include <winsock.h>
316 #    endif
317 #  endif
318 #endif
319 
320 int
main()321 main ()
322 {
323 
324 /* ioctlsocket source code */
325  int socket;
326  unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
327 
328   ;
329   return 0;
330 }
331 
332 #endif
333 #ifdef HAVE_IOCTLSOCKET_CAMEL
334 /* includes start */
335 #ifdef HAVE_WINDOWS_H
336 #  ifndef WIN32_LEAN_AND_MEAN
337 #    define WIN32_LEAN_AND_MEAN
338 #  endif
339 #  include <windows.h>
340 #  ifdef HAVE_WINSOCK2_H
341 #    include <winsock2.h>
342 #  else
343 #    ifdef HAVE_WINSOCK_H
344 #      include <winsock.h>
345 #    endif
346 #  endif
347 #endif
348 
349 int
main()350 main ()
351 {
352 
353 /* IoctlSocket source code */
354     if(0 != IoctlSocket(0, 0, 0))
355       return 1;
356   ;
357   return 0;
358 }
359 #endif
360 #ifdef HAVE_IOCTLSOCKET_CAMEL_FIONBIO
361 /* includes start */
362 #ifdef HAVE_WINDOWS_H
363 #  ifndef WIN32_LEAN_AND_MEAN
364 #    define WIN32_LEAN_AND_MEAN
365 #  endif
366 #  include <windows.h>
367 #  ifdef HAVE_WINSOCK2_H
368 #    include <winsock2.h>
369 #  else
370 #    ifdef HAVE_WINSOCK_H
371 #      include <winsock.h>
372 #    endif
373 #  endif
374 #endif
375 
376 int
main()377 main ()
378 {
379 
380 /* IoctlSocket source code */
381         long flags = 0;
382         if(0 != ioctlsocket(0, FIONBIO, &flags))
383           return 1;
384   ;
385   return 0;
386 }
387 #endif
388 #ifdef HAVE_IOCTLSOCKET_FIONBIO
389 /* includes start */
390 #ifdef HAVE_WINDOWS_H
391 #  ifndef WIN32_LEAN_AND_MEAN
392 #    define WIN32_LEAN_AND_MEAN
393 #  endif
394 #  include <windows.h>
395 #  ifdef HAVE_WINSOCK2_H
396 #    include <winsock2.h>
397 #  else
398 #    ifdef HAVE_WINSOCK_H
399 #      include <winsock.h>
400 #    endif
401 #  endif
402 #endif
403 
404 int
main()405 main ()
406 {
407 
408         int flags = 0;
409         if(0 != ioctlsocket(0, FIONBIO, &flags))
410           return 1;
411 
412   ;
413   return 0;
414 }
415 #endif
416 #ifdef HAVE_IOCTL_FIONBIO
417 /* headers for FIONBIO test */
418 /* includes start */
419 #ifdef HAVE_SYS_TYPES_H
420 #  include <sys/types.h>
421 #endif
422 #ifdef HAVE_UNISTD_H
423 #  include <unistd.h>
424 #endif
425 #ifdef HAVE_SYS_SOCKET_H
426 #  include <sys/socket.h>
427 #endif
428 #ifdef HAVE_SYS_IOCTL_H
429 #  include <sys/ioctl.h>
430 #endif
431 #ifdef HAVE_STROPTS_H
432 #  include <stropts.h>
433 #endif
434 
435 int
main()436 main ()
437 {
438 
439         int flags = 0;
440         if(0 != ioctl(0, FIONBIO, &flags))
441           return 1;
442 
443   ;
444   return 0;
445 }
446 #endif
447 #ifdef HAVE_IOCTL_SIOCGIFADDR
448 /* headers for FIONBIO test */
449 /* includes start */
450 #ifdef HAVE_SYS_TYPES_H
451 #  include <sys/types.h>
452 #endif
453 #ifdef HAVE_UNISTD_H
454 #  include <unistd.h>
455 #endif
456 #ifdef HAVE_SYS_SOCKET_H
457 #  include <sys/socket.h>
458 #endif
459 #ifdef HAVE_SYS_IOCTL_H
460 #  include <sys/ioctl.h>
461 #endif
462 #ifdef HAVE_STROPTS_H
463 #  include <stropts.h>
464 #endif
465 #include <net/if.h>
466 
467 int
main()468 main ()
469 {
470         struct ifreq ifr;
471         if(0 != ioctl(0, SIOCGIFADDR, &ifr))
472           return 1;
473 
474   ;
475   return 0;
476 }
477 #endif
478 #ifdef HAVE_SETSOCKOPT_SO_NONBLOCK
479 /* includes start */
480 #ifdef HAVE_WINDOWS_H
481 #  ifndef WIN32_LEAN_AND_MEAN
482 #    define WIN32_LEAN_AND_MEAN
483 #  endif
484 #  include <windows.h>
485 #  ifdef HAVE_WINSOCK2_H
486 #    include <winsock2.h>
487 #  else
488 #    ifdef HAVE_WINSOCK_H
489 #      include <winsock.h>
490 #    endif
491 #  endif
492 #endif
493 /* includes start */
494 #ifdef HAVE_SYS_TYPES_H
495 #  include <sys/types.h>
496 #endif
497 #ifdef HAVE_SYS_SOCKET_H
498 #  include <sys/socket.h>
499 #endif
500 /* includes end */
501 
502 int
main()503 main ()
504 {
505         if(0 != setsockopt(0, SOL_SOCKET, SO_NONBLOCK, 0, 0))
506           return 1;
507   ;
508   return 0;
509 }
510 #endif
511 #ifdef HAVE_GLIBC_STRERROR_R
512 #include <string.h>
513 #include <errno.h>
514 
check(char c)515 void check(char c) {}
516 
517 int
main()518 main () {
519   char buffer[1024];
520   /* This will not compile if strerror_r does not return a char* */
521   check(strerror_r(EACCES, buffer, sizeof(buffer))[0]);
522   return 0;
523 }
524 #endif
525 #ifdef HAVE_POSIX_STRERROR_R
526 #include <string.h>
527 #include <errno.h>
528 
529 /* float, because a pointer can't be implicitly cast to float */
check(float f)530 void check(float f) {}
531 
532 int
main()533 main () {
534   char buffer[1024];
535   /* This will not compile if strerror_r does not return an int */
536   check(strerror_r(EACCES, buffer, sizeof(buffer)));
537   return 0;
538 }
539 #endif
540 #ifdef HAVE_FSETXATTR_6
541 #include <sys/xattr.h> /* header from libc, not from libattr */
542 int
main()543 main() {
544   fsetxattr(0, 0, 0, 0, 0, 0);
545   return 0;
546 }
547 #endif
548 #ifdef HAVE_FSETXATTR_5
549 #include <sys/xattr.h> /* header from libc, not from libattr */
550 int
main()551 main() {
552   fsetxattr(0, 0, 0, 0, 0);
553   return 0;
554 }
555 #endif
556 #ifdef HAVE_CLOCK_GETTIME_MONOTONIC
557 #include <time.h>
558 int
main()559 main() {
560   struct timespec ts = {0, 0};
561   clock_gettime(CLOCK_MONOTONIC, &ts);
562   return 0;
563 }
564 #endif
565 #ifdef HAVE_BUILTIN_AVAILABLE
566 int
main()567 main() {
568   if(__builtin_available(macOS 10.12, *)) {}
569   return 0;
570 }
571 #endif
572 #ifdef HAVE_VARIADIC_MACROS_C99
573 #define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__)
574 #define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__)
575 
576 int fun3(int arg1, int arg2, int arg3);
577 int fun2(int arg1, int arg2);
578 
fun3(int arg1,int arg2,int arg3)579 int fun3(int arg1, int arg2, int arg3) {
580   return arg1 + arg2 + arg3;
581 }
fun2(int arg1,int arg2)582 int fun2(int arg1, int arg2) {
583   return arg1 + arg2;
584 }
585 
586 int
main()587 main() {
588   int res3 = c99_vmacro3(1, 2, 3);
589   int res2 = c99_vmacro2(1, 2);
590   (void)res3;
591   (void)res2;
592   return 0;
593 }
594 #endif
595 #ifdef HAVE_VARIADIC_MACROS_GCC
596 #define gcc_vmacro3(first, args...) fun3(first, args)
597 #define gcc_vmacro2(first, args...) fun2(first, args)
598 
599 int fun3(int arg1, int arg2, int arg3);
600 int fun2(int arg1, int arg2);
601 
fun3(int arg1,int arg2,int arg3)602 int fun3(int arg1, int arg2, int arg3) {
603   return arg1 + arg2 + arg3;
604 }
fun2(int arg1,int arg2)605 int fun2(int arg1, int arg2) {
606   return arg1 + arg2;
607 }
608 
609 int
main()610 main() {
611   int res3 = gcc_vmacro3(1, 2, 3);
612   int res2 = gcc_vmacro2(1, 2);
613   (void)res3;
614   (void)res2;
615   return 0;
616 }
617 #endif
618