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