1/*
2 * Copyright (c) 2001 by Sun Microsystems, Inc.
3 * All rights reserved.
4 */
5
6#pragma ident	"%Z%%M%	%I%	%E% SMI"
7
8/*
9 * The contents of this file are subject to the Netscape Public
10 * License Version 1.1 (the "License"); you may not use this file
11 * except in compliance with the License. You may obtain a copy of
12 * the License at http://www.mozilla.org/NPL/
13 *
14 * Software distributed under the License is distributed on an "AS
15 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
16 * implied. See the License for the specific language governing
17 * rights and limitations under the License.
18 *
19 * The Original Code is Mozilla Communicator client code, released
20 * March 31, 1998.
21 *
22 * The Initial Developer of the Original Code is Netscape
23 * Communications Corporation. Portions created by Netscape are
24 * Copyright (C) 1998-1999 Netscape Communications Corporation. All
25 * Rights Reserved.
26 *
27 * Contributor(s):
28 */
29
30/*
31 * Copyright (c) 1994 Regents of the University of Michigan.
32 * All rights reserved.
33 *
34 * Redistribution and use in source and binary forms are permitted
35 * provided that this notice is preserved and that due credit is given
36 * to the University of Michigan at Ann Arbor. The name of the University
37 * may not be used to endorse or promote products derived from this
38 * software without specific prior written permission. This software
39 * is provided ``as is'' without express or implied warranty.
40 */
41
42#ifndef _PORTABLE_H
43#define _PORTABLE_H
44
45/*
46 * portable.h for LDAP -- this is where we define common stuff to make
47 * life easier on various Unix systems.
48 *
49 * Unless you are porting LDAP to a new platform, you should not need to
50 * edit this file.
51 */
52
53#ifndef SYSV
54#if defined( hpux ) || defined( sunos5 ) || defined ( sgi ) || defined( SVR4 )
55#define SYSV
56#endif
57#endif
58
59/*
60 * under System V, use sysconf() instead of getdtablesize
61 */
62#if !defined( USE_SYSCONF ) && defined( SYSV )
63#define USE_SYSCONF
64#endif
65
66/*
67 * under System V, daemons should use setsid() instead of detaching from their
68 * tty themselves
69 */
70#if !defined( USE_SETSID ) && defined( SYSV )
71#define USE_SETSID
72#endif
73
74/*
75 * System V has socket options in filio.h
76 */
77#if !defined( NEED_FILIO ) && defined( SYSV ) && !defined( hpux ) && !defined( AIX )
78#define NEED_FILIO
79#endif
80
81/*
82 * use lockf() under System V
83 */
84#if !defined( USE_LOCKF ) && ( defined( SYSV ) || defined( aix ))
85#define USE_LOCKF
86#endif
87
88/*
89 * on many systems, we should use waitpid() instead of waitN()
90 */
91#if !defined( USE_WAITPID ) && ( defined( SYSV ) || defined( sunos4 ) || defined( ultrix ) || defined( aix ))
92#define USE_WAITPID
93#endif
94
95/*
96 * define the wait status argument type
97 */
98#if ( defined( SunOS ) && SunOS < 40 ) || defined( nextstep )
99#define WAITSTATUSTYPE	union wait
100#else
101#define WAITSTATUSTYPE	int
102#endif
103
104/*
105 * define the flags for wait
106 */
107#ifdef sunos5
108#define WAIT_FLAGS	( WNOHANG | WUNTRACED | WCONTINUED )
109#else
110#define WAIT_FLAGS	( WNOHANG | WUNTRACED )
111#endif
112
113/*
114 * defined the options for openlog (syslog)
115 */
116#ifdef ultrix
117#define OPENLOG_OPTIONS		LOG_PID
118#else
119#define OPENLOG_OPTIONS		( LOG_PID | LOG_NOWAIT )
120#endif
121
122/*
123 * some systems don't have the BSD re_comp and re_exec routines
124 */
125#ifndef NEED_BSDREGEX
126#if ( defined( SYSV ) || defined( VMS ) || defined( netbsd ) || defined( freebsd ) || defined( linux )) && !defined(sgi)
127#define NEED_BSDREGEX
128#endif
129#endif
130
131/*
132 * many systems do not have the setpwfile() library routine... we just
133 * enable use for those systems we know have it.
134 */
135#ifndef HAVE_SETPWFILE
136#if defined( sunos4 ) || defined( ultrix ) || defined( OSF1 )
137#define HAVE_SETPWFILE
138#endif
139#endif
140
141/*
142 * Are sys_errlist and sys_nerr declared in stdio.h?
143 */
144#ifndef SYSERRLIST_IN_STDIO
145#if defined( freebsd )
146#define SYSERRLIST_IN_STDIO
147#endif
148#endif
149
150
151/*
152 * Is snprintf() part of the standard C runtime library?
153 */
154#if !defined(HAVE_SNPRINTF)
155#if defined(SOLARIS) || defined(LINUX) || defined(HPUX)
156#define HAVE_SNPRINTF
157#endif
158#endif
159
160
161/*
162 * Async IO.  Use a non blocking implementation of connect() and
163 * dns functions
164 */
165#if !defined(LDAP_ASYNC_IO)
166#if !defined(_WINDOWS) && !defined(macintosh)
167#define LDAP_ASYNC_IO
168#endif /* _WINDOWS */
169#endif
170
171/*
172 * for select()
173 */
174#if !defined(WINSOCK) && !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2)
175#if defined(hpux) || defined(LINUX) || defined(SUNOS4)
176#include <sys/time.h>
177#else
178#include <sys/select.h>
179#endif
180#if !defined(FD_SET)
181#define NFDBITS         32
182#define FD_SETSIZE      32
183#define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
184#define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
185#define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
186#define FD_ZERO(p)      bzero((char *)(p), sizeof(*(p)))
187#endif /* !FD_SET */
188#endif /* !WINSOCK && !_WINDOWS && !macintosh */
189
190
191/*
192 * for connect() -- must we block signals when calling connect()?  This
193 * is necessary on some buggy UNIXes.
194 */
195#if !defined(LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED) && \
196	( defined(AIX) || defined(IRIX) || defined(HPUX) || defined(SUNOS4) \
197	|| defined(SOLARIS) || defined(OSF1) ||defined(freebsd))
198#define LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED
199#endif
200
201
202/*
203 * for signal() -- what do signal handling functions return?
204 */
205#ifndef SIG_FN
206#ifdef sunos5
207#   define SIG_FN void          /* signal-catching functions return void */
208#else /* sunos5 */
209# ifdef BSD
210#  if (BSD >= 199006) || defined(NeXT) || defined(OSF1) || defined(sun) || defined(ultrix) || defined(apollo) || defined(POSIX_SIGNALS)
211#   define SIG_FN void          /* signal-catching functions return void */
212#  else
213#   define SIG_FN int           /* signal-catching functions return int */
214#  endif
215# else /* BSD */
216#  define SIG_FN void           /* signal-catching functions return void */
217# endif /* BSD */
218#endif /* sunos5 */
219#endif /* SIG_FN */
220
221/*
222 * toupper and tolower macros are different under bsd and sys v
223 */
224#if defined( SYSV ) && !defined( hpux )
225#define TOUPPER(c)	(isascii(c) && islower(c) ? _toupper(c) : c)
226#define TOLOWER(c)	(isascii(c) && isupper(c) ? _tolower(c) : c)
227#else
228#define TOUPPER(c)	(isascii(c) && islower(c) ? toupper(c) : c)
229#define TOLOWER(c)	(isascii(c) && isupper(c) ? tolower(c) : c)
230#endif
231
232/*
233 * put a cover on the tty-related ioctl calls we need to use
234 */
235#if defined( NeXT ) || (defined(SunOS) && SunOS < 40)
236#define TERMIO_TYPE struct sgttyb
237#define TERMFLAG_TYPE int
238#define GETATTR( fd, tiop )	ioctl((fd), TIOCGETP, (caddr_t)(tiop))
239#define SETATTR( fd, tiop )	ioctl((fd), TIOCSETP, (caddr_t)(tiop))
240#define GETFLAGS( tio )		(tio).sg_flags
241#define SETFLAGS( tio, flags )	(tio).sg_flags = (flags)
242#else
243#define USE_TERMIOS
244#define TERMIO_TYPE struct termios
245#define TERMFLAG_TYPE tcflag_t
246#define GETATTR( fd, tiop )	tcgetattr((fd), (tiop))
247#define SETATTR( fd, tiop )	tcsetattr((fd), TCSANOW /* 0 */, (tiop))
248#define GETFLAGS( tio )		(tio).c_lflag
249#define SETFLAGS( tio, flags )	(tio).c_lflag = (flags)
250#endif
251
252#if ( !defined( HPUX9 )) && ( !defined( sunos4 )) && ( !defined( SNI )) && \
253	( !defined( HAVE_TIME_R ))
254#define HAVE_TIME_R
255#endif
256
257#if defined( sunos5 ) || defined( aix )
258#define HAVE_GETPWNAM_R
259#define HAVE_GETGRNAM_R
260#endif
261
262#if defined(SNI) || defined(LINUX1_2)
263int strcasecmp(const char *, const char *);
264#ifdef SNI
265int strncasecmp(const char *, const char *, int);
266#endif /* SNI */
267#ifdef LINUX1_2
268int strncasecmp(const char *, const char *, size_t);
269#endif /* LINUX1_2 */
270#endif /* SNI || LINUX1_2 */
271
272#if defined(_WINDOWS) || defined(macintosh) || defined(XP_OS2)
273#define GETHOSTBYNAME( n, r, b, l, e )  gethostbyname( n )
274#define NSLDAPI_CTIME( c, b, l )	ctime( c )
275#define STRTOK( s1, s2, l )		strtok( s1, s2 )
276#else /* UNIX */
277#if defined(sgi) || defined(HPUX9) || defined(LINUX1_2) || defined(SCOOS) || \
278    defined(UNIXWARE) || defined(SUNOS4) || defined(SNI) || defined(BSDI) || \
279    defined(NCR) || defined(OSF1) || defined(NEC) || \
280    ( defined(HPUX10) && !defined(_REENTRANT)) || defined(HPUX11) || \
281    defined(UnixWare) || defined(LINUX) || (defined(AIX) && !defined(USE_REENTRANT_LIBC))
282#define GETHOSTBYNAME( n, r, b, l, e )  gethostbyname( n )
283#elif defined(AIX)
284/* Maybe this is for another version of AIX?
285   Commenting out for AIX 4.1 for Nova
286   Replaced with following to lines, stolen from the #else below
287#define GETHOSTBYNAME_BUF_T struct hostent_data
288*/
289typedef char GETHOSTBYNAME_buf_t [BUFSIZ /* XXX might be too small */];
290#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
291#define GETHOSTBYNAME( n, r, b, l, e ) \
292	(memset (&b, 0, l), gethostbyname_r (n, r, &b) ? NULL : r)
293#elif defined(HPUX10)
294#define GETHOSTBYNAME_BUF_T struct hostent_data
295#define GETHOSTBYNAME( n, r, b, l, e )	nsldapi_compat_gethostbyname_r( n, r, (char *)&b, l, e )
296#else
297#include <stdio.h> /* BUFSIZ */
298typedef char GETHOSTBYNAME_buf_t [BUFSIZ /* XXX might be too small */];
299#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
300#define GETHOSTBYNAME( n, r, b, l, e )  gethostbyname_r( n, r, b, l, e )
301#endif
302#if defined(HPUX9) || defined(LINUX1_2) || defined(LINUX2_0) || \
303    defined(LINUX2_1) || defined(SUNOS4) || defined(SNI) || \
304    defined(SCOOS) || defined(BSDI) || defined(NCR) || \
305    defined(NEC) || ( defined(HPUX10) && !defined(_REENTRANT)) || \
306    (defined(AIX) && !defined(USE_REENTRANT_LIBC))
307#define NSLDAPI_CTIME( c, b, l )	ctime( c )
308#elif defined(HPUX10) && defined(_REENTRANT) && !defined(HPUX11)
309#define NSLDAPI_CTIME( c, b, l )	nsldapi_compat_ctime_r( c, b, l )
310#elif defined( IRIX6_2 ) || defined( IRIX6_3 ) || defined(UNIXWARE) \
311	|| defined(OSF1V4) || defined(AIX) || defined(UnixWare) || defined(hpux) || defined(HPUX11)
312#define NSLDAPI_CTIME( c, b, l )        ctime_r( c, b )
313#elif defined( OSF1V3 )
314#define NSLDAPI_CTIME( c, b, l )	(ctime_r( c, b, l ) ? NULL : b)
315#else
316#define NSLDAPI_CTIME( c, b, l )	ctime_r( c, b, l )
317#endif
318#if defined(hpux9) || defined(LINUX1_2) || defined(SUNOS4) || defined(SNI) || \
319    defined(SCOOS) || defined(BSDI) || defined(NCR) || \
320    defined(NEC) || defined(LINUX) || (defined(AIX) && !defined(USE_REENTRANT_LIBC))
321#define STRTOK( s1, s2, l )		strtok( s1, s2 )
322#else
323#define HAVE_STRTOK_R
324char *strtok_r(char *, const char *, char **);
325#define STRTOK( s1, s2, l )		(char *)strtok_r( s1, s2, l )
326#endif /* STRTOK */
327#endif /* UNIX */
328
329#if defined( ultrix ) || defined( nextstep )
330extern char *strdup();
331#endif /* ultrix || nextstep */
332
333#if defined( sunos4 ) || defined( OSF1 )
334#define	BSD_TIME	1	/* for servers/slapd/log.h */
335#endif /* sunos4 || osf */
336
337#if !defined(_WINDOWS) && !defined(macintosh)
338#include <netinet/in.h>
339#include <arpa/inet.h>	/* for inet_addr() */
340#endif
341
342/*
343 * Define a portable type for IPv4 style Internet addresses (32 bits):
344 */
345#if ( defined(sunos5) && defined(_IN_ADDR_T)) || \
346    defined(aix) || defined(HPUX11) || defined(OSF1) || defined(SOLARIS)
347typedef in_addr_t	nsldapi_in_addr_t;
348#else
349typedef unsigned long	nsldapi_in_addr_t;
350#endif
351
352#ifdef SUNOS4
353#include <pcfs/pc_dir.h>	/* for toupper() */
354int fprintf(FILE *, char *, ...);
355int fseek(FILE *, long, int);
356int fread(char *, int, int, FILE *);
357int fclose(FILE *);
358int fflush(FILE *);
359int rewind(FILE *);
360void *memmove(void *, const void *, size_t);
361int strcasecmp(char *, char *);
362int strncasecmp(char *, char *, int);
363time_t time(time_t *);
364void perror(char *);
365int fputc(char, FILE *);
366int fputs(char *, FILE *);
367int re_exec(char *);
368int socket(int, int, int);
369void bzero(char *, int);
370unsigned long inet_addr(char *);
371char * inet_ntoa(struct in_addr);
372int getdtablesize();
373int connect(int, struct sockaddr *, int);
374#endif /* SUNOS4 */
375
376/* #if defined(SUNOS4) || defined(SNI) */
377#if defined(SUNOS4)
378int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
379#endif /* SUNOS4 || SNI */
380
381/*
382 * SAFEMEMCPY is an overlap-safe copy from s to d of n bytes
383 * This is moved to lber.h in Solaris
384 */
385#ifndef _SOLARIS_SDK
386#ifdef macintosh
387#define SAFEMEMCPY( d, s, n )	BlockMoveData( (Ptr)s, (Ptr)d, n )
388#else /* macintosh */
389#ifdef sunos4
390#define SAFEMEMCPY( d, s, n )	bcopy( s, d, n )
391#else /* sunos4 */
392#define SAFEMEMCPY( d, s, n )	memmove( d, s, n )
393#endif /* sunos4 */
394#endif /* macintosh */
395#endif /* ifndef _SOLARIS_SDK */
396
397#ifdef _WINDOWS
398
399#define strcasecmp strcmpi
400#define strncasecmp _strnicmp
401#define bzero(a, b) memset( a, 0, b )
402#define getpid _getpid
403#define ioctl ioctlsocket
404#define sleep(a) Sleep( a*1000 )
405
406#define EMSGSIZE WSAEMSGSIZE
407#define EWOULDBLOCK WSAEWOULDBLOCK
408#define EHOSTUNREACH WSAEHOSTUNREACH
409
410#ifndef MAXPATHLEN
411#define MAXPATHLEN _MAX_PATH
412#endif
413
414/* We'd like this number to be prime for the hash
415 * into the Connection table */
416#define DS_MAX_NT_SOCKET_CONNECTIONS 2003
417
418#elif defined(XP_OS2)
419
420#define strcasecmp strcmpi
421#define strncasecmp strnicmp
422#define bzero(a, b) memset( a, 0, b )
423#include "dirent.h"
424#include <string.h> /*for strcmpi()*/
425#include <time.h>   /*for ctime()*/
426
427#endif /* XP_OS2 */
428
429
430#endif /* _PORTABLE_H */
431