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.2 2020/09/15 02:05:29 christos 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 176#ifdef BUILTIN_TELNET 177# include <netinet/in.h> 178# include <arpa/inet.h> 179#endif 180 181#if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME)) 182# undef USE_LOCALE 183#endif 184 185/***************************************************************** 186 * terminal handling 187 */ 188 189#if defined (POSIX) || defined (__FreeBSD__) 190# include <termios.h> 191# ifdef hpux 192# include <bsdtty.h> 193# endif /* hpux */ 194# ifdef NCCS 195# define MAXCC NCCS 196# else 197# define MAXCC 256 198# endif 199#else /* POSIX */ 200# ifdef TERMIO 201# include <termio.h> 202# ifdef NCC 203# define MAXCC NCC 204# else 205# define MAXCC 256 206# endif 207# ifdef CYTERMIO 208# include <cytermio.h> 209# endif 210# else /* TERMIO */ 211# if defined (HAVE_SGTTY_H) 212# include <sgtty.h> 213# endif 214# endif /* TERMIO */ 215#endif /* POSIX */ 216 217#ifndef VDISABLE 218# ifdef _POSIX_VDISABLE 219# define VDISABLE _POSIX_VDISABLE 220# else 221# define VDISABLE 0377 222# endif /* _POSIX_VDISABLE */ 223#endif /* !VDISABLE */ 224 225 226/* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD) 227 * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE) 228 * to hold the whole packet at first read(). 229 * (Marc Boucher) 230 * 231 * matthew green: 232 * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100 233 * 234 * Joe Traister: On AIX4, programs like irc won't work if screen 235 * uses TIOCPKT (select fails to return on pty read). 236 */ 237#if defined(sgi) || defined(DGUX) || defined(_IBMR2) 238# undef TIOCPKT 239#endif 240 241/* linux ncurses is broken, we have to use our own tputs */ 242#if defined(linux) && defined(TERMINFO) 243# define tputs xtputs 244#endif 245 246/* Alexandre Oliva: SVR4 style ptys don't work with osf */ 247#ifdef __osf__ 248# undef HAVE_SVR4_PTYS 249#endif 250 251/***************************************************************** 252 * utmp handling 253 */ 254 255#ifdef GETUTENT 256 typedef char *slot_t; 257#else 258 typedef int slot_t; 259#endif 260 261#if defined(UTMPOK) || defined(BUGGYGETLOGIN) 262# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux) 263# include <utmpx.h> 264# define UTMPFILE UTMPX_FILE 265# define utmp utmpx 266# define getutent getutxent 267# define getutid getutxid 268# define getutline getutxline 269# define pututline pututxline 270# define setutent setutxent 271# define endutent endutxent 272# define ut_time ut_xtime 273# else /* SVR4 */ 274# include <utmp.h> 275# endif /* SVR4 */ 276# ifdef apollo 277 /* 278 * We don't have GETUTENT, so we dig into utmp ourselves. 279 * But we save the permanent filedescriptor and 280 * open utmp just when we need to. 281 * This code supports an unsorted utmp. jw. 282 */ 283# define UTNOKEEP 284# endif /* apollo */ 285 286# ifndef UTMPFILE 287# ifdef UTMP_FILE 288# define UTMPFILE UTMP_FILE 289# else 290# ifdef _PATH_UTMP 291# define UTMPFILE _PATH_UTMP 292# else 293# define UTMPFILE "/etc/utmp" 294# endif /* _PATH_UTMP */ 295# endif 296# endif 297 298#endif /* UTMPOK || BUGGYGETLOGIN */ 299 300#if !defined(UTMPOK) && defined(USRLIMIT) 301# undef USRLIMIT 302#endif 303 304#ifdef LOGOUTOK 305# ifndef LOGINDEFAULT 306# define LOGINDEFAULT 0 307# endif 308#else 309# ifdef LOGINDEFAULT 310# undef LOGINDEFAULT 311# endif 312# define LOGINDEFAULT 1 313#endif 314 315 316/***************************************************************** 317 * file stuff 318 */ 319 320#ifndef F_OK 321#define F_OK 0 322#endif 323#ifndef X_OK 324#define X_OK 1 325#endif 326#ifndef W_OK 327#define W_OK 2 328#endif 329#ifndef R_OK 330#define R_OK 4 331#endif 332 333#ifndef S_IFIFO 334#define S_IFIFO 0010000 335#endif 336#ifndef S_IREAD 337#define S_IREAD 0000400 338#endif 339#ifndef S_IWRITE 340#define S_IWRITE 0000200 341#endif 342#ifndef S_IEXEC 343#define S_IEXEC 0000100 344#endif 345 346#if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO) 347#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) 348#endif 349#if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK) 350#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) 351#endif 352#if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR) 353#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) 354#endif 355#if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR) 356#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 357#endif 358#if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK) 359#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) 360#endif 361 362/* 363 * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK: 364 * 365 * O_NONBLOCK Same as O_NDELAY above. 366 * 367 * on the very same SunOS 4.1.3, I traced the open system call and found 368 * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked, 369 * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through. 370 * 371 * For this simple reason I now favour O_NDELAY. jw. 4.5.95 372 */ 373#if defined(sun) && !defined(SVR4) 374# undef O_NONBLOCK 375#endif 376 377#if !defined(O_NONBLOCK) && defined(O_NDELAY) 378# define O_NONBLOCK O_NDELAY 379#endif 380 381#if !defined(FNBLOCK) && defined(FNONBLOCK) 382# define FNBLOCK FNONBLOCK 383#endif 384#if !defined(FNBLOCK) && defined(FNDELAY) 385# define FNBLOCK FNDELAY 386#endif 387#if !defined(FNBLOCK) && defined(O_NONBLOCK) 388# define FNBLOCK O_NONBLOCK 389#endif 390 391#ifndef POSIX 392#undef mkfifo 393#define mkfifo(n,m) mknod(n,S_IFIFO|(m),0) 394#endif 395 396#if !defined(HAVE_LSTAT) && !defined(lstat) 397# define lstat stat 398#endif 399 400/***************************************************************** 401 * signal handling 402 */ 403 404#ifdef SIGVOID 405# define SIGRETURN 406# define sigret_t void 407#else 408# define SIGRETURN return 0; 409# define sigret_t int 410#endif 411 412/* Geeeee, reverse it? */ 413#if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT) 414# define SIGHASARG 415#endif 416 417#ifdef SIGHASARG 418# define SIGPROTOARG (int) 419# define SIGDEFARG (sigsig) int sigsig; 420# define SIGARG 0 421#else 422# define SIGPROTOARG (void) 423# define SIGDEFARG () 424# define SIGARG 425#endif 426 427#ifndef SIGCHLD 428#define SIGCHLD SIGCLD 429#endif 430 431#if defined(POSIX) || defined(hpux) 432# define signal xsignal 433#else 434# ifdef USESIGSET 435# define signal sigset 436# endif /* USESIGSET */ 437#endif 438 439/* used in screen.c and attacher.c */ 440#ifndef NSIG /* kbeal needs these w/o SYSV */ 441# define NSIG 32 442#endif /* !NSIG */ 443 444 445/***************************************************************** 446 * Wait stuff 447 */ 448 449#if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX) 450# include <sys/wait.h> 451#endif 452 453#ifndef WTERMSIG 454# ifndef BSDWAIT /* if wait is NOT a union: */ 455# define WTERMSIG(status) (status & 0177) 456# else 457# define WTERMSIG(status) status.w_T.w_Termsig 458# endif 459#endif 460 461#ifndef WSTOPSIG 462# ifndef BSDWAIT /* if wait is NOT a union: */ 463# define WSTOPSIG(status) ((status >> 8) & 0377) 464# else 465# define WSTOPSIG(status) status.w_S.w_Stopsig 466# endif 467#endif 468 469/* NET-2 uses WCOREDUMP */ 470#if defined(WCOREDUMP) && !defined(WIFCORESIG) 471# define WIFCORESIG(status) WCOREDUMP(status) 472#endif 473 474#ifndef WIFCORESIG 475# ifndef BSDWAIT /* if wait is NOT a union: */ 476# define WIFCORESIG(status) (status & 0200) 477# else 478# define WIFCORESIG(status) status.w_T.w_Coredump 479# endif 480#endif 481 482#ifndef WEXITSTATUS 483# ifndef BSDWAIT /* if wait is NOT a union: */ 484# define WEXITSTATUS(status) ((status >> 8) & 0377) 485# else 486# define WEXITSTATUS(status) status.w_T.w_Retcode 487# endif 488#endif 489 490 491/***************************************************************** 492 * select stuff 493 */ 494 495#if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_) || defined (__INTERIX) 496#include <sys/select.h> /* for timeval + FD... */ 497#endif 498 499/* 500 * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93 501 * tschmidt@vax.micron.com 502 */ 503#ifndef FD_SET 504# ifndef SUNOS3 505typedef struct fd_set { int fds_bits[1]; } fd_set; 506# endif 507# define FD_ZERO(fd) ((fd)->fds_bits[0] = 0) 508# define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b)) 509# define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b)) 510# define FD_SETSIZE 32 511#endif 512 513 514/***************************************************************** 515 * user defineable stuff 516 */ 517 518#ifndef TERMCAP_BUFSIZE 519# define TERMCAP_BUFSIZE 2048 520#endif 521 522#ifndef MAXPATHLEN 523# define MAXPATHLEN 1024 524#endif 525 526/* 527 * you may try to vary this value. Use low values if your (VMS) system 528 * tends to choke when pasting. Use high values if you want to test 529 * how many characters your pty's can buffer. 530 */ 531#define IOSIZE 4096 532