1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/*
2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpa_supplicant/hostapd / Debug prints
3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi>
4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify
6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as
7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation.
8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD
10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license.
11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details.
13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h"
16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h"
18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic FILE *out_file = NULL;
22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_level = MSG_INFO;
24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_show_keys = 0;
25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_timestamp = 0;
26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
282c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef CONFIG_ANDROID_LOG
292c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
302c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#include <android/log.h>
312c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
322c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtvoid android_printf(int level, char *format, ...)
332c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{
342c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	if (level >= wpa_debug_level) {
352c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		va_list ap;
362c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		if (level == MSG_ERROR) {
372c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			level = ANDROID_LOG_ERROR;
382c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		} else if (level == MSG_WARNING) {
392c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			level = ANDROID_LOG_WARN;
402c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		} else if (level == MSG_INFO) {
412c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			level = ANDROID_LOG_INFO;
422c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		} else {
432c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt			level = ANDROID_LOG_DEBUG;
442c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		}
452c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		va_start(ap, format);
462c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		__android_log_vprint(level, "wpa_supplicant", format, ap);
472c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt		va_end(ap);
482c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt	}
492c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt}
502c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
512c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#else /* CONFIG_ANDROID_LOG */
522c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt
53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_STDOUT_DEBUG
54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_debug_print_timestamp(void)
56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	struct os_time tv;
58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (!wpa_debug_timestamp)
60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_get_time(&tv);
63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (out_file) {
65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		fprintf(out_file, "%ld.%06u: ", (long) tv.sec,
66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			(unsigned int) tv.usec);
67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else
68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("%ld.%06u: ", (long) tv.sec, (unsigned int) tv.usec);
70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/**
74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * wpa_printf - conditional printf
75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @level: priority level (MSG_*) of the message
76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @fmt: printf format string, followed by optional arguments
77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is used to print conditional debugging and error messages. The
79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * output may be directed to stdout, stderr, and/or syslog based on
80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * configuration.
81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *
82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Note: New line '\n' is added to the end of the text when printing to stdout.
83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */
84dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidtvoid wpa_printf(int level, const char *fmt, ...)
85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_list ap;
87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_start(ap, fmt);
89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (level >= wpa_debug_level) {
90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_debug_print_timestamp();
91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (out_file) {
93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			vfprintf(out_file, fmt, ap);
94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file, "\n");
95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else {
96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		vprintf(fmt, ap);
98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("\n");
99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_end(ap);
104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void _wpa_hexdump(int level, const char *title, const u8 *buf,
108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			 size_t len, int show)
109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t i;
111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (level < wpa_debug_level)
112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_debug_print_timestamp();
114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (out_file) {
116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		fprintf(out_file, "%s - hexdump(len=%lu):",
117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			title, (unsigned long) len);
118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (buf == NULL) {
119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file, " [NULL]");
120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else if (show) {
121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			for (i = 0; i < len; i++)
122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				fprintf(out_file, " %02x", buf[i]);
123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		} else {
124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file, " [REMOVED]");
125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		fprintf(out_file, "\n");
127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else {
128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("%s - hexdump(len=%lu):", title, (unsigned long) len);
130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL) {
131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf(" [NULL]");
132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (show) {
133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		for (i = 0; i < len; i++)
134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf(" %02x", buf[i]);
135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else {
136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf(" [REMOVED]");
137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("\n");
139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump(int level, const char *title, const u8 *buf, size_t len)
145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	_wpa_hexdump(level, title, buf, len, 1);
147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len)
151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	_wpa_hexdump(level, title, buf, len, wpa_debug_show_keys);
153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void _wpa_hexdump_ascii(int level, const char *title, const u8 *buf,
157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			       size_t len, int show)
158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	size_t i, llen;
160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const u8 *pos = buf;
161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const size_t line_len = 16;
162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (level < wpa_debug_level)
164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_debug_print_timestamp();
166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (out_file) {
168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (!show) {
169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file,
170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				"%s - hexdump_ascii(len=%lu): [REMOVED]\n",
171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				title, (unsigned long) len);
172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return;
173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		if (buf == NULL) {
175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file,
176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				"%s - hexdump_ascii(len=%lu): [NULL]\n",
177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				title, (unsigned long) len);
178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			return;
179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		fprintf(out_file, "%s - hexdump_ascii(len=%lu):\n",
181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			title, (unsigned long) len);
182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		while (len) {
183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			llen = len > line_len ? line_len : len;
184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file, "    ");
185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			for (i = 0; i < llen; i++)
186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				fprintf(out_file, " %02x", pos[i]);
187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			for (i = llen; i < line_len; i++)
188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				fprintf(out_file, "   ");
189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file, "   ");
190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			for (i = 0; i < llen; i++) {
191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				if (isprint(pos[i]))
192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					fprintf(out_file, "%c", pos[i]);
193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				else
194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt					fprintf(out_file, "_");
195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			}
196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			for (i = llen; i < line_len; i++)
197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				fprintf(out_file, " ");
198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			fprintf(out_file, "\n");
199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			pos += llen;
200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			len -= llen;
201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else {
203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (!show) {
205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("%s - hexdump_ascii(len=%lu): [REMOVED]\n",
206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       title, (unsigned long) len);
207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL) {
210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("%s - hexdump_ascii(len=%lu): [NULL]\n",
211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		       title, (unsigned long) len);
212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	printf("%s - hexdump_ascii(len=%lu):\n", title, (unsigned long) len);
215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	while (len) {
216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		llen = len > line_len ? line_len : len;
217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("    ");
218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		for (i = 0; i < llen; i++)
219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf(" %02x", pos[i]);
220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		for (i = llen; i < line_len; i++)
221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf("   ");
222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("   ");
223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		for (i = 0; i < llen; i++) {
224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			if (isprint(pos[i]))
225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				printf("%c", pos[i]);
226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			else
227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				printf("_");
228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		}
229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		for (i = llen; i < line_len; i++)
230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			printf(" ");
231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		printf("\n");
232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		pos += llen;
233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		len -= llen;
234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump_ascii(int level, const char *title, const u8 *buf, size_t len)
242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	_wpa_hexdump_ascii(level, title, buf, len, 1);
244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf,
248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			   size_t len)
249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	_wpa_hexdump_ascii(level, title, buf, len, wpa_debug_show_keys);
251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint wpa_debug_open_file(const char *path)
255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (!path)
258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return 0;
259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	out_file = fopen(path, "a");
260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (out_file == NULL) {
261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open "
262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			   "output file, using standard output");
263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return -1;
264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef _WIN32
266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setvbuf(out_file, NULL, _IOLBF, 0);
267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* _WIN32 */
268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return 0;
270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_debug_close_file(void)
274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_DEBUG_FILE
276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (!out_file)
277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	fclose(out_file);
279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	out_file = NULL;
280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_DEBUG_FILE */
281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_STDOUT_DEBUG */
284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
2852c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif /* CONFIG_ANDROID_LOG */
286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_WPA_MSG
288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic wpa_msg_cb_func wpa_msg_cb = NULL;
289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid wpa_msg_register_cb(wpa_msg_cb_func func)
291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_msg_cb = func;
293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
296dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidtvoid wpa_msg(void *ctx, int level, const char *fmt, ...)
297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_list ap;
299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char *buf;
300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const int buflen = 2048;
301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int len;
302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf = os_malloc(buflen);
304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL) {
305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_msg: Failed to allocate message "
306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			   "buffer");
307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_start(ap, fmt);
310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_end(ap);
312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpa_printf(level, "%s", buf);
313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (wpa_msg_cb)
314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_msg_cb(ctx, level, buf, len);
315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(buf);
316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
317dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt
318dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt
319dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidtvoid wpa_msg_ctrl(void *ctx, int level, const char *fmt, ...)
320dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt{
321dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	va_list ap;
322dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	char *buf;
323dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	const int buflen = 2048;
324dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	int len;
325dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt
326dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	if (!wpa_msg_cb)
327dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt		return;
328dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt
329dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	buf = os_malloc(buflen);
330dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	if (buf == NULL) {
331dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt		wpa_printf(MSG_ERROR, "wpa_msg_ctrl: Failed to allocate "
332dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt			   "message buffer");
333dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt		return;
334dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	}
335dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	va_start(ap, fmt);
336dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
337dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	va_end(ap);
338dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	wpa_msg_cb(ctx, level, buf, len);
339dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt	os_free(buf);
340dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt}
341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_WPA_MSG */
342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_HOSTAPD_LOGGER
345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic hostapd_logger_cb_func hostapd_logger_cb = NULL;
346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid hostapd_logger_register_cb(hostapd_logger_cb_func func)
348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	hostapd_logger_cb = func;
350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid hostapd_logger(void *ctx, const u8 *addr, unsigned int module, int level,
354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		    const char *fmt, ...)
355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_list ap;
357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	char *buf;
358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	const int buflen = 2048;
359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int len;
360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	buf = os_malloc(buflen);
362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (buf == NULL) {
363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_printf(MSG_ERROR, "hostapd_logger: Failed to allocate "
364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			   "message buffer");
365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		return;
366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_start(ap, fmt);
368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	len = vsnprintf(buf, buflen, fmt, ap);
369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	va_end(ap);
370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (hostapd_logger_cb)
371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		hostapd_logger_cb(ctx, addr, module, level, buf, len);
372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		wpa_printf(MSG_DEBUG, "hostapd_logger: %s", buf);
374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	os_free(buf);
375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_HOSTAPD_LOGGER */
377