From ac6912b5d13614a585d0b7ff6c8b653159c9725c Mon Sep 17 00:00:00 2001 From: Ben Greear Date: Sun, 6 Feb 2011 20:15:19 +0200 Subject: [PATCH] wpa_supplicant: Support 'relog' command to re-open log files This allows rolling log files: mv log.txt log.txt.1 wpa_cli relog Signed-off-by: Ben Greear --- src/utils/wpa_debug.c | 34 ++++++++++++++++++++++++++++++++++ src/utils/wpa_debug.h | 1 + wpa_supplicant/ctrl_iface.c | 3 +++ wpa_supplicant/wpa_cli.c | 9 +++++++++ 4 files changed, 47 insertions(+) diff --git a/src/utils/wpa_debug.c b/src/utils/wpa_debug.c index 6f6fc69cc..560b85a84 100644 --- a/src/utils/wpa_debug.c +++ b/src/utils/wpa_debug.c @@ -273,11 +273,43 @@ void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, } +#ifdef CONFIG_DEBUG_FILE +static char *last_path = NULL; +#endif /* CONFIG_DEBUG_FILE */ + +int wpa_debug_reopen_file(void) +{ +#ifdef CONFIG_DEBUG_FILE + int rv; + if (last_path) { + char *tmp = os_strdup(last_path); + wpa_debug_close_file(); + rv = wpa_debug_open_file(tmp); + os_free(tmp); + } else { + wpa_printf(MSG_ERROR, "Last-path was not set, cannot " + "re-open log file."); + rv = -1; + } + return rv; +#else /* CONFIG_DEBUG_FILE */ + return 0; +#endif /* CONFIG_DEBUG_FILE */ +} + + int wpa_debug_open_file(const char *path) { #ifdef CONFIG_DEBUG_FILE if (!path) return 0; + + if (last_path == NULL || os_strcmp(last_path, path) != 0) { + /* Save our path to enable re-open */ + os_free(last_path); + last_path = os_strdup(path); + } + out_file = fopen(path, "a"); if (out_file == NULL) { wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open " @@ -299,6 +331,8 @@ void wpa_debug_close_file(void) return; fclose(out_file); out_file = NULL; + os_free(last_path); + last_path = NULL; #endif /* CONFIG_DEBUG_FILE */ } diff --git a/src/utils/wpa_debug.h b/src/utils/wpa_debug.h index f2e86460c..fb59ea540 100644 --- a/src/utils/wpa_debug.h +++ b/src/utils/wpa_debug.h @@ -40,6 +40,7 @@ enum { #else /* CONFIG_NO_STDOUT_DEBUG */ int wpa_debug_open_file(const char *path); +int wpa_debug_reopen_file(void); void wpa_debug_close_file(void); /** diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 38aadd50a..7731895f4 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -2785,6 +2785,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s, if (os_strcmp(buf, "PING") == 0) { os_memcpy(reply, "PONG\n", 5); reply_len = 5; + } else if (os_strncmp(buf, "RELOG", 5) == 0) { + if (wpa_debug_reopen_file() < 0) + reply_len = -1; } else if (os_strncmp(buf, "NOTE ", 5) == 0) { wpa_printf(MSG_INFO, "NOTE: %s", buf + 5); } else if (os_strcmp(buf, "MIB") == 0) { diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c index be62fb0e1..c511cc064 100644 --- a/wpa_supplicant/wpa_cli.c +++ b/wpa_supplicant/wpa_cli.c @@ -278,6 +278,12 @@ static int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[]) } +static int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[]) +{ + return wpa_ctrl_command(ctrl, "RELOG"); +} + + static int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[]) { char cmd[256]; @@ -2164,6 +2170,9 @@ static struct wpa_cli_cmd wpa_cli_commands[] = { { "ping", wpa_cli_cmd_ping, cli_cmd_flag_none, "= pings wpa_supplicant" }, + { "relog", wpa_cli_cmd_relog, + cli_cmd_flag_none, + "= re-open log-file (allow rolling logs)" }, { "note", wpa_cli_cmd_note, cli_cmd_flag_none, " = add a note to wpa_supplicant debug log" },