1/* Copyright (c) 1993-2002
2 *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
3 *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
4 * Copyright (c) 1987 Oliver Laumann
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program (see the file COPYING); if not, write to the
18 * Free Software Foundation, Inc.,
19 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
20 *
21 ****************************************************************
22 * $Id: os.h,v 1.10 1994/05/31 12:32:22 mlschroe Exp $ FAU
23 */
24
25#include <stdio.h>
26#include <errno.h>
27
28#include <sys/param.h>
29
30/* In strict ANSI mode, HP-UX machines define __hpux but not hpux */
31#if defined(__hpux) && !defined(hpux)
32# define hpux
33#endif
34
35#if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux)
36# include <signal.h>
37#endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */
38
39#ifdef ISC
40# ifdef ENAMETOOLONG
41#  undef ENAMETOOLONG
42# endif
43# ifdef ENOTEMPTY
44#  undef ENOTEMPTY
45# endif
46# include <sys/bsdtypes.h>
47# include <net/errno.h>
48#endif
49
50#ifdef sun
51# define getpgrp __getpgrp
52# define exit __exit
53#endif
54#ifdef POSIX
55# include <unistd.h>
56# if defined(__STDC__)
57#  include <stdlib.h>
58# endif /* __STDC__ */
59#endif /* POSIX */
60#ifdef sun
61# undef getpgrp
62# undef exit
63#endif /* sun */
64
65#ifndef linux /* all done in <errno.h> */
66extern int errno;
67#endif /* linux */
68#ifndef HAVE_STRERROR
69/* No macros, please */
70#undef strerror
71#endif
72
73#if !defined(SYSV) && !defined(linux)
74# ifdef NEWSOS
75#  define strlen ___strlen___
76#  include <strings.h>
77#  undef strlen
78# else /* NEWSOS */
79#  include <strings.h>
80# endif /* NEWSOS */
81#else /* SYSV */
82# if defined(SVR4) || defined(NEWSOS)
83#  define strlen ___strlen___
84#  include <string.h>
85#  undef strlen
86#  if !defined(NEWSOS) && !defined(__hpux)
87    extern size_t strlen(const char *);
88#  endif
89# else /* SVR4 */
90#  include <string.h>
91# endif /* SVR4 */
92#endif /* SYSV */
93
94#ifdef USEVARARGS
95# if defined(__STDC__)
96#  include <stdarg.h>
97#  define VA_LIST(var) va_list var;
98#  define VA_DOTS ...
99#  define VA_DECL
100#  define VA_START(ap, fmt) va_start(ap, fmt)
101#  define VA_ARGS(ap) ap
102#  define VA_END(ap) va_end(ap)
103# else
104#  include <varargs.h>
105#  define VA_LIST(var) va_list var;
106#  define VA_DOTS va_alist
107#  define VA_DECL va_dcl
108#  define VA_START(ap, fmt) va_start(ap)
109#  define VA_ARGS(ap) ap
110#  define VA_END(ap) va_end(ap)
111# endif
112#else
113# define VA_LIST(var)
114# define VA_DOTS p1, p2, p3, p4, p5, p6
115# define VA_DECL unsigned long VA_DOTS;
116# define VA_START(ap, fmt)
117# define VA_ARGS(ap) VA_DOTS
118# define VA_END(ap)
119# undef vsnprintf
120# define vsnprintf xsnprintf
121#endif
122
123#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
124# include <time.h>
125#endif
126#include <sys/time.h>
127
128#ifdef M_UNIX   /* SCO */
129# include <sys/stream.h>
130# include <sys/ptem.h>
131# define ftruncate(fd, s) chsize(fd, s)
132#endif
133
134#ifdef SYSV
135# define index strchr
136# define rindex strrchr
137# define bzero(poi,len) memset(poi,0,len)
138# define bcmp memcmp
139# define killpg(pgrp,sig) kill( -(pgrp), sig)
140#endif
141
142#ifndef HAVE_GETCWD
143# define getcwd(b,l) getwd(b)
144#endif
145
146#ifndef USEBCOPY
147# ifdef USEMEMMOVE
148#  define bcopy(s,d,len) memmove(d,s,len)
149# else
150#  ifdef USEMEMCPY
151#   define bcopy(s,d,len) memcpy(d,s,len)
152#  else
153#   define NEED_OWN_BCOPY
154#   define bcopy xbcopy
155#  endif
156# endif
157#endif
158
159#ifdef hpux
160# define setreuid(ruid, euid) setresuid(ruid, euid, -1)
161# define setregid(rgid, egid) setresgid(rgid, egid, -1)
162#endif
163
164#if defined(HAVE_SETEUID) || defined(HAVE_SETREUID)
165# define USE_SETEUID
166#endif
167
168#if !defined(HAVE__EXIT) && !defined(_exit)
169#define _exit(x) exit(x)
170#endif
171
172#ifndef HAVE_UTIMES
173# define utimes utime
174#endif
175#ifndef HAVE_VSNPRINTF
176# define vsnprintf xvsnprintf
177#endif
178
179#ifdef BUILTIN_TELNET
180# include <netinet/in.h>
181# include <arpa/inet.h>
182#endif
183
184#if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME))
185# undef USE_LOCALE
186#endif
187
188/*****************************************************************
189 *    terminal handling
190 */
191
192#ifdef POSIX
193# include <termios.h>
194# ifdef hpux
195#  include <bsdtty.h>
196# endif /* hpux */
197# ifdef NCCS
198#  define MAXCC NCCS
199# else
200#  define MAXCC 256
201# endif
202#else /* POSIX */
203# ifdef TERMIO
204#  include <termio.h>
205#  ifdef NCC
206#   define MAXCC NCC
207#  else
208#   define MAXCC 256
209#  endif
210#  ifdef CYTERMIO
211#   include <cytermio.h>
212#  endif
213# else /* TERMIO */
214#  include <sgtty.h>
215# endif /* TERMIO */
216#endif /* POSIX */
217
218#ifndef VDISABLE
219# ifdef _POSIX_VDISABLE
220#  define VDISABLE _POSIX_VDISABLE
221# else
222#  define VDISABLE 0377
223# endif /* _POSIX_VDISABLE */
224#endif /* !VDISABLE */
225
226
227/* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD)
228 * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE)
229 * to hold the whole packet at first read().
230 * (Marc Boucher)
231 *
232 * matthew green:
233 * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100
234 *
235 * Joe Traister: On AIX4, programs like irc won't work if screen
236 * uses TIOCPKT (select fails to return on pty read).
237 */
238#if defined(sgi) || defined(DGUX) || defined(_IBMR2)
239# undef TIOCPKT
240#endif
241
242/* linux ncurses is broken, we have to use our own tputs */
243#if defined(linux) && defined(TERMINFO)
244# define tputs xtputs
245#endif
246
247/* Alexandre Oliva: SVR4 style ptys don't work with osf */
248#ifdef __osf__
249# undef HAVE_SVR4_PTYS
250#endif
251
252/*****************************************************************
253 *   utmp handling
254 */
255
256#ifdef GETUTENT
257  typedef char *slot_t;
258#else
259  typedef int slot_t;
260#endif
261
262#if defined(UTMPOK) || defined(BUGGYGETLOGIN)
263# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux)
264#  include <utmpx.h>
265#  define UTMPFILE	UTMPX_FILE
266#  define utmp		utmpx
267#  define getutent	getutxent
268#  define getutid	getutxid
269#  define getutline	getutxline
270#  define pututline	pututxline
271#  define setutent	setutxent
272#  define endutent	endutxent
273#  define ut_time	ut_xtime
274# else /* SVR4 */
275#  include <utmp.h>
276# endif /* SVR4 */
277# ifdef apollo
278   /*
279    * We don't have GETUTENT, so we dig into utmp ourselves.
280    * But we save the permanent filedescriptor and
281    * open utmp just when we need to.
282    * This code supports an unsorted utmp. jw.
283    */
284#  define UTNOKEEP
285# endif /* apollo */
286
287# ifndef UTMPFILE
288#  ifdef UTMP_FILE
289#   define UTMPFILE	UTMP_FILE
290#  else
291#   ifdef _PATH_UTMP
292#    define UTMPFILE	_PATH_UTMP
293#   else
294#    define UTMPFILE	"/etc/utmp"
295#   endif /* _PATH_UTMP */
296#  endif
297# endif
298
299#endif /* UTMPOK || BUGGYGETLOGIN */
300
301#if !defined(UTMPOK) && defined(USRLIMIT)
302# undef USRLIMIT
303#endif
304
305#ifdef LOGOUTOK
306# ifndef LOGINDEFAULT
307#  define LOGINDEFAULT 0
308# endif
309#else
310# ifdef LOGINDEFAULT
311#  undef LOGINDEFAULT
312# endif
313# define LOGINDEFAULT 1
314#endif
315
316
317/*****************************************************************
318 *    file stuff
319 */
320
321#ifndef F_OK
322#define F_OK 0
323#endif
324#ifndef X_OK
325#define X_OK 1
326#endif
327#ifndef W_OK
328#define W_OK 2
329#endif
330#ifndef R_OK
331#define R_OK 4
332#endif
333
334#ifndef S_IFIFO
335#define S_IFIFO  0010000
336#endif
337#ifndef S_IREAD
338#define S_IREAD  0000400
339#endif
340#ifndef S_IWRITE
341#define S_IWRITE 0000200
342#endif
343#ifndef S_IEXEC
344#define S_IEXEC  0000100
345#endif
346
347#if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO)
348#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
349#endif
350#if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK)
351#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
352#endif
353#if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR)
354#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
355#endif
356#if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR)
357#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
358#endif
359#if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK)
360#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
361#endif
362
363/*
364 * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK:
365 *
366 *     O_NONBLOCK     Same as O_NDELAY above.
367 *
368 * on the very same SunOS 4.1.3, I traced the open system call and found
369 * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked,
370 * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY  |O_NOCTTY) went through.
371 *
372 * For this simple reason I now favour O_NDELAY. jw. 4.5.95
373 */
374#if defined(sun) && !defined(SVR4)
375# undef O_NONBLOCK
376#endif
377
378#if !defined(O_NONBLOCK) && defined(O_NDELAY)
379# define O_NONBLOCK O_NDELAY
380#endif
381
382#if !defined(FNBLOCK) && defined(FNONBLOCK)
383# define FNBLOCK FNONBLOCK
384#endif
385#if !defined(FNBLOCK) && defined(FNDELAY)
386# define FNBLOCK FNDELAY
387#endif
388#if !defined(FNBLOCK) && defined(O_NONBLOCK)
389# define FNBLOCK O_NONBLOCK
390#endif
391
392#ifndef POSIX
393#undef mkfifo
394#define mkfifo(n,m) mknod(n,S_IFIFO|(m),0)
395#endif
396
397#if !defined(HAVE_LSTAT) && !defined(lstat)
398# define lstat stat
399#endif
400
401/*****************************************************************
402 *    signal handling
403 */
404
405#ifdef SIGVOID
406# define SIGRETURN
407# define sigret_t void
408#else
409# define SIGRETURN return 0;
410# define sigret_t int
411#endif
412
413/* Geeeee, reverse it? */
414#if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT)
415# define SIGHASARG
416#endif
417
418#ifdef SIGHASARG
419# define SIGPROTOARG   (int)
420# define SIGDEFARG     (sigsig) int sigsig;
421# define SIGARG        0
422#else
423# define SIGPROTOARG   (void)
424# define SIGDEFARG     ()
425# define SIGARG
426#endif
427
428#ifndef SIGCHLD
429#define SIGCHLD SIGCLD
430#endif
431
432#if defined(POSIX) || defined(hpux)
433# define signal xsignal
434#else
435# ifdef USESIGSET
436#  define signal sigset
437# endif /* USESIGSET */
438#endif
439
440/* used in screen.c and attacher.c */
441#ifndef NSIG		/* kbeal needs these w/o SYSV */
442# define NSIG 32
443#endif /* !NSIG */
444
445
446/*****************************************************************
447 *    Wait stuff
448 */
449
450#if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX)
451# include <sys/wait.h>
452#endif
453
454#ifndef WTERMSIG
455# ifndef BSDWAIT /* if wait is NOT a union: */
456#  define WTERMSIG(status) (status & 0177)
457# else
458#  define WTERMSIG(status) status.w_T.w_Termsig
459# endif
460#endif
461
462#ifndef WSTOPSIG
463# ifndef BSDWAIT /* if wait is NOT a union: */
464#  define WSTOPSIG(status) ((status >> 8) & 0377)
465# else
466#  define WSTOPSIG(status) status.w_S.w_Stopsig
467# endif
468#endif
469
470/* NET-2 uses WCOREDUMP */
471#if defined(WCOREDUMP) && !defined(WIFCORESIG)
472# define WIFCORESIG(status) WCOREDUMP(status)
473#endif
474
475#ifndef WIFCORESIG
476# ifndef BSDWAIT /* if wait is NOT a union: */
477#  define WIFCORESIG(status) (status & 0200)
478# else
479#  define WIFCORESIG(status) status.w_T.w_Coredump
480# endif
481#endif
482
483#ifndef WEXITSTATUS
484# ifndef BSDWAIT /* if wait is NOT a union: */
485#  define WEXITSTATUS(status) ((status >> 8) & 0377)
486# else
487#  define WEXITSTATUS(status) status.w_T.w_Retcode
488# endif
489#endif
490
491
492/*****************************************************************
493 *    select stuff
494 */
495
496#if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_)
497#include <sys/select.h>		/* for timeval + FD... */
498#endif
499
500/*
501 * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93
502 * tschmidt@vax.micron.com
503 */
504#ifndef FD_SET
505# ifndef SUNOS3
506typedef struct fd_set { int fds_bits[1]; } fd_set;
507# endif
508# define FD_ZERO(fd) ((fd)->fds_bits[0] = 0)
509# define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b))
510# define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b))
511# define FD_SETSIZE 32
512#endif
513
514
515/*****************************************************************
516 *    user defineable stuff
517 */
518
519#ifndef TERMCAP_BUFSIZE
520# define TERMCAP_BUFSIZE 2048
521#endif
522
523#ifndef MAXPATHLEN
524# define MAXPATHLEN 1024
525#endif
526
527/*
528 * you may try to vary this value. Use low values if your (VMS) system
529 * tends to choke when pasting. Use high values if you want to test
530 * how many characters your pty's can buffer.
531 */
532#define IOSIZE		4096
533
534