defines.h revision 294332
1104630Ssam/*
2104478Ssam * Copyright (c) 1999-2003 Damien Miller.  All rights reserved.
3139749Simp *
4104478Ssam * Redistribution and use in source and binary forms, with or without
5104478Ssam * modification, are permitted provided that the following conditions
6104478Ssam * are met:
7162969Sjhb * 1. Redistributions of source code must retain the above copyright
8104478Ssam *    notice, this list of conditions and the following disclaimer.
9104478Ssam * 2. Redistributions in binary form must reproduce the above copyright
10104478Ssam *    notice, this list of conditions and the following disclaimer in the
11104478Ssam *    documentation and/or other materials provided with the distribution.
12104478Ssam *
13104478Ssam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14104478Ssam * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15104478Ssam * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16104478Ssam * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17104478Ssam * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18104478Ssam * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19104478Ssam * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20104478Ssam * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21104478Ssam * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22104478Ssam * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23104478Ssam */
24104478Ssam
25104478Ssam#ifndef _DEFINES_H
26104478Ssam#define _DEFINES_H
27104478Ssam
28104478Ssam/* $Id: defines.h,v 1.183 2014/09/02 19:33:26 djm Exp $ */
29104478Ssam
30104478Ssam
31104478Ssam/* Constants */
32104478Ssam
33104478Ssam#if defined(HAVE_DECL_SHUT_RD) && HAVE_DECL_SHUT_RD == 0
34104478Ssamenum
35104478Ssam{
36104478Ssam  SHUT_RD = 0,		/* No more receptions.  */
37104478Ssam  SHUT_WR,			/* No more transmissions.  */
38104478Ssam  SHUT_RDWR			/* No more receptions or transmissions.  */
39104478Ssam};
40104478Ssam# define SHUT_RD   SHUT_RD
41119418Sobrien# define SHUT_WR   SHUT_WR
42119418Sobrien# define SHUT_RDWR SHUT_RDWR
43119418Sobrien#endif
44104478Ssam
45104478Ssam/*
46104478Ssam * Definitions for IP type of service (ip_tos)
47104478Ssam */
48112124Ssam#include <netinet/in_systm.h>
49112124Ssam#include <netinet/ip.h>
50104478Ssam#ifndef IPTOS_LOWDELAY
51104478Ssam# define IPTOS_LOWDELAY          0x10
52104478Ssam# define IPTOS_THROUGHPUT        0x08
53104478Ssam# define IPTOS_RELIABILITY       0x04
54104478Ssam# define IPTOS_LOWCOST           0x02
55104478Ssam# define IPTOS_MINCOST           IPTOS_LOWCOST
56129879Sphk#endif /* IPTOS_LOWDELAY */
57104478Ssam
58104478Ssam/*
59104478Ssam * Definitions for DiffServ Codepoints as per RFC2474
60104478Ssam */
61104478Ssam#ifndef IPTOS_DSCP_AF11
62104478Ssam# define	IPTOS_DSCP_AF11		0x28
63104478Ssam# define	IPTOS_DSCP_AF12		0x30
64104478Ssam# define	IPTOS_DSCP_AF13		0x38
65104478Ssam# define	IPTOS_DSCP_AF21		0x48
66104478Ssam# define	IPTOS_DSCP_AF22		0x50
67104478Ssam# define	IPTOS_DSCP_AF23		0x58
68104478Ssam# define	IPTOS_DSCP_AF31		0x68
69104478Ssam# define	IPTOS_DSCP_AF32		0x70
70104478Ssam# define	IPTOS_DSCP_AF33		0x78
71104478Ssam# define	IPTOS_DSCP_AF41		0x88
72104478Ssam# define	IPTOS_DSCP_AF42		0x90
73104478Ssam# define	IPTOS_DSCP_AF43		0x98
74104478Ssam# define	IPTOS_DSCP_EF		0xb8
75104478Ssam#endif /* IPTOS_DSCP_AF11 */
76167755Ssam#ifndef IPTOS_DSCP_CS0
77104478Ssam# define	IPTOS_DSCP_CS0		0x00
78167755Ssam# define	IPTOS_DSCP_CS1		0x20
79167755Ssam# define	IPTOS_DSCP_CS2		0x40
80119287Simp# define	IPTOS_DSCP_CS3		0x60
81119287Simp# define	IPTOS_DSCP_CS4		0x80
82104478Ssam# define	IPTOS_DSCP_CS5		0xa0
83104478Ssam# define	IPTOS_DSCP_CS6		0xc0
84104478Ssam# define	IPTOS_DSCP_CS7		0xe0
85104478Ssam#endif /* IPTOS_DSCP_CS0 */
86104478Ssam#ifndef IPTOS_DSCP_EF
87104478Ssam# define	IPTOS_DSCP_EF		0xb8
88104478Ssam#endif /* IPTOS_DSCP_EF */
89104478Ssam
90163648Sru#ifndef PATH_MAX
91111416Ssam# ifdef _POSIX_PATH_MAX
92104478Ssam# define PATH_MAX _POSIX_PATH_MAX
93104478Ssam# endif
94104478Ssam#endif
95104478Ssam
96112124Ssam#ifndef MAXPATHLEN
97112124Ssam# ifdef PATH_MAX
98112124Ssam#  define MAXPATHLEN PATH_MAX
99104478Ssam# else /* PATH_MAX */
100104478Ssam#  define MAXPATHLEN 64
101104478Ssam/* realpath uses a fixed buffer of size MAXPATHLEN, so force use of ours */
102104478Ssam#  ifndef BROKEN_REALPATH
103104478Ssam#   define BROKEN_REALPATH 1
104104478Ssam#  endif /* BROKEN_REALPATH */
105104478Ssam# endif /* PATH_MAX */
106104478Ssam#endif /* MAXPATHLEN */
107104478Ssam
108104478Ssam#ifndef HOST_NAME_MAX
109104478Ssam# include "netdb.h" /* for MAXHOSTNAMELEN */
110194023Savg# if defined(_POSIX_HOST_NAME_MAX)
111104478Ssam#  define HOST_NAME_MAX _POSIX_HOST_NAME_MAX
112167755Ssam# elif defined(MAXHOSTNAMELEN)
113167755Ssam#  define HOST_NAME_MAX MAXHOSTNAMELEN
114167755Ssam# else
115167755Ssam#  define HOST_NAME_MAX	255
116167755Ssam# endif
117104478Ssam#endif /* HOST_NAME_MAX */
118104478Ssam
119104478Ssam#if defined(HAVE_DECL_MAXSYMLINKS) && HAVE_DECL_MAXSYMLINKS == 0
120104478Ssam# define MAXSYMLINKS 5
121104478Ssam#endif
122104478Ssam
123104478Ssam#ifndef STDIN_FILENO
124104478Ssam# define STDIN_FILENO    0
125104478Ssam#endif
126167755Ssam#ifndef STDOUT_FILENO
127167755Ssam# define STDOUT_FILENO   1
128167755Ssam#endif
129167755Ssam#ifndef STDERR_FILENO
130167755Ssam# define STDERR_FILENO   2
131167755Ssam#endif
132227843Smarius
133104478Ssam#ifndef NGROUPS_MAX	/* Disable groupaccess if NGROUP_MAX is not set */
134104478Ssam#ifdef NGROUPS
135104478Ssam#define NGROUPS_MAX NGROUPS
136104478Ssam#else
137104478Ssam#define NGROUPS_MAX 0
138104478Ssam#endif
139104478Ssam#endif
140104478Ssam
141104478Ssam#if defined(HAVE_DECL_O_NONBLOCK) && HAVE_DECL_O_NONBLOCK == 0
142105251Smarkm# define O_NONBLOCK      00004	/* Non Blocking Open */
143112124Ssam#endif
144112124Ssam
145112124Ssam#ifndef S_IFSOCK
146104478Ssam# define S_IFSOCK 0
147104478Ssam#endif /* S_IFSOCK */
148104478Ssam
149111416Ssam#ifndef S_ISDIR
150104478Ssam# define S_ISDIR(mode)	(((mode) & (_S_IFMT)) == (_S_IFDIR))
151104478Ssam#endif /* S_ISDIR */
152104478Ssam
153104478Ssam#ifndef S_ISREG
154104478Ssam# define S_ISREG(mode)	(((mode) & (_S_IFMT)) == (_S_IFREG))
155104478Ssam#endif /* S_ISREG */
156108823Ssam
157108823Ssam#ifndef S_ISLNK
158104478Ssam# define S_ISLNK(mode)	(((mode) & S_IFMT) == S_IFLNK)
159104478Ssam#endif /* S_ISLNK */
160104478Ssam
161104478Ssam#ifndef S_IXUSR
162104478Ssam# define S_IXUSR			0000100	/* execute/search permission, */
163104478Ssam# define S_IXGRP			0000010	/* execute/search permission, */
164104478Ssam# define S_IXOTH			0000001	/* execute/search permission, */
165104478Ssam# define _S_IWUSR			0000200	/* write permission, */
166104478Ssam# define S_IWUSR			_S_IWUSR	/* write permission, owner */
167104478Ssam# define S_IWGRP			0000020	/* write permission, group */
168104630Ssam# define S_IWOTH			0000002	/* write permission, other */
169104630Ssam# define S_IRUSR			0000400	/* read permission, owner */
170104478Ssam# define S_IRGRP			0000040	/* read permission, group */
171104478Ssam# define S_IROTH			0000004	/* read permission, other */
172104478Ssam# define S_IRWXU			0000700	/* read, write, execute */
173104478Ssam# define S_IRWXG			0000070	/* read, write, execute */
174104478Ssam# define S_IRWXO			0000007	/* read, write, execute */
175104478Ssam#endif /* S_IXUSR */
176227309Sed
177227309Sed#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
178109595Ssam#define MAP_ANON MAP_ANONYMOUS
179104478Ssam#endif
180104478Ssam
181104478Ssam#ifndef MAP_FAILED
182104478Ssam# define MAP_FAILED ((void *)-1)
183104478Ssam#endif
184104478Ssam
185109595Ssam/*
186109595SsamSCO Open Server 3 has INADDR_LOOPBACK defined in rpc/rpc.h but
187104478Ssamincluding rpc/rpc.h breaks Solaris 6
188104478Ssam*/
189104478Ssam#ifndef INADDR_LOOPBACK
190104478Ssam#define INADDR_LOOPBACK ((u_long)0x7f000001)
191104478Ssam#endif
192104478Ssam
193104478Ssam/* Types */
194104478Ssam
195104478Ssam/* If sys/types.h does not supply intXX_t, supply them ourselves */
196104478Ssam/* (or die trying) */
197104478Ssam
198104478Ssam#ifndef HAVE_U_INT
199109595Ssamtypedef unsigned int u_int;
200109595Ssam#endif
201104478Ssam
202105215Sphk#ifndef HAVE_INTXX_T
203104478Ssamtypedef signed char int8_t;
204104478Ssam# if (SIZEOF_SHORT_INT == 2)
205114105Ssamtypedef short int int16_t;
206114105Ssam# else
207114105Ssam#  ifdef _UNICOS
208142880Simp#   if (SIZEOF_SHORT_INT == 4)
209104478Ssamtypedef short int16_t;
210104478Ssam#   else
211104478Ssamtypedef long  int16_t;
212142880Simp#   endif
213104478Ssam#  else
214111646Ssam#   error "16 bit int type not found."
215111646Ssam#  endif /* _UNICOS */
216111646Ssam# endif
217104478Ssam# if (SIZEOF_INT == 4)
218104478Ssamtypedef int int32_t;
219110522Ssam# else
220191894Sphilip#  ifdef _UNICOS
221191894Sphiliptypedef long  int32_t;
222110522Ssam#  else
223142880Simp#   error "32 bit int type not found."
224104478Ssam#  endif /* _UNICOS */
225104478Ssam# endif
226104478Ssam#endif
227104478Ssam
228104478Ssam/* If sys/types.h does not supply u_intXX_t, supply them ourselves */
229104478Ssam#ifndef HAVE_U_INTXX_T
230104478Ssam# ifdef HAVE_UINTXX_T
231104478Ssamtypedef uint8_t u_int8_t;
232104478Ssamtypedef uint16_t u_int16_t;
233104478Ssamtypedef uint32_t u_int32_t;
234111646Ssam# define HAVE_U_INTXX_T 1
235111646Ssam# else
236104478Ssamtypedef unsigned char u_int8_t;
237104478Ssam#  if (SIZEOF_SHORT_INT == 2)
238104478Ssamtypedef unsigned short int u_int16_t;
239104478Ssam#  else
240110522Ssam#   ifdef _UNICOS
241191894Sphilip#    if (SIZEOF_SHORT_INT == 4)
242104478Ssamtypedef unsigned short u_int16_t;
243104478Ssam#    else
244104478Ssamtypedef unsigned long  u_int16_t;
245104478Ssam#    endif
246104478Ssam#   else
247104478Ssam#    error "16 bit int type not found."
248104478Ssam#   endif
249114105Ssam#  endif
250114105Ssam#  if (SIZEOF_INT == 4)
251114105Ssamtypedef unsigned int u_int32_t;
252114105Ssam#  else
253114105Ssam#   ifdef _UNICOS
254114105Ssamtypedef unsigned long  u_int32_t;
255104478Ssam#   else
256104478Ssam#    error "32 bit int type not found."
257104478Ssam#   endif
258104478Ssam#  endif
259112124Ssam# endif
260112124Ssam#define __BIT_TYPES_DEFINED__
261112124Ssam#endif
262256377Smarkm
263112124Ssam/* 64-bit types */
264112124Ssam#ifndef HAVE_INT64_T
265104478Ssam# if (SIZEOF_LONG_INT == 8)
266104478Ssamtypedef long int int64_t;
267104478Ssam# else
268104478Ssam#  if (SIZEOF_LONG_LONG_INT == 8)
269104478Ssamtypedef long long int int64_t;
270254263Sscottl#  endif
271104478Ssam# endif
272104478Ssam#endif
273104478Ssam#ifndef HAVE_U_INT64_T
274104478Ssam# if (SIZEOF_LONG_INT == 8)
275104478Ssamtypedef unsigned long int u_int64_t;
276104478Ssam# else
277104478Ssam#  if (SIZEOF_LONG_LONG_INT == 8)
278104478Ssamtypedef unsigned long long int u_int64_t;
279104478Ssam#  endif
280104478Ssam# endif
281104478Ssam#endif
282104478Ssam
283104478Ssam#ifndef HAVE_UINTXX_T
284104478Ssamtypedef u_int8_t uint8_t;
285104478Ssamtypedef u_int16_t uint16_t;
286104478Ssamtypedef u_int32_t uint32_t;
287104478Ssamtypedef u_int64_t uint64_t;
288104478Ssam#endif
289104478Ssam
290104478Ssam#ifndef HAVE_INTMAX_T
291111646Ssamtypedef long long intmax_t;
292111646Ssam#endif
293104478Ssam
294104478Ssam#ifndef HAVE_UINTMAX_T
295104478Ssamtypedef unsigned long long uintmax_t;
296104478Ssam#endif
297104478Ssam
298104478Ssam#ifndef HAVE_U_CHAR
299104478Ssamtypedef unsigned char u_char;
300114105Ssam# define HAVE_U_CHAR
301114105Ssam#endif /* HAVE_U_CHAR */
302114105Ssam
303191894Sphilip#ifndef ULLONG_MAX
304191894Sphilip# define ULLONG_MAX ((unsigned long long)-1)
305114105Ssam#endif
306114105Ssam
307114105Ssam#ifndef SIZE_T_MAX
308104478Ssam#define SIZE_T_MAX ULONG_MAX
309104478Ssam#endif /* SIZE_T_MAX */
310104478Ssam
311104478Ssam#ifndef HAVE_SIZE_T
312104478Ssamtypedef unsigned int size_t;
313104478Ssam# define HAVE_SIZE_T
314162969Sjhb# define SIZE_T_MAX UINT_MAX
315254263Sscottl#endif /* HAVE_SIZE_T */
316104478Ssam
317162969Sjhb#ifndef SIZE_MAX
318104478Ssam#define SIZE_MAX SIZE_T_MAX
319104478Ssam#endif
320104478Ssam
321127135Snjl#ifndef HAVE_SSIZE_T
322127135Snjltypedef int ssize_t;
323104478Ssam# define HAVE_SSIZE_T
324104478Ssam#endif /* HAVE_SSIZE_T */
325104478Ssam
326104478Ssam#ifndef HAVE_CLOCK_T
327104478Ssamtypedef long clock_t;
328104478Ssam# define HAVE_CLOCK_T
329104478Ssam#endif /* HAVE_CLOCK_T */
330104478Ssam
331104478Ssam#ifndef HAVE_SA_FAMILY_T
332104478Ssamtypedef int sa_family_t;
333104478Ssam# define HAVE_SA_FAMILY_T
334127135Snjl#endif /* HAVE_SA_FAMILY_T */
335127135Snjl
336104478Ssam#ifndef HAVE_PID_T
337104478Ssamtypedef int pid_t;
338108823Ssam# define HAVE_PID_T
339104478Ssam#endif /* HAVE_PID_T */
340104478Ssam
341104478Ssam#ifndef HAVE_SIG_ATOMIC_T
342104478Ssamtypedef int sig_atomic_t;
343104478Ssam# define HAVE_SIG_ATOMIC_T
344115747Ssam#endif /* HAVE_SIG_ATOMIC_T */
345166901Spiso
346104478Ssam#ifndef HAVE_MODE_T
347108823Ssamtypedef int mode_t;
348104478Ssam# define HAVE_MODE_T
349104478Ssam#endif /* HAVE_MODE_T */
350167755Ssam
351104478Ssam#if !defined(HAVE_SS_FAMILY_IN_SS) && defined(HAVE___SS_FAMILY_IN_SS)
352104478Ssam# define ss_family __ss_family
353108823Ssam#endif /* !defined(HAVE_SS_FAMILY_IN_SS) && defined(HAVE_SA_FAMILY_IN_SS) */
354104478Ssam
355104478Ssam#ifndef HAVE_SYS_UN_H
356104478Ssamstruct	sockaddr_un {
357104478Ssam	short	sun_family;		/* AF_UNIX */
358104478Ssam	char	sun_path[108];		/* path name (gag) */
359232874Sscottl};
360104478Ssam#endif /* HAVE_SYS_UN_H */
361104478Ssam
362104478Ssam#ifndef HAVE_IN_ADDR_T
363104478Ssamtypedef u_int32_t	in_addr_t;
364108823Ssam#endif
365104478Ssam#ifndef HAVE_IN_PORT_T
366108823Ssamtypedef u_int16_t	in_port_t;
367104478Ssam#endif
368117126Sscottl
369104478Ssam#if defined(BROKEN_SYS_TERMIO_H) && !defined(_STRUCT_WINSIZE)
370104478Ssam#define _STRUCT_WINSIZE
371108823Ssamstruct winsize {
372104478Ssam      unsigned short ws_row;          /* rows, in characters */
373104478Ssam      unsigned short ws_col;          /* columns, in character */
374104478Ssam      unsigned short ws_xpixel;       /* horizontal size, pixels */
375104478Ssam      unsigned short ws_ypixel;       /* vertical size, pixels */
376104478Ssam};
377104478Ssam#endif
378104478Ssam
379104478Ssam/* bits needed for select that may not be in the system headers */
380104478Ssam#ifndef HAVE_FD_MASK
381104478Ssam typedef unsigned long int	fd_mask;
382104478Ssam#endif
383104478Ssam
384104478Ssam#if defined(HAVE_DECL_NFDBITS) && HAVE_DECL_NFDBITS == 0
385104478Ssam# define	NFDBITS (8 * sizeof(unsigned long))
386104478Ssam#endif
387104478Ssam
388104478Ssam#if defined(HAVE_DECL_HOWMANY) && HAVE_DECL_HOWMANY == 0
389104478Ssam# define howmany(x,y)	(((x)+((y)-1))/(y))
390104478Ssam#endif
391104478Ssam
392104478Ssam/* Paths */
393104478Ssam
394104478Ssam#ifndef _PATH_BSHELL
395104478Ssam# define _PATH_BSHELL "/bin/sh"
396104478Ssam#endif
397104478Ssam
398115747Ssam#ifdef USER_PATH
399115747Ssam# ifdef _PATH_STDPATH
400115747Ssam#  undef _PATH_STDPATH
401115747Ssam# endif
402104478Ssam# define _PATH_STDPATH USER_PATH
403104478Ssam#endif
404104478Ssam
405167755Ssam#ifndef _PATH_STDPATH
406167755Ssam# define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin"
407167755Ssam#endif
408167755Ssam
409104478Ssam#ifndef SUPERUSER_PATH
410104478Ssam# define SUPERUSER_PATH	_PATH_STDPATH
411104478Ssam#endif
412104478Ssam
413104478Ssam#ifndef _PATH_DEVNULL
414104478Ssam# define _PATH_DEVNULL "/dev/null"
415104478Ssam#endif
416104478Ssam
417104478Ssam/* user may have set a different path */
418104478Ssam#if defined(_PATH_MAILDIR) && defined(MAIL_DIRECTORY)
419104478Ssam# undef _PATH_MAILDIR
420104478Ssam#endif /* defined(_PATH_MAILDIR) && defined(MAIL_DIRECTORY) */
421104478Ssam
422104478Ssam#ifdef MAIL_DIRECTORY
423104478Ssam# define _PATH_MAILDIR MAIL_DIRECTORY
424104478Ssam#endif
425104478Ssam
426104478Ssam#ifndef _PATH_NOLOGIN
427104478Ssam# define _PATH_NOLOGIN "/etc/nologin"
428112124Ssam#endif
429112124Ssam
430112124Ssam/* Define this to be the path of the xauth program. */
431112124Ssam#ifdef XAUTH_PATH
432112124Ssam#define _PATH_XAUTH XAUTH_PATH
433112124Ssam#endif /* XAUTH_PATH */
434112124Ssam
435112124Ssam/* derived from XF4/xc/lib/dps/Xlibnet.h */
436112124Ssam#ifndef X_UNIX_PATH
437104478Ssam#  ifdef __hpux
438104478Ssam#    define X_UNIX_PATH "/var/spool/sockets/X11/%u"
439104478Ssam#  else
440104478Ssam#    define X_UNIX_PATH "/tmp/.X11-unix/X%u"
441104478Ssam#  endif
442104478Ssam#endif /* X_UNIX_PATH */
443104478Ssam#define _PATH_UNIX_X X_UNIX_PATH
444104478Ssam
445104478Ssam#ifndef _PATH_TTY
446104478Ssam# define _PATH_TTY "/dev/tty"
447104478Ssam#endif
448104478Ssam
449104478Ssam/* Macros */
450104478Ssam
451104478Ssam#if defined(HAVE_LOGIN_GETCAPBOOL) && defined(HAVE_LOGIN_CAP_H)
452104478Ssam# define HAVE_LOGIN_CAP
453104478Ssam#endif
454104478Ssam
455104478Ssam#ifndef MAX
456104478Ssam# define MAX(a,b) (((a)>(b))?(a):(b))
457104478Ssam# define MIN(a,b) (((a)<(b))?(a):(b))
458104478Ssam#endif
459283291Sjkim
460104478Ssam#ifndef roundup
461104478Ssam# define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
462104478Ssam#endif
463104478Ssam
464104478Ssam#ifndef timersub
465115747Ssam#define timersub(a, b, result)					\
466115747Ssam   do {								\
467104478Ssam      (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;		\
468104478Ssam      (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;		\
469104478Ssam      if ((result)->tv_usec < 0) {				\
470104478Ssam	 --(result)->tv_sec;					\
471167755Ssam	 (result)->tv_usec += 1000000;				\
472104630Ssam      }								\
473167755Ssam   } while (0)
474104630Ssam#endif
475104478Ssam
476104478Ssam#ifndef TIMEVAL_TO_TIMESPEC
477108823Ssam#define	TIMEVAL_TO_TIMESPEC(tv, ts) {					\
478108823Ssam	(ts)->tv_sec = (tv)->tv_sec;					\
479108823Ssam	(ts)->tv_nsec = (tv)->tv_usec * 1000;				\
480108823Ssam}
481108823Ssam#endif
482108823Ssam
483108823Ssam#ifndef TIMESPEC_TO_TIMEVAL
484108823Ssam#define	TIMESPEC_TO_TIMEVAL(tv, ts) {					\
485104478Ssam	(tv)->tv_sec = (ts)->tv_sec;					\
486104478Ssam	(tv)->tv_usec = (ts)->tv_nsec / 1000;				\
487104478Ssam}
488104478Ssam#endif
489104478Ssam
490104478Ssam#ifndef __P
491104478Ssam# define __P(x) x
492104478Ssam#endif
493104478Ssam
494104478Ssam#if !defined(IN6_IS_ADDR_V4MAPPED)
495104478Ssam# define IN6_IS_ADDR_V4MAPPED(a) \
496104478Ssam	((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \
497108823Ssam	 (((u_int32_t *) (a))[2] == htonl (0xffff)))
498108823Ssam#endif /* !defined(IN6_IS_ADDR_V4MAPPED) */
499115747Ssam
500115747Ssam#if !defined(__GNUC__) || (__GNUC__ < 2)
501115747Ssam# define __attribute__(x)
502104478Ssam#endif /* !defined(__GNUC__) || (__GNUC__ < 2) */
503104478Ssam
504104478Ssam#if !defined(HAVE_ATTRIBUTE__SENTINEL__) && !defined(__sentinel__)
505104478Ssam# define __sentinel__
506104478Ssam#endif
507112124Ssam
508112124Ssam#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__bounded__)
509112124Ssam# define __bounded__(x, y, z)
510112124Ssam#endif
511112124Ssam
512108823Ssam#if !defined(HAVE_ATTRIBUTE__NONNULL__) && !defined(__nonnull__)
513108823Ssam# define __nonnull__(x)
514108823Ssam#endif
515108823Ssam
516163648Sru#ifndef OSSH_ALIGNBYTES
517108823Ssam#define OSSH_ALIGNBYTES	(sizeof(int) - 1)
518108823Ssam#endif
519108823Ssam#ifndef __CMSG_ALIGN
520115747Ssam#define	__CMSG_ALIGN(p) (((u_int)(p) + OSSH_ALIGNBYTES) &~ OSSH_ALIGNBYTES)
521159224Spjd#endif
522108823Ssam
523108823Ssam/* Length of the contents of a control message of length len */
524108823Ssam#ifndef CMSG_LEN
525108823Ssam#define	CMSG_LEN(len)	(__CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
526108823Ssam#endif
527108823Ssam
528108823Ssam/* Length of the space taken up by a padded control message of length len */
529115747Ssam#ifndef CMSG_SPACE
530108823Ssam#define	CMSG_SPACE(len)	(__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(len))
531104478Ssam#endif
532104478Ssam
533104478Ssam/* given pointer to struct cmsghdr, return pointer to data */
534104478Ssam#ifndef CMSG_DATA
535104478Ssam#define CMSG_DATA(cmsg) ((u_char *)(cmsg) + __CMSG_ALIGN(sizeof(struct cmsghdr)))
536104478Ssam#endif /* CMSG_DATA */
537104478Ssam
538104478Ssam/*
539104478Ssam * RFC 2292 requires to check msg_controllen, in case that the kernel returns
540104478Ssam * an empty list for some reasons.
541104478Ssam */
542104478Ssam#ifndef CMSG_FIRSTHDR
543104478Ssam#define CMSG_FIRSTHDR(mhdr) \
544104478Ssam	((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
545194023Savg	 (struct cmsghdr *)(mhdr)->msg_control : \
546104478Ssam	 (struct cmsghdr *)NULL)
547104478Ssam#endif /* CMSG_FIRSTHDR */
548104478Ssam
549104478Ssam#if defined(HAVE_DECL_OFFSETOF) && HAVE_DECL_OFFSETOF == 0
550104478Ssam# define offsetof(type, member) ((size_t) &((type *)0)->member)
551194023Savg#endif
552104478Ssam
553104478Ssam/* Set up BSD-style BYTE_ORDER definition if it isn't there already */
554104478Ssam/* XXX: doesn't try to cope with strange byte orders (PDP_ENDIAN) */
555104478Ssam#ifndef BYTE_ORDER
556104478Ssam# ifndef LITTLE_ENDIAN
557104478Ssam#  define LITTLE_ENDIAN  1234
558104478Ssam# endif /* LITTLE_ENDIAN */
559104478Ssam# ifndef BIG_ENDIAN
560104478Ssam#  define BIG_ENDIAN     4321
561104478Ssam# endif /* BIG_ENDIAN */
562104478Ssam# ifdef WORDS_BIGENDIAN
563104478Ssam#  define BYTE_ORDER BIG_ENDIAN
564104478Ssam# else /* WORDS_BIGENDIAN */
565104478Ssam#  define BYTE_ORDER LITTLE_ENDIAN
566104478Ssam# endif /* WORDS_BIGENDIAN */
567104478Ssam#endif /* BYTE_ORDER */
568104478Ssam
569104478Ssam/* Function replacement / compatibility hacks */
570104478Ssam
571104478Ssam#if !defined(HAVE_GETADDRINFO) && (defined(HAVE_OGETADDRINFO) || defined(HAVE_NGETADDRINFO))
572104478Ssam# define HAVE_GETADDRINFO
573104478Ssam#endif
574104478Ssam
575104478Ssam#ifndef HAVE_GETOPT_OPTRESET
576104478Ssam# undef getopt
577104478Ssam# undef opterr
578104478Ssam# undef optind
579104478Ssam# undef optopt
580104478Ssam# undef optreset
581104478Ssam# undef optarg
582104478Ssam# define getopt(ac, av, o)  BSDgetopt(ac, av, o)
583104478Ssam# define opterr             BSDopterr
584104478Ssam# define optind             BSDoptind
585104478Ssam# define optopt             BSDoptopt
586104478Ssam# define optreset           BSDoptreset
587104478Ssam# define optarg             BSDoptarg
588104478Ssam#endif
589104478Ssam
590104478Ssam#if defined(BROKEN_GETADDRINFO) && defined(HAVE_GETADDRINFO)
591104478Ssam# undef HAVE_GETADDRINFO
592104478Ssam#endif
593104478Ssam#if defined(BROKEN_GETADDRINFO) && defined(HAVE_FREEADDRINFO)
594104478Ssam# undef HAVE_FREEADDRINFO
595104478Ssam#endif
596115747Ssam#if defined(BROKEN_GETADDRINFO) && defined(HAVE_GAI_STRERROR)
597104478Ssam# undef HAVE_GAI_STRERROR
598104478Ssam#endif
599104478Ssam
600104478Ssam#if defined(HAVE_GETADDRINFO)
601104478Ssam# if defined(HAVE_DECL_AI_NUMERICSERV) && HAVE_DECL_AI_NUMERICSERV == 0
602104478Ssam#   define AI_NUMERICSERV	0
603104478Ssam# endif
604104478Ssam#endif
605115747Ssam
606104478Ssam#if defined(BROKEN_UPDWTMPX) && defined(HAVE_UPDWTMPX)
607104478Ssam# undef HAVE_UPDWTMPX
608104478Ssam#endif
609104478Ssam
610104478Ssam#if defined(BROKEN_SHADOW_EXPIRE) && defined(HAS_SHADOW_EXPIRE)
611104478Ssam# undef HAS_SHADOW_EXPIRE
612104478Ssam#endif
613163648Sru
614104478Ssam#if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT) && \
615104478Ssam    defined(SYSLOG_R_SAFE_IN_SIGHAND)
616108471Ssam# define DO_LOG_SAFE_IN_SIGHAND
617104478Ssam#endif
618104478Ssam
619104478Ssam#if !defined(HAVE_MEMMOVE) && defined(HAVE_BCOPY)
620104478Ssam# define memmove(s1, s2, n) bcopy((s2), (s1), (n))
621104478Ssam#endif /* !defined(HAVE_MEMMOVE) && defined(HAVE_BCOPY) */
622104478Ssam
623104478Ssam#ifndef GETPGRP_VOID
624104478Ssam# include <unistd.h>
625104478Ssam# define getpgrp() getpgrp(0)
626104478Ssam#endif
627104478Ssam
628104478Ssam#ifdef USE_BSM_AUDIT
629104478Ssam# define SSH_AUDIT_EVENTS
630104478Ssam# define CUSTOM_SSH_AUDIT_EVENTS
631104478Ssam#endif
632104478Ssam
633104478Ssam#ifdef USE_LINUX_AUDIT
634104478Ssam# define SSH_AUDIT_EVENTS
635104478Ssam# define CUSTOM_SSH_AUDIT_EVENTS
636104478Ssam#endif
637115747Ssam
638104478Ssam#if !defined(HAVE___func__) && defined(HAVE___FUNCTION__)
639104478Ssam#  define __func__ __FUNCTION__
640104478Ssam#elif !defined(HAVE___func__)
641104478Ssam#  define __func__ ""
642104478Ssam#endif
643104478Ssam
644104478Ssam#if defined(KRB5) && !defined(HEIMDAL)
645104478Ssam#  define krb5_get_err_text(context,code) error_message(code)
646104478Ssam#endif
647104478Ssam
648115747Ssam#if defined(SKEYCHALLENGE_4ARG)
649104478Ssam# define _compat_skeychallenge(a,b,c,d) skeychallenge(a,b,c,d)
650104478Ssam#else
651104478Ssam# define _compat_skeychallenge(a,b,c,d) skeychallenge(a,b,c)
652108823Ssam#endif
653104478Ssam
654104478Ssam/* Maximum number of file descriptors available */
655104478Ssam#ifdef HAVE_SYSCONF
656104478Ssam# define SSH_SYSFDMAX sysconf(_SC_OPEN_MAX)
657108823Ssam#else
658104478Ssam# define SSH_SYSFDMAX 10000
659104478Ssam#endif
660104478Ssam
661163648Sru#ifdef FSID_HAS_VAL
662104478Ssam/* encode f_fsid into a 64 bit value  */
663104478Ssam#define FSID_TO_ULONG(f) \
664104478Ssam	((((u_int64_t)(f).val[0] & 0xffffffffUL) << 32) | \
665104478Ssam	    ((f).val[1] & 0xffffffffUL))
666104478Ssam#elif defined(FSID_HAS___VAL)
667104478Ssam#define FSID_TO_ULONG(f) \
668104478Ssam	((((u_int64_t)(f).__val[0] & 0xffffffffUL) << 32) | \
669104478Ssam	    ((f).__val[1] & 0xffffffffUL))
670115747Ssam#else
671104478Ssam# define FSID_TO_ULONG(f) ((f))
672104478Ssam#endif
673104478Ssam
674104478Ssam#if defined(__Lynx__)
675104478Ssam /*
676104478Ssam  * LynxOS defines these in param.h which we do not want to include since
677104478Ssam  * it will also pull in a bunch of kernel definitions.
678104478Ssam  */
679104478Ssam# define ALIGNBYTES (sizeof(int) - 1)
680104478Ssam# define ALIGN(p) (((unsigned)p + ALIGNBYTES) & ~ALIGNBYTES)
681104478Ssam  /* Missing prototypes on LynxOS */
682104478Ssam  int snprintf (char *, size_t, const char *, ...);
683104478Ssam  int mkstemp (char *);
684104478Ssam  char *crypt (const char *, const char *);
685104478Ssam  int seteuid (uid_t);
686104478Ssam  int setegid (gid_t);
687115747Ssam  char *mkdtemp (char *);
688104478Ssam  int rresvport_af (int *, sa_family_t);
689104478Ssam  int innetgr (const char *, const char *, const char *, const char *);
690115747Ssam#endif
691104478Ssam
692104478Ssam/*
693104478Ssam * Define this to use pipes instead of socketpairs for communicating with the
694158828Spjd * client program.  Socketpairs do not seem to work on all systems.
695158828Spjd *
696158828Spjd * configure.ac sets this for a few OS's which are known to have problems
697158828Spjd * but you may need to set it yourself
698104478Ssam */
699104478Ssam/* #define USE_PIPES 1 */
700104478Ssam
701104478Ssam/**
702104478Ssam ** login recorder definitions
703104478Ssam **/
704158828Spjd
705104478Ssam/* FIXME: put default paths back in */
706104478Ssam#ifndef UTMP_FILE
707104478Ssam#  ifdef _PATH_UTMP
708104478Ssam#    define UTMP_FILE _PATH_UTMP
709104478Ssam#  else
710104478Ssam#    ifdef CONF_UTMP_FILE
711104478Ssam#      define UTMP_FILE CONF_UTMP_FILE
712111416Ssam#    endif
713104478Ssam#  endif
714104478Ssam#endif
715104478Ssam#ifndef WTMP_FILE
716104478Ssam#  ifdef _PATH_WTMP
717104478Ssam#    define WTMP_FILE _PATH_WTMP
718104478Ssam#  else
719104478Ssam#    ifdef CONF_WTMP_FILE
720108471Ssam#      define WTMP_FILE CONF_WTMP_FILE
721108471Ssam#    endif
722108471Ssam#  endif
723111416Ssam#endif
724111416Ssam/* pick up the user's location for lastlog if given */
725108471Ssam#ifndef LASTLOG_FILE
726108471Ssam#  ifdef _PATH_LASTLOG
727108471Ssam#    define LASTLOG_FILE _PATH_LASTLOG
728108471Ssam#  else
729108471Ssam#    ifdef CONF_LASTLOG_FILE
730111416Ssam#      define LASTLOG_FILE CONF_LASTLOG_FILE
731111416Ssam#    endif
732111416Ssam#  endif
733111416Ssam#endif
734111416Ssam
735111416Ssam#if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
736111416Ssam# define USE_SHADOW
737111416Ssam#endif
738111416Ssam
739111416Ssam/* The login() library function in libutil is first choice */
740111416Ssam#if defined(HAVE_LOGIN) && !defined(DISABLE_LOGIN)
741111416Ssam#  define USE_LOGIN
742111416Ssam
743111416Ssam#else
744104478Ssam/* Simply select your favourite login types. */
745108471Ssam/* Can't do if-else because some systems use several... <sigh> */
746104478Ssam#  if !defined(DISABLE_UTMPX)
747104478Ssam#    define USE_UTMPX
748108471Ssam#  endif
749108471Ssam#  if defined(UTMP_FILE) && !defined(DISABLE_UTMP)
750111416Ssam#    define USE_UTMP
751104478Ssam#  endif
752111416Ssam#  if defined(WTMPX_FILE) && !defined(DISABLE_WTMPX)
753111416Ssam#    define USE_WTMPX
754111416Ssam#  endif
755111416Ssam#  if defined(WTMP_FILE) && !defined(DISABLE_WTMP)
756111416Ssam#    define USE_WTMP
757111416Ssam#  endif
758104478Ssam
759111416Ssam#endif
760104478Ssam
761104478Ssam#ifndef UT_LINESIZE
762104478Ssam# define UT_LINESIZE 8
763104478Ssam#endif
764104478Ssam
765104478Ssam/* I hope that the presence of LASTLOG_FILE is enough to detect this */
766163648Sru#if defined(LASTLOG_FILE) && !defined(DISABLE_LASTLOG)
767104478Ssam#  define USE_LASTLOG
768104478Ssam#endif
769104478Ssam
770104478Ssam#ifdef HAVE_OSF_SIA
771104478Ssam# ifdef USE_SHADOW
772104478Ssam#  undef USE_SHADOW
773104478Ssam# endif
774104478Ssam# define CUSTOM_SYS_AUTH_PASSWD 1
775104478Ssam#endif
776104478Ssam
777104478Ssam#if defined(HAVE_LIBIAF) && defined(HAVE_SET_ID) && !defined(HAVE_SECUREWARE)
778104478Ssam# define CUSTOM_SYS_AUTH_PASSWD 1
779104478Ssam#endif
780104478Ssam#if defined(HAVE_LIBIAF) && defined(HAVE_SET_ID) && !defined(BROKEN_LIBIAF)
781104478Ssam# define USE_LIBIAF
782163648Sru#endif
783104478Ssam
784104478Ssam/* HP-UX 11.11 */
785104478Ssam#ifdef BTMP_FILE
786104478Ssam# define _PATH_BTMP BTMP_FILE
787104478Ssam#endif
788104478Ssam
789104478Ssam#if defined(USE_BTMP) && defined(_PATH_BTMP)
790104478Ssam# define CUSTOM_FAILED_LOGIN
791104478Ssam#endif
792108471Ssam
793108471Ssam/** end of login recorder definitions */
794108471Ssam
795108823Ssam#ifdef BROKEN_GETGROUPS
796104478Ssam# define getgroups(a,b) ((a)==0 && (b)==NULL ? NGROUPS_MAX : getgroups((a),(b)))
797104478Ssam#endif
798104478Ssam
799111416Ssam#if defined(HAVE_MMAP) && defined(BROKEN_MMAP)
800104478Ssam# undef HAVE_MMAP
801111416Ssam#endif
802104478Ssam
803111416Ssam#ifndef IOV_MAX
804111416Ssam# if defined(_XOPEN_IOV_MAX)
805111416Ssam#  define	IOV_MAX		_XOPEN_IOV_MAX
806111416Ssam# elif defined(DEF_IOV_MAX)
807111416Ssam#  define	IOV_MAX		DEF_IOV_MAX
808104478Ssam# else
809111416Ssam#  define	IOV_MAX		16
810111416Ssam# endif
811104478Ssam#endif
812111416Ssam
813111416Ssam#ifndef EWOULDBLOCK
814111416Ssam# define EWOULDBLOCK EAGAIN
815111416Ssam#endif
816104478Ssam
817163648Sru#ifndef INET6_ADDRSTRLEN	/* for non IPv6 machines */
818111416Ssam#define INET6_ADDRSTRLEN 46
819111416Ssam#endif
820111416Ssam
821108471Ssam#ifndef SSH_IOBUFSZ
822108471Ssam# define SSH_IOBUFSZ 8192
823111416Ssam#endif
824104478Ssam
825104478Ssam/*
826159225Spjd * Platforms that have arc4random_uniform() and not arc4random_stir()
827159225Spjd * shouldn't need the latter.
828159225Spjd */
829159225Spjd#if defined(HAVE_ARC4RANDOM) && defined(HAVE_ARC4RANDOM_UNIFORM) && \
830159225Spjd    !defined(HAVE_ARC4RANDOM_STIR)
831159225Spjd# define arc4random_stir()
832159225Spjd#endif
833159225Spjd
834159225Spjd#ifndef HAVE_VA_COPY
835159225Spjd# ifdef HAVE___VA_COPY
836159225Spjd#  define va_copy(dest, src) __va_copy(dest, src)
837159225Spjd# else
838159225Spjd#  define va_copy(dest, src) (dest) = (src)
839159225Spjd# endif
840159225Spjd#endif
841159225Spjd
842159225Spjd#ifndef __predict_true
843159225Spjd# if defined(__GNUC__) && \
844159225Spjd     ((__GNUC__ > (2)) || (__GNUC__ == (2) && __GNUC_MINOR__ >= (96)))
845159225Spjd#  define __predict_true(exp)     __builtin_expect(((exp) != 0), 1)
846159225Spjd#  define __predict_false(exp)    __builtin_expect(((exp) != 0), 0)
847159225Spjd# else
848159225Spjd#  define __predict_true(exp)     ((exp) != 0)
849159225Spjd#  define __predict_false(exp)    ((exp) != 0)
850159225Spjd# endif /* gcc version */
851159225Spjd#endif /* __predict_true */
852159225Spjd
853159225Spjd#endif /* _DEFINES_H */
854159225Spjd