Start converting to GPL v3+ (ref: ticket #23900)
[screen-lua.git] / src / os.h
blobd30e61ceca638314a5ac0ce970d1c0696d0bd840
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
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 3, or (at your option)
9 * any later version.
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.
16 * You should have received a copy of the GNU General Public License
17 * along with this program (see the file COPYING); if not, see
18 * http://www.gnu.org/licenses/, or contact Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
21 ****************************************************************
22 * $Id$ FAU
25 #include <stdio.h>
26 #include <errno.h>
28 #include <sys/param.h>
30 /* In strict ANSI mode, HP-UX machines define __hpux but not hpux */
31 #if defined(__hpux) && !defined(hpux)
32 # define hpux
33 #endif
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 */
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
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 */
65 #ifndef linux /* all done in <errno.h> */
66 extern int errno;
67 #endif /* linux */
68 #ifndef HAVE_STRERROR
69 /* No macros, please */
70 #undef strerror
71 #endif
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 */
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
123 #if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
124 # include <time.h>
125 #endif
126 #include <sys/time.h>
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
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
142 #ifndef HAVE_GETCWD
143 # define getcwd(b,l) getwd(b)
144 #endif
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
159 #if defined(HAVE_SETRESUID) && !defined(HAVE_SETREUID)
160 # define setreuid(ruid, euid) setresuid(ruid, euid, -1)
161 # define setregid(rgid, egid) setresgid(rgid, egid, -1)
162 #endif
164 #if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) || defined(HAVE_SETRESUID)
165 # define USE_SETEUID
166 #endif
168 #if !defined(HAVE__EXIT) && !defined(_exit)
169 #define _exit(x) exit(x)
170 #endif
172 #ifndef HAVE_UTIMES
173 # define utimes utime
174 #endif
175 #ifndef HAVE_VSNPRINTF
176 # define vsnprintf xvsnprintf
177 #endif
179 #ifdef BUILTIN_TELNET
180 # include <netinet/in.h>
181 # include <arpa/inet.h>
182 #endif
184 #if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME))
185 # undef USE_LOCALE
186 #endif
188 /*****************************************************************
189 * terminal handling
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 */
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 */
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)
232 * matthew green:
233 * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100
235 * Joe Traister: On AIX4, programs like irc won't work if screen
236 * uses TIOCPKT (select fails to return on pty read).
238 #if defined(sgi) || defined(DGUX) || defined(_IBMR2)
239 # undef TIOCPKT
240 #endif
242 /* linux ncurses is broken, we have to use our own tputs */
243 #if defined(linux) && defined(TERMINFO)
244 # define tputs xtputs
245 #endif
247 /* Alexandre Oliva: SVR4 style ptys don't work with osf */
248 #ifdef __osf__
249 # undef HAVE_SVR4_PTYS
250 #endif
252 /*****************************************************************
253 * utmp handling
256 #ifdef GETUTENT
257 typedef char *slot_t;
258 #else
259 typedef int slot_t;
260 #endif
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
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.
284 # define UTNOKEEP
285 # endif /* apollo */
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
299 #endif /* UTMPOK || BUGGYGETLOGIN */
301 #if !defined(UTMPOK) && defined(USRLIMIT)
302 # undef USRLIMIT
303 #endif
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
317 /*****************************************************************
318 * file stuff
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
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
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
364 * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK:
366 * O_NONBLOCK Same as O_NDELAY above.
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.
372 * For this simple reason I now favour O_NDELAY. jw. 4.5.95
374 #if defined(sun) && !defined(SVR4)
375 # undef O_NONBLOCK
376 #endif
378 #if !defined(O_NONBLOCK) && defined(O_NDELAY)
379 # define O_NONBLOCK O_NDELAY
380 #endif
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
392 #ifndef POSIX
393 #undef mkfifo
394 #define mkfifo(n,m) mknod(n,S_IFIFO|(m),0)
395 #endif
397 #if !defined(HAVE_LSTAT) && !defined(lstat)
398 # define lstat stat
399 #endif
401 /*****************************************************************
402 * signal handling
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
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
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
428 #ifndef SIGCHLD
429 #define SIGCHLD SIGCLD
430 #endif
432 #if defined(POSIX) || defined(hpux)
433 # define signal xsignal
434 #else
435 # ifdef USESIGSET
436 # define signal sigset
437 # endif /* USESIGSET */
438 #endif
440 /* used in screen.c and attacher.c */
441 #ifndef NSIG /* kbeal needs these w/o SYSV */
442 # define NSIG 32
443 #endif /* !NSIG */
446 /*****************************************************************
447 * Wait stuff
450 #if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX)
451 # include <sys/wait.h>
452 #endif
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
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
470 /* NET-2 uses WCOREDUMP */
471 #if defined(WCOREDUMP) && !defined(WIFCORESIG)
472 # define WIFCORESIG(status) WCOREDUMP(status)
473 #endif
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
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
492 /*****************************************************************
493 * select stuff
496 #if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_)
497 #include <sys/select.h> /* for timeval + FD... */
498 #endif
501 * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93
502 * tschmidt@vax.micron.com
504 #ifndef FD_SET
505 # ifndef SUNOS3
506 typedef 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
515 /*****************************************************************
516 * user defineable stuff
519 #ifndef TERMCAP_BUFSIZE
520 # define TERMCAP_BUFSIZE 2048
521 #endif
523 #ifndef MAXPATHLEN
524 # define MAXPATHLEN 1024
525 #endif
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.
532 #define IOSIZE 4096