|
|
1.1 ! root 1: /* detach.c ! 2: Detach from the controlling terminal. ! 3: ! 4: Copyright (C) 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: #include "uucp.h" ! 27: ! 28: #include "uudefs.h" ! 29: #include "system.h" ! 30: #include "sysdep.h" ! 31: ! 32: #include <errno.h> ! 33: ! 34: #if HAVE_SYS_IOCTL_H ! 35: #include <sys/ioctl.h> ! 36: #endif ! 37: ! 38: #ifdef TIOCNOTTY ! 39: #define HAVE_TIOCNOTTY 1 ! 40: #else ! 41: #define HAVE_TIOCNOTTY 0 ! 42: #endif ! 43: ! 44: #if HAVE_FCNTL_H ! 45: #include <fcntl.h> ! 46: #else ! 47: #if HAVE_SYS_FILE_H ! 48: #include <sys/file.h> ! 49: #endif ! 50: #endif ! 51: ! 52: #ifndef O_RDONLY ! 53: #define O_RDONLY 0 ! 54: #define O_WRONLY 1 ! 55: #define O_RDWR 2 ! 56: #endif ! 57: ! 58: /* Detach from the controlling terminal. This is called by uucico if ! 59: it is calling out to another system, so that it can receive SIGHUP ! 60: signals from the port it calls out on. It is also called by uucico ! 61: just before it starts uuxqt, so that uuxqt is completely ! 62: independent of the terminal. */ ! 63: ! 64: void ! 65: usysdep_detach () ! 66: { ! 67: #if ! HAVE_BSD_PGRP || ! HAVE_TIOCNOTTY ! 68: ! 69: pid_t igrp; ! 70: ! 71: /* First make sure we are not a process group leader. If we have ! 72: TIOCNOTTY, this doesn't matter, since TIOCNOTTY sets our process ! 73: group to 0 anyhow. */ ! 74: ! 75: #if HAVE_BSD_PGRP ! 76: igrp = getpgrp (0); ! 77: #else ! 78: igrp = getpgrp (); ! 79: #endif ! 80: ! 81: if (igrp == getpid ()) ! 82: { ! 83: boolean fignored; ! 84: pid_t ipid; ! 85: ! 86: /* Ignore SIGHUP, since our process group leader is about to ! 87: die. */ ! 88: usset_signal (SIGHUP, SIG_IGN, FALSE, &fignored); ! 89: ! 90: ipid = ixsfork (); ! 91: if (ipid < 0) ! 92: ulog (LOG_FATAL, "fork: %s", strerror (errno)); ! 93: ! 94: if (ipid != 0) ! 95: _exit (EXIT_SUCCESS); ! 96: ! 97: /* We'll always wind up as a child of process number 1, right? ! 98: Right? We have to wait for our parent to die before ! 99: reenabling SIGHUP. */ ! 100: while (getppid () != 1) ! 101: sleep (1); ! 102: ! 103: ulog_id (getpid ()); ! 104: ! 105: /* Restore SIGHUP catcher if it wasn't being ignored. */ ! 106: if (! fignored) ! 107: usset_signal (SIGHUP, ussignal, TRUE, (boolean *) NULL); ! 108: } ! 109: ! 110: #endif /* ! HAVE_BSD_PGRP || ! HAVE_TIOCNOTTY */ ! 111: ! 112: #if HAVE_TIOCNOTTY ! 113: /* Lose the original controlling terminal. If standard input has ! 114: been reopened to /dev/null, this will do no harm. If another ! 115: port has been opened to become the controlling terminal, it ! 116: should have been detached when it was closed. */ ! 117: (void) ioctl (0, TIOCNOTTY, (char *) NULL); ! 118: #endif ! 119: ! 120: /* Close stdin, stdout and stderr and reopen them on /dev/null, to ! 121: make sure we have no connection at all to the terminal. */ ! 122: (void) close (0); ! 123: (void) close (1); ! 124: (void) close (2); ! 125: if (open ((char *) "/dev/null", O_RDONLY) != 0 ! 126: || open ((char *) "/dev/null", O_WRONLY) != 1 ! 127: || open ((char *) "/dev/null", O_WRONLY) != 2) ! 128: ulog (LOG_FATAL, "open (/dev/null): %s", strerror (errno)); ! 129: ! 130: #if HAVE_BSD_PGRP ! 131: ! 132: /* Make sure our process group ID is set to 0. On BSD TIOCNOTTY ! 133: should already have set it 0, so this will do no harm. On System ! 134: V we presumably did not execute the TIOCNOTTY call, but the ! 135: System V setpgrp will detach the controlling terminal anyhow. ! 136: This lets us use the same code on both BSD and System V, provided ! 137: it compiles correctly, which life easier for the configure ! 138: script. We don't output an error if we got EPERM because some ! 139: BSD variants don't permit this usage of setpgrp (which means they ! 140: don't provide any way to pick up a new controlling terminal). */ ! 141: ! 142: if (setpgrp (0, 0) < 0) ! 143: { ! 144: if (errno != EPERM) ! 145: ulog (LOG_ERROR, "setpgrp: %s", strerror (errno)); ! 146: } ! 147: ! 148: #else /* ! HAVE_BSD_PGRP */ ! 149: ! 150: #if HAVE_SETSID ! 151: ! 152: /* Under POSIX the setsid call creates a new session for which we ! 153: are the process group leader. It also detaches us from our ! 154: controlling terminal. I'm using the BSD setpgrp call first ! 155: because they should be equivalent for my purposes, but it turns ! 156: out that on Ultrix 4.0 setsid prevents us from ever acquiring ! 157: another controlling terminal (it does not change our process ! 158: group, and Ultrix 4.0 prevents us from setting our process group ! 159: to 0). */ ! 160: (void) setsid (); ! 161: ! 162: #else /* ! HAVE_SETSID */ ! 163: ! 164: #if HAVE_SETPGRP ! 165: ! 166: /* Now we assume we have the System V setpgrp, which takes no ! 167: arguments, and we couldn't compile the HAVE_BSD_PGRP code above ! 168: because there was a prototype somewhere in scope. On System V ! 169: setpgrp makes us the leader of a new process group and also ! 170: detaches the controlling terminal. */ ! 171: ! 172: if (setpgrp () < 0) ! 173: ulog (LOG_ERROR, "setpgrp: %s", strerror (errno)); ! 174: ! 175: #else /* ! HAVE_SETPGRP */ ! 176: ! 177: #error Must detach from controlling terminal ! 178: ! 179: #endif /* HAVE_SETPGRP */ ! 180: #endif /* ! HAVE_SETSID */ ! 181: #endif /* ! HAVE_BSD_PGRP */ ! 182: ! 183: /* At this point we have completely detached from our controlling ! 184: terminal. The next terminal device we open will probably become ! 185: our controlling terminal. */ ! 186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.