summaryrefslogtreecommitdiff
path: root/daemon.c
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:53 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:53 +0000
commitdf3e1beed5bbb631975127133464b7e24fc38497 (patch)
tree6291fb1c51fb790c2f236249b5f44eb9bedfdc7b /daemon.c
R6.6 is the Xorg base-lineXORG-MAIN
Diffstat (limited to 'daemon.c')
-rw-r--r--daemon.c146
1 files changed, 146 insertions, 0 deletions
diff --git a/daemon.c b/daemon.c
new file mode 100644
index 0000000..937240c
--- /dev/null
+++ b/daemon.c
@@ -0,0 +1,146 @@
+/* $Xorg: daemon.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */
+/*
+
+Copyright 1988, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+/*
+ * xdm - display manager daemon
+ * Author: Keith Packard, MIT X Consortium
+ */
+
+#include <X11/Xos.h>
+
+#if defined(SVR4) || defined(USG)
+#include <termios.h>
+#else
+#include <sys/ioctl.h>
+#endif
+#if defined(__osf__) || defined(linux)
+#define setpgrp setpgid
+#endif
+#ifdef hpux
+#include <sys/ptyio.h>
+#endif
+#include <errno.h>
+#ifdef X_NOT_STDC_ENV
+extern int errno;
+#endif
+#include <sys/types.h>
+#ifdef X_NOT_POSIX
+#define Pid_t int
+#else
+#define Pid_t pid_t
+#endif
+
+extern void exit ();
+
+BecomeOrphan ()
+{
+ Pid_t child_id;
+ int stat;
+
+ /*
+ * 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 xdm exits.
+ */
+
+ child_id = fork();
+ switch (child_id) {
+ case 0:
+ /* child */
+ break;
+ case -1:
+ /* error */
+ LogError("daemon fork failed, errno = %d\n", errno);
+ break;
+
+ default:
+ /* parent */
+
+#if defined(SVR4)
+ stat = setpgid(child_id, child_id);
+ /* This gets error EPERM. Why? */
+#else
+#if defined(SYSV)
+ stat = 0; /* don't know how to set child's process group */
+#else
+ stat = setpgrp(child_id, child_id);
+ if (stat != 0)
+ LogError("setting process grp for daemon failed, errno = %d\n",
+ errno);
+#endif
+#endif
+ exit (0);
+ }
+}
+
+BecomeDaemon ()
+{
+ register int i;
+
+ /*
+ * Close standard file descriptors and get rid of controlling tty
+ */
+
+#if defined(SYSV) || defined(SVR4)
+ setpgrp ();
+#else
+ setpgrp (0, getpid());
+#endif
+
+ close (0);
+ close (1);
+ close (2);
+
+#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 /* !i386 */
+
+ /*
+ * Set up the standard file descriptors.
+ */
+ (void) open ("/", O_RDONLY); /* root inode already in core */
+ (void) dup2 (0, 1);
+ (void) dup2 (0, 2);
+}