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