mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 00:41:17 +00:00
37b489fe04
It wasn't possible to read hostapd wpa_printf messages unless running hostapd manually. It was because hostapd was printing them using vprintf and not directly to the syslog. We were trying to workaround this problem by redirecting STDIN_FILENO and STDOUT_FILENO but it was working only for the initialization phase. As soon as hostapd did os_daemonize our solution stopped working. Please note despite the subject this change doesn't affect debug level messages only but just everything printed by hostapd with wpa_printf including MSG_ERROR-s. This makes it even more important as reading error messages can be quite useful for debugging. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
98 lines
1.8 KiB
Diff
98 lines
1.8 KiB
Diff
--- 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__) */
|