[PATCH] Allow logging to specific file with -F option

Dan Williams dcbw
Mon Dec 24 17:03:33 PST 2007


On Mon, 2007-12-17 at 11:49 +1000, Kel Modderman wrote:
> Hi,
> 
> (Re-sending this one, as it was not commented on in last patch frenzy.)
> 
> Logging to file was recently added, but the file path and name template
> is hardcoded in wpa_debug_open_file(). This change adds an extra -F
> command line option which allows specification of a specific output
> filename to write debug output to.

Since there hadn't been any releases with the -f flag, any reason why
you added a new flag for the debug file rather than just using -f?  It
seems a bit overkill to have two options; you could make it so that if
you specify -f without the path it'll log to the default location but
you can override it if you like.  That's the approach I'd rather see
here...  I think optarg will just be NULL if you don't specify a file,
in which case it'll just fall through to the default location because
params->wpa_debug_file will be NULL.

Other than that, the patch looks OK to me.

Dan

> wpa_debug_open_file() also prints an error message when the output file
> failed to be opened for writing, and wpa_debug_close_file() does not
> attempt to fclose the output file if it failed to be opened.
> 
> Signed-off-by: Kel Modderman <kel at otaku42.de>
> ---
> diff --git a/src/utils/wpa_debug.c b/src/utils/wpa_debug.c
> index b2f8c8b..7d3fff8 100644
> --- a/src/utils/wpa_debug.c
> +++ b/src/utils/wpa_debug.c
> @@ -227,36 +227,42 @@ void wpa_hexdump_ascii_key(int level, const char *title, 
> const u8 *buf,
>  }
>  
> 
> -int wpa_debug_open_file(void)
> +int wpa_debug_open_file(const char *file)
>  {
>  #ifdef CONFIG_DEBUG_FILE
>  	static int count = 0;
>  	char fname[64];
>  	if (!wpa_debug_use_file)
>  		return 0;
> +	if (file != NULL && out_file == NULL) {
> +		out_file = fopen(file, "a");
> +	} else {
>  #ifdef _WIN32
> -	os_snprintf(fname, sizeof(fname), "\\Temp\\wpa_supplicant-log-%d.txt",
> -		    count++);
> +		os_snprintf(fname, sizeof(fname), "\\Temp\\wpa_supplicant-log-%d.txt",
> +			    count++);
>  #else /* _WIN32 */
> -	os_snprintf(fname, sizeof(fname), "/tmp/wpa_supplicant-log-%d.txt",
> -		    count++);
> +		os_snprintf(fname, sizeof(fname), "/tmp/wpa_supplicant-log-%d.txt",
> +			    count++);
>  #endif /* _WIN32 */
> -	out_file = fopen(fname, "w");
> +		out_file = fopen(fname, "w");
> +	}
> +	if (out_file == NULL) {
> +		wpa_printf(MSG_ERROR, "wpa_debug_open_file: Failed to open output file, "
> +			   "using standard output");
> +		return -1;
> +	}
>  #ifndef _WIN32
> -	if (out_file)
> -		setvbuf(out_file, NULL, _IOLBF, 0);
> +	setvbuf(out_file, NULL, _IOLBF, 0);
>  #endif /* _WIN32 */
> -	return out_file == NULL ? -1 : 0;
> -#else /* CONFIG_DEBUG_FILE */
> -	return 0;
>  #endif /* CONFIG_DEBUG_FILE */
> +	return 0;
>  }
>  
> 
>  void wpa_debug_close_file(void)
>  {
>  #ifdef CONFIG_DEBUG_FILE
> -	if (!wpa_debug_use_file)
> +	if (!wpa_debug_use_file || out_file == NULL)
>  		return;
>  	fclose(out_file);
>  	out_file = NULL;
> diff --git a/src/utils/wpa_debug.h b/src/utils/wpa_debug.h
> index 9890945..8372cce 100644
> --- a/src/utils/wpa_debug.h
> +++ b/src/utils/wpa_debug.h
> @@ -37,7 +37,7 @@ enum { MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, 
> MSG_ERROR };
>  
>  #else /* CONFIG_NO_STDOUT_DEBUG */
>  
> -int wpa_debug_open_file(void);
> +int wpa_debug_open_file(const char *file);
>  void wpa_debug_close_file(void);
>  
>  /**
> diff --git a/wpa_supplicant/doc/docbook/wpa_supplicant.sgml 
> b/wpa_supplicant/doc/docbook/wpa_supplicant.sgml
> index 296e660..1c7234a 100644
> --- a/wpa_supplicant/doc/docbook/wpa_supplicant.sgml
> +++ b/wpa_supplicant/doc/docbook/wpa_supplicant.sgml
> @@ -17,6 +17,7 @@
>        <arg>-c<replaceable>config file</replaceable></arg>
>        <arg>-D<replaceable>driver</replaceable></arg>
>        <arg>-P<replaceable>PID_file</replaceable></arg>
> +      <arg>-F<replaceable>output file</replaceable></arg>
>      </cmdsynopsis>
>    </refsynopsisdiv>
>    <refsect1>
> @@ -383,6 +384,13 @@
>        </varlistentry>
>  
>        <varlistentry>
> +	<term>-F output file</term>
> +	<listitem>
> +	  <para>Log output to specified file.</para>
> +	</listitem>
> +      </varlistentry>
> +
> +      <varlistentry>
>  	<term>-g global ctrl_interface</term>
>  	<listitem>
>  	  <para>Path to global ctrl_interface socket.</para>
> diff --git a/wpa_supplicant/main.c b/wpa_supplicant/main.c
> index e5af13d..dc89a8d 100644
> --- a/wpa_supplicant/main.c
> +++ b/wpa_supplicant/main.c
> @@ -40,7 +40,12 @@ static void usage(void)
>  	printf("%s\n\n%s\n"
>  	       "usage:\n"
>  	       "  wpa_supplicant [-BddfhKLqqtuvwW] [-P<pid file>] "
> -	       "[-g<global ctrl>] \\\n"
> +	       "[-g<global ctrl>]"
> +#ifdef CONFIG_DEBUG_FILE
> +	       " [-F<output file>] \\\n"
> +#else /* CONFIG_DEBUG_FILE */
> +	       " \\\n"
> +#endif /* CONFIG_DEBUG_FILE */
>  	       "        -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] "
>  	       "[-p<driver_param>] \\\n"
>  	       "        [-b<br_ifname> [-N -i<ifname> -c<conf> [-C<ctrl>] "
> @@ -67,6 +72,7 @@ static void usage(void)
>  	       "  -D = driver name\n"
>  #ifdef CONFIG_DEBUG_FILE
>  	       "  -f = Log output to default log location (normally /tmp)\n"
> +	       "  -F = Log output to specified file\n"
>  #endif /* CONFIG_DEBUG_FILE */
>  	       "  -g = global ctrl_interface\n"
>  	       "  -K = include keys (passwords, etc.) in debug output\n"
> @@ -146,7 +152,7 @@ int main(int argc, char *argv[])
>  	wpa_supplicant_fd_workaround();
>  
>  	for (;;) {
> -		c = getopt(argc, argv, "b:Bc:C:D:dfg:hi:KLNp:P:qtuvwW");
> +		c = getopt(argc, argv, "b:Bc:C:D:dF:fg:hi:KLNp:P:qtuvwW");
>  		if (c < 0)
>  			break;
>  		switch (c) {
> @@ -179,6 +185,10 @@ int main(int argc, char *argv[])
>  		case 'f':
>  			params.wpa_debug_use_file = 1;
>  			break;
> +		case 'F':
> +			params.wpa_debug_use_file = 1;
> +			params.wpa_debug_file = optarg;
> +			break;
>  #endif /* CONFIG_DEBUG_FILE */
>  		case 'g':
>  			params.ctrl_interface = optarg;
> diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
> index 0c1a142..bcae686 100644
> --- a/wpa_supplicant/wpa_supplicant.c
> +++ b/wpa_supplicant/wpa_supplicant.c
> @@ -1828,7 +1828,7 @@ struct wpa_global * wpa_supplicant_init(struct 
> wpa_params *params)
>  		return NULL;
>  
>  	wpa_debug_use_file = params->wpa_debug_use_file;
> -	wpa_debug_open_file();
> +	wpa_debug_open_file(params->wpa_debug_file);
>  
>  	ret = eap_peer_register_methods();
>  	if (ret) {
> diff --git a/wpa_supplicant/wpa_supplicant_i.h 
> b/wpa_supplicant/wpa_supplicant_i.h
> index 00e3162..f741244 100644
> --- a/wpa_supplicant/wpa_supplicant_i.h
> +++ b/wpa_supplicant/wpa_supplicant_i.h
> @@ -154,6 +154,11 @@ struct wpa_params {
>  	 * wpa_debug_use_file - Write debug to a file (instead of stdout)
>  	 */
>  	int wpa_debug_use_file;
> +
> +	/**
> +	 * wpa_debug_file - Write debug to specified file.
> +	 */
> +	char *wpa_debug_file;
>  };
>  
>  /**





More information about the Hostap mailing list