compat.h revision 181834
1181834Sroberto/*  -*- Mode: C -*-  */
2181834Sroberto
3181834Sroberto/* --- fake the preprocessor into handlng portability */
4181834Sroberto/*
5181834Sroberto *  Time-stamp:      "2007-02-03 17:41:06 bkorb"
6181834Sroberto *
7181834Sroberto * Author:           Gary V Vaughan <gvaughan@oranda.demon.co.uk>
8181834Sroberto * Created:          Mon Jun 30 15:54:46 1997
9181834Sroberto *
10181834Sroberto * $Id: compat.h,v 4.16 2007/04/27 01:10:47 bkorb Exp $
11181834Sroberto */
12181834Sroberto#ifndef COMPAT_H_GUARD
13181834Sroberto#define COMPAT_H_GUARD 1
14181834Sroberto
15181834Sroberto#if defined(HAVE_CONFIG_H)
16181834Sroberto#  include <config.h>
17181834Sroberto
18181834Sroberto#elif defined(_WIN32) && !defined(__CYGWIN__)
19181834Sroberto#  include "windows-config.h"
20181834Sroberto
21181834Sroberto#else
22181834Sroberto#  error "compat.h" requires "config.h"
23181834Sroberto   choke me.
24181834Sroberto#endif
25181834Sroberto
26181834Sroberto
27181834Sroberto#ifndef HAVE_STRSIGNAL
28181834Sroberto   char * strsignal( int signo );
29181834Sroberto#endif
30181834Sroberto
31181834Sroberto#define  _GNU_SOURCE    1 /* for strsignal in GNU's libc */
32181834Sroberto#define  __USE_GNU      1 /* exact same thing as above   */
33181834Sroberto#define  __EXTENSIONS__ 1 /* and another way to call for it */
34181834Sroberto
35181834Sroberto/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
36181834Sroberto *
37181834Sroberto *  SYSTEM HEADERS:
38181834Sroberto */
39181834Sroberto#include <sys/types.h>
40181834Sroberto#ifdef HAVE_SYS_MMAN_H
41181834Sroberto#  include <sys/mman.h>
42181834Sroberto#endif
43181834Sroberto#include <sys/param.h>
44181834Sroberto#if HAVE_SYS_PROCSET_H
45181834Sroberto#  include <sys/procset.h>
46181834Sroberto#endif
47181834Sroberto#include <sys/stat.h>
48181834Sroberto#include <sys/wait.h>
49181834Sroberto
50181834Sroberto#if defined( HAVE_SOLARIS_SYSINFO )
51181834Sroberto#  include <sys/systeminfo.h>
52181834Sroberto#elif defined( HAVE_UNAME_SYSCALL )
53181834Sroberto#  include <sys/utsname.h>
54181834Sroberto#endif
55181834Sroberto
56181834Sroberto#ifdef DAEMON_ENABLED
57181834Sroberto#  if HAVE_SYS_STROPTS_H
58181834Sroberto#  include <sys/stropts.h>
59181834Sroberto#  endif
60181834Sroberto
61181834Sroberto#  if HAVE_SYS_SOCKET_H
62181834Sroberto#  include <sys/socket.h>
63181834Sroberto#  endif
64181834Sroberto
65181834Sroberto#  if ! defined(HAVE_SYS_POLL_H) && ! defined(HAVE_SYS_SELECT_H)
66181834Sroberto#    error This system cannot support daemon processing
67181834Sroberto     Choke Me.
68181834Sroberto#  endif
69181834Sroberto
70181834Sroberto#  if HAVE_SYS_POLL_H
71181834Sroberto#  include <sys/poll.h>
72181834Sroberto#  endif
73181834Sroberto
74181834Sroberto#  if HAVE_SYS_SELECT_H
75181834Sroberto#  include <sys/select.h>
76181834Sroberto#  endif
77181834Sroberto
78181834Sroberto#  if HAVE_NETINET_IN_H
79181834Sroberto#  include <netinet/in.h>
80181834Sroberto#  endif
81181834Sroberto
82181834Sroberto#  if HAVE_SYS_UN_H
83181834Sroberto#  include <sys/un.h>
84181834Sroberto#  endif
85181834Sroberto#endif
86181834Sroberto
87181834Sroberto/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
88181834Sroberto *
89181834Sroberto *  USER HEADERS:
90181834Sroberto */
91181834Sroberto#include <stdio.h>
92181834Sroberto#include <assert.h>
93181834Sroberto#include <ctype.h>
94181834Sroberto
95181834Sroberto/*
96181834Sroberto *  Directory opening stuff:
97181834Sroberto */
98181834Sroberto# if defined (_POSIX_SOURCE)
99181834Sroberto/* Posix does not require that the d_ino field be present, and some
100181834Sroberto   systems do not provide it. */
101181834Sroberto#    define REAL_DIR_ENTRY(dp) 1
102181834Sroberto# else /* !_POSIX_SOURCE */
103181834Sroberto#    define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
104181834Sroberto# endif /* !_POSIX_SOURCE */
105181834Sroberto
106181834Sroberto# if defined (HAVE_DIRENT_H)
107181834Sroberto#   include <dirent.h>
108181834Sroberto#   define D_NAMLEN(dirent) strlen((dirent)->d_name)
109181834Sroberto# else /* !HAVE_DIRENT_H */
110181834Sroberto#   define dirent direct
111181834Sroberto#   define D_NAMLEN(dirent) (dirent)->d_namlen
112181834Sroberto#   if defined (HAVE_SYS_NDIR_H)
113181834Sroberto#     include <sys/ndir.h>
114181834Sroberto#   endif /* HAVE_SYS_NDIR_H */
115181834Sroberto#   if defined (HAVE_SYS_DIR_H)
116181834Sroberto#     include <sys/dir.h>
117181834Sroberto#   endif /* HAVE_SYS_DIR_H */
118181834Sroberto#   if defined (HAVE_NDIR_H)
119181834Sroberto#     include <ndir.h>
120181834Sroberto#   endif /* HAVE_NDIR_H */
121181834Sroberto# endif /* !HAVE_DIRENT_H */
122181834Sroberto
123181834Sroberto#include <errno.h>
124181834Sroberto#ifdef HAVE_FCNTL_H
125181834Sroberto# include <fcntl.h>
126181834Sroberto#endif
127181834Sroberto#ifndef O_NONBLOCK
128181834Sroberto# define O_NONBLOCK FNDELAY
129181834Sroberto#endif
130181834Sroberto
131181834Sroberto#if defined(HAVE_LIBGEN) && defined(HAVE_LIBGEN_H)
132181834Sroberto#  include <libgen.h>
133181834Sroberto#endif
134181834Sroberto
135181834Sroberto#if defined(HAVE_LIMITS_H)  /* this is also in options.h */
136181834Sroberto#  include <limits.h>
137181834Sroberto#elif defined(HAVE_SYS_LIMITS_H)
138181834Sroberto#  include <sys/limits.h>
139181834Sroberto#endif /* HAVE_LIMITS/SYS_LIMITS_H */
140181834Sroberto
141181834Sroberto#include <memory.h>
142181834Sroberto#include <setjmp.h>
143181834Sroberto#include <signal.h>
144181834Sroberto
145181834Sroberto#if defined( HAVE_STDINT_H )
146181834Sroberto#  include <stdint.h>
147181834Sroberto#elif defined( HAVE_INTTYPES_H )
148181834Sroberto#  include <inttypes.h>
149181834Sroberto#endif
150181834Sroberto
151181834Sroberto#include <stdlib.h>
152181834Sroberto#include <string.h>
153181834Sroberto
154181834Sroberto#include <time.h>
155181834Sroberto
156181834Sroberto#ifdef HAVE_UTIME_H
157181834Sroberto#  include <utime.h>
158181834Sroberto#endif
159181834Sroberto
160181834Sroberto#ifdef HAVE_UNISTD_H
161181834Sroberto#  include <unistd.h>
162181834Sroberto#endif
163181834Sroberto
164181834Sroberto/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
165181834Sroberto *
166181834Sroberto *  FIXUPS and CONVIENCE STUFF:
167181834Sroberto */
168181834Sroberto#ifdef __cplusplus
169181834Sroberto#   define EXTERN extern "C"
170181834Sroberto#else
171181834Sroberto#   define EXTERN extern
172181834Sroberto#endif
173181834Sroberto
174181834Sroberto/* some systems #def errno! and others do not declare it!! */
175181834Sroberto#ifndef errno
176181834Sroberto   extern int errno;
177181834Sroberto#endif
178181834Sroberto
179181834Sroberto/* Some machines forget this! */
180181834Sroberto
181181834Sroberto# ifndef EXIT_FAILURE
182181834Sroberto#   define EXIT_SUCCESS 0
183181834Sroberto#   define EXIT_FAILURE 1
184181834Sroberto# endif
185181834Sroberto
186181834Sroberto#ifndef NUL
187181834Sroberto#  define NUL '\0'
188181834Sroberto#endif
189181834Sroberto
190181834Sroberto#ifndef NULL
191181834Sroberto#  define NULL 0
192181834Sroberto#endif
193181834Sroberto
194181834Sroberto#if !defined (MAXPATHLEN) && defined (HAVE_SYS_PARAM_H)
195181834Sroberto#  include <sys/param.h>
196181834Sroberto#endif /* !MAXPATHLEN && HAVE_SYS_PARAM_H */
197181834Sroberto
198181834Sroberto#if !defined (MAXPATHLEN) && defined (PATH_MAX)
199181834Sroberto#  define MAXPATHLEN PATH_MAX
200181834Sroberto#endif /* !MAXPATHLEN && PATH_MAX */
201181834Sroberto
202181834Sroberto#if !defined (MAXPATHLEN) && defined(_MAX_PATH)
203181834Sroberto#  define PATH_MAX _MAX_PATH
204181834Sroberto#  define MAXPATHLEN _MAX_PATH
205181834Sroberto#endif
206181834Sroberto
207181834Sroberto#if !defined (MAXPATHLEN)
208181834Sroberto#  define MAXPATHLEN ((size_t)4096)
209181834Sroberto#endif /* MAXPATHLEN */
210181834Sroberto
211181834Sroberto#define AG_PATH_MAX  ((size_t)MAXPATHLEN)
212181834Sroberto
213181834Sroberto#ifndef LONG_MAX
214181834Sroberto#  define LONG_MAX      ~(1L << (8*sizeof(long) -1))
215181834Sroberto#  define INT_MAX       ~(1 << (8*sizeof(int) -1))
216181834Sroberto#endif
217181834Sroberto
218181834Sroberto#ifndef ULONG_MAX
219181834Sroberto#  define ULONG_MAX     ~(OUL)
220181834Sroberto#  define UINT_MAX      ~(OU)
221181834Sroberto#endif
222181834Sroberto
223181834Sroberto#ifndef SHORT_MAX
224181834Sroberto#  define SHORT_MAX     ~(1 << (8*sizeof(short) -1))
225181834Sroberto#else
226181834Sroberto#  define USHORT_MAX    ~(OUS)
227181834Sroberto#endif
228181834Sroberto
229181834Sroberto#ifndef HAVE_INT8_T
230181834Sroberto  typedef signed char       int8_t;
231181834Sroberto#endif
232181834Sroberto#ifndef HAVE_UINT8_T
233181834Sroberto  typedef unsigned char     uint8_t;
234181834Sroberto#endif
235181834Sroberto#ifndef HAVE_INT16_T
236181834Sroberto  typedef signed short      int16_t;
237181834Sroberto#endif
238181834Sroberto#ifndef HAVE_UINT16_T
239181834Sroberto  typedef unsigned short    uint16_t;
240181834Sroberto#endif
241181834Sroberto#ifndef HAVE_UINT_T
242181834Sroberto  typedef unsigned int      uint_t;
243181834Sroberto#endif
244181834Sroberto
245181834Sroberto#ifndef HAVE_INT32_T
246181834Sroberto# if SIZEOF_INT == 4
247181834Sroberto        typedef signed int      int32_t;
248181834Sroberto# elif SIZEOF_LONG == 4
249181834Sroberto        typedef signed long     int32_t;
250181834Sroberto# endif
251181834Sroberto#endif
252181834Sroberto
253181834Sroberto#ifndef HAVE_UINT32_T
254181834Sroberto# if SIZEOF_INT == 4
255181834Sroberto        typedef unsigned int    uint32_t;
256181834Sroberto# elif SIZEOF_LONG == 4
257181834Sroberto        typedef unsigned long   uint32_t;
258181834Sroberto# else
259181834Sroberto#   error Cannot create a uint32_t type.
260181834Sroberto    Choke Me.
261181834Sroberto# endif
262181834Sroberto#endif
263181834Sroberto
264181834Sroberto#ifndef HAVE_INTPTR_T
265181834Sroberto  typedef signed long   intptr_t;
266181834Sroberto#endif
267181834Sroberto#ifndef HAVE_UINTPTR_T
268181834Sroberto  typedef unsigned long uintptr_t;
269181834Sroberto#endif
270181834Sroberto
271181834Sroberto/* redefine these for BSD style string libraries */
272181834Sroberto#ifndef HAVE_STRCHR
273181834Sroberto#  define strchr        index
274181834Sroberto#  define strrchr       rindex
275181834Sroberto#endif
276181834Sroberto
277181834Sroberto#ifdef USE_FOPEN_BINARY
278181834Sroberto#  ifndef FOPEN_BINARY_FLAG
279181834Sroberto#    define FOPEN_BINARY_FLAG   "b"
280181834Sroberto#  endif
281181834Sroberto#  ifndef FOPEN_TEXT_FLAG
282181834Sroberto#    define FOPEN_TEXT_FLAG     "t"
283181834Sroberto#  endif
284181834Sroberto#else
285181834Sroberto#  ifndef FOPEN_BINARY_FLAG
286181834Sroberto#    define FOPEN_BINARY_FLAG
287181834Sroberto#  endif
288181834Sroberto#  ifndef FOPEN_TEXT_FLAG
289181834Sroberto#    define FOPEN_TEXT_FLAG
290181834Sroberto#  endif
291181834Sroberto#endif
292181834Sroberto
293181834Sroberto#ifndef STR
294181834Sroberto#  define _STR(s) #s
295181834Sroberto#  define STR(s)  _STR(s)
296181834Sroberto#endif
297181834Sroberto
298181834Sroberto/* ##### Pointer sized word ##### */
299181834Sroberto
300181834Sroberto/* FIXME:  the MAX stuff in here is broken! */
301181834Sroberto#if SIZEOF_CHARP > SIZEOF_INT
302181834Sroberto   typedef long t_word;
303181834Sroberto   #define WORD_MAX  LONG_MAX
304181834Sroberto   #define WORD_MIN  LONG_MIN
305181834Sroberto#else /* SIZEOF_CHARP <= SIZEOF_INT */
306181834Sroberto   typedef int t_word;
307181834Sroberto   #define WORD_MAX  INT_MAX
308181834Sroberto   #define WORD_MIN  INT_MIN
309181834Sroberto#endif
310181834Sroberto
311181834Sroberto#endif /* COMPAT_H_GUARD */
312181834Sroberto
313181834Sroberto/*
314181834Sroberto * Local Variables:
315181834Sroberto * mode: C
316181834Sroberto * c-file-style: "stroustrup"
317181834Sroberto * indent-tabs-mode: nil
318181834Sroberto * End:
319181834Sroberto * end of compat/compat.h */
320