12b15cb3dSCy Schubert /* -*- Mode: C -*- 22b15cb3dSCy Schubert * 32b15cb3dSCy Schubert * compat.h is free software. 42b15cb3dSCy Schubert * This file is part of AutoGen and AutoOpts. 52b15cb3dSCy Schubert * 6*a466cc55SCy Schubert * AutoGen Copyright (C) 1992-2018 by Bruce Korb - all rights reserved 72b15cb3dSCy Schubert * 82b15cb3dSCy Schubert * AutoOpts is available under any one of two licenses. The license 92b15cb3dSCy Schubert * in use must be one of these two and the choice is under the control 102b15cb3dSCy Schubert * of the user of the license. 112b15cb3dSCy Schubert * 122b15cb3dSCy Schubert * The GNU Lesser General Public License, version 3 or later 132b15cb3dSCy Schubert * See the files "COPYING.lgplv3" and "COPYING.gplv3" 142b15cb3dSCy Schubert * 152b15cb3dSCy Schubert * The Modified Berkeley Software Distribution License 162b15cb3dSCy Schubert * See the file "COPYING.mbsd" 172b15cb3dSCy Schubert * 182b15cb3dSCy Schubert * These files have the following sha256 sums: 192b15cb3dSCy Schubert * 202b15cb3dSCy Schubert * 8584710e9b04216a394078dc156b781d0b47e1729104d666658aecef8ee32e95 COPYING.gplv3 212b15cb3dSCy Schubert * 4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b COPYING.lgplv3 222b15cb3dSCy Schubert * 13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239 COPYING.mbsd 232b15cb3dSCy Schubert */ 24ea906c41SOllivier Robert 252b15cb3dSCy Schubert /** 262b15cb3dSCy Schubert * \file compat.h 272b15cb3dSCy Schubert * fake the preprocessor into handlng stuff portability 28ea906c41SOllivier Robert */ 29ea906c41SOllivier Robert #ifndef COMPAT_H_GUARD 30ea906c41SOllivier Robert #define COMPAT_H_GUARD 1 31ea906c41SOllivier Robert 32ea906c41SOllivier Robert #if defined(HAVE_CONFIG_H) 33ea906c41SOllivier Robert # include <config.h> 34ea906c41SOllivier Robert 35ea906c41SOllivier Robert #elif defined(_WIN32) && !defined(__CYGWIN__) 36ea906c41SOllivier Robert # include "windows-config.h" 37ea906c41SOllivier Robert 38ea906c41SOllivier Robert #else 39ea906c41SOllivier Robert # error "compat.h" requires "config.h" 40ea906c41SOllivier Robert choke me. 41ea906c41SOllivier Robert #endif 42ea906c41SOllivier Robert 43ea906c41SOllivier Robert 44ea906c41SOllivier Robert #ifndef HAVE_STRSIGNAL 452b15cb3dSCy Schubert # ifndef HAVE_RAW_DECL_STRSIGNAL 46ea906c41SOllivier Robert char * strsignal(int signo); 47ea906c41SOllivier Robert # endif 482b15cb3dSCy Schubert #endif 49ea906c41SOllivier Robert 50ea906c41SOllivier Robert #define _GNU_SOURCE 1 /* for strsignal in GNU's libc */ 51ea906c41SOllivier Robert #define __USE_GNU 1 /* exact same thing as above */ 52ea906c41SOllivier Robert #define __EXTENSIONS__ 1 /* and another way to call for it */ 53ea906c41SOllivier Robert 54ea906c41SOllivier Robert /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 55ea906c41SOllivier Robert * 56ea906c41SOllivier Robert * SYSTEM HEADERS: 57ea906c41SOllivier Robert */ 58ea906c41SOllivier Robert #include <sys/types.h> 59ea906c41SOllivier Robert #ifdef HAVE_SYS_MMAN_H 60ea906c41SOllivier Robert # include <sys/mman.h> 61ea906c41SOllivier Robert #endif 62ea906c41SOllivier Robert #include <sys/param.h> 63ea906c41SOllivier Robert #if HAVE_SYS_PROCSET_H 64ea906c41SOllivier Robert # include <sys/procset.h> 65ea906c41SOllivier Robert #endif 66ea906c41SOllivier Robert #include <sys/stat.h> 672b15cb3dSCy Schubert #ifdef HAVE_SYS_WAIT_H 68ea906c41SOllivier Robert # include <sys/wait.h> 692b15cb3dSCy Schubert #endif 70ea906c41SOllivier Robert 71ea906c41SOllivier Robert #if defined( HAVE_SOLARIS_SYSINFO ) 72ea906c41SOllivier Robert # include <sys/systeminfo.h> 73ea906c41SOllivier Robert #elif defined( HAVE_UNAME_SYSCALL ) 74ea906c41SOllivier Robert # include <sys/utsname.h> 75ea906c41SOllivier Robert #endif 76ea906c41SOllivier Robert 77ea906c41SOllivier Robert #ifdef DAEMON_ENABLED 78ea906c41SOllivier Robert # if HAVE_SYS_STROPTS_H 79ea906c41SOllivier Robert # include <sys/stropts.h> 80ea906c41SOllivier Robert # endif 81ea906c41SOllivier Robert 82ea906c41SOllivier Robert # if HAVE_SYS_SOCKET_H 83ea906c41SOllivier Robert # include <sys/socket.h> 84ea906c41SOllivier Robert # endif 85ea906c41SOllivier Robert 86ea906c41SOllivier Robert # if ! defined(HAVE_SYS_POLL_H) && ! defined(HAVE_SYS_SELECT_H) 87ea906c41SOllivier Robert # error This system cannot support daemon processing 88ea906c41SOllivier Robert Choke Me. 89ea906c41SOllivier Robert # endif 90ea906c41SOllivier Robert 91ea906c41SOllivier Robert # if HAVE_SYS_POLL_H 92ea906c41SOllivier Robert # include <sys/poll.h> 93ea906c41SOllivier Robert # endif 94ea906c41SOllivier Robert 95ea906c41SOllivier Robert # if HAVE_SYS_SELECT_H 96ea906c41SOllivier Robert # include <sys/select.h> 97ea906c41SOllivier Robert # endif 98ea906c41SOllivier Robert 99ea906c41SOllivier Robert # if HAVE_NETINET_IN_H 100ea906c41SOllivier Robert # include <netinet/in.h> 101ea906c41SOllivier Robert # endif 102ea906c41SOllivier Robert 103ea906c41SOllivier Robert # if HAVE_SYS_UN_H 104ea906c41SOllivier Robert # include <sys/un.h> 105ea906c41SOllivier Robert # endif 106ea906c41SOllivier Robert #endif 107ea906c41SOllivier Robert 108ea906c41SOllivier Robert /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 109ea906c41SOllivier Robert * 110ea906c41SOllivier Robert * USER HEADERS: 111ea906c41SOllivier Robert */ 112ea906c41SOllivier Robert #include <stdio.h> 113ea906c41SOllivier Robert #include <assert.h> 114ea906c41SOllivier Robert #include <ctype.h> 115ea906c41SOllivier Robert 116ea906c41SOllivier Robert /* 117ea906c41SOllivier Robert * Directory opening stuff: 118ea906c41SOllivier Robert */ 119ea906c41SOllivier Robert # if defined (_POSIX_SOURCE) 120ea906c41SOllivier Robert /* Posix does not require that the d_ino field be present, and some 121ea906c41SOllivier Robert systems do not provide it. */ 122ea906c41SOllivier Robert # define REAL_DIR_ENTRY(dp) 1 123ea906c41SOllivier Robert # else /* !_POSIX_SOURCE */ 124ea906c41SOllivier Robert # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) 125ea906c41SOllivier Robert # endif /* !_POSIX_SOURCE */ 126ea906c41SOllivier Robert 127ea906c41SOllivier Robert # if defined (HAVE_DIRENT_H) 128ea906c41SOllivier Robert # include <dirent.h> 129ea906c41SOllivier Robert # define D_NAMLEN(dirent) strlen((dirent)->d_name) 130ea906c41SOllivier Robert # else /* !HAVE_DIRENT_H */ 131ea906c41SOllivier Robert # define dirent direct 132ea906c41SOllivier Robert # define D_NAMLEN(dirent) (dirent)->d_namlen 133ea906c41SOllivier Robert # if defined (HAVE_SYS_NDIR_H) 134ea906c41SOllivier Robert # include <sys/ndir.h> 135ea906c41SOllivier Robert # endif /* HAVE_SYS_NDIR_H */ 136ea906c41SOllivier Robert # if defined (HAVE_SYS_DIR_H) 137ea906c41SOllivier Robert # include <sys/dir.h> 138ea906c41SOllivier Robert # endif /* HAVE_SYS_DIR_H */ 139ea906c41SOllivier Robert # if defined (HAVE_NDIR_H) 140ea906c41SOllivier Robert # include <ndir.h> 141ea906c41SOllivier Robert # endif /* HAVE_NDIR_H */ 142ea906c41SOllivier Robert # endif /* !HAVE_DIRENT_H */ 143ea906c41SOllivier Robert 144ea906c41SOllivier Robert #include <errno.h> 145ea906c41SOllivier Robert #ifdef HAVE_FCNTL_H 146ea906c41SOllivier Robert # include <fcntl.h> 147ea906c41SOllivier Robert #endif 148ea906c41SOllivier Robert #ifndef O_NONBLOCK 149ea906c41SOllivier Robert # define O_NONBLOCK FNDELAY 150ea906c41SOllivier Robert #endif 151ea906c41SOllivier Robert 152ea906c41SOllivier Robert #if defined(HAVE_LIBGEN) && defined(HAVE_LIBGEN_H) 153ea906c41SOllivier Robert # include <libgen.h> 154ea906c41SOllivier Robert #endif 155ea906c41SOllivier Robert 156ea906c41SOllivier Robert #if defined(HAVE_LIMITS_H) /* this is also in options.h */ 157ea906c41SOllivier Robert # include <limits.h> 158ea906c41SOllivier Robert #elif defined(HAVE_SYS_LIMITS_H) 159ea906c41SOllivier Robert # include <sys/limits.h> 160ea906c41SOllivier Robert #endif /* HAVE_LIMITS/SYS_LIMITS_H */ 161ea906c41SOllivier Robert 162ea906c41SOllivier Robert #include <memory.h> 163ea906c41SOllivier Robert #include <setjmp.h> 164ea906c41SOllivier Robert #include <signal.h> 165ea906c41SOllivier Robert 166ea906c41SOllivier Robert #if defined(HAVE_STDINT_H) 167ea906c41SOllivier Robert # include <stdint.h> 1682b15cb3dSCy Schubert 169ea906c41SOllivier Robert #elif defined(HAVE_INTTYPES_H) 170ea906c41SOllivier Robert # include <inttypes.h> 171ea906c41SOllivier Robert #endif 172ea906c41SOllivier Robert 173ea906c41SOllivier Robert #include <stdlib.h> 174ea906c41SOllivier Robert #include <string.h> 175ea906c41SOllivier Robert #include <time.h> 176ea906c41SOllivier Robert 177ea906c41SOllivier Robert #ifdef HAVE_UTIME_H 178ea906c41SOllivier Robert # include <utime.h> 179ea906c41SOllivier Robert #endif 180ea906c41SOllivier Robert 181ea906c41SOllivier Robert #ifdef HAVE_UNISTD_H 182ea906c41SOllivier Robert # include <unistd.h> 183ea906c41SOllivier Robert #endif 184ea906c41SOllivier Robert 185*a466cc55SCy Schubert #if defined(HAVE_STDBOOL_H) 1862b15cb3dSCy Schubert # include <stdbool.h> 187*a466cc55SCy Schubert #elif ! defined(bool) 1882b15cb3dSCy Schubert typedef enum { false = 0, true = 1 } _Bool; 1892b15cb3dSCy Schubert # define bool _Bool 1902b15cb3dSCy Schubert 1912b15cb3dSCy Schubert /* The other macros must be usable in preprocessor directives. */ 1922b15cb3dSCy Schubert # define false 0 1932b15cb3dSCy Schubert # define true 1 1942b15cb3dSCy Schubert #endif 1952b15cb3dSCy Schubert 196ea906c41SOllivier Robert /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 197ea906c41SOllivier Robert * 198ea906c41SOllivier Robert * FIXUPS and CONVIENCE STUFF: 199ea906c41SOllivier Robert */ 200ea906c41SOllivier Robert #ifdef __cplusplus 201ea906c41SOllivier Robert # define EXTERN extern "C" 202ea906c41SOllivier Robert #else 203ea906c41SOllivier Robert # define EXTERN extern 204ea906c41SOllivier Robert #endif 205ea906c41SOllivier Robert 206ea906c41SOllivier Robert /* some systems #def errno! and others do not declare it!! */ 207ea906c41SOllivier Robert #ifndef errno 208ea906c41SOllivier Robert extern int errno; 209ea906c41SOllivier Robert #endif 210ea906c41SOllivier Robert 211ea906c41SOllivier Robert /* Some machines forget this! */ 212ea906c41SOllivier Robert 213ea906c41SOllivier Robert # ifndef EXIT_FAILURE 214ea906c41SOllivier Robert # define EXIT_SUCCESS 0 215ea906c41SOllivier Robert # define EXIT_FAILURE 1 216ea906c41SOllivier Robert # endif 217ea906c41SOllivier Robert 218ea906c41SOllivier Robert #ifndef NUL 219ea906c41SOllivier Robert # define NUL '\0' 220ea906c41SOllivier Robert #endif 221ea906c41SOllivier Robert 222ea906c41SOllivier Robert #ifndef NULL 223ea906c41SOllivier Robert # define NULL 0 224ea906c41SOllivier Robert #endif 225ea906c41SOllivier Robert 226ea906c41SOllivier Robert #if !defined (MAXPATHLEN) && defined (HAVE_SYS_PARAM_H) 227ea906c41SOllivier Robert # include <sys/param.h> 228ea906c41SOllivier Robert #endif /* !MAXPATHLEN && HAVE_SYS_PARAM_H */ 229ea906c41SOllivier Robert 230ea906c41SOllivier Robert #if !defined (MAXPATHLEN) && defined (PATH_MAX) 231ea906c41SOllivier Robert # define MAXPATHLEN PATH_MAX 232ea906c41SOllivier Robert #endif /* !MAXPATHLEN && PATH_MAX */ 233ea906c41SOllivier Robert 234ea906c41SOllivier Robert #if !defined (MAXPATHLEN) && defined(_MAX_PATH) 235ea906c41SOllivier Robert # define PATH_MAX _MAX_PATH 236ea906c41SOllivier Robert # define MAXPATHLEN _MAX_PATH 237ea906c41SOllivier Robert #endif 238ea906c41SOllivier Robert 239ea906c41SOllivier Robert #if !defined (MAXPATHLEN) 2402b15cb3dSCy Schubert # define MAXPATHLEN 4096 241ea906c41SOllivier Robert #endif /* MAXPATHLEN */ 242ea906c41SOllivier Robert 243ea906c41SOllivier Robert #define AG_PATH_MAX ((size_t)MAXPATHLEN) 244ea906c41SOllivier Robert 245ea906c41SOllivier Robert #ifndef LONG_MAX 246ea906c41SOllivier Robert # define LONG_MAX ~(1L << (8*sizeof(long) -1)) 247ea906c41SOllivier Robert # define INT_MAX ~(1 << (8*sizeof(int) -1)) 248ea906c41SOllivier Robert #endif 249ea906c41SOllivier Robert 250ea906c41SOllivier Robert #ifndef ULONG_MAX 251ea906c41SOllivier Robert # define ULONG_MAX ~(OUL) 252ea906c41SOllivier Robert # define UINT_MAX ~(OU) 253ea906c41SOllivier Robert #endif 254ea906c41SOllivier Robert 255ea906c41SOllivier Robert #ifndef SHORT_MAX 256ea906c41SOllivier Robert # define SHORT_MAX ~(1 << (8*sizeof(short) - 1)) 257ea906c41SOllivier Robert #else 258ea906c41SOllivier Robert # define USHORT_MAX ~(OUS) 259ea906c41SOllivier Robert #endif 260ea906c41SOllivier Robert 261ea906c41SOllivier Robert #ifndef HAVE_INT8_T 262ea906c41SOllivier Robert typedef signed char int8_t; 2632b15cb3dSCy Schubert # define HAVE_INT8_T 1 264ea906c41SOllivier Robert #endif 265ea906c41SOllivier Robert #ifndef HAVE_UINT8_T 266ea906c41SOllivier Robert typedef unsigned char uint8_t; 2672b15cb3dSCy Schubert # define HAVE_UINT8_T 1 268ea906c41SOllivier Robert #endif 269ea906c41SOllivier Robert #ifndef HAVE_INT16_T 270ea906c41SOllivier Robert typedef signed short int16_t; 2712b15cb3dSCy Schubert # define HAVE_INT16_T 1 272ea906c41SOllivier Robert #endif 273ea906c41SOllivier Robert #ifndef HAVE_UINT16_T 274ea906c41SOllivier Robert typedef unsigned short uint16_t; 2752b15cb3dSCy Schubert # define HAVE_UINT16_T 1 276ea906c41SOllivier Robert #endif 277ea906c41SOllivier Robert 278ea906c41SOllivier Robert #ifndef HAVE_INT32_T 279ea906c41SOllivier Robert # if SIZEOF_INT == 4 280ea906c41SOllivier Robert typedef signed int int32_t; 281ea906c41SOllivier Robert # elif SIZEOF_LONG == 4 282ea906c41SOllivier Robert typedef signed long int32_t; 283ea906c41SOllivier Robert # endif 2842b15cb3dSCy Schubert # define HAVE_INT32_T 1 285ea906c41SOllivier Robert #endif 286ea906c41SOllivier Robert 287ea906c41SOllivier Robert #ifndef HAVE_UINT32_T 288ea906c41SOllivier Robert # if SIZEOF_INT == 4 289ea906c41SOllivier Robert typedef unsigned int uint32_t; 290ea906c41SOllivier Robert # elif SIZEOF_LONG == 4 291ea906c41SOllivier Robert typedef unsigned long uint32_t; 292ea906c41SOllivier Robert # else 293ea906c41SOllivier Robert # error Cannot create a uint32_t type. 294ea906c41SOllivier Robert Choke Me. 295ea906c41SOllivier Robert # endif 2962b15cb3dSCy Schubert # define HAVE_UINT32_T 1 297ea906c41SOllivier Robert #endif 298ea906c41SOllivier Robert 299ea906c41SOllivier Robert #ifndef HAVE_INTPTR_T 3002b15cb3dSCy Schubert # if SIZEOF_CHARP == SIZEOF_LONG 301ea906c41SOllivier Robert typedef signed long intptr_t; 3022b15cb3dSCy Schubert # else 3032b15cb3dSCy Schubert typedef signed int intptr_t; 304ea906c41SOllivier Robert # endif 3052b15cb3dSCy Schubert # define HAVE_INTPTR_T 1 3062b15cb3dSCy Schubert #endif 3072b15cb3dSCy Schubert 308ea906c41SOllivier Robert #ifndef HAVE_UINTPTR_T 3092b15cb3dSCy Schubert # if SIZEOF_CHARP == SIZEOF_LONG 3102b15cb3dSCy Schubert typedef unsigned long intptr_t; 3112b15cb3dSCy Schubert # else 3122b15cb3dSCy Schubert typedef unsigned int intptr_t; 3132b15cb3dSCy Schubert # endif 3142b15cb3dSCy Schubert # define HAVE_INTPTR_T 1 3152b15cb3dSCy Schubert #endif 3162b15cb3dSCy Schubert 3172b15cb3dSCy Schubert #ifndef HAVE_UINT_T 3182b15cb3dSCy Schubert typedef unsigned int uint_t; 3192b15cb3dSCy Schubert # define HAVE_UINT_T 1 3202b15cb3dSCy Schubert #endif 3212b15cb3dSCy Schubert 3222b15cb3dSCy Schubert #ifndef HAVE_SIZE_T 3232b15cb3dSCy Schubert typedef unsigned int size_t; 3242b15cb3dSCy Schubert # define HAVE_SIZE_T 1 3252b15cb3dSCy Schubert #endif 3262b15cb3dSCy Schubert #ifndef HAVE_WINT_T 3272b15cb3dSCy Schubert typedef unsigned int wint_t; 3282b15cb3dSCy Schubert # define HAVE_WINT_T 1 3292b15cb3dSCy Schubert #endif 3302b15cb3dSCy Schubert #ifndef HAVE_PID_T 3312b15cb3dSCy Schubert typedef signed int pid_t; 3322b15cb3dSCy Schubert # define HAVE_PID_T 1 333ea906c41SOllivier Robert #endif 334ea906c41SOllivier Robert 335ea906c41SOllivier Robert /* redefine these for BSD style string libraries */ 336ea906c41SOllivier Robert #ifndef HAVE_STRCHR 337ea906c41SOllivier Robert # define strchr index 338ea906c41SOllivier Robert # define strrchr rindex 339ea906c41SOllivier Robert #endif 340ea906c41SOllivier Robert 341ea906c41SOllivier Robert #ifdef USE_FOPEN_BINARY 342ea906c41SOllivier Robert # ifndef FOPEN_BINARY_FLAG 343ea906c41SOllivier Robert # define FOPEN_BINARY_FLAG "b" 344ea906c41SOllivier Robert # endif 345ea906c41SOllivier Robert # ifndef FOPEN_TEXT_FLAG 346ea906c41SOllivier Robert # define FOPEN_TEXT_FLAG "t" 347ea906c41SOllivier Robert # endif 348ea906c41SOllivier Robert #else 349ea906c41SOllivier Robert # ifndef FOPEN_BINARY_FLAG 350ea906c41SOllivier Robert # define FOPEN_BINARY_FLAG 351ea906c41SOllivier Robert # endif 352ea906c41SOllivier Robert # ifndef FOPEN_TEXT_FLAG 353ea906c41SOllivier Robert # define FOPEN_TEXT_FLAG 354ea906c41SOllivier Robert # endif 355ea906c41SOllivier Robert #endif 356ea906c41SOllivier Robert 357ea906c41SOllivier Robert #ifndef STR 358ea906c41SOllivier Robert # define _STR(s) #s 359ea906c41SOllivier Robert # define STR(s) _STR(s) 360ea906c41SOllivier Robert #endif 361ea906c41SOllivier Robert 362ea906c41SOllivier Robert /* ##### Pointer sized word ##### */ 363ea906c41SOllivier Robert 364ea906c41SOllivier Robert /* FIXME: the MAX stuff in here is broken! */ 365ea906c41SOllivier Robert #if SIZEOF_CHARP > SIZEOF_INT 366ea906c41SOllivier Robert typedef long t_word; 367ea906c41SOllivier Robert #define WORD_MAX LONG_MAX 368ea906c41SOllivier Robert #define WORD_MIN LONG_MIN 369ea906c41SOllivier Robert #else /* SIZEOF_CHARP <= SIZEOF_INT */ 370ea906c41SOllivier Robert typedef int t_word; 371ea906c41SOllivier Robert #define WORD_MAX INT_MAX 372ea906c41SOllivier Robert #define WORD_MIN INT_MIN 373ea906c41SOllivier Robert #endif 374ea906c41SOllivier Robert 375ea906c41SOllivier Robert #endif /* COMPAT_H_GUARD */ 376ea906c41SOllivier Robert 377ea906c41SOllivier Robert /* 378ea906c41SOllivier Robert * Local Variables: 379ea906c41SOllivier Robert * mode: C 380ea906c41SOllivier Robert * c-file-style: "stroustrup" 381ea906c41SOllivier Robert * indent-tabs-mode: nil 382ea906c41SOllivier Robert * End: 383ea906c41SOllivier Robert * end of compat/compat.h */ 384