12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- --- 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>
- @@ -179,59 +180,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__) */
|