Home | History | Annotate | Download | only in CMake
      1 /***************************************************************************
      2  *                                  _   _ ____  _
      3  *  Project                     ___| | | |  _ \| |
      4  *                             / __| | | | |_) | |
      5  *                            | (__| |_| |  _ <| |___
      6  *                             \___|\___/|_| \_\_____|
      7  *
      8  * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel (at) 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.haxx.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
     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
     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>
     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 #elif defined(HAVE_GETHOSTBYADDR_R_7) || \
    129       defined(HAVE_GETHOSTBYADDR_R_7_REENTRANT)
    130   hp = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &h_errnop);
    131   (void)hp;
    132 #elif defined(HAVE_GETHOSTBYADDR_R_8) || \
    133       defined(HAVE_GETHOSTBYADDR_R_8_REENTRANT)
    134   rc = gethostbyaddr_r(address, length, type, &h, buffer, 8192, &hp, &h_errnop);
    135 #endif
    136 
    137 #if   defined(HAVE_GETHOSTBYNAME_R_3) || \
    138       defined(HAVE_GETHOSTBYNAME_R_3_REENTRANT)
    139   rc = gethostbyname_r(address, &h, &hdata);
    140 #elif defined(HAVE_GETHOSTBYNAME_R_5) || \
    141       defined(HAVE_GETHOSTBYNAME_R_5_REENTRANT)
    142   rc = gethostbyname_r(address, &h, buffer, 8192, &h_errnop);
    143   (void)hp; /* not used for test */
    144 #elif defined(HAVE_GETHOSTBYNAME_R_6) || \
    145       defined(HAVE_GETHOSTBYNAME_R_6_REENTRANT)
    146   rc = gethostbyname_r(address, &h, buffer, 8192, &hp, &h_errnop);
    147 #endif
    148 
    149   (void)length;
    150   (void)type;
    151   (void)rc;
    152   return 0;
    153 }
    154 #endif
    155 
    156 #ifdef HAVE_SOCKLEN_T
    157 #ifdef _WIN32
    158 #include <ws2tcpip.h>
    159 #else
    160 #include <sys/types.h>
    161 #include <sys/socket.h>
    162 #endif
    163 int
    164 main ()
    165 {
    166 if ((socklen_t *) 0)
    167   return 0;
    168 if (sizeof (socklen_t))
    169   return 0;
    170   ;
    171   return 0;
    172 }
    173 #endif
    174 #ifdef HAVE_IN_ADDR_T
    175 #include <sys/types.h>
    176 #include <sys/socket.h>
    177 #include <arpa/inet.h>
    178 
    179 int
    180 main ()
    181 {
    182 if ((in_addr_t *) 0)
    183   return 0;
    184 if (sizeof (in_addr_t))
    185   return 0;
    186   ;
    187   return 0;
    188 }
    189 #endif
    190 
    191 #ifdef HAVE_BOOL_T
    192 #ifdef HAVE_SYS_TYPES_H
    193 #include <sys/types.h>
    194 #endif
    195 #ifdef HAVE_STDBOOL_H
    196 #include <stdbool.h>
    197 #endif
    198 int
    199 main ()
    200 {
    201 if (sizeof (bool *) )
    202   return 0;
    203   ;
    204   return 0;
    205 }
    206 #endif
    207 
    208 #ifdef STDC_HEADERS
    209 #include <stdlib.h>
    210 #include <stdarg.h>
    211 #include <string.h>
    212 #include <float.h>
    213 int main() { return 0; }
    214 #endif
    215 #ifdef RETSIGTYPE_TEST
    216 #include <sys/types.h>
    217 #include <signal.h>
    218 #ifdef signal
    219 # undef signal
    220 #endif
    221 #ifdef __cplusplus
    222 extern "C" void (*signal (int, void (*)(int)))(int);
    223 #else
    224 void (*signal ()) ();
    225 #endif
    226 
    227 int
    228 main ()
    229 {
    230   return 0;
    231 }
    232 #endif
    233 #ifdef HAVE_INET_NTOA_R_DECL
    234 #include <arpa/inet.h>
    235 
    236 typedef void (*func_type)();
    237 
    238 int main()
    239 {
    240 #ifndef inet_ntoa_r
    241   func_type func;
    242   func = (func_type)inet_ntoa_r;
    243 #endif
    244   return 0;
    245 }
    246 #endif
    247 #ifdef HAVE_INET_NTOA_R_DECL_REENTRANT
    248 #define _REENTRANT
    249 #include <arpa/inet.h>
    250 
    251 typedef void (*func_type)();
    252 
    253 int main()
    254 {
    255 #ifndef inet_ntoa_r
    256   func_type func;
    257   func = (func_type)&inet_ntoa_r;
    258 #endif
    259   return 0;
    260 }
    261 #endif
    262 #ifdef HAVE_GETADDRINFO
    263 #include <netdb.h>
    264 #include <sys/types.h>
    265 #include <sys/socket.h>
    266 
    267 int main(void) {
    268     struct addrinfo hints, *ai;
    269     int error;
    270 
    271     memset(&hints, 0, sizeof(hints));
    272     hints.ai_family = AF_UNSPEC;
    273     hints.ai_socktype = SOCK_STREAM;
    274 #ifndef getaddrinfo
    275     (void)getaddrinfo;
    276 #endif
    277     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
    278     if (error) {
    279         return 1;
    280     }
    281     return 0;
    282 }
    283 #endif
    284 #ifdef HAVE_FILE_OFFSET_BITS
    285 #ifdef _FILE_OFFSET_BITS
    286 #undef _FILE_OFFSET_BITS
    287 #endif
    288 #define _FILE_OFFSET_BITS 64
    289 #include <sys/types.h>
    290  /* Check that off_t can represent 2**63 - 1 correctly.
    291     We can't simply define LARGE_OFF_T to be 9223372036854775807,
    292     since some C++ compilers masquerading as C compilers
    293     incorrectly reject 9223372036854775807.  */
    294 #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
    295   int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
    296                        && LARGE_OFF_T % 2147483647 == 1)
    297                       ? 1 : -1];
    298 int main () { ; return 0; }
    299 #endif
    300 #ifdef HAVE_IOCTLSOCKET
    301 /* includes start */
    302 #ifdef HAVE_WINDOWS_H
    303 #  ifndef WIN32_LEAN_AND_MEAN
    304 #    define WIN32_LEAN_AND_MEAN
    305 #  endif
    306 #  include <windows.h>
    307 #  ifdef HAVE_WINSOCK2_H
    308 #    include <winsock2.h>
    309 #  else
    310 #    ifdef HAVE_WINSOCK_H
    311 #      include <winsock.h>
    312 #    endif
    313 #  endif
    314 #endif
    315 
    316 int
    317 main ()
    318 {
    319 
    320 /* ioctlsocket source code */
    321  int socket;
    322  unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
    323 
    324   ;
    325   return 0;
    326 }
    327 
    328 #endif
    329 #ifdef HAVE_IOCTLSOCKET_CAMEL
    330 /* includes start */
    331 #ifdef HAVE_WINDOWS_H
    332 #  ifndef WIN32_LEAN_AND_MEAN
    333 #    define WIN32_LEAN_AND_MEAN
    334 #  endif
    335 #  include <windows.h>
    336 #  ifdef HAVE_WINSOCK2_H
    337 #    include <winsock2.h>
    338 #  else
    339 #    ifdef HAVE_WINSOCK_H
    340 #      include <winsock.h>
    341 #    endif
    342 #  endif
    343 #endif
    344 
    345 int
    346 main ()
    347 {
    348 
    349 /* IoctlSocket source code */
    350     if(0 != IoctlSocket(0, 0, 0))
    351       return 1;
    352   ;
    353   return 0;
    354 }
    355 #endif
    356 #ifdef HAVE_IOCTLSOCKET_CAMEL_FIONBIO
    357 /* includes start */
    358 #ifdef HAVE_WINDOWS_H
    359 #  ifndef WIN32_LEAN_AND_MEAN
    360 #    define WIN32_LEAN_AND_MEAN
    361 #  endif
    362 #  include <windows.h>
    363 #  ifdef HAVE_WINSOCK2_H
    364 #    include <winsock2.h>
    365 #  else
    366 #    ifdef HAVE_WINSOCK_H
    367 #      include <winsock.h>
    368 #    endif
    369 #  endif
    370 #endif
    371 
    372 int
    373 main ()
    374 {
    375 
    376 /* IoctlSocket source code */
    377         long flags = 0;
    378         if(0 != ioctlsocket(0, FIONBIO, &flags))
    379           return 1;
    380   ;
    381   return 0;
    382 }
    383 #endif
    384 #ifdef HAVE_IOCTLSOCKET_FIONBIO
    385 /* includes start */
    386 #ifdef HAVE_WINDOWS_H
    387 #  ifndef WIN32_LEAN_AND_MEAN
    388 #    define WIN32_LEAN_AND_MEAN
    389 #  endif
    390 #  include <windows.h>
    391 #  ifdef HAVE_WINSOCK2_H
    392 #    include <winsock2.h>
    393 #  else
    394 #    ifdef HAVE_WINSOCK_H
    395 #      include <winsock.h>
    396 #    endif
    397 #  endif
    398 #endif
    399 
    400 int
    401 main ()
    402 {
    403 
    404         int flags = 0;
    405         if(0 != ioctlsocket(0, FIONBIO, &flags))
    406           return 1;
    407 
    408   ;
    409   return 0;
    410 }
    411 #endif
    412 #ifdef HAVE_IOCTL_FIONBIO
    413 /* headers for FIONBIO test */
    414 /* includes start */
    415 #ifdef HAVE_SYS_TYPES_H
    416 #  include <sys/types.h>
    417 #endif
    418 #ifdef HAVE_UNISTD_H
    419 #  include <unistd.h>
    420 #endif
    421 #ifdef HAVE_SYS_SOCKET_H
    422 #  include <sys/socket.h>
    423 #endif
    424 #ifdef HAVE_SYS_IOCTL_H
    425 #  include <sys/ioctl.h>
    426 #endif
    427 #ifdef HAVE_STROPTS_H
    428 #  include <stropts.h>
    429 #endif
    430 
    431 int
    432 main ()
    433 {
    434 
    435         int flags = 0;
    436         if(0 != ioctl(0, FIONBIO, &flags))
    437           return 1;
    438 
    439   ;
    440   return 0;
    441 }
    442 #endif
    443 #ifdef HAVE_IOCTL_SIOCGIFADDR
    444 /* headers for FIONBIO test */
    445 /* includes start */
    446 #ifdef HAVE_SYS_TYPES_H
    447 #  include <sys/types.h>
    448 #endif
    449 #ifdef HAVE_UNISTD_H
    450 #  include <unistd.h>
    451 #endif
    452 #ifdef HAVE_SYS_SOCKET_H
    453 #  include <sys/socket.h>
    454 #endif
    455 #ifdef HAVE_SYS_IOCTL_H
    456 #  include <sys/ioctl.h>
    457 #endif
    458 #ifdef HAVE_STROPTS_H
    459 #  include <stropts.h>
    460 #endif
    461 #include <net/if.h>
    462 
    463 int
    464 main ()
    465 {
    466         struct ifreq ifr;
    467         if(0 != ioctl(0, SIOCGIFADDR, &ifr))
    468           return 1;
    469 
    470   ;
    471   return 0;
    472 }
    473 #endif
    474 #ifdef HAVE_SETSOCKOPT_SO_NONBLOCK
    475 /* includes start */
    476 #ifdef HAVE_WINDOWS_H
    477 #  ifndef WIN32_LEAN_AND_MEAN
    478 #    define WIN32_LEAN_AND_MEAN
    479 #  endif
    480 #  include <windows.h>
    481 #  ifdef HAVE_WINSOCK2_H
    482 #    include <winsock2.h>
    483 #  else
    484 #    ifdef HAVE_WINSOCK_H
    485 #      include <winsock.h>
    486 #    endif
    487 #  endif
    488 #endif
    489 /* includes start */
    490 #ifdef HAVE_SYS_TYPES_H
    491 #  include <sys/types.h>
    492 #endif
    493 #ifdef HAVE_SYS_SOCKET_H
    494 #  include <sys/socket.h>
    495 #endif
    496 /* includes end */
    497 
    498 int
    499 main ()
    500 {
    501         if(0 != setsockopt(0, SOL_SOCKET, SO_NONBLOCK, 0, 0))
    502           return 1;
    503   ;
    504   return 0;
    505 }
    506 #endif
    507 #ifdef HAVE_GLIBC_STRERROR_R
    508 #include <string.h>
    509 #include <errno.h>
    510 int
    511 main () {
    512   char buffer[1024]; /* big enough to play with */
    513   char *string =
    514     strerror_r(EACCES, buffer, sizeof(buffer));
    515     /* this should've returned a string */
    516     if(!string || !string[0])
    517       return 99;
    518     return 0;
    519 }
    520 #endif
    521 #ifdef HAVE_POSIX_STRERROR_R
    522 #include <string.h>
    523 #include <errno.h>
    524 int
    525 main () {
    526   char buffer[1024]; /* big enough to play with */
    527   int error =
    528     strerror_r(EACCES, buffer, sizeof(buffer));
    529     /* This should've returned zero, and written an error string in the
    530        buffer.*/
    531     if(!buffer[0] || error)
    532       return 99;
    533     return 0;
    534 }
    535 #endif
    536