1124208Sdes/*
2124208Sdes * Copyright (c) 1999-2003 Damien Miller.  All rights reserved.
3124208Sdes *
4124208Sdes * Redistribution and use in source and binary forms, with or without
5124208Sdes * modification, are permitted provided that the following conditions
6124208Sdes * are met:
7124208Sdes * 1. Redistributions of source code must retain the above copyright
8124208Sdes *    notice, this list of conditions and the following disclaimer.
9124208Sdes * 2. Redistributions in binary form must reproduce the above copyright
10124208Sdes *    notice, this list of conditions and the following disclaimer in the
11124208Sdes *    documentation and/or other materials provided with the distribution.
12124208Sdes *
13124208Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14124208Sdes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15124208Sdes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16124208Sdes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17124208Sdes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18124208Sdes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19124208Sdes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20124208Sdes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21124208Sdes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22124208Sdes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23124208Sdes */
24124208Sdes
2598937Sdes#ifndef _DEFINES_H
2698937Sdes#define _DEFINES_H
2798937Sdes
28295367Sdes/* $Id: defines.h,v 1.183 2014/09/02 19:33:26 djm Exp $ */
2998937Sdes
3098937Sdes
3198937Sdes/* Constants */
3298937Sdes
33162852Sdes#if defined(HAVE_DECL_SHUT_RD) && HAVE_DECL_SHUT_RD == 0
3498937Sdesenum
3598937Sdes{
3698937Sdes  SHUT_RD = 0,		/* No more receptions.  */
3798937Sdes  SHUT_WR,			/* No more transmissions.  */
3898937Sdes  SHUT_RDWR			/* No more receptions or transmissions.  */
3998937Sdes};
4098937Sdes# define SHUT_RD   SHUT_RD
4198937Sdes# define SHUT_WR   SHUT_WR
4298937Sdes# define SHUT_RDWR SHUT_RDWR
4398937Sdes#endif
4498937Sdes
45221420Sdes/*
46323124Sdes * Cygwin doesn't really have a notion of reserved ports.  It is still
47323124Sdes * is useful on the client side so for compatibility it defines as 1024 via
48323124Sdes * netinet/in.h inside an enum.  We * don't actually want that restriction
49323124Sdes * so we want to set that to zero, but we can't do it direct in config.h
50323124Sdes * because it'll cause a conflicting definition the first time we include
51323124Sdes * netinet/in.h.
52323124Sdes */
53323124Sdes
54323124Sdes#ifdef HAVE_CYGWIN
55323124Sdes#define IPPORT_RESERVED 0
56323124Sdes#endif
57323124Sdes
58323124Sdes/*
59221420Sdes * Definitions for IP type of service (ip_tos)
60221420Sdes */
61221487Sdes#include <netinet/in_systm.h>
62221420Sdes#include <netinet/ip.h>
6398937Sdes#ifndef IPTOS_LOWDELAY
6498937Sdes# define IPTOS_LOWDELAY          0x10
6598937Sdes# define IPTOS_THROUGHPUT        0x08
6698937Sdes# define IPTOS_RELIABILITY       0x04
6798937Sdes# define IPTOS_LOWCOST           0x02
6898937Sdes# define IPTOS_MINCOST           IPTOS_LOWCOST
6998937Sdes#endif /* IPTOS_LOWDELAY */
7098937Sdes
71221420Sdes/*
72221420Sdes * Definitions for DiffServ Codepoints as per RFC2474
73221420Sdes */
74221420Sdes#ifndef IPTOS_DSCP_AF11
75221420Sdes# define	IPTOS_DSCP_AF11		0x28
76221420Sdes# define	IPTOS_DSCP_AF12		0x30
77221420Sdes# define	IPTOS_DSCP_AF13		0x38
78221420Sdes# define	IPTOS_DSCP_AF21		0x48
79221420Sdes# define	IPTOS_DSCP_AF22		0x50
80221420Sdes# define	IPTOS_DSCP_AF23		0x58
81221420Sdes# define	IPTOS_DSCP_AF31		0x68
82221420Sdes# define	IPTOS_DSCP_AF32		0x70
83221420Sdes# define	IPTOS_DSCP_AF33		0x78
84221420Sdes# define	IPTOS_DSCP_AF41		0x88
85221420Sdes# define	IPTOS_DSCP_AF42		0x90
86221420Sdes# define	IPTOS_DSCP_AF43		0x98
87221420Sdes# define	IPTOS_DSCP_EF		0xb8
88221420Sdes#endif /* IPTOS_DSCP_AF11 */
89221420Sdes#ifndef IPTOS_DSCP_CS0
90221420Sdes# define	IPTOS_DSCP_CS0		0x00
91221420Sdes# define	IPTOS_DSCP_CS1		0x20
92221420Sdes# define	IPTOS_DSCP_CS2		0x40
93221420Sdes# define	IPTOS_DSCP_CS3		0x60
94221420Sdes# define	IPTOS_DSCP_CS4		0x80
95221420Sdes# define	IPTOS_DSCP_CS5		0xa0
96221420Sdes# define	IPTOS_DSCP_CS6		0xc0
97221420Sdes# define	IPTOS_DSCP_CS7		0xe0
98221420Sdes#endif /* IPTOS_DSCP_CS0 */
99221420Sdes#ifndef IPTOS_DSCP_EF
100221420Sdes# define	IPTOS_DSCP_EF		0xb8
101221420Sdes#endif /* IPTOS_DSCP_EF */
102221420Sdes
103240075Sdes#ifndef PATH_MAX
104240075Sdes# ifdef _POSIX_PATH_MAX
105240075Sdes# define PATH_MAX _POSIX_PATH_MAX
106240075Sdes# endif
107240075Sdes#endif
108240075Sdes
10998937Sdes#ifndef MAXPATHLEN
11098937Sdes# ifdef PATH_MAX
11198937Sdes#  define MAXPATHLEN PATH_MAX
11298937Sdes# else /* PATH_MAX */
113149749Sdes#  define MAXPATHLEN 64
114149749Sdes/* realpath uses a fixed buffer of size MAXPATHLEN, so force use of ours */
115149749Sdes#  ifndef BROKEN_REALPATH
116149749Sdes#   define BROKEN_REALPATH 1
117149749Sdes#  endif /* BROKEN_REALPATH */
11898937Sdes# endif /* PATH_MAX */
11998937Sdes#endif /* MAXPATHLEN */
12098937Sdes
121295367Sdes#ifndef HOST_NAME_MAX
122295367Sdes# include "netdb.h" /* for MAXHOSTNAMELEN */
123295367Sdes# if defined(_POSIX_HOST_NAME_MAX)
124295367Sdes#  define HOST_NAME_MAX _POSIX_HOST_NAME_MAX
125295367Sdes# elif defined(MAXHOSTNAMELEN)
126295367Sdes#  define HOST_NAME_MAX MAXHOSTNAMELEN
127295367Sdes# else
128295367Sdes#  define HOST_NAME_MAX	255
129295367Sdes# endif
130295367Sdes#endif /* HOST_NAME_MAX */
131295367Sdes
132181111Sdes#if defined(HAVE_DECL_MAXSYMLINKS) && HAVE_DECL_MAXSYMLINKS == 0
133149749Sdes# define MAXSYMLINKS 5
134149749Sdes#endif
135149749Sdes
13698937Sdes#ifndef STDIN_FILENO
13798937Sdes# define STDIN_FILENO    0
13898937Sdes#endif
13998937Sdes#ifndef STDOUT_FILENO
14098937Sdes# define STDOUT_FILENO   1
14198937Sdes#endif
14298937Sdes#ifndef STDERR_FILENO
14398937Sdes# define STDERR_FILENO   2
14498937Sdes#endif
14598937Sdes
14698937Sdes#ifndef NGROUPS_MAX	/* Disable groupaccess if NGROUP_MAX is not set */
14798937Sdes#ifdef NGROUPS
14898937Sdes#define NGROUPS_MAX NGROUPS
14998937Sdes#else
15098937Sdes#define NGROUPS_MAX 0
15198937Sdes#endif
15298937Sdes#endif
15398937Sdes
154162852Sdes#if defined(HAVE_DECL_O_NONBLOCK) && HAVE_DECL_O_NONBLOCK == 0
155162852Sdes# define O_NONBLOCK      00004	/* Non Blocking Open */
15698937Sdes#endif
15798937Sdes
158226046Sdes#ifndef S_IFSOCK
159226046Sdes# define S_IFSOCK 0
160226046Sdes#endif /* S_IFSOCK */
161226046Sdes
16298937Sdes#ifndef S_ISDIR
16398937Sdes# define S_ISDIR(mode)	(((mode) & (_S_IFMT)) == (_S_IFDIR))
16498937Sdes#endif /* S_ISDIR */
16598937Sdes
166126274Sdes#ifndef S_ISREG
16798937Sdes# define S_ISREG(mode)	(((mode) & (_S_IFMT)) == (_S_IFREG))
16898937Sdes#endif /* S_ISREG */
16998937Sdes
17098937Sdes#ifndef S_ISLNK
17198937Sdes# define S_ISLNK(mode)	(((mode) & S_IFMT) == S_IFLNK)
17298937Sdes#endif /* S_ISLNK */
17398937Sdes
17498937Sdes#ifndef S_IXUSR
17598937Sdes# define S_IXUSR			0000100	/* execute/search permission, */
17698937Sdes# define S_IXGRP			0000010	/* execute/search permission, */
17798937Sdes# define S_IXOTH			0000001	/* execute/search permission, */
17898937Sdes# define _S_IWUSR			0000200	/* write permission, */
17998937Sdes# define S_IWUSR			_S_IWUSR	/* write permission, owner */
18098937Sdes# define S_IWGRP			0000020	/* write permission, group */
18198937Sdes# define S_IWOTH			0000002	/* write permission, other */
18298937Sdes# define S_IRUSR			0000400	/* read permission, owner */
18398937Sdes# define S_IRGRP			0000040	/* read permission, group */
18498937Sdes# define S_IROTH			0000004	/* read permission, other */
18598937Sdes# define S_IRWXU			0000700	/* read, write, execute */
18698937Sdes# define S_IRWXG			0000070	/* read, write, execute */
18798937Sdes# define S_IRWXO			0000007	/* read, write, execute */
18898937Sdes#endif /* S_IXUSR */
18998937Sdes
19098937Sdes#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)
19198937Sdes#define MAP_ANON MAP_ANONYMOUS
19298937Sdes#endif
19398937Sdes
19498937Sdes#ifndef MAP_FAILED
19598937Sdes# define MAP_FAILED ((void *)-1)
19698937Sdes#endif
19798937Sdes
19898937Sdes/*
19998937SdesSCO Open Server 3 has INADDR_LOOPBACK defined in rpc/rpc.h but
20098937Sdesincluding rpc/rpc.h breaks Solaris 6
20198937Sdes*/
20298937Sdes#ifndef INADDR_LOOPBACK
203106121Sdes#define INADDR_LOOPBACK ((u_long)0x7f000001)
20498937Sdes#endif
20598937Sdes
20698937Sdes/* Types */
20798937Sdes
20898937Sdes/* If sys/types.h does not supply intXX_t, supply them ourselves */
20998937Sdes/* (or die trying) */
21098937Sdes
21198937Sdes#ifndef HAVE_U_INT
21298937Sdestypedef unsigned int u_int;
21398937Sdes#endif
21498937Sdes
21598937Sdes#ifndef HAVE_INTXX_T
216240075Sdestypedef signed char int8_t;
21798937Sdes# if (SIZEOF_SHORT_INT == 2)
21898937Sdestypedef short int int16_t;
21998937Sdes# else
220106121Sdes#  ifdef _UNICOS
22198937Sdes#   if (SIZEOF_SHORT_INT == 4)
22298937Sdestypedef short int16_t;
22398937Sdes#   else
22498937Sdestypedef long  int16_t;
22598937Sdes#   endif
22698937Sdes#  else
22798937Sdes#   error "16 bit int type not found."
228106121Sdes#  endif /* _UNICOS */
22998937Sdes# endif
23098937Sdes# if (SIZEOF_INT == 4)
23198937Sdestypedef int int32_t;
23298937Sdes# else
233106121Sdes#  ifdef _UNICOS
23498937Sdestypedef long  int32_t;
23598937Sdes#  else
23698937Sdes#   error "32 bit int type not found."
237106121Sdes#  endif /* _UNICOS */
23898937Sdes# endif
23998937Sdes#endif
24098937Sdes
24198937Sdes/* If sys/types.h does not supply u_intXX_t, supply them ourselves */
24298937Sdes#ifndef HAVE_U_INTXX_T
24398937Sdes# ifdef HAVE_UINTXX_T
24498937Sdestypedef uint8_t u_int8_t;
24598937Sdestypedef uint16_t u_int16_t;
24698937Sdestypedef uint32_t u_int32_t;
24798937Sdes# define HAVE_U_INTXX_T 1
24898937Sdes# else
24998937Sdestypedef unsigned char u_int8_t;
25098937Sdes#  if (SIZEOF_SHORT_INT == 2)
25198937Sdestypedef unsigned short int u_int16_t;
25298937Sdes#  else
253106121Sdes#   ifdef _UNICOS
25498937Sdes#    if (SIZEOF_SHORT_INT == 4)
25598937Sdestypedef unsigned short u_int16_t;
25698937Sdes#    else
25798937Sdestypedef unsigned long  u_int16_t;
25898937Sdes#    endif
25998937Sdes#   else
26098937Sdes#    error "16 bit int type not found."
26198937Sdes#   endif
26298937Sdes#  endif
26398937Sdes#  if (SIZEOF_INT == 4)
26498937Sdestypedef unsigned int u_int32_t;
26598937Sdes#  else
266106121Sdes#   ifdef _UNICOS
26798937Sdestypedef unsigned long  u_int32_t;
26898937Sdes#   else
26998937Sdes#    error "32 bit int type not found."
27098937Sdes#   endif
27198937Sdes#  endif
27298937Sdes# endif
27398937Sdes#define __BIT_TYPES_DEFINED__
27498937Sdes#endif
27598937Sdes
27698937Sdes/* 64-bit types */
27798937Sdes#ifndef HAVE_INT64_T
27898937Sdes# if (SIZEOF_LONG_INT == 8)
27998937Sdestypedef long int int64_t;
28098937Sdes# else
28198937Sdes#  if (SIZEOF_LONG_LONG_INT == 8)
28298937Sdestypedef long long int int64_t;
28398937Sdes#  endif
28498937Sdes# endif
28598937Sdes#endif
28698937Sdes#ifndef HAVE_U_INT64_T
28798937Sdes# if (SIZEOF_LONG_INT == 8)
28898937Sdestypedef unsigned long int u_int64_t;
28998937Sdes# else
29098937Sdes#  if (SIZEOF_LONG_LONG_INT == 8)
29198937Sdestypedef unsigned long long int u_int64_t;
29298937Sdes#  endif
29398937Sdes# endif
29498937Sdes#endif
29598937Sdes
296262566Sdes#ifndef HAVE_UINTXX_T
297262566Sdestypedef u_int8_t uint8_t;
298262566Sdestypedef u_int16_t uint16_t;
299262566Sdestypedef u_int32_t uint32_t;
300262566Sdestypedef u_int64_t uint64_t;
301262566Sdes#endif
302262566Sdes
303262566Sdes#ifndef HAVE_INTMAX_T
304262566Sdestypedef long long intmax_t;
305262566Sdes#endif
306262566Sdes
307262566Sdes#ifndef HAVE_UINTMAX_T
308262566Sdestypedef unsigned long long uintmax_t;
309262566Sdes#endif
310262566Sdes
31198937Sdes#ifndef HAVE_U_CHAR
31298937Sdestypedef unsigned char u_char;
31398937Sdes# define HAVE_U_CHAR
31498937Sdes#endif /* HAVE_U_CHAR */
31598937Sdes
316248619Sdes#ifndef ULLONG_MAX
317248619Sdes# define ULLONG_MAX ((unsigned long long)-1)
318248619Sdes#endif
319248619Sdes
320106121Sdes#ifndef SIZE_T_MAX
321106121Sdes#define SIZE_T_MAX ULONG_MAX
322106121Sdes#endif /* SIZE_T_MAX */
323106121Sdes
32498937Sdes#ifndef HAVE_SIZE_T
32598937Sdestypedef unsigned int size_t;
32698937Sdes# define HAVE_SIZE_T
327126274Sdes# define SIZE_T_MAX UINT_MAX
32898937Sdes#endif /* HAVE_SIZE_T */
32998937Sdes
330221420Sdes#ifndef SIZE_MAX
331221420Sdes#define SIZE_MAX SIZE_T_MAX
332221420Sdes#endif
333221420Sdes
33498937Sdes#ifndef HAVE_SSIZE_T
33598937Sdestypedef int ssize_t;
33698937Sdes# define HAVE_SSIZE_T
33798937Sdes#endif /* HAVE_SSIZE_T */
33898937Sdes
33998937Sdes#ifndef HAVE_CLOCK_T
34098937Sdestypedef long clock_t;
34198937Sdes# define HAVE_CLOCK_T
34298937Sdes#endif /* HAVE_CLOCK_T */
34398937Sdes
34498937Sdes#ifndef HAVE_SA_FAMILY_T
34598937Sdestypedef int sa_family_t;
34698937Sdes# define HAVE_SA_FAMILY_T
34798937Sdes#endif /* HAVE_SA_FAMILY_T */
34898937Sdes
34998937Sdes#ifndef HAVE_PID_T
35098937Sdestypedef int pid_t;
35198937Sdes# define HAVE_PID_T
35298937Sdes#endif /* HAVE_PID_T */
35398937Sdes
35498937Sdes#ifndef HAVE_SIG_ATOMIC_T
35598937Sdestypedef int sig_atomic_t;
35698937Sdes# define HAVE_SIG_ATOMIC_T
35798937Sdes#endif /* HAVE_SIG_ATOMIC_T */
35898937Sdes
35998937Sdes#ifndef HAVE_MODE_T
36098937Sdestypedef int mode_t;
36198937Sdes# define HAVE_MODE_T
36298937Sdes#endif /* HAVE_MODE_T */
36398937Sdes
36498937Sdes#if !defined(HAVE_SS_FAMILY_IN_SS) && defined(HAVE___SS_FAMILY_IN_SS)
36598937Sdes# define ss_family __ss_family
36698937Sdes#endif /* !defined(HAVE_SS_FAMILY_IN_SS) && defined(HAVE_SA_FAMILY_IN_SS) */
36798937Sdes
36898937Sdes#ifndef HAVE_SYS_UN_H
36998937Sdesstruct	sockaddr_un {
37098937Sdes	short	sun_family;		/* AF_UNIX */
37198937Sdes	char	sun_path[108];		/* path name (gag) */
37298937Sdes};
37398937Sdes#endif /* HAVE_SYS_UN_H */
37498937Sdes
375146998Sdes#ifndef HAVE_IN_ADDR_T
376146998Sdestypedef u_int32_t	in_addr_t;
377146998Sdes#endif
378197679Sdes#ifndef HAVE_IN_PORT_T
379197679Sdestypedef u_int16_t	in_port_t;
380197679Sdes#endif
381146998Sdes
38298937Sdes#if defined(BROKEN_SYS_TERMIO_H) && !defined(_STRUCT_WINSIZE)
38398937Sdes#define _STRUCT_WINSIZE
38498937Sdesstruct winsize {
38598937Sdes      unsigned short ws_row;          /* rows, in characters */
38698937Sdes      unsigned short ws_col;          /* columns, in character */
38798937Sdes      unsigned short ws_xpixel;       /* horizontal size, pixels */
38898937Sdes      unsigned short ws_ypixel;       /* vertical size, pixels */
38998937Sdes};
39098937Sdes#endif
39198937Sdes
392255767Sdes/* bits needed for select that may not be in the system headers */
393255767Sdes#ifndef HAVE_FD_MASK
39498937Sdes typedef unsigned long int	fd_mask;
39598937Sdes#endif
39698937Sdes
397255767Sdes#if defined(HAVE_DECL_NFDBITS) && HAVE_DECL_NFDBITS == 0
398255767Sdes# define	NFDBITS (8 * sizeof(unsigned long))
399255767Sdes#endif
400255767Sdes
401255767Sdes#if defined(HAVE_DECL_HOWMANY) && HAVE_DECL_HOWMANY == 0
402255767Sdes# define howmany(x,y)	(((x)+((y)-1))/(y))
403255767Sdes#endif
404255767Sdes
40598937Sdes/* Paths */
40698937Sdes
40798937Sdes#ifndef _PATH_BSHELL
40898937Sdes# define _PATH_BSHELL "/bin/sh"
40998937Sdes#endif
41098937Sdes
41198937Sdes#ifdef USER_PATH
41298937Sdes# ifdef _PATH_STDPATH
41398937Sdes#  undef _PATH_STDPATH
41498937Sdes# endif
41598937Sdes# define _PATH_STDPATH USER_PATH
41698937Sdes#endif
41798937Sdes
41898937Sdes#ifndef _PATH_STDPATH
41998937Sdes# define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin"
42098937Sdes#endif
42198937Sdes
422124208Sdes#ifndef SUPERUSER_PATH
423124208Sdes# define SUPERUSER_PATH	_PATH_STDPATH
424124208Sdes#endif
425124208Sdes
42698937Sdes#ifndef _PATH_DEVNULL
42798937Sdes# define _PATH_DEVNULL "/dev/null"
42898937Sdes#endif
42998937Sdes
430226046Sdes/* user may have set a different path */
431226046Sdes#if defined(_PATH_MAILDIR) && defined(MAIL_DIRECTORY)
432295367Sdes# undef _PATH_MAILDIR
433226046Sdes#endif /* defined(_PATH_MAILDIR) && defined(MAIL_DIRECTORY) */
43498937Sdes
435226046Sdes#ifdef MAIL_DIRECTORY
436226046Sdes# define _PATH_MAILDIR MAIL_DIRECTORY
43798937Sdes#endif
43898937Sdes
43998937Sdes#ifndef _PATH_NOLOGIN
44098937Sdes# define _PATH_NOLOGIN "/etc/nologin"
44198937Sdes#endif
44298937Sdes
44398937Sdes/* Define this to be the path of the xauth program. */
44498937Sdes#ifdef XAUTH_PATH
44598937Sdes#define _PATH_XAUTH XAUTH_PATH
44698937Sdes#endif /* XAUTH_PATH */
44798937Sdes
44898937Sdes/* derived from XF4/xc/lib/dps/Xlibnet.h */
44998937Sdes#ifndef X_UNIX_PATH
45098937Sdes#  ifdef __hpux
45198937Sdes#    define X_UNIX_PATH "/var/spool/sockets/X11/%u"
45298937Sdes#  else
45398937Sdes#    define X_UNIX_PATH "/tmp/.X11-unix/X%u"
45498937Sdes#  endif
45598937Sdes#endif /* X_UNIX_PATH */
45698937Sdes#define _PATH_UNIX_X X_UNIX_PATH
45798937Sdes
45898937Sdes#ifndef _PATH_TTY
45998937Sdes# define _PATH_TTY "/dev/tty"
46098937Sdes#endif
46198937Sdes
46298937Sdes/* Macros */
46398937Sdes
46498937Sdes#if defined(HAVE_LOGIN_GETCAPBOOL) && defined(HAVE_LOGIN_CAP_H)
46598937Sdes# define HAVE_LOGIN_CAP
46698937Sdes#endif
46798937Sdes
46898937Sdes#ifndef MAX
46998937Sdes# define MAX(a,b) (((a)>(b))?(a):(b))
47098937Sdes# define MIN(a,b) (((a)<(b))?(a):(b))
47198937Sdes#endif
47298937Sdes
47398937Sdes#ifndef roundup
47498937Sdes# define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
47598937Sdes#endif
47698937Sdes
47798937Sdes#ifndef timersub
47898937Sdes#define timersub(a, b, result)					\
47998937Sdes   do {								\
48098937Sdes      (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;		\
48198937Sdes      (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;		\
48298937Sdes      if ((result)->tv_usec < 0) {				\
48398937Sdes	 --(result)->tv_sec;					\
48498937Sdes	 (result)->tv_usec += 1000000;				\
48598937Sdes      }								\
48698937Sdes   } while (0)
48798937Sdes#endif
48898937Sdes
489113908Sdes#ifndef TIMEVAL_TO_TIMESPEC
490113908Sdes#define	TIMEVAL_TO_TIMESPEC(tv, ts) {					\
491113908Sdes	(ts)->tv_sec = (tv)->tv_sec;					\
492113908Sdes	(ts)->tv_nsec = (tv)->tv_usec * 1000;				\
493113908Sdes}
494113908Sdes#endif
495113908Sdes
496113908Sdes#ifndef TIMESPEC_TO_TIMEVAL
497113908Sdes#define	TIMESPEC_TO_TIMEVAL(tv, ts) {					\
498113908Sdes	(tv)->tv_sec = (ts)->tv_sec;					\
499113908Sdes	(tv)->tv_usec = (ts)->tv_nsec / 1000;				\
500113908Sdes}
501113908Sdes#endif
502113908Sdes
50398937Sdes#ifndef __P
50498937Sdes# define __P(x) x
50598937Sdes#endif
50698937Sdes
50798937Sdes#if !defined(IN6_IS_ADDR_V4MAPPED)
50898937Sdes# define IN6_IS_ADDR_V4MAPPED(a) \
50998937Sdes	((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \
51098937Sdes	 (((u_int32_t *) (a))[2] == htonl (0xffff)))
51198937Sdes#endif /* !defined(IN6_IS_ADDR_V4MAPPED) */
51298937Sdes
51398937Sdes#if !defined(__GNUC__) || (__GNUC__ < 2)
51498937Sdes# define __attribute__(x)
51598937Sdes#endif /* !defined(__GNUC__) || (__GNUC__ < 2) */
51698937Sdes
517149749Sdes#if !defined(HAVE_ATTRIBUTE__SENTINEL__) && !defined(__sentinel__)
518149749Sdes# define __sentinel__
519149749Sdes#endif
520149749Sdes
521157016Sdes#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__bounded__)
522157016Sdes# define __bounded__(x, y, z)
523157016Sdes#endif
524157016Sdes
525181111Sdes#if !defined(HAVE_ATTRIBUTE__NONNULL__) && !defined(__nonnull__)
526181111Sdes# define __nonnull__(x)
527181111Sdes#endif
528181111Sdes
52998937Sdes#ifndef OSSH_ALIGNBYTES
53098937Sdes#define OSSH_ALIGNBYTES	(sizeof(int) - 1)
53198937Sdes#endif
53298937Sdes#ifndef __CMSG_ALIGN
53398937Sdes#define	__CMSG_ALIGN(p) (((u_int)(p) + OSSH_ALIGNBYTES) &~ OSSH_ALIGNBYTES)
53498937Sdes#endif
53598937Sdes
53698937Sdes/* Length of the contents of a control message of length len */
53798937Sdes#ifndef CMSG_LEN
53898937Sdes#define	CMSG_LEN(len)	(__CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
53998937Sdes#endif
54098937Sdes
54198937Sdes/* Length of the space taken up by a padded control message of length len */
54298937Sdes#ifndef CMSG_SPACE
54398937Sdes#define	CMSG_SPACE(len)	(__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(len))
54498937Sdes#endif
54598937Sdes
546124208Sdes/* given pointer to struct cmsghdr, return pointer to data */
547124208Sdes#ifndef CMSG_DATA
548124208Sdes#define CMSG_DATA(cmsg) ((u_char *)(cmsg) + __CMSG_ALIGN(sizeof(struct cmsghdr)))
549124208Sdes#endif /* CMSG_DATA */
550124208Sdes
551124208Sdes/*
552124208Sdes * RFC 2292 requires to check msg_controllen, in case that the kernel returns
553124208Sdes * an empty list for some reasons.
554124208Sdes */
555124208Sdes#ifndef CMSG_FIRSTHDR
556124208Sdes#define CMSG_FIRSTHDR(mhdr) \
557124208Sdes	((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
558124208Sdes	 (struct cmsghdr *)(mhdr)->msg_control : \
559124208Sdes	 (struct cmsghdr *)NULL)
560124208Sdes#endif /* CMSG_FIRSTHDR */
561124208Sdes
562181111Sdes#if defined(HAVE_DECL_OFFSETOF) && HAVE_DECL_OFFSETOF == 0
563137015Sdes# define offsetof(type, member) ((size_t) &((type *)0)->member)
564137015Sdes#endif
565124208Sdes
566162852Sdes/* Set up BSD-style BYTE_ORDER definition if it isn't there already */
567162852Sdes/* XXX: doesn't try to cope with strange byte orders (PDP_ENDIAN) */
568162852Sdes#ifndef BYTE_ORDER
569162852Sdes# ifndef LITTLE_ENDIAN
570162852Sdes#  define LITTLE_ENDIAN  1234
571162852Sdes# endif /* LITTLE_ENDIAN */
572162852Sdes# ifndef BIG_ENDIAN
573162852Sdes#  define BIG_ENDIAN     4321
574162852Sdes# endif /* BIG_ENDIAN */
575162852Sdes# ifdef WORDS_BIGENDIAN
576162852Sdes#  define BYTE_ORDER BIG_ENDIAN
577162852Sdes# else /* WORDS_BIGENDIAN */
578162852Sdes#  define BYTE_ORDER LITTLE_ENDIAN
579162852Sdes# endif /* WORDS_BIGENDIAN */
580162852Sdes#endif /* BYTE_ORDER */
581162852Sdes
58298937Sdes/* Function replacement / compatibility hacks */
58398937Sdes
58498937Sdes#if !defined(HAVE_GETADDRINFO) && (defined(HAVE_OGETADDRINFO) || defined(HAVE_NGETADDRINFO))
58598937Sdes# define HAVE_GETADDRINFO
58698937Sdes#endif
58798937Sdes
58898937Sdes#ifndef HAVE_GETOPT_OPTRESET
58999060Sdes# undef getopt
59099060Sdes# undef opterr
59199060Sdes# undef optind
59299060Sdes# undef optopt
59399060Sdes# undef optreset
59499060Sdes# undef optarg
59599060Sdes# define getopt(ac, av, o)  BSDgetopt(ac, av, o)
59699060Sdes# define opterr             BSDopterr
59799060Sdes# define optind             BSDoptind
59899060Sdes# define optopt             BSDoptopt
59999060Sdes# define optreset           BSDoptreset
60099060Sdes# define optarg             BSDoptarg
60198937Sdes#endif
60298937Sdes
60398937Sdes#if defined(BROKEN_GETADDRINFO) && defined(HAVE_GETADDRINFO)
60498937Sdes# undef HAVE_GETADDRINFO
60598937Sdes#endif
60698937Sdes#if defined(BROKEN_GETADDRINFO) && defined(HAVE_FREEADDRINFO)
60798937Sdes# undef HAVE_FREEADDRINFO
60898937Sdes#endif
60998937Sdes#if defined(BROKEN_GETADDRINFO) && defined(HAVE_GAI_STRERROR)
61098937Sdes# undef HAVE_GAI_STRERROR
61198937Sdes#endif
61298937Sdes
613295367Sdes#if defined(HAVE_GETADDRINFO)
614295367Sdes# if defined(HAVE_DECL_AI_NUMERICSERV) && HAVE_DECL_AI_NUMERICSERV == 0
615295367Sdes#   define AI_NUMERICSERV	0
616295367Sdes# endif
617295367Sdes#endif
618295367Sdes
619128456Sdes#if defined(BROKEN_UPDWTMPX) && defined(HAVE_UPDWTMPX)
620128456Sdes# undef HAVE_UPDWTMPX
621128456Sdes#endif
622128456Sdes
623181111Sdes#if defined(BROKEN_SHADOW_EXPIRE) && defined(HAS_SHADOW_EXPIRE)
624181111Sdes# undef HAS_SHADOW_EXPIRE
625181111Sdes#endif
626181111Sdes
627162852Sdes#if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT) && \
628162852Sdes    defined(SYSLOG_R_SAFE_IN_SIGHAND)
629162852Sdes# define DO_LOG_SAFE_IN_SIGHAND
630162852Sdes#endif
631162852Sdes
63298937Sdes#if !defined(HAVE_MEMMOVE) && defined(HAVE_BCOPY)
63398937Sdes# define memmove(s1, s2, n) bcopy((s2), (s1), (n))
63498937Sdes#endif /* !defined(HAVE_MEMMOVE) && defined(HAVE_BCOPY) */
63598937Sdes
63698937Sdes#ifndef GETPGRP_VOID
637162852Sdes# include <unistd.h>
63898937Sdes# define getpgrp() getpgrp(0)
63998937Sdes#endif
64098937Sdes
641146998Sdes#ifdef USE_BSM_AUDIT
642146998Sdes# define SSH_AUDIT_EVENTS
643146998Sdes# define CUSTOM_SSH_AUDIT_EVENTS
644146998Sdes#endif
645146998Sdes
646221420Sdes#ifdef USE_LINUX_AUDIT
647221420Sdes# define SSH_AUDIT_EVENTS
648221420Sdes# define CUSTOM_SSH_AUDIT_EVENTS
649221420Sdes#endif
650221420Sdes
65198937Sdes#if !defined(HAVE___func__) && defined(HAVE___FUNCTION__)
65298937Sdes#  define __func__ __FUNCTION__
65398937Sdes#elif !defined(HAVE___func__)
65498937Sdes#  define __func__ ""
65598937Sdes#endif
65698937Sdes
657124208Sdes#if defined(KRB5) && !defined(HEIMDAL)
658124208Sdes#  define krb5_get_err_text(context,code) error_message(code)
659124208Sdes#endif
660124208Sdes
661128456Sdes#if defined(SKEYCHALLENGE_4ARG)
662128456Sdes# define _compat_skeychallenge(a,b,c,d) skeychallenge(a,b,c,d)
663128456Sdes#else
664128456Sdes# define _compat_skeychallenge(a,b,c,d) skeychallenge(a,b,c)
665128456Sdes#endif
666128456Sdes
667126274Sdes/* Maximum number of file descriptors available */
668126274Sdes#ifdef HAVE_SYSCONF
669126274Sdes# define SSH_SYSFDMAX sysconf(_SC_OPEN_MAX)
670126274Sdes#else
671126274Sdes# define SSH_SYSFDMAX 10000
672126274Sdes#endif
673126274Sdes
674181111Sdes#ifdef FSID_HAS_VAL
675181111Sdes/* encode f_fsid into a 64 bit value  */
676181111Sdes#define FSID_TO_ULONG(f) \
677181111Sdes	((((u_int64_t)(f).val[0] & 0xffffffffUL) << 32) | \
678181111Sdes	    ((f).val[1] & 0xffffffffUL))
679197679Sdes#elif defined(FSID_HAS___VAL)
680197679Sdes#define FSID_TO_ULONG(f) \
681197679Sdes	((((u_int64_t)(f).__val[0] & 0xffffffffUL) << 32) | \
682197679Sdes	    ((f).__val[1] & 0xffffffffUL))
683181111Sdes#else
684181111Sdes# define FSID_TO_ULONG(f) ((f))
685181111Sdes#endif
686181111Sdes
687149749Sdes#if defined(__Lynx__)
688149749Sdes /*
689149749Sdes  * LynxOS defines these in param.h which we do not want to include since
690149749Sdes  * it will also pull in a bunch of kernel definitions.
691149749Sdes  */
692149749Sdes# define ALIGNBYTES (sizeof(int) - 1)
693149749Sdes# define ALIGN(p) (((unsigned)p + ALIGNBYTES) & ~ALIGNBYTES)
694149749Sdes  /* Missing prototypes on LynxOS */
695149749Sdes  int snprintf (char *, size_t, const char *, ...);
696149749Sdes  int mkstemp (char *);
697149749Sdes  char *crypt (const char *, const char *);
698149749Sdes  int seteuid (uid_t);
699149749Sdes  int setegid (gid_t);
700149749Sdes  char *mkdtemp (char *);
701149749Sdes  int rresvport_af (int *, sa_family_t);
702149749Sdes  int innetgr (const char *, const char *, const char *, const char *);
703149749Sdes#endif
704126274Sdes
70598937Sdes/*
70698937Sdes * Define this to use pipes instead of socketpairs for communicating with the
70798937Sdes * client program.  Socketpairs do not seem to work on all systems.
70898937Sdes *
70998937Sdes * configure.ac sets this for a few OS's which are known to have problems
71098937Sdes * but you may need to set it yourself
71198937Sdes */
71298937Sdes/* #define USE_PIPES 1 */
71398937Sdes
71498937Sdes/**
71598937Sdes ** login recorder definitions
71698937Sdes **/
71798937Sdes
71898937Sdes/* FIXME: put default paths back in */
71998937Sdes#ifndef UTMP_FILE
72098937Sdes#  ifdef _PATH_UTMP
72198937Sdes#    define UTMP_FILE _PATH_UTMP
72298937Sdes#  else
72398937Sdes#    ifdef CONF_UTMP_FILE
72498937Sdes#      define UTMP_FILE CONF_UTMP_FILE
72598937Sdes#    endif
72698937Sdes#  endif
72798937Sdes#endif
72898937Sdes#ifndef WTMP_FILE
72998937Sdes#  ifdef _PATH_WTMP
73098937Sdes#    define WTMP_FILE _PATH_WTMP
73198937Sdes#  else
73298937Sdes#    ifdef CONF_WTMP_FILE
73398937Sdes#      define WTMP_FILE CONF_WTMP_FILE
73498937Sdes#    endif
73598937Sdes#  endif
73698937Sdes#endif
73798937Sdes/* pick up the user's location for lastlog if given */
73898937Sdes#ifndef LASTLOG_FILE
73998937Sdes#  ifdef _PATH_LASTLOG
74098937Sdes#    define LASTLOG_FILE _PATH_LASTLOG
74198937Sdes#  else
74298937Sdes#    ifdef CONF_LASTLOG_FILE
74398937Sdes#      define LASTLOG_FILE CONF_LASTLOG_FILE
74498937Sdes#    endif
74598937Sdes#  endif
74698937Sdes#endif
74798937Sdes
748126274Sdes#if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
749126274Sdes# define USE_SHADOW
750126274Sdes#endif
75198937Sdes
75298937Sdes/* The login() library function in libutil is first choice */
75398937Sdes#if defined(HAVE_LOGIN) && !defined(DISABLE_LOGIN)
75498937Sdes#  define USE_LOGIN
75598937Sdes
75698937Sdes#else
75798937Sdes/* Simply select your favourite login types. */
75898937Sdes/* Can't do if-else because some systems use several... <sigh> */
759202213Sed#  if !defined(DISABLE_UTMPX)
76098937Sdes#    define USE_UTMPX
76198937Sdes#  endif
76298937Sdes#  if defined(UTMP_FILE) && !defined(DISABLE_UTMP)
76398937Sdes#    define USE_UTMP
76498937Sdes#  endif
76598937Sdes#  if defined(WTMPX_FILE) && !defined(DISABLE_WTMPX)
76698937Sdes#    define USE_WTMPX
76798937Sdes#  endif
76898937Sdes#  if defined(WTMP_FILE) && !defined(DISABLE_WTMP)
76998937Sdes#    define USE_WTMP
77098937Sdes#  endif
77198937Sdes
77298937Sdes#endif
77398937Sdes
774128456Sdes#ifndef UT_LINESIZE
775128456Sdes# define UT_LINESIZE 8
776128456Sdes#endif
777128456Sdes
77898937Sdes/* I hope that the presence of LASTLOG_FILE is enough to detect this */
77998937Sdes#if defined(LASTLOG_FILE) && !defined(DISABLE_LASTLOG)
78098937Sdes#  define USE_LASTLOG
78198937Sdes#endif
78298937Sdes
783128456Sdes#ifdef HAVE_OSF_SIA
784128456Sdes# ifdef USE_SHADOW
785128456Sdes#  undef USE_SHADOW
786128456Sdes# endif
787128456Sdes# define CUSTOM_SYS_AUTH_PASSWD 1
788128456Sdes#endif
789128456Sdes
790192595Sdes#if defined(HAVE_LIBIAF) && defined(HAVE_SET_ID) && !defined(HAVE_SECUREWARE)
791149749Sdes# define CUSTOM_SYS_AUTH_PASSWD 1
792149749Sdes#endif
793181111Sdes#if defined(HAVE_LIBIAF) && defined(HAVE_SET_ID) && !defined(BROKEN_LIBIAF)
794181111Sdes# define USE_LIBIAF
795181111Sdes#endif
796149749Sdes
797146998Sdes/* HP-UX 11.11 */
798146998Sdes#ifdef BTMP_FILE
799146998Sdes# define _PATH_BTMP BTMP_FILE
800146998Sdes#endif
801146998Sdes
802146998Sdes#if defined(USE_BTMP) && defined(_PATH_BTMP)
803146998Sdes# define CUSTOM_FAILED_LOGIN
804146998Sdes#endif
805146998Sdes
80698937Sdes/** end of login recorder definitions */
80798937Sdes
808149749Sdes#ifdef BROKEN_GETGROUPS
809149749Sdes# define getgroups(a,b) ((a)==0 && (b)==NULL ? NGROUPS_MAX : getgroups((a),(b)))
810149749Sdes#endif
811149749Sdes
812149749Sdes#if defined(HAVE_MMAP) && defined(BROKEN_MMAP)
813149749Sdes# undef HAVE_MMAP
814149749Sdes#endif
815149749Sdes
816162852Sdes#ifndef IOV_MAX
817162852Sdes# if defined(_XOPEN_IOV_MAX)
818162852Sdes#  define	IOV_MAX		_XOPEN_IOV_MAX
819162852Sdes# elif defined(DEF_IOV_MAX)
820162852Sdes#  define	IOV_MAX		DEF_IOV_MAX
821162852Sdes# else
822162852Sdes#  define	IOV_MAX		16
823162852Sdes# endif
824157016Sdes#endif
825157016Sdes
826181111Sdes#ifndef EWOULDBLOCK
827181111Sdes# define EWOULDBLOCK EAGAIN
828181111Sdes#endif
829181111Sdes
830192595Sdes#ifndef INET6_ADDRSTRLEN	/* for non IPv6 machines */
831192595Sdes#define INET6_ADDRSTRLEN 46
832192595Sdes#endif
833192595Sdes
834197679Sdes#ifndef SSH_IOBUFSZ
835197679Sdes# define SSH_IOBUFSZ 8192
836197679Sdes#endif
837197679Sdes
838262566Sdes/*
839262566Sdes * Platforms that have arc4random_uniform() and not arc4random_stir()
840262566Sdes * shouldn't need the latter.
841262566Sdes */
842262566Sdes#if defined(HAVE_ARC4RANDOM) && defined(HAVE_ARC4RANDOM_UNIFORM) && \
843262566Sdes    !defined(HAVE_ARC4RANDOM_STIR)
844262566Sdes# define arc4random_stir()
845262566Sdes#endif
846262566Sdes
847295367Sdes#ifndef HAVE_VA_COPY
848295367Sdes# ifdef HAVE___VA_COPY
849295367Sdes#  define va_copy(dest, src) __va_copy(dest, src)
850295367Sdes# else
851295367Sdes#  define va_copy(dest, src) (dest) = (src)
852295367Sdes# endif
853295367Sdes#endif
854295367Sdes
855295367Sdes#ifndef __predict_true
856295367Sdes# if defined(__GNUC__) && \
857295367Sdes     ((__GNUC__ > (2)) || (__GNUC__ == (2) && __GNUC_MINOR__ >= (96)))
858295367Sdes#  define __predict_true(exp)     __builtin_expect(((exp) != 0), 1)
859295367Sdes#  define __predict_false(exp)    __builtin_expect(((exp) != 0), 0)
860295367Sdes# else
861295367Sdes#  define __predict_true(exp)     ((exp) != 0)
862295367Sdes#  define __predict_false(exp)    ((exp) != 0)
863295367Sdes# endif /* gcc version */
864295367Sdes#endif /* __predict_true */
865295367Sdes
866296781Sdes#if defined(HAVE_GLOB_H) && defined(GLOB_HAS_ALTDIRFUNC) && \
867296781Sdes    defined(GLOB_HAS_GL_MATCHC) && defined(GLOB_HAS_GL_STATV) && \
868296781Sdes    defined(HAVE_DECL_GLOB_NOMATCH) &&  HAVE_DECL_GLOB_NOMATCH != 0 && \
869296781Sdes    !defined(BROKEN_GLOB)
870296781Sdes# define USE_SYSTEM_GLOB
871296781Sdes#endif
872296781Sdes
87398937Sdes#endif /* _DEFINES_H */
874