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