|
|
1.1 ! root 1: /* sysh.unx -*- C -*- ! 2: The header file for the UNIX system dependent routines. ! 3: ! 4: Copyright (C) 1991, 1992 Ian Lance Taylor ! 5: ! 6: This file is part of the Taylor UUCP package. ! 7: ! 8: This program is free software; you can redistribute it and/or ! 9: modify it under the terms of the GNU General Public License as ! 10: published by the Free Software Foundation; either version 2 of the ! 11: License, or (at your option) any later version. ! 12: ! 13: This program is distributed in the hope that it will be useful, but ! 14: WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 16: General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU General Public License ! 19: along with this program; if not, write to the Free Software ! 20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: The author of the program may be contacted at [email protected] or ! 23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. ! 24: */ ! 25: ! 26: #ifndef SYSH_UNX_H ! 27: ! 28: #define SYSH_UNX_H ! 29: ! 30: #if ANSI_C ! 31: /* These structures are used in prototypes but are not defined in this ! 32: header file. */ ! 33: struct uuconf_system; ! 34: struct sconnection; ! 35: #endif ! 36: ! 37: /* Make sure the defines do not conflict. These are in this file ! 38: because they are Unix dependent. */ ! 39: #if HAVE_V2_LOCKFILES + HAVE_HDB_LOCKFILES + HAVE_SCO_LOCKFILES + HAVE_SVR4_LOCKFILES + HAVE_COHERENT_LOCKFILES != 1 ! 40: #error LOCKFILES define not set or duplicated ! 41: #endif ! 42: ! 43: /* SCO and SVR4 lockfiles are basically just like HDB lockfiles. */ ! 44: #if HAVE_SCO_LOCKFILES || HAVE_SVR4_LOCKFILES ! 45: #undef HAVE_HDB_LOCKFILES ! 46: #define HAVE_HDB_LOCKFILES 1 ! 47: #endif ! 48: ! 49: #if HAVE_BSD_TTY + HAVE_SYSV_TERMIO + HAVE_POSIX_TERMIOS != 1 ! 50: #error Terminal driver define not set or duplicated ! 51: #endif ! 52: ! 53: #if SPOOLDIR_V2 + SPOOLDIR_BSD42 + SPOOLDIR_BSD43 + SPOOLDIR_HDB + SPOOLDIR_ULTRIX + SPOOLDIR_SVR4 + SPOOLDIR_TAYLOR != 1 ! 54: #error Spool directory define not set or duplicated ! 55: #endif ! 56: ! 57: /* If setreuid is broken, don't use it. */ ! 58: #if HAVE_BROKEN_SETREUID ! 59: #undef HAVE_SETREUID ! 60: #define HAVE_SETREUID 0 ! 61: #endif ! 62: ! 63: /* Get some standard types from the configuration header file. */ ! 64: /* ! 65: #ifdef PID_T ! 66: typedef PID_T pid_t; ! 67: #endif ! 68: ! 69: #ifdef UID_T ! 70: typedef UID_T uid_t; ! 71: #endif ! 72: ! 73: #ifdef GID_T ! 74: typedef GID_T gid_t; ! 75: #endif ! 76: ! 77: #ifdef OFF_T ! 78: typedef OFF_T off_t; ! 79: #endif ! 80: ! 81: */ ! 82: ! 83: /* On Unix, binary files are the same as text files. */ ! 84: #define BINREAD "r" ! 85: #define BINWRITE "w" ! 86: ! 87: /* If we have sigaction, we can force system calls to not be ! 88: restarted. */ ! 89: #if HAVE_SIGACTION ! 90: #undef HAVE_RESTARTABLE_SYSCALLS ! 91: #define HAVE_RESTARTABLE_SYSCALLS 0 ! 92: #endif ! 93: ! 94: /* If we have sigvec, and we have HAVE_SIGVEC_SV_FLAGS, and ! 95: SV_INTERRUPT is defined, we can force system calls to not be ! 96: restarted (signal.h is included by uucp.h before this point, so ! 97: SV_INTERRUPT will be defined by now if it it ever is). */ ! 98: #if HAVE_SIGVEC && HAVE_SIGVEC_SV_FLAGS ! 99: #ifdef SV_INTERRUPT ! 100: #undef HAVE_RESTARTABLE_SYSCALLS ! 101: #define HAVE_RESTARTABLE_SYSCALLS 0 ! 102: #endif ! 103: #endif ! 104: ! 105: /* If we were cross-configured, we will have a value of -1 for ! 106: HAVE_RESTARTABLE_SYSCALLS. In this case, we try to guess what the ! 107: correct value should be. Yuck. If we have sigvec, but neither of ! 108: the above cases applied (which we know because they would have ! 109: changed HAVE_RESTARTABLE_SYSCALLS) then we are probably on 4.2BSD ! 110: and system calls are automatically restarted. Otherwise, assume ! 111: that they are not. */ ! 112: #if HAVE_RESTARTABLE_SYSCALLS == -1 ! 113: #undef HAVE_RESTARTABLE_SYSCALLS ! 114: #if HAVE_SIGVEC ! 115: #define HAVE_RESTARTABLE_SYSCALLS 1 ! 116: #else ! 117: #define HAVE_RESTARTABLE_SYSCALLS 0 ! 118: #endif ! 119: #endif /* HAVE_RESTARTABLE_SYSCALLS == -1 */ ! 120: ! 121: /* We don't handle sigset in combination with restartable system ! 122: calls, so we check for it although this combination will never ! 123: happen. */ ! 124: #if ! HAVE_SIGACTION && ! HAVE_SIGVEC && HAVE_SIGSET ! 125: #if HAVE_RESTARTABLE_SYSCALLS ! 126: #undef HAVE_SIGSET ! 127: #define HAVE_SIGSET 0 ! 128: #endif ! 129: #endif ! 130: ! 131: /* If we don't have restartable system calls, we can ignore ! 132: fsysdep_catch, usysdep_start_catch and usysdep_end_catch. ! 133: Otherwise fsysdep_catch has to do a setjmp. */ ! 134: ! 135: #if ! HAVE_RESTARTABLE_SYSCALLS ! 136: ! 137: #define fsysdep_catch() (TRUE) ! 138: #define usysdep_start_catch() ! 139: #define usysdep_end_catch() ! 140: #define CATCH_PROTECT ! 141: ! 142: #else /* HAVE_RESTARTABLE_SYSCALLS */ ! 143: ! 144: #if HAVE_SETRET && ! HAVE_SIGSETJMP ! 145: #include <setret.h> ! 146: #define setjmp setret ! 147: #define longjmp longret ! 148: #define jmp_buf ret_buf ! 149: #else /* ! HAVE_SETRET || HAVE_SIGSETJMP */ ! 150: #include <setjmp.h> ! 151: #if HAVE_SIGSETJMP ! 152: #undef setjmp ! 153: #undef longjmp ! 154: #undef jmp_buf ! 155: #define setjmp(s) sigsetjmp ((s), TRUE) ! 156: #define longjmp siglongjmp ! 157: #define jmp_buf sigjmp_buf ! 158: #endif /* HAVE_SIGSETJMP */ ! 159: #endif /* ! HAVE_SETRET || HAVE_SIGSETJMP */ ! 160: ! 161: extern volatile sig_atomic_t fSjmp; ! 162: extern volatile jmp_buf sSjmp_buf; ! 163: ! 164: #define fsysdep_catch() (setjmp (sSjmp_buf) == 0) ! 165: ! 166: #define usysdep_start_catch() (fSjmp = TRUE) ! 167: ! 168: #define usysdep_end_catch() (fSjmp = FALSE) ! 169: ! 170: #define CATCH_PROTECT volatile ! 171: ! 172: #endif /* HAVE_RESTARTABLE_SYSCALLS */ ! 173: ! 174: /* Get definitions for the terminal driver. */ ! 175: ! 176: #if HAVE_BSD_TTY ! 177: #include <sgtty.h> ! 178: struct sbsd_terminal ! 179: { ! 180: struct sgttyb stty; ! 181: struct tchars stchars; ! 182: struct ltchars sltchars; ! 183: }; ! 184: typedef struct sbsd_terminal sterminal; ! 185: #define fgetterminfo(o, q) \ ! 186: (ioctl ((o), TIOCGETP, &(q)->stty) == 0 \ ! 187: && ioctl ((o), TIOCGETC, &(q)->stchars) == 0 \ ! 188: && ioctl ((o), TIOCGLTC, &(q)->sltchars) == 0) ! 189: #define fsetterminfo(o, q) \ ! 190: (ioctl ((o), TIOCSETN, &(q)->stty) == 0 \ ! 191: && ioctl ((o), TIOCSETC, &(q)->stchars) == 0 \ ! 192: && ioctl ((o), TIOCSLTC, &(q)->sltchars) == 0) ! 193: #define fsetterminfodrain(o, q) \ ! 194: (ioctl ((o), TIOCSETP, &(q)->stty) == 0 \ ! 195: && ioctl ((o), TIOCSETC, &(q)->stchars) == 0 \ ! 196: && ioctl ((o), TIOCSLTC, &(q)->sltchars) == 0) ! 197: #endif /* HAVE_BSD_TTY */ ! 198: ! 199: #if HAVE_SYSV_TERMIO ! 200: #include <termio.h> ! 201: typedef struct termio sterminal; ! 202: #define fgetterminfo(o, q) (ioctl ((o), TCGETA, (q)) == 0) ! 203: #define fsetterminfo(o, q) (ioctl ((o), TCSETA, (q)) == 0) ! 204: #define fsetterminfodrain(o, q) (ioctl ((o), TCSETAW, (q)) == 0) ! 205: #endif /* HAVE_SYSV_TERMIO */ ! 206: ! 207: #if HAVE_POSIX_TERMIOS ! 208: #include <termios.h> ! 209: typedef struct termios sterminal; ! 210: #define fgetterminfo(o, q) (tcgetattr ((o), (q)) == 0) ! 211: #define fsetterminfo(o, q) (tcsetattr ((o), TCSANOW, (q)) == 0) ! 212: #define fsetterminfodrain(o, q) (tcsetattr ((o), TCSADRAIN, (q)) == 0) ! 213: ! 214: /* On some systems it is not possible to include both <sys/ioctl.h> ! 215: and <termios.h> in the same source files; I don't really know why. ! 216: On such systems, we pretend that we don't have <sys/ioctl.h>. */ ! 217: #if ! HAVE_TERMIOS_AND_SYS_IOCTL_H ! 218: #undef HAVE_SYS_IOCTL_H ! 219: #define HAVE_SYS_IOCTL_H 0 ! 220: #endif ! 221: ! 222: #endif /* HAVE_POSIX_TERMIOS */ ! 223: ! 224: /* The root directory (this is needed by the system independent stuff ! 225: as the default for local-send). */ ! 226: #define ZROOTDIR "/" ! 227: ! 228: /* The name of the execution directory within the spool directory ! 229: (this is need by the system independent uuxqt.c). */ ! 230: #define XQTDIR ".Xqtdir" ! 231: ! 232: /* The name of the directory in which we preserve file transfers that ! 233: failed. */ ! 234: #define PRESERVEDIR ".Preserve" ! 235: ! 236: /* The length of the sequence number used in a file name. */ ! 237: #define CSEQLEN (4) ! 238: ! 239: /* Get some standard definitions. Avoid including the files more than ! 240: once--some might have been included by uucp.h. */ ! 241: #if USE_STDIO && HAVE_UNISTD_H ! 242: #include <unistd.h> ! 243: #endif ! 244: #if ! USE_TYPES_H ! 245: #include <sys/types.h> ! 246: #endif ! 247: #include <sys/stat.h> ! 248: ! 249: /* Get definitions for the file permission bits. */ ! 250: ! 251: #ifndef S_IRWXU ! 252: #define S_IRWXU 0700 ! 253: #endif ! 254: #ifndef S_IRUSR ! 255: #define S_IRUSR 0400 ! 256: #endif ! 257: #ifndef S_IWUSR ! 258: #define S_IWUSR 0200 ! 259: #endif ! 260: #ifndef S_IXUSR ! 261: #define S_IXUSR 0100 ! 262: #endif ! 263: ! 264: #ifndef S_IRWXG ! 265: #define S_IRWXG 0070 ! 266: #endif ! 267: #ifndef S_IRGRP ! 268: #define S_IRGRP 0040 ! 269: #endif ! 270: #ifndef S_IWGRP ! 271: #define S_IWGRP 0020 ! 272: #endif ! 273: #ifndef S_IXGRP ! 274: #define S_IXGRP 0010 ! 275: #endif ! 276: ! 277: #ifndef S_IRWXO ! 278: #define S_IRWXO 0007 ! 279: #endif ! 280: #ifndef S_IROTH ! 281: #define S_IROTH 0004 ! 282: #endif ! 283: #ifndef S_IWOTH ! 284: #define S_IWOTH 0002 ! 285: #endif ! 286: #ifndef S_IXOTH ! 287: #define S_IXOTH 0001 ! 288: #endif ! 289: ! 290: #ifndef S_ISDIR ! 291: #ifdef S_IFDIR ! 292: #define S_ISDIR(i) (((i) & S_IFMT) == S_IFDIR) ! 293: #else /* ! defined (S_IFDIR) */ ! 294: #define S_ISDIR(i) (((i) & 0170000) == 040000) ! 295: #endif /* ! defined (S_IFDIR) */ ! 296: #endif /* ! defined (S_ISDIR) */ ! 297: ! 298: /* We need the access macros. */ ! 299: #ifndef R_OK ! 300: #define R_OK 4 ! 301: #define W_OK 2 ! 302: #define X_OK 1 ! 303: #define F_OK 0 ! 304: #endif /* ! defined (R_OK) */ ! 305: ! 306: /* We create files with these modes (should this be configurable?). */ ! 307: #define IPRIVATE_FILE_MODE (S_IRUSR | S_IWUSR) ! 308: #define IPUBLIC_FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) ! 309: ! 310: /* We create directories with this mode (should this be configurable?). */ ! 311: #define IDIRECTORY_MODE (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) ! 312: #define IPUBLIC_DIRECTORY_MODE (S_IRWXU | S_IRWXG | S_IRWXO) ! 313: ! 314: #if ! HAVE_OPENDIR ! 315: ! 316: /* Define some structures to use if we don't have opendir, etc. These ! 317: will only work if we have the old Unix filesystem, with a 2 byte ! 318: inode and a 14 byte filename. */ ! 319: ! 320: #include <sys/dir.h> ! 321: ! 322: struct dirent ! 323: { ! 324: char d_name[DIRSIZ + 1]; ! 325: }; ! 326: ! 327: typedef struct ! 328: { ! 329: int o; ! 330: struct dirent s; ! 331: } DIR; ! 332: ! 333: extern DIR *opendir P((const char *zdir)); ! 334: extern struct dirent *readdir P((DIR *)); ! 335: extern int closedir P((DIR *)); ! 336: ! 337: #endif /* ! HAVE_OPENDIR */ ! 338: ! 339: #if ! HAVE_FTW_H ! 340: ! 341: /* If there is no <ftw.h>, define the ftw constants. */ ! 342: ! 343: #define FTW_F (0) ! 344: #define FTW_D (1) ! 345: #define FTW_DNR (2) ! 346: #define FTW_NS (3) ! 347: ! 348: #endif /* ! HAVE_FTW_H */ ! 349: ! 350: /* This structure holds the system dependent information we keep for a ! 351: connection. This is used by the TCP and TLI code. */ ! 352: ! 353: struct ssysdep_conn ! 354: { ! 355: /* File descriptor. */ ! 356: int o; ! 357: /* Device name. */ ! 358: char *zdevice; ! 359: /* File status flags. */ ! 360: int iflags; ! 361: /* File status flags for descriptor 1 (-1 if not standard input). */ ! 362: int istdout_flags; ! 363: /* Hold the real descriptor when using a dialer device. */ ! 364: int ohold; ! 365: /* TRUE if this is a terminal and the remaining fields are valid. */ ! 366: boolean fterminal; ! 367: /* TRUE if this is a TLI descriptor. */ ! 368: boolean ftli; ! 369: /* Baud rate. */ ! 370: long ibaud; ! 371: /* Original terminal settings. */ ! 372: sterminal sorig; ! 373: /* Current terminal settings. */ ! 374: sterminal snew; ! 375: #if HAVE_COHERENT_LOCKFILES ! 376: /* On Coherent we need to hold on to the real port name which will ! 377: be used to enable the port. Ick. */ ! 378: char *zenable; ! 379: #endif ! 380: }; ! 381: ! 382: /* These functions do I/O and chat scripts to a port. They are called ! 383: by the TCP and TLI routines. */ ! 384: extern boolean fsysdep_conn_read P((struct sconnection *qconn, ! 385: char *zbuf, size_t *pclen, ! 386: size_t cmin, int ctimeout, ! 387: boolean freport)); ! 388: extern boolean fsysdep_conn_write P((struct sconnection *qconn, ! 389: const char *zbuf, size_t clen)); ! 390: extern boolean fsysdep_conn_io P((struct sconnection *qconn, ! 391: const char *zwrite, size_t *pcwrite, ! 392: char *zread, size_t *pcread)); ! 393: extern boolean fsysdep_conn_chat P((struct sconnection *qconn, ! 394: char **pzprog)); ! 395: ! 396: /* Set a signal handler. */ ! 397: extern void usset_signal P((int isig, RETSIGTYPE (*pfn) P((int)), ! 398: boolean fforce, boolean *pfignored)); ! 399: ! 400: /* Default signal handler. This sets the appropriate element of the ! 401: afSignal array. If system calls are automatically restarted, it ! 402: may do a longjmp to an fsysdep_catch. */ ! 403: extern RETSIGTYPE ussignal P((int isig)); ! 404: ! 405: /* Try to fork, repeating several times. */ ! 406: extern pid_t ixsfork P((void)); ! 407: ! 408: /* Spawn a job. Returns the process ID of the spawned job or -1 on ! 409: error. The following macros may be passed in aidescs. */ ! 410: ! 411: /* Set descriptor to /dev/null. */ ! 412: #define SPAWN_NULL (-1) ! 413: /* Set element of aidescs to a pipe for caller to read from. */ ! 414: #define SPAWN_READ_PIPE (-2) ! 415: /* Set element of aidescs to a pipe for caller to write to. */ ! 416: #define SPAWN_WRITE_PIPE (-3) ! 417: ! 418: extern pid_t ixsspawn P((const char **pazargs, int *aidescs, ! 419: boolean fkeepuid, boolean fkeepenv, ! 420: const char *zchdir, boolean fnosigs, ! 421: boolean fshell, const char *zpath, ! 422: const char *zuu_machine, ! 423: const char *zuu_user)); ! 424: ! 425: /* Do a form of popen using ixsspawn. */ ! 426: extern FILE *espopen P((const char **pazargs, boolean frd, ! 427: pid_t *pipid)); ! 428: ! 429: /* Wait for a particular process to finish, returning the exit status. ! 430: The process ID should be pid_t, but we can't put that in a ! 431: prototype. */ ! 432: extern int ixswait P((unsigned long ipid, const char *zreport)); ! 433: ! 434: /* Find a spool file in the spool directory. For a local file, the ! 435: bgrade argument is the grade of the file. This is needed for ! 436: SPOOLDIR_SVR4. */ ! 437: extern char *zsfind_file P((const char *zsimple, const char *zsystem, ! 438: int bgrade)); ! 439: ! 440: /* Return the grade given a sequence number. */ ! 441: extern char bsgrade P((pointer pseq)); ! 442: ! 443: /* Lock a string. */ ! 444: extern boolean fsdo_lock P((const char *, boolean fspooldir, ! 445: boolean *pferr)); ! 446: ! 447: /* Unlock a string. */ ! 448: extern boolean fsdo_unlock P((const char *, boolean fspooldir)); ! 449: ! 450: /* Check access for a particular user name, or NULL to check access ! 451: for any user. */ ! 452: extern boolean fsuser_access P((const struct stat *, int imode, ! 453: const char *zuser)); ! 454: ! 455: /* Stick two directories and a file name together. */ ! 456: extern char *zsappend3 P((const char *zdir1, const char *zdir2, ! 457: const char *zfile)); ! 458: ! 459: /* Stick three directories and a file name together. */ ! 460: extern char *zsappend4 P((const char *zdir1, const char *zdir2, ! 461: const char *zdir3, const char *zfile)); ! 462: ! 463: /* Get a temporary file name. */ ! 464: extern char *zstemp_file P((const struct uuconf_system *qsys)); ! 465: ! 466: /* Get a command file name. */ ! 467: extern char *zscmd_file P((const struct uuconf_system *qsys, int bgrade)); ! 468: ! 469: /* Get a jobid from a system, a file name, and a grade. */ ! 470: extern char *zsfile_to_jobid P((const struct uuconf_system *qsys, ! 471: const char *zfile, ! 472: int bgrade)); ! 473: ! 474: /* Get a file name from a jobid. This also returns the associated system ! 475: in *pzsystem and the grade in *pbgrade. */ ! 476: extern char *zsjobid_to_file P((const char *zid, char **pzsystem, ! 477: char *pbgrade)); ! 478: ! 479: /* See whether there is a spool directory for a system when using ! 480: SPOOLDIR_ULTRIX. */ ! 481: extern boolean fsultrix_has_spool P((const char *zsystem)); ! 482: ! 483: #if HAVE_COHERENT_LOCKFILES ! 484: /* Lock a coherent tty. */ ! 485: extern boolean lockttyexist P((const char *z)); ! 486: extern boolean fscoherent_disable_tty P((const char *zdevice, ! 487: char **pzenable)); ! 488: #endif ! 489: ! 490: /* Some replacements for standard Unix functions. */ ! 491: ! 492: #if ! HAVE_DUP2 ! 493: extern int dup2 P((int oold, int onew)); ! 494: #endif ! 495: ! 496: #if ! HAVE_FTW ! 497: extern int ftw P((const char *zdir, ! 498: int (*pfn) P((const char *zfile, ! 499: const struct stat *qstat, ! 500: int iflag)), ! 501: int cdescriptors)); ! 502: #endif ! 503: ! 504: #if ! HAVE_GETCWD && ! HAVE_GETWD ! 505: extern char *getcwd P((char *zbuf, size_t cbuf)); ! 506: #endif ! 507: ! 508: #if ! HAVE_MKDIR ! 509: extern int mkdir P((const char *zdir, int imode)); ! 510: #endif ! 511: ! 512: #if ! HAVE_RENAME ! 513: extern int rename P((const char *zold, const char *znew)); ! 514: #endif ! 515: ! 516: #if ! HAVE_RMDIR ! 517: extern int rmdir P((const char *zdir)); ! 518: #endif ! 519: ! 520: /* The working directory from which the program was run (this is set ! 521: by usysdep_initialize if called with INIT_GETCWD). */ ! 522: extern char *zScwd; ! 523: ! 524: /* The spool directory name. */ ! 525: extern const char *zSspooldir; ! 526: ! 527: /* The lock directory name. */ ! 528: extern const char *zSlockdir; ! 529: ! 530: /* The local UUCP name (needed for some spool directory stuff). */ ! 531: extern const char *zSlocalname; ! 532: ! 533: #endif /* ! defined (SYSH_UNX_H) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.