OpenWrt – Rev 1

Subversion Repositories:
Rev:
--- a/src/utils/os_unix.c
+++ b/src/utils/os_unix.c
@@ -10,6 +10,7 @@
 
 #include <time.h>
 #include <sys/wait.h>
+#include <fcntl.h>
 
 #ifdef ANDROID
 #include <sys/capability.h>
@@ -182,59 +183,46 @@ int os_gmtime(os_time_t t, struct os_tm
        return 0;
 }
 
-
-#ifdef __APPLE__
-#include <fcntl.h>
-static int os_daemon(int nochdir, int noclose)
+int os_daemonize(const char *pid_file)
 {
-       int devnull;
+       int pid = 0, i, devnull;
 
-       if (chdir("/") < 0)
-               return -1;
+#if defined(__uClinux__) || defined(__sun__)
+       return -1;
+#else /* defined(__uClinux__) || defined(__sun__) */
 
-       devnull = open("/dev/null", O_RDWR);
-       if (devnull < 0)
+#ifndef __APPLE__
+       pid = fork();
+       if (pid < 0)
                return -1;
+#endif
 
-       if (dup2(devnull, STDIN_FILENO) < 0) {
-               close(devnull);
-               return -1;
+       if (pid > 0) {
+               if (pid_file) {
+                       FILE *f = fopen(pid_file, "w");
+                       if (f) {
+                               fprintf(f, "%u\n", pid);
+                               fclose(f);
+                       }
+               }
+               _exit(0);
        }
 
-       if (dup2(devnull, STDOUT_FILENO) < 0) {
-               close(devnull);
+       if (setsid() < 0)
                return -1;
-       }
 
-       if (dup2(devnull, STDERR_FILENO) < 0) {
-               close(devnull);
+       if (chdir("/") < 0)
                return -1;
-       }
-
-       return 0;
-}
-#else /* __APPLE__ */
-#define os_daemon daemon
-#endif /* __APPLE__ */
 
-
-int os_daemonize(const char *pid_file)
-{
-#if defined(__uClinux__) || defined(__sun__)
-       return -1;
-#else /* defined(__uClinux__) || defined(__sun__) */
-       if (os_daemon(0, 0)) {
-               perror("daemon");
+       devnull = open("/dev/null", O_RDWR);
+       if (devnull < 0)
                return -1;
-       }
 
-       if (pid_file) {
-               FILE *f = fopen(pid_file, "w");
-               if (f) {
-                       fprintf(f, "%u\n", getpid());
-                       fclose(f);
-               }
-       }
+       for (i = 0; i <= STDERR_FILENO; i++)
+               dup2(devnull, i);
+
+       if (devnull > 2)
+               close(devnull);
 
        return -0;
 #endif /* defined(__uClinux__) || defined(__sun__) */