From 7e40c0280141045540a73dbb76f63b6be81db73c Mon Sep 17 00:00:00 2001 From: Kaleb Keithley Date: Mon, 23 Feb 2004 21:37:54 +0000 Subject: merge most of XFree86 RC3 (4.3.99.903) from vendor branch. bug #214 --- include/os.h | 3 +- os/daemon.c | 153 ++++++++++++++++++++++++----------------------------------- os/error.c | 4 +- os/utils.c | 3 +- 4 files changed, 66 insertions(+), 97 deletions(-) diff --git a/include/os.h b/include/os.h index 4bd4a4d..52e7b14 100644 --- a/include/os.h +++ b/include/os.h @@ -47,7 +47,7 @@ in this Software without prior written authorization from The Open Group. * $NCDXorg: @(#)os.h,v 4.2 1991/05/10 07:59:16 lemke Exp $ * */ -/* $XFree86: xc/programs/xfs/include/os.h,v 3.14 2002/10/15 01:45:03 dawes Exp $ */ +/* $XFree86: xc/programs/xfs/include/os.h,v 3.15 2004/01/07 03:47:35 dawes Exp $ */ #ifndef _OS_H_ #define _OS_H_ @@ -105,7 +105,6 @@ extern void CloseSockets(void); extern void StopListening(void); /* os/daemon.c */ -extern void BecomeOrphan(void); extern void BecomeDaemon(void); /* os/error.c */ diff --git a/os/daemon.c b/os/daemon.c index 0e5ce3e..658965e 100644 --- a/os/daemon.c +++ b/os/daemon.c @@ -27,23 +27,14 @@ other dealings in this Software without prior written authorization from the X Consortium. */ -/* $XFree86: xc/programs/xfs/os/daemon.c,v 1.12 2002/10/20 21:42:50 tsi Exp $ */ +/* $XFree86: xc/programs/xfs/os/daemon.c,v 1.13 2004/01/07 03:47:36 dawes Exp $ */ #include #include #include #include -#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 #else # include @@ -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 */ } diff --git a/os/error.c b/os/error.c index c6adcaf..20b877c 100644 --- a/os/error.c +++ b/os/error.c @@ -44,7 +44,7 @@ in this Software without prior written authorization from The Open Group. * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ -/* $XFree86: xc/programs/xfs/os/error.c,v 1.11 2002/10/15 01:45:03 dawes Exp $ */ +/* $XFree86: xc/programs/xfs/os/error.c,v 1.12 2004/01/28 22:12:49 herrb Exp $ */ #include #include @@ -95,7 +95,7 @@ abort_server(void) #ifdef SABER saber_stop(); #else - abort(); + _exit(1); #endif } diff --git a/os/utils.c b/os/utils.c index 4dc46a1..c953306 100644 --- a/os/utils.c +++ b/os/utils.c @@ -46,7 +46,7 @@ in this Software without prior written authorization from The Open Group. * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ -/* $XFree86: xc/programs/xfs/os/utils.c,v 3.20 2002/10/15 01:45:03 dawes Exp $ */ +/* $XFree86: xc/programs/xfs/os/utils.c,v 3.21 2004/01/07 03:47:36 dawes Exp $ */ #include #include @@ -526,7 +526,6 @@ SetDaemonState(void) int oldpid; if (becomeDaemon) { - BecomeOrphan(); BecomeDaemon(); if ((oldpid = StorePid ())) { if (oldpid == -1) -- cgit v1.2.3