diff options
Diffstat (limited to 'os/daemon.c')
-rw-r--r-- | os/daemon.c | 151 |
1 files changed, 61 insertions, 90 deletions
diff --git a/os/daemon.c b/os/daemon.c index 0e5ce3e..2b23de3 100644 --- a/os/daemon.c +++ b/os/daemon.c @@ -34,16 +34,7 @@ from the X Consortium. #include <errno.h> #include <stdlib.h> -#ifndef __GLIBC__ -# if defined(__osf__) || \ - defined(__GNU__) || \ - defined(__CYGWIN__) || \ - defined(linux) -# define setpgrp setpgid -# endif -#endif - -#if defined(SVR4) || defined(USG) || defined(__GLIBC__) +#if defined(USG) # include <termios.h> #else # include <sys/ioctl.h> @@ -60,108 +51,88 @@ from the X Consortium. #include "os.h" -void -BecomeOrphan () -{ - Pid_t child_id; +#if defined(__GLIBC__) || defined(CSRG_BASED) +#define HAS_DAEMON +#endif - chdir("/"); - /* - * fork so that the process goes into the background automatically. Also - * has a nice side effect of having the child process get inherited by - * init (pid 1). - * Separate the child into its own process group before the parent - * exits. This eliminates the possibility that the child might get - * killed when the init script that's running xfs exits. - */ +#ifndef X_NOT_POSIX +#define HAS_SETSID +#endif - child_id = fork(); - switch (child_id) { - case 0: - /* child */ - break; - case -1: - /* error */ - FatalError("daemon fork failed, %s\n", strerror(errno)); - break; +#ifndef HAS_SETSID - default: - /* parent */ +#define setsid() MySetsid() + +static Pid_t +MySetsid(void) +{ +#if defined(TIOCNOTTY) || defined(TCCLRCTTY) || defined(TIOCTTY) + int fd; +#endif + int stat; -#if defined(CSRG_BASED) || \ - defined(SYSV) || \ - defined(SVR4) || \ - defined(__QNXNTO__) || \ - defined(__GLIBC__) || \ - defined(linux) - { - int stat; -# if defined(SVR4) || defined(__QNXNTO__) - /* This gets error EPERM. Why? */ - stat = setpgid (child_id, child_id); -# elif defined(SYSV) - stat = 0; /* don't know how to set child's process group */ -# elif defined(__GLIBC__) - stat = setpgrp (); -# else - stat = setpgrp (child_id, child_id); -# endif - if (stat != 0) - FatalError("setting process group for daemon failed: %s\n", - strerror(errno)); - } -#endif /* ! (CSRG_BASED || SYSV || SVR4 || __QNXNTO__ || __GLIBC__) */ - exit (0); + fd = open("/dev/tty", O_RDWR); + if (fd >= 0) { +#if defined(USG) && defined(TCCLRCTTY) + int zero = 0; + (void) ioctl (fd, TCCLRCTTY, &zero); +#elif (defined(SYSV) || defined(SVR4)) && defined(TIOCTTY) + int zero = 0; + (void) ioctl (i, TIOCTTY, &zero); +#elif defined(TIOCNOTTY) + (void) ioctl (i, TIOCNOTTY, (char *) 0); /* detach, BSD style */ +#endif + close(fd); } + +#if defined(SYSV) || defined(__QNXNTO__) + return setpgrp(); +#else + return setpgid(0, getpid()); +#endif } +#endif /* !HAS_SETSID */ + + +/* detach */ void BecomeDaemon () { - /* - * Close standard file descriptors and get rid of controlling tty. - */ - /* If our C library has the daemon() function, just use it. */ -#if defined(__GLIBC__) || defined(CSRG_BASED) +#ifdef HAS_DAEMON daemon (0, 0); #else - register int i; -# if defined(SYSV) || defined(SVR4) || defined(__QNXNTO__) - setpgrp (); -# else - setpgrp (0, getpid()); -# endif + switch (fork()) { + case -1: + /* error */ + FatalError("daemon fork failed, %s\n", strerror(errno)); + break; + case 0: + /* child */ + break; + default: + /* parent */ + exit(0); + } + + if (setsid() == -1) + FatalError("setting session id for daemon failed: %s\n", + strerror(errno)); + + chdir("/"); close (0); close (1); close (2); -# if !defined(__UNIXOS2__) && !defined(__CYGWIN__) -# if !((defined(SYSV) || defined(SVR4)) && defined(i386)) - if ((i = open ("/dev/tty", O_RDWR)) >= 0) { /* did open succeed? */ -# if defined(USG) && defined(TCCLRCTTY) - int zero = 0; - (void) ioctl (i, TCCLRCTTY, &zero); -# else -# if (defined(SYSV) || defined(SVR4)) && defined(TIOCTTY) - int zero = 0; - (void) ioctl (i, TIOCTTY, &zero); -# else - (void) ioctl (i, TIOCNOTTY, (char *) 0); /* detach, BSD style */ -# endif -# endif - (void) close (i); - } -# endif /* !((SYSV || SVR4) && i386) */ -# endif /* !__UNIXOS2__ && !__CYGWIN__ */ - /* * Set up the standard file descriptors. */ - (void) open ("/", O_RDONLY); /* root inode already in core */ + (void) open ("/dev/null", O_RDWR); (void) dup2 (0, 1); (void) dup2 (0, 2); -#endif + +#endif /* HAS_DAEMON */ } |