| 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 | #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 |
| 505 | typedef 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 |