- Added daemon() replacement.
authorGuus Sliepen <guus@tinc-vpn.org>
Fri, 24 Nov 2000 23:30:50 +0000 (23:30 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Fri, 24 Nov 2000 23:30:50 +0000 (23:30 +0000)
lib/daemon.c [new file with mode: 0644]
lib/daemon.h [new file with mode: 0644]

diff --git a/lib/daemon.c b/lib/daemon.c
new file mode 100644 (file)
index 0000000..f12599f
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+    daemon.c -- replacement daemon() for platforms that do not have it
+    Copyright (C) 2000 Ivo Timmermans <itimmermans@bigfoot.com>,
+                  2000 Guus Sliepen <guus@sliepen.warande.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+    $Id: daemon.c,v 1.1.2.1 2000/11/24 23:30:50 guus Exp $
+*/
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#include <system.h>
+
+#ifndef HAVE_DAEMON
+int daemon(int nochdir, int noclose)
+{
+  pid_t pid;
+  int fd;
+  
+  pid = fork();
+  
+  /* Check if forking failed */
+    
+  if(pid < 0)
+    {
+      perror("fork");
+      exit(-1);
+    }
+
+  /* If we are the parent, terminate */
+  
+  if(pid)
+    exit(0);
+
+  /* Detach by becoming the new process group leader */
+  
+  if(setsid() < 0)
+    {
+      perror("setsid");
+      return -1;
+    }
+  
+  /* Change working directory to the root (to avoid keeping mount points busy) */
+  
+  if(!nochdir)
+    {
+      chdir("/");
+    }
+    
+  /* Redirect stdin/out/err to /dev/null */
+
+  if(!noclose)
+    {
+      fd = open("/dev/null", O_RDWR);
+
+      if(fd < 0)
+        {
+          perror("opening /dev/null");
+          return -1;
+        }
+        else
+        {
+          dup2(fd, 0);
+          dup2(fd, 1);
+          dup2(fd, 2);
+        }
+    }
+}
+#endif
diff --git a/lib/daemon.h b/lib/daemon.h
new file mode 100644 (file)
index 0000000..ce23b76
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+    daemon.h -- header file for daemon.c
+    Copyright (C) 2000 Ivo Timmermans <itimmermans@bigfoot.com>,
+                  2000 Guus Sliepen <guus@sliepen.warande.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+    $Id: daemon.h,v 1.1.2.1 2000/11/24 23:30:50 guus Exp $
+*/
+
+#ifndef __DAEMON_H__
+#define __DAEMON_H__
+
+#ifndef HAVE_DAEMON
+extern int daemon(int, int);
+#endif
+
+#endif /* __DAEMON_H__ */