1 /* $Header: /p/tcsh/cvsroot/tcsh/tc.os.h,v 3.101 2006/02/14 00:52:52 christos Exp $ */ 2 /* 3 * tc.os.h: Shell os dependent defines 4 */ 5 /*- 6 * Copyright (c) 1980, 1991 The Regents of the University of California. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 #ifndef _h_tc_os 34 #define _h_tc_os 35 36 #ifdef notdef 37 /* 38 * for SVR4 and linux we used to fork pipelines backwards. 39 * This should not be needed any more. 40 * more info in sh.sem.c 41 */ 42 # define BACKPIPE 43 #endif /* notdef */ 44 45 #ifdef __CYGWIN__ 46 # undef NOFILE 47 # define NOFILE sysconf(_SC_OPEN_MAX) 48 #endif 49 50 #ifdef _VMS_POSIX 51 # ifndef NOFILE 52 # define NOFILE 64 53 # endif /* NOFILE */ 54 # define nice(a) setprio((getpid()),a) 55 # include <sys/time.h> /* for time stuff in tc.prompt.c */ 56 # include <limits.h> 57 #endif /* atp vmsposix */ 58 59 #if defined(DECOSF1) || defined(HPUXVERSION) 60 # include <sys/signal.h> 61 #endif /* DECOSF1 || HPUXVERSION */ 62 63 #ifdef DECOSF1 64 # include <sys/ioctl.h> 65 #endif /* DECOSF1 */ 66 67 #if defined(OPEN_MAX) && !defined(NOFILE) 68 # define NOFILE OPEN_MAX 69 #endif /* OPEN_MAX && !NOFILE */ 70 71 #if defined(USR_NFDS) && !defined(NOFILE) 72 # define NOFILE USR_NFDS 73 #endif /* USR_NFDS && !NOFILE */ 74 75 #ifndef NOFILE 76 # define NOFILE 256 77 #endif /* NOFILE */ 78 79 #ifdef OREO 80 # include <sys/time.h> 81 # ifdef notdef 82 /* Don't include it, because it defines things we don't really have */ 83 # include <sys/resource.h> 84 # endif /* notdef */ 85 # ifdef POSIX 86 # include <sys/tty.h> 87 # include <termios.h> 88 # endif /* POSIX */ 89 #endif /* OREO */ 90 91 #ifdef convex 92 # include <sys/dmon.h> 93 #endif /* convex */ 94 95 #ifdef titan 96 extern int end; 97 #endif /* titan */ 98 99 #ifdef hpux 100 # ifdef lint 101 /* 102 * Hpux defines struct ucred, in <sys/user.h>, but if I include that 103 * then I need to include the *world* 104 * [all this to pass lint cleanly!!!] 105 * so I define struct ucred here... 106 */ 107 struct ucred { 108 int foo; 109 }; 110 # endif /* lint */ 111 112 /* 113 * hpux 7.0 does not define it 114 */ 115 # ifndef CSUSP 116 # define CSUSP 032 117 # endif /* CSUSP */ 118 119 # include <signal.h> 120 # if !defined(hp9000s500) && !(defined(SIGRTMAX) || defined(SIGRTMIN)) 121 /* 122 * hpux < 7 123 */ 124 # include <sys/bsdtty.h> 125 # endif /* !hp9000s500 && !(SIGRTMAX || SIGRTMIN) */ 126 127 # ifndef TIOCSTI 128 # include <sys/strtio.h> 129 # endif 130 #endif /* hpux */ 131 132 /* 133 * ISC does not define CSUSP 134 */ 135 #ifdef ISC 136 # ifndef CSUSP 137 # define CSUSP 032 138 # endif /* CSUSP */ 139 # if defined(POSIX) && !defined(TIOCGWINSZ) 140 /* 141 * ISC defines this only in termio.h. If we are using POSIX and include 142 * termios.h, then we define it ourselves so that window resizing works. 143 */ 144 # define TIOCGWINSZ (('T'<<8)|104) 145 # endif /* POSIX && !TIOCGWINSZ */ 146 #endif /* ISC */ 147 148 #ifdef ISC202 149 # undef TIOCGWINSZ 150 #endif /* ISC202 */ 151 152 /* 153 * XXX: This will be changed soon to 154 * #if (SYSVREL > 0) && defined(TIOCGWINSZ) 155 * If that breaks on your machine, let me know. 156 * 157 * It would break on glibc, where all this is 158 * defined in <termios.h>. Wrapper added. 159 */ 160 #if !defined(linux) && !defined(__GNU__) && !defined(__GLIBC__) && !defined(_VMS_POSIX) 161 # if defined(INTEL) || defined(u3b2) || defined (u3b5) || defined(ub15) || defined(u3b20d) || defined(ISC) || defined(SCO) || defined(tower32) 162 # ifdef TIOCGWINSZ 163 /* 164 * for struct winsiz 165 */ 166 # include <sys/stream.h> 167 # include <sys/ptem.h> 168 # endif /* TIOCGWINSZ */ 169 # endif /* INTEL || u3b2 || u3b5 || ub15 || u3b20d || ISC || SCO || tower32 */ 170 #endif /* !glibc && !_VMS_POSIX */ 171 172 #ifdef IRIS4D 173 # include <sys/time.h> 174 # include <sys/resource.h> 175 #endif /* IRIS4D */ 176 177 /* 178 * For some versions of system V software, specially ones that use the 179 * Wollongong Software TCP/IP, the FIOCLEX, FIONCLEX, FIONBIO calls 180 * might not work correctly for file descriptors [they work only for 181 * sockets]. So we try to use first the fcntl() and we only use the 182 * ioctl() form, only if we don't have the fcntl() one. 183 * 184 * From: scott@craycos.com (Scott Bolte) 185 */ 186 #ifndef WINNT_NATIVE 187 # ifdef F_SETFD 188 # ifndef FD_CLOEXEC 189 # define FD_CLOEXEC 1 190 # endif 191 # define close_on_exec(fd, v) fcntl((fd), F_SETFD, ((v) ? FD_CLOEXEC : 0)) 192 # else /* !F_SETFD */ 193 # ifdef FIOCLEX 194 # define close_on_exec(fd, v) ioctl((fd), ((v) ? FIOCLEX : FIONCLEX), NULL) 195 # else /* !FIOCLEX */ 196 # define close_on_exec(fd, v) /* Nothing */ 197 # endif /* FIOCLEX */ 198 # endif /* F_SETFD */ 199 #else /* WINNT_NATIVE */ 200 # define close_on_exec(fd, v) nt_close_on_exec((fd),(v)) 201 #endif /* !WINNT_NATIVE */ 202 203 /* 204 * Stat 205 */ 206 #ifdef ISC 207 /* these are not defined for _POSIX_SOURCE under ISC 2.2 */ 208 # ifndef S_IFMT 209 # define S_IFMT 0170000 /* type of file */ 210 # define S_IFDIR 0040000 /* directory */ 211 # define S_IFCHR 0020000 /* character special */ 212 # define S_IFBLK 0060000 /* block special */ 213 # define S_IFREG 0100000 /* regular */ 214 # define S_IFIFO 0010000 /* fifo */ 215 # define S_IFNAM 0050000 /* special named file */ 216 # ifndef ISC202 217 # define S_IFLNK 0120000 /* symbolic link */ 218 # endif /* ISC202 */ 219 # endif /* S_IFMT */ 220 #endif /* ISC */ 221 222 #ifdef STAT_MACROS_BROKEN 223 # undef S_ISDIR 224 # undef S_ISCHR 225 # undef S_ISBLK 226 # undef S_ISREG 227 # undef S_ISFIFO 228 # undef S_ISNAM 229 # undef S_ISLNK 230 # undef S_ISSOCK 231 #endif /* STAT_MACROS_BROKEN */ 232 233 #ifdef S_IFMT 234 # if !defined(S_ISDIR) && defined(S_IFDIR) 235 # define S_ISDIR(a) (((a) & S_IFMT) == S_IFDIR) 236 # endif /* ! S_ISDIR && S_IFDIR */ 237 # if !defined(S_ISCHR) && defined(S_IFCHR) 238 # define S_ISCHR(a) (((a) & S_IFMT) == S_IFCHR) 239 # endif /* ! S_ISCHR && S_IFCHR */ 240 # if !defined(S_ISBLK) && defined(S_IFBLK) 241 # define S_ISBLK(a) (((a) & S_IFMT) == S_IFBLK) 242 # endif /* ! S_ISBLK && S_IFBLK */ 243 # if !defined(S_ISREG) && defined(S_IFREG) 244 # define S_ISREG(a) (((a) & S_IFMT) == S_IFREG) 245 # endif /* ! S_ISREG && S_IFREG */ 246 # if !defined(S_ISFIFO) && defined(S_IFIFO) 247 # define S_ISFIFO(a) (((a) & S_IFMT) == S_IFIFO) 248 # endif /* ! S_ISFIFO && S_IFIFO */ 249 # if !defined(S_ISNAM) && defined(S_IFNAM) 250 # define S_ISNAM(a) (((a) & S_IFMT) == S_IFNAM) 251 # endif /* ! S_ISNAM && S_IFNAM */ 252 # if !defined(S_ISLNK) && defined(S_IFLNK) 253 # define S_ISLNK(a) (((a) & S_IFMT) == S_IFLNK) 254 # endif /* ! S_ISLNK && S_IFLNK */ 255 # if !defined(S_ISSOCK) && defined(S_IFSOCK) 256 # define S_ISSOCK(a) (((a) & S_IFMT) == S_IFSOCK) 257 # endif /* ! S_ISSOCK && S_IFSOCK */ 258 #endif /* S_IFMT */ 259 260 #ifdef tower32 261 /* The header files lie; we really don't have symlinks */ 262 # undef S_ISLNK 263 # undef S_IFLNK 264 #endif /* tower32 */ 265 266 #ifndef S_IREAD 267 # define S_IREAD 0000400 268 #endif /* S_IREAD */ 269 #ifndef S_IROTH 270 # define S_IROTH (S_IREAD >> 6) 271 #endif /* S_IROTH */ 272 #ifndef S_IRGRP 273 # define S_IRGRP (S_IREAD >> 3) 274 #endif /* S_IRGRP */ 275 #ifndef S_IRUSR 276 # define S_IRUSR S_IREAD 277 #endif /* S_IRUSR */ 278 279 #ifndef S_IWRITE 280 # define S_IWRITE 0000200 281 #endif /* S_IWRITE */ 282 #ifndef S_IWOTH 283 # define S_IWOTH (S_IWRITE >> 6) 284 #endif /* S_IWOTH */ 285 #ifndef S_IWGRP 286 # define S_IWGRP (S_IWRITE >> 3) 287 #endif /* S_IWGRP */ 288 #ifndef S_IWUSR 289 # define S_IWUSR S_IWRITE 290 #endif /* S_IWUSR */ 291 292 #ifndef S_IEXEC 293 # define S_IEXEC 0000100 294 #endif /* S_IEXEC */ 295 #ifndef S_IXOTH 296 # define S_IXOTH (S_IEXEC >> 6) 297 #endif /* S_IXOTH */ 298 #ifndef S_IXGRP 299 # define S_IXGRP (S_IEXEC >> 3) 300 #endif /* S_IXGRP */ 301 #ifndef S_IXUSR 302 # define S_IXUSR S_IEXEC 303 #endif /* S_IXUSR */ 304 305 #ifndef S_ISUID 306 # define S_ISUID 0004000 /* setuid */ 307 #endif /* S_ISUID */ 308 #ifndef S_ISGID 309 # define S_ISGID 0002000 /* setgid */ 310 #endif /* S_ISGID */ 311 #ifndef S_ISVTX 312 # define S_ISVTX 0001000 /* sticky */ 313 #endif /* S_ISVTX */ 314 #ifndef S_ENFMT 315 # define S_ENFMT S_ISGID /* record locking enforcement flag */ 316 #endif /* S_ENFMT */ 317 318 /* the following macros are for POSIX conformance */ 319 #ifndef S_IRWXU 320 # define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) 321 #endif /* S_IRWXU */ 322 #ifndef S_IRWXG 323 # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) 324 #endif /* S_IRWXG */ 325 #ifndef S_IRWXO 326 # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) 327 #endif /* S_IRWXO */ 328 329 /* 330 * Access() 331 */ 332 #ifndef F_OK 333 # define F_OK 0 334 #endif /* F_OK */ 335 #ifndef X_OK 336 # define X_OK 1 337 #endif /* X_OK */ 338 #ifndef W_OK 339 # define W_OK 2 340 #endif /* W_OK */ 341 #ifndef R_OK 342 # define R_OK 4 343 #endif /* R_OK */ 344 345 /* 346 * Open() 347 */ 348 #ifndef O_RDONLY 349 # define O_RDONLY 0 350 #endif /* O_RDONLY */ 351 #ifndef O_WRONLY 352 # define O_WRONLY 1 353 #endif /* O_WRONLY */ 354 #ifndef O_RDWR 355 # define O_RDWR 2 356 #endif /* O_RDWR */ 357 358 /* 359 * Lseek() 360 */ 361 #ifndef L_SET 362 # ifdef SEEK_SET 363 # define L_SET SEEK_SET 364 # else /* !SEEK_SET */ 365 # define L_SET 0 366 # endif /* SEEK_SET */ 367 #endif /* L_SET */ 368 #ifndef L_INCR 369 # ifdef SEEK_CUR 370 # define L_INCR SEEK_CUR 371 # else /* !SEEK_CUR */ 372 # define L_INCR 1 373 # endif /* SEEK_CUR */ 374 #endif /* L_INCR */ 375 #ifndef L_XTND 376 # ifdef SEEK_END 377 # define L_XTND SEEK_END 378 # else /* !SEEK_END */ 379 # define L_XTND 2 380 # endif /* SEEK_END */ 381 #endif /* L_XTND */ 382 383 #if !defined (HAVE_SETPGID) && !defined (SETPGRP_VOID) 384 # define setpgid(pid, pgrp) setpgrp(pid, pgrp) 385 #endif 386 387 #if defined(BSDJOBS) && !(defined(POSIX) && defined(POSIXJOBS)) 388 # define NEEDtcgetpgrp 389 #endif /* BSDJOBS && !(POSIX && POSIXJOBS) */ 390 391 #ifdef RENO 392 /* 393 * RENO has this broken. It is fixed on 4.4BSD 394 */ 395 # define NEEDtcgetpgrp 396 #endif /* RENO */ 397 398 #ifdef SXA 399 # ifndef _BSDX_ 400 /* 401 * Only needed in the system V environment. 402 */ 403 # define setrlimit bsd_setrlimit 404 # define getrlimit bsd_getrlimit 405 # endif /* _BSDX_ */ 406 #endif /* SXA */ 407 408 #if defined(_MINIX) || defined(__EMX__) 409 # define HAVENOLIMIT 410 /* 411 * Minix does not have these, so... 412 */ 413 # define getpgrp getpid 414 #endif /* _MINIX || __EMX__ */ 415 416 #ifdef __EMX__ 417 /* XXX: How can we get the tty name in emx? */ 418 # define ttyname(fd) (isatty(fd) ? "/dev/tty" : NULL) 419 #endif /* __EMX__ */ 420 421 #ifndef S_IFLNK 422 # define lstat stat 423 #endif /* S_IFLNK */ 424 425 426 #if defined(BSDTIMES) && !defined(_SEQUENT_) 427 typedef struct timeval timeval_t; 428 #endif /* BSDTIMES && ! _SEQUENT_ */ 429 430 #ifdef NeXT 431 /* 432 * From Tony_Mason@transarc.com, override NeXT's malloc stuff. 433 */ 434 # define malloc tcsh_malloc 435 # define calloc tcsh_calloc 436 # define realloc tcsh_realloc 437 # define free tcsh_free 438 #endif /* NeXT */ 439 440 #if defined(HAVE_GETHOSTNAME) && !HAVE_DECL_GETHOSTNAME 441 extern int gethostname (char *, int); 442 #endif 443 444 #ifndef GETPGRP_VOID 445 # define mygetpgrp() getpgrp(0) 446 #else 447 # define mygetpgrp() getpgrp() 448 #endif 449 450 #if !defined(POSIX) || defined(SUNOS4) || defined(UTekV) || defined(sysV88) 451 extern time_t time(); 452 extern char *getenv(); 453 extern int atoi(); 454 # ifndef __EMX__ 455 extern char *ttyname(); 456 # endif /* __EMX__ */ 457 458 459 # if defined(SUNOS4) 460 # ifndef toupper 461 extern int toupper (int); 462 # endif /* toupper */ 463 # ifndef tolower 464 extern int tolower (int); 465 # endif /* tolower */ 466 extern caddr_t sbrk (int); 467 # else /* !SUNOS4 */ 468 # ifndef WINNT_NATIVE 469 # ifdef hpux 470 extern void abort(); 471 extern void qsort(); 472 # endif /* hpux */ 473 # endif /* !WINNT_NATIVE */ 474 # endif /* SUNOS4 */ 475 #ifndef _CX_UX 476 extern void perror(); 477 #endif 478 479 # ifdef BSD 480 extern uid_t getuid(), geteuid(); 481 extern gid_t getgid(), getegid(); 482 # endif /* BSD */ 483 484 # ifdef SYSMALLOC 485 extern memalign_t malloc(); 486 extern memalign_t realloc(); 487 extern memalign_t calloc(); 488 extern void free(); 489 # endif /* SYSMALLOC */ 490 491 # ifdef BSDJOBS 492 # ifdef BSDTIMES 493 # ifdef __MACHTEN__ 494 extern pid_t wait3(); 495 # endif /* __MACHTEN__ */ 496 # endif /* BSDTIMES */ 497 # endif /* BSDJOBS */ 498 499 # if (!defined(fps500) && !defined(apollo) && !defined(__lucid) && !defined(HPBSD) && !defined(DECOSF1)) 500 extern void setpwent(); 501 extern void endpwent(); 502 # endif /* !fps500 && !apollo && !__lucid && !HPBSD && !DECOSF1 */ 503 504 # ifndef __STDC__ 505 extern struct passwd *getpwuid(), *getpwnam(), *getpwent(); 506 # ifdef HAVE_SHADOW_H 507 extern struct spwd *getspnam(), *getspent(); 508 # endif /* HAVE_SHADOW_H */ 509 # if defined(HAVE_AUTH_H) && defined(HAVE_GETAUTHUID) 510 extern struct authorization *getauthuid(); 511 # endif /* HAVE_AUTH_H && HAVE_GETAUTHUID */ 512 # endif /* __STDC__ */ 513 514 # ifndef getcwd 515 extern char *getcwd(); 516 # endif /* getcwd */ 517 518 #else /* POSIX || !SUNOS4 || !UTekV || !sysV88 */ 519 520 # if (defined(SUNOS4) && !defined(__GNUC__)) || defined(_IBMR2) || defined(_IBMESA) 521 extern char *getvwd(); 522 # endif /* (SUNOS4 && ! __GNUC__) || _IBMR2 || _IBMESA */ 523 524 # ifdef SCO 525 extern char *ttyname(); 526 # endif /* SCO */ 527 528 # ifdef __clipper__ 529 extern char *ttyname(); 530 # endif /* __clipper__ */ 531 532 #endif /* !POSIX || SUNOS4 || UTekV || sysV88 */ 533 534 #if defined(SUNOS4) && __GNUC__ == 2 535 /* 536 * Somehow these are missing 537 */ 538 extern int ioctl (int, int, ...); 539 extern int readlink (const char *, char *, size_t); 540 extern void setgrent (void); 541 extern void endgrent (void); 542 # ifdef REMOTEHOST 543 # ifndef _SOCKLEN_T /* Avoid Solaris 2.7 bogosity. */ 544 struct sockaddr; 545 extern int getpeername (int, struct sockaddr *, int *); 546 # endif /* _SOCKLEN_T */ 547 # endif /* REMOTEHOST */ 548 #endif /* SUNOS4 && __GNUC__ == 2 */ 549 550 #if (defined(BSD) && !defined(BSD4_4)) || defined(SUNOS4) 551 # if defined(__alpha) && defined(__osf__) && DECOSF1 < 200 552 extern void bcopy (const void *, void *, size_t); 553 # define memmove(a, b, c) (bcopy((char *) (b), (char *) (a), (int) (c)), a) 554 # endif /* __alpha && __osf__ && DECOSF1 < 200 */ 555 #endif /* (BSD && !BSD4_4) || SUNOS4 */ 556 557 #ifdef SUNOS4 558 # include <memory.h> /* memset should be declared in <string.h> but isn't */ 559 #endif /* SUNOS4 */ 560 561 #if SYSVREL == 4 562 # ifdef REMOTEHOST 563 /* Irix6 defines getpeername(int, void *, int *) which conflicts with 564 the definition below. */ 565 # if !defined(__sgi) && !defined(_OSD_POSIX) && !defined(__MVS__) 566 # ifndef _SOCKLEN_T /* Avoid Solaris 2.7 bogosity. */ 567 struct sockaddr; 568 extern int getpeername (int, struct sockaddr *, int *); 569 # endif /* _SOCKLEN_T */ 570 # endif /* !__sgi && !_OSD_POSIX && !__MVS__ */ 571 # endif /* REMOTEHOST */ 572 # ifndef BSDTIMES 573 extern int getrlimit (int, struct rlimit *); 574 extern int setrlimit (int, const struct rlimit *); 575 # endif /* !BSDTIMES */ 576 # if defined(SOLARIS2) 577 extern char *strerror (int); 578 # endif /* SOLARIS2 */ 579 #endif /* SYSVREL == 4 */ 580 581 #if defined(__alpha) && defined(__osf__) && DECOSF1 < 200 582 /* These are ok for 1.3, but conflict with the header files for 2.0 */ 583 extern char *sbrk (ssize_t); 584 extern int ioctl (int, unsigned long, char *); 585 extern pid_t vfork (void); 586 extern int killpg (pid_t, int); 587 #endif /* __osf__ && __alpha && DECOSF1 < 200 */ 588 589 #ifndef va_copy 590 # ifdef __va_copy 591 # define va_copy(DEST, SRC) __va_copy(DEST, SRC) 592 # else 593 # define va_copy(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof(va_list)) 594 # endif 595 #endif 596 597 #endif /* _h_tc_os */ 598