Allow debug log to be written to both syslog and file

If hostapd or wpa_supplicant is started with both -s and -f command line
arguments, debug log ended up being written only into syslog and the log
file was left empty. Change this so that the log entries will be written
to both places. Either -s or -f (or both) results in debug log to stdout
being disabled which was already the case.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2019-12-28 18:17:44 +02:00
parent 53a96146fb
commit 53661e3a9a
4 changed files with 77 additions and 78 deletions

View file

@ -768,7 +768,7 @@ int main(int argc, char *argv[])
if (log_file) if (log_file)
wpa_debug_open_file(log_file); wpa_debug_open_file(log_file);
else if (!log_file && !wpa_debug_syslog)
wpa_debug_setup_stdout(); wpa_debug_setup_stdout();
#ifdef CONFIG_DEBUG_SYSLOG #ifdef CONFIG_DEBUG_SYSLOG
if (wpa_debug_syslog) if (wpa_debug_syslog)

View file

@ -12,8 +12,6 @@
#ifdef CONFIG_DEBUG_SYSLOG #ifdef CONFIG_DEBUG_SYSLOG
#include <syslog.h> #include <syslog.h>
int wpa_debug_syslog = 0;
#endif /* CONFIG_DEBUG_SYSLOG */ #endif /* CONFIG_DEBUG_SYSLOG */
#ifdef CONFIG_DEBUG_LINUX_TRACING #ifdef CONFIG_DEBUG_LINUX_TRACING
@ -32,6 +30,10 @@ static FILE *wpa_debug_tracing_file = NULL;
int wpa_debug_level = MSG_INFO; int wpa_debug_level = MSG_INFO;
int wpa_debug_show_keys = 0; int wpa_debug_show_keys = 0;
int wpa_debug_timestamp = 0; int wpa_debug_timestamp = 0;
int wpa_debug_syslog = 0;
#ifndef CONFIG_NO_STDOUT_DEBUG
static FILE *out_file = NULL;
#endif /* CONFIG_NO_STDOUT_DEBUG */
#ifdef CONFIG_ANDROID_LOG #ifdef CONFIG_ANDROID_LOG
@ -61,8 +63,6 @@ static int wpa_to_android_level(int level)
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
static FILE *out_file = NULL;
#endif /* CONFIG_DEBUG_FILE */ #endif /* CONFIG_DEBUG_FILE */
@ -76,12 +76,12 @@ void wpa_debug_print_timestamp(void)
os_get_time(&tv); os_get_time(&tv);
#ifdef CONFIG_DEBUG_FILE #ifdef CONFIG_DEBUG_FILE
if (out_file) { if (out_file)
fprintf(out_file, "%ld.%06u: ", (long) tv.sec, fprintf(out_file, "%ld.%06u: ", (long) tv.sec,
(unsigned int) tv.usec); (unsigned int) tv.usec);
} else
#endif /* CONFIG_DEBUG_FILE */ #endif /* CONFIG_DEBUG_FILE */
printf("%ld.%06u: ", (long) tv.sec, (unsigned int) tv.usec); if (!out_file && !wpa_debug_syslog)
printf("%ld.%06u: ", (long) tv.sec, (unsigned int) tv.usec);
#endif /* CONFIG_ANDROID_LOG */ #endif /* CONFIG_ANDROID_LOG */
} }
@ -210,35 +210,37 @@ void wpa_printf(int level, const char *fmt, ...)
{ {
va_list ap; va_list ap;
va_start(ap, fmt);
if (level >= wpa_debug_level) { if (level >= wpa_debug_level) {
#ifdef CONFIG_ANDROID_LOG #ifdef CONFIG_ANDROID_LOG
va_start(ap, fmt);
__android_log_vprint(wpa_to_android_level(level), __android_log_vprint(wpa_to_android_level(level),
ANDROID_LOG_NAME, fmt, ap); ANDROID_LOG_NAME, fmt, ap);
va_end(ap);
#else /* CONFIG_ANDROID_LOG */ #else /* CONFIG_ANDROID_LOG */
#ifdef CONFIG_DEBUG_SYSLOG #ifdef CONFIG_DEBUG_SYSLOG
if (wpa_debug_syslog) { if (wpa_debug_syslog) {
va_start(ap, fmt);
vsyslog(syslog_priority(level), fmt, ap); vsyslog(syslog_priority(level), fmt, ap);
} else { va_end(ap);
}
#endif /* CONFIG_DEBUG_SYSLOG */ #endif /* CONFIG_DEBUG_SYSLOG */
wpa_debug_print_timestamp(); wpa_debug_print_timestamp();
#ifdef CONFIG_DEBUG_FILE #ifdef CONFIG_DEBUG_FILE
if (out_file) { if (out_file) {
va_start(ap, fmt);
vfprintf(out_file, fmt, ap); vfprintf(out_file, fmt, ap);
fprintf(out_file, "\n"); fprintf(out_file, "\n");
} else { va_end(ap);
#endif /* CONFIG_DEBUG_FILE */
vprintf(fmt, ap);
printf("\n");
#ifdef CONFIG_DEBUG_FILE
} }
#endif /* CONFIG_DEBUG_FILE */ #endif /* CONFIG_DEBUG_FILE */
#ifdef CONFIG_DEBUG_SYSLOG if (!wpa_debug_syslog && !out_file) {
va_start(ap, fmt);
vprintf(fmt, ap);
printf("\n");
va_end(ap);
} }
#endif /* CONFIG_DEBUG_SYSLOG */
#endif /* CONFIG_ANDROID_LOG */ #endif /* CONFIG_ANDROID_LOG */
} }
va_end(ap);
#ifdef CONFIG_DEBUG_LINUX_TRACING #ifdef CONFIG_DEBUG_LINUX_TRACING
if (wpa_debug_tracing_file != NULL) { if (wpa_debug_tracing_file != NULL) {
@ -254,7 +256,7 @@ void wpa_printf(int level, const char *fmt, ...)
static void _wpa_hexdump(int level, const char *title, const u8 *buf, static void _wpa_hexdump(int level, const char *title, const u8 *buf,
size_t len, int show) size_t len, int show, int only_syslog)
{ {
size_t i; size_t i;
@ -345,7 +347,8 @@ static void _wpa_hexdump(int level, const char *title, const u8 *buf,
syslog(syslog_priority(level), "%s - hexdump(len=%lu):%s", syslog(syslog_priority(level), "%s - hexdump(len=%lu):%s",
title, (unsigned long) len, display); title, (unsigned long) len, display);
bin_clear_free(strbuf, 1 + 3 * len); bin_clear_free(strbuf, 1 + 3 * len);
return; if (only_syslog)
return;
} }
#endif /* CONFIG_DEBUG_SYSLOG */ #endif /* CONFIG_DEBUG_SYSLOG */
wpa_debug_print_timestamp(); wpa_debug_print_timestamp();
@ -362,33 +365,32 @@ static void _wpa_hexdump(int level, const char *title, const u8 *buf,
fprintf(out_file, " [REMOVED]"); fprintf(out_file, " [REMOVED]");
} }
fprintf(out_file, "\n"); fprintf(out_file, "\n");
} else {
#endif /* CONFIG_DEBUG_FILE */
printf("%s - hexdump(len=%lu):", title, (unsigned long) len);
if (buf == NULL) {
printf(" [NULL]");
} else if (show) {
for (i = 0; i < len; i++)
printf(" %02x", buf[i]);
} else {
printf(" [REMOVED]");
}
printf("\n");
#ifdef CONFIG_DEBUG_FILE
} }
#endif /* CONFIG_DEBUG_FILE */ #endif /* CONFIG_DEBUG_FILE */
if (!wpa_debug_syslog && !out_file) {
printf("%s - hexdump(len=%lu):", title, (unsigned long) len);
if (buf == NULL) {
printf(" [NULL]");
} else if (show) {
for (i = 0; i < len; i++)
printf(" %02x", buf[i]);
} else {
printf(" [REMOVED]");
}
printf("\n");
}
#endif /* CONFIG_ANDROID_LOG */ #endif /* CONFIG_ANDROID_LOG */
} }
void wpa_hexdump(int level, const char *title, const void *buf, size_t len) void wpa_hexdump(int level, const char *title, const void *buf, size_t len)
{ {
_wpa_hexdump(level, title, buf, len, 1); _wpa_hexdump(level, title, buf, len, 1, 0);
} }
void wpa_hexdump_key(int level, const char *title, const void *buf, size_t len) void wpa_hexdump_key(int level, const char *title, const void *buf, size_t len)
{ {
_wpa_hexdump(level, title, buf, len, wpa_debug_show_keys); _wpa_hexdump(level, title, buf, len, wpa_debug_show_keys, 0);
} }
@ -421,13 +423,11 @@ static void _wpa_hexdump_ascii(int level, const char *title, const void *buf,
if (level < wpa_debug_level) if (level < wpa_debug_level)
return; return;
#ifdef CONFIG_ANDROID_LOG #ifdef CONFIG_ANDROID_LOG
_wpa_hexdump(level, title, buf, len, show); _wpa_hexdump(level, title, buf, len, show, 0);
#else /* CONFIG_ANDROID_LOG */ #else /* CONFIG_ANDROID_LOG */
#ifdef CONFIG_DEBUG_SYSLOG #ifdef CONFIG_DEBUG_SYSLOG
if (wpa_debug_syslog) { if (wpa_debug_syslog)
_wpa_hexdump(level, title, buf, len, show); _wpa_hexdump(level, title, buf, len, show, 1);
return;
}
#endif /* CONFIG_DEBUG_SYSLOG */ #endif /* CONFIG_DEBUG_SYSLOG */
wpa_debug_print_timestamp(); wpa_debug_print_timestamp();
#ifdef CONFIG_DEBUG_FILE #ifdef CONFIG_DEBUG_FILE
@ -436,13 +436,13 @@ static void _wpa_hexdump_ascii(int level, const char *title, const void *buf,
fprintf(out_file, fprintf(out_file,
"%s - hexdump_ascii(len=%lu): [REMOVED]\n", "%s - hexdump_ascii(len=%lu): [REMOVED]\n",
title, (unsigned long) len); title, (unsigned long) len);
return; goto file_done;
} }
if (buf == NULL) { if (buf == NULL) {
fprintf(out_file, fprintf(out_file,
"%s - hexdump_ascii(len=%lu): [NULL]\n", "%s - hexdump_ascii(len=%lu): [NULL]\n",
title, (unsigned long) len); title, (unsigned long) len);
return; goto file_done;
} }
fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n", fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n",
title, (unsigned long) len); title, (unsigned long) len);
@ -466,42 +466,43 @@ static void _wpa_hexdump_ascii(int level, const char *title, const void *buf,
pos += llen; pos += llen;
len -= llen; len -= llen;
} }
} else { }
file_done:
#endif /* CONFIG_DEBUG_FILE */ #endif /* CONFIG_DEBUG_FILE */
if (!show) { if (!wpa_debug_syslog && !out_file) {
printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n", if (!show) {
title, (unsigned long) len); printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n",
return; title, (unsigned long) len);
} return;
if (buf == NULL) { }
printf("%s - hexdump_ascii(len=%lu): [NULL]\n", if (buf == NULL) {
title, (unsigned long) len); printf("%s - hexdump_ascii(len=%lu): [NULL]\n",
return; title, (unsigned long) len);
} return;
printf("%s - hexdump_ascii(len=%lu):\n", title, (unsigned long) len); }
while (len) { printf("%s - hexdump_ascii(len=%lu):\n", title,
llen = len > line_len ? line_len : len; (unsigned long) len);
printf(" "); while (len) {
for (i = 0; i < llen; i++) llen = len > line_len ? line_len : len;
printf(" %02x", pos[i]); printf(" ");
for (i = llen; i < line_len; i++) for (i = 0; i < llen; i++)
printf(" "); printf(" %02x", pos[i]);
printf(" "); for (i = llen; i < line_len; i++)
for (i = 0; i < llen; i++) { printf(" ");
if (isprint(pos[i])) printf(" ");
printf("%c", pos[i]); for (i = 0; i < llen; i++) {
else if (isprint(pos[i]))
printf("_"); printf("%c", pos[i]);
else
printf("_");
}
for (i = llen; i < line_len; i++)
printf(" ");
printf("\n");
pos += llen;
len -= llen;
} }
for (i = llen; i < line_len; i++)
printf(" ");
printf("\n");
pos += llen;
len -= llen;
} }
#ifdef CONFIG_DEBUG_FILE
}
#endif /* CONFIG_DEBUG_FILE */
#endif /* CONFIG_ANDROID_LOG */ #endif /* CONFIG_ANDROID_LOG */
} }

View file

@ -14,9 +14,7 @@
extern int wpa_debug_level; extern int wpa_debug_level;
extern int wpa_debug_show_keys; extern int wpa_debug_show_keys;
extern int wpa_debug_timestamp; extern int wpa_debug_timestamp;
#ifdef CONFIG_DEBUG_SYSLOG
extern int wpa_debug_syslog; extern int wpa_debug_syslog;
#endif /* CONFIG_DEBUG_SYSLOG */
/* Debugging function - conditional printf and hex dump. Driver wrappers can /* Debugging function - conditional printf and hex dump. Driver wrappers can
* use these for debugging purposes. */ * use these for debugging purposes. */

View file

@ -6701,7 +6701,7 @@ struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
if (params->wpa_debug_file_path) if (params->wpa_debug_file_path)
wpa_debug_open_file(params->wpa_debug_file_path); wpa_debug_open_file(params->wpa_debug_file_path);
else if (!params->wpa_debug_file_path && !params->wpa_debug_syslog)
wpa_debug_setup_stdout(); wpa_debug_setup_stdout();
if (params->wpa_debug_syslog) if (params->wpa_debug_syslog)
wpa_debug_open_syslog(); wpa_debug_open_syslog();