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> */ 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 532