[go: up one dir, main page]

Menu

Diff of /daemonize.c [000000] .. [r1]  Maximize  Restore

Switch to side-by-side view

--- a
+++ b/daemonize.c
@@ -0,0 +1,70 @@
+/*
+ * $Header: /cvsroot/kmux/kmux-generate/helper/sane/scanbd/daemonize.c,v 1.1 2008/11/17 20:04:31 wimalopaan Exp $
+ *
+ *  scanbd - KMUX scanner button daemon
+ *
+ *  Copyright (C) 2008  Wilhelm Meier (wilhelm.meier@fh-kl.de)
+ *
+ *  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.
+ */
+
+
+#include "common.h"
+
+void daemonize(void) {
+    pid_t pid;
+
+    if ((pid = fork()) < 0) {
+	perror("fork");
+	exit(EXIT_FAILURE);
+    }
+    else if (pid > 0) { // Parent
+	exit(EXIT_SUCCESS);
+    }
+    // Child
+    if (setsid() < 0) {
+	perror("setsid");
+	exit(EXIT_FAILURE);
+    }
+    if ((pid = fork()) < 0) {
+	perror("fork");
+	exit(EXIT_FAILURE);
+    }
+    else if (pid > 0) { // Parent
+	exit(EXIT_SUCCESS);
+    }
+    // Child-Child
+    int ofd;
+    if ((ofd = open("/dev/null", O_RDWR)) < 0) {
+	perror("open /dev/null");
+	exit(EXIT_FAILURE);
+    }
+    if (dup2(ofd, STDIN_FILENO) < 0) {
+	perror("dup2");
+	exit(EXIT_FAILURE);
+    }
+    if (dup2(ofd, STDOUT_FILENO) < 0) {
+	perror("dup2");
+	exit(EXIT_FAILURE);
+    }
+    if (dup2(ofd, STDERR_FILENO) < 0) {
+	perror("dup2");
+	exit(EXIT_FAILURE);
+    }
+    if (chdir("/") < 0) {
+	perror("chdir");
+	exit(EXIT_FAILURE);
+    }
+}