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