| --- 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> |
| @@ -188,59 +189,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__) */ |