From patchwork Tue Dec 11 10:02:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Allow PID file to be written in foreground mode From: Pontus Fuchs X-Patchwork-Id: 205143 Message-Id: <1355220125-3764-1-git-send-email-pontus.fuchs@gmail.com> To: hostap@lists.shmoo.com Date: Tue, 11 Dec 2012 11:02:05 +0100 I wanted hostapd to write a PID file in foreground mode but I found that it couldn't that. I will silently ignore the -P option when -B is not specified on the command line. Fix this by moving the PID file writing from os_daemonize to a new function. Signed-hostap: Pontus Fuchs --- hostapd/hostapd_cli.c | 3 ++- hostapd/main.c | 3 ++- src/utils/os.h | 10 ++++++++-- src/utils/os_internal.c | 12 +++++++++--- src/utils/os_none.c | 8 +++++++- src/utils/os_unix.c | 12 ++++++++---- src/utils/os_win32.c | 8 +++++++- wpa_supplicant/wpa_cli.c | 3 +++ wpa_supplicant/wpa_priv.c | 3 ++- wpa_supplicant/wpa_supplicant.c | 8 ++++---- 10 files changed, 52 insertions(+), 18 deletions(-) diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c index 633c13d..cf6d88b 100644 --- a/hostapd/hostapd_cli.c +++ b/hostapd/hostapd_cli.c @@ -1096,8 +1096,9 @@ int main(int argc, char *argv[]) } } - if (daemonize && os_daemonize(pid_file)) + if (daemonize && os_daemonize()) return -1; + os_write_pid_file(pid_file); if (interactive) hostapd_cli_interactive(); diff --git a/hostapd/main.c b/hostapd/main.c index 56f0002..d13a742 100644 --- a/hostapd/main.c +++ b/hostapd/main.c @@ -451,10 +451,11 @@ static int hostapd_global_run(struct hapd_interfaces *ifaces, int daemonize, } #endif /* EAP_SERVER_TNC */ - if (daemonize && os_daemonize(pid_file)) { + if (daemonize && os_daemonize()) { perror("daemon"); return -1; } + os_write_pid_file(pid_file); eloop_run(); diff --git a/src/utils/os.h b/src/utils/os.h index ad20834..18d8dc6 100644 --- a/src/utils/os.h +++ b/src/utils/os.h @@ -77,10 +77,9 @@ int os_gmtime(os_time_t t, struct os_tm *tm); /** * os_daemonize - Run in the background (detach from the controlling terminal) - * @pid_file: File name to write the process ID to or %NULL to skip this * Returns: 0 on success, -1 on failure */ -int os_daemonize(const char *pid_file); +int os_daemonize(); /** * os_daemonize_terminate - Stop running in the background (remove pid file) @@ -89,6 +88,13 @@ int os_daemonize(const char *pid_file); void os_daemonize_terminate(const char *pid_file); /** + * os_write_pid_file - Write current process ID to pid_file + * @pid_file: File name to write the process ID to or %NULL to skip this + * Returns: 0 on success, -1 on failure + */ +int os_write_pid_file(const char *pid_file); + +/** * os_get_random - Get cryptographically strong pseudo random data * @buf: Buffer for pseudo random data * @len: Length of the buffer diff --git a/src/utils/os_internal.c b/src/utils/os_internal.c index e4b7fdb..3ebae06 100644 --- a/src/utils/os_internal.c +++ b/src/utils/os_internal.c @@ -82,22 +82,28 @@ int os_gmtime(os_time_t t, struct os_tm *tm) } -int os_daemonize(const char *pid_file) +int os_daemonize() { if (daemon(0, 0)) { perror("daemon"); return -1; } + return 0; +} + + +int os_write_pid_file(const char *pid_file) +{ if (pid_file) { FILE *f = fopen(pid_file, "w"); if (f) { fprintf(f, "%u\n", getpid()); fclose(f); + return 0; } } - - return -0; + return -1; } diff --git a/src/utils/os_none.c b/src/utils/os_none.c index cabf73b..cf02476 100644 --- a/src/utils/os_none.c +++ b/src/utils/os_none.c @@ -38,7 +38,13 @@ int os_gmtime(os_time_t t, struct os_tm *tm) } -int os_daemonize(const char *pid_file) +int os_daemonize() +{ + return -1; +} + + +int os_write_pid_file(const char *pid_file) { return -1; } diff --git a/src/utils/os_unix.c b/src/utils/os_unix.c index 23a93be..1248a17 100644 --- a/src/utils/os_unix.c +++ b/src/utils/os_unix.c @@ -153,7 +153,7 @@ static int os_daemon(int nochdir, int noclose) #endif /* __APPLE__ */ -int os_daemonize(const char *pid_file) +int os_daemonize() { #if defined(__uClinux__) || defined(__sun__) return -1; @@ -162,17 +162,21 @@ int os_daemonize(const char *pid_file) perror("daemon"); return -1; } + return 0; +#endif /* defined(__uClinux__) || defined(__sun__) */ +} +int os_write_pid_file(const char *pid_file) +{ if (pid_file) { FILE *f = fopen(pid_file, "w"); if (f) { fprintf(f, "%u\n", getpid()); fclose(f); + return 0; } } - - return -0; -#endif /* defined(__uClinux__) || defined(__sun__) */ + return -1; } diff --git a/src/utils/os_win32.c b/src/utils/os_win32.c index 163cebe..b5a01a9 100644 --- a/src/utils/os_win32.c +++ b/src/utils/os_win32.c @@ -105,13 +105,19 @@ int os_gmtime(os_time_t t, struct os_tm *tm) } -int os_daemonize(const char *pid_file) +int os_daemonize() { /* TODO */ return -1; } +int os_write_pid_file(const char *pid_file) +{ + return -1; +} + + void os_daemonize_terminate(const char *pid_file) { } diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c index 61bb7fd..2591ab7 100644 --- a/wpa_supplicant/wpa_cli.c +++ b/wpa_supplicant/wpa_cli.c @@ -3482,8 +3482,11 @@ int main(int argc, char *argv[]) } } + if (daemonize && os_daemonize()) + return -1; if (daemonize && os_daemonize(pid_file)) return -1; + os_write_pid_file(pid_file); if (action_file) wpa_cli_action(ctrl_conn); diff --git a/wpa_supplicant/wpa_priv.c b/wpa_supplicant/wpa_priv.c index ad6a080..149ae89 100644 --- a/wpa_supplicant/wpa_priv.c +++ b/wpa_supplicant/wpa_priv.c @@ -1008,8 +1008,9 @@ int main(int argc, char *argv[]) interfaces = iface; } - if (daemonize && os_daemonize(pid_file)) + if (daemonize && os_daemonize()) goto out; + os_write_pid_file(pid_file); eloop_register_signal_terminate(wpa_priv_terminate, NULL); eloop_run(); diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 784a471..74bec00 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -2400,10 +2400,10 @@ int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s) } -static int wpa_supplicant_daemon(const char *pid_file) +static int wpa_supplicant_daemon() { wpa_printf(MSG_DEBUG, "Daemonize.."); - return os_daemonize(pid_file); + return os_daemonize(); } @@ -3246,9 +3246,9 @@ int wpa_supplicant_run(struct wpa_global *global) { struct wpa_supplicant *wpa_s; - if (global->params.daemonize && - wpa_supplicant_daemon(global->params.pid_file)) + if (global->params.daemonize && wpa_supplicant_daemon()) return -1; + os_write_pid_file(global->params.pid_file); if (global->params.wait_for_monitor) { for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)