hostapd: update to version 2016-09-05
[openwrt/openwrt.git] / package / network / services / hostapd / patches / 100-daemonize_fix.patch
diff --git a/package/network/services/hostapd/patches/100-daemonize_fix.patch b/package/network/services/hostapd/patches/100-daemonize_fix.patch
new file mode 100644 (file)
index 0000000..0389406
--- /dev/null
@@ -0,0 +1,97 @@
+--- 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__) */