aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/100-daemonize_fix.patch
blob: 687bd4082dd4a73a18d7a7b56e60bfd896b38d5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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>
@@ -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__) */