Send the output of the -D and -L options to the standard output rather

than the standard error.

In Wireshark on Windows, create a console before doing so and destroy it
before exiting.  Don't do that in TShark or dumpcap, as those are
console-mode programs on Windows.

This should fix bug 8609 and still allow "wireshark -D" and "wireshark
-L" to work when the standard output isn't redirected.

svn path=/trunk/; revision=49025
This commit is contained in:
Guy Harris 2013-04-25 05:47:11 +00:00
parent 35d3fa75be
commit 39779a7bee
8 changed files with 79 additions and 193 deletions

View File

@ -71,7 +71,6 @@ WIRESHARK_COMMON_INCLUDES = \
cfutils.h \ cfutils.h \
clopts_common.h \ clopts_common.h \
cmdarg_err.h \ cmdarg_err.h \
console_io.h \
color.h \ color.h \
disabled_protos.h \ disabled_protos.h \
file.h \ file.h \

View File

@ -45,7 +45,6 @@
#include "capture_opts.h" #include "capture_opts.h"
#include "ringbuffer.h" #include "ringbuffer.h"
#include "clopts_common.h" #include "clopts_common.h"
#include "console_io.h"
#include "cmdarg_err.h" #include "cmdarg_err.h"
#include "capture_ifinfo.h" #include "capture_ifinfo.h"
@ -845,19 +844,19 @@ capture_opts_print_if_capabilities(if_capabilities_t *caps, char *name,
data_link_info_t *data_link_info; data_link_info_t *data_link_info;
if (caps->can_set_rfmon) if (caps->can_set_rfmon)
fprintf_stderr("Data link types of interface %s when %sin monitor mode (use option -y to set):\n", printf("Data link types of interface %s when %sin monitor mode (use option -y to set):\n",
name, monitor_mode ? "" : "not "); name, monitor_mode ? "" : "not ");
else else
fprintf_stderr("Data link types of interface %s (use option -y to set):\n", name); printf("Data link types of interface %s (use option -y to set):\n", name);
for (lt_entry = caps->data_link_types; lt_entry != NULL; for (lt_entry = caps->data_link_types; lt_entry != NULL;
lt_entry = g_list_next(lt_entry)) { lt_entry = g_list_next(lt_entry)) {
data_link_info = (data_link_info_t *)lt_entry->data; data_link_info = (data_link_info_t *)lt_entry->data;
fprintf_stderr(" %s", data_link_info->name); printf(" %s", data_link_info->name);
if (data_link_info->description != NULL) if (data_link_info->description != NULL)
fprintf_stderr(" (%s)", data_link_info->description); printf(" (%s)", data_link_info->description);
else else
fprintf_stderr(" (not supported)"); printf(" (not supported)");
fprintf_stderr("\n"); printf("\n");
} }
} }
@ -873,17 +872,17 @@ capture_opts_print_interfaces(GList *if_list)
for (if_entry = g_list_first(if_list); if_entry != NULL; for (if_entry = g_list_first(if_list); if_entry != NULL;
if_entry = g_list_next(if_entry)) { if_entry = g_list_next(if_entry)) {
if_info = (if_info_t *)if_entry->data; if_info = (if_info_t *)if_entry->data;
fprintf_stderr("%d. %s", i++, if_info->name); printf("%d. %s", i++, if_info->name);
/* Print the interface friendly name, if it exists; /* Print the interface friendly name, if it exists;
if not fall back to vendor description, if it exists. */ if not fall back to vendor description, if it exists. */
if (if_info->friendly_name != NULL){ if (if_info->friendly_name != NULL){
fprintf_stderr(" (%s)", if_info->friendly_name); printf(" (%s)", if_info->friendly_name);
} else { } else {
if (if_info->vendor_description != NULL) if (if_info->vendor_description != NULL)
fprintf_stderr(" (%s)", if_info->vendor_description); printf(" (%s)", if_info->vendor_description);
} }
fprintf_stderr("\n"); printf("\n");
} }
} }

View File

@ -1,51 +0,0 @@
/* console_io.h
* Declarations of routines to print to the standard error, and, in
* GUI programs on Windows, to create a console in which to display
* the standard error.
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef __CONSOLE_IO_H__
#define __CONSOLE_IO_H__
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
* Print to the standard error. On Windows, create a console for the
* standard error to show up on, if necessary.
* XXX - pop this up in a window of some sort on UNIX+X11 if the controlling
* terminal isn't the standard error?
*/
extern void
vfprintf_stderr(const char *fmt, va_list ap);
extern void
fprintf_stderr(const char *fmt, ...)
G_GNUC_PRINTF(1, 2);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __CMDARG_ERR_H__ */

View File

@ -82,7 +82,6 @@
#include "ringbuffer.h" #include "ringbuffer.h"
#include "clopts_common.h" #include "clopts_common.h"
#include "console_io.h"
#include "cmdarg_err.h" #include "cmdarg_err.h"
#include "version_info.h" #include "version_info.h"
@ -526,26 +525,6 @@ show_version(GString *comp_info_str, GString *runtime_info_str)
wireshark_svnversion, get_copyright_info(), comp_info_str->str, runtime_info_str->str); wireshark_svnversion, get_copyright_info(), comp_info_str->str, runtime_info_str->str);
} }
/*
* Print to the standard error. This is a command-line tool, so there's
* no need to pop up a console.
*/
void
vfprintf_stderr(const char *fmt, va_list ap)
{
vfprintf(stderr, fmt, ap);
}
void
fprintf_stderr(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf_stderr(fmt, ap);
va_end(ap);
}
/* /*
* Report an error in command-line arguments. * Report an error in command-line arguments.
*/ */

View File

@ -71,7 +71,6 @@
#include <epan/addr_resolv.h> #include <epan/addr_resolv.h>
#include "ui/util.h" #include "ui/util.h"
#include "clopts_common.h" #include "clopts_common.h"
#include "console_io.h"
#include "cmdarg_err.h" #include "cmdarg_err.h"
#include "version_info.h" #include "version_info.h"
#include <epan/plugins.h> #include <epan/plugins.h>
@ -3976,26 +3975,6 @@ write_failure_message(const char *filename, int err)
filename, g_strerror(err)); filename, g_strerror(err));
} }
/*
* Print to the standard error. This is a command-line tool, so there's
* no need to pop up a console.
*/
void
vfprintf_stderr(const char *fmt, va_list ap)
{
vfprintf(stderr, fmt, ap);
}
void
fprintf_stderr(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf_stderr(fmt, ap);
va_end(ap);
}
/* /*
* Report an error in command-line arguments. * Report an error in command-line arguments.
*/ */

View File

@ -50,8 +50,10 @@
#ifdef _WIN32 /* Needed for console I/O */ #ifdef _WIN32 /* Needed for console I/O */
#if _MSC_VER < 1500 #if _MSC_VER < 1500
/* AttachConsole() needs this #define! */ /* AttachConsole() needs this #define! */
/* But we're not calling it from here any more; do we need this? */
#define _WIN32_WINNT 0x0501 #define _WIN32_WINNT 0x0501
#endif #endif
#include <fcntl.h> #include <fcntl.h>
#include <conio.h> #include <conio.h>
#include <ui/win32/console_win32.h> #include <ui/win32/console_win32.h>
@ -1225,10 +1227,6 @@ print_usage(gboolean print_ver) {
static void static void
show_version(void) show_version(void)
{ {
#ifdef _WIN32
create_console();
#endif
printf(PACKAGE " " VERSION "%s\n" printf(PACKAGE " " VERSION "%s\n"
"\n" "\n"
"%s" "%s"
@ -1238,35 +1236,6 @@ show_version(void)
"%s", "%s",
wireshark_svnversion, get_copyright_info(), comp_info_str->str, wireshark_svnversion, get_copyright_info(), comp_info_str->str,
runtime_info_str->str); runtime_info_str->str);
#ifdef _WIN32
destroy_console();
#endif
}
/*
* Print to the standard error. On Windows, create a console for the
* standard error to show up on, if necessary.
* XXX - pop this up in a window of some sort on UNIX+X11 if the controlling
* terminal isn't the standard error?
*/
void
vfprintf_stderr(const char *fmt, va_list ap)
{
#ifdef _WIN32
create_console();
#endif
vfprintf(stderr, fmt, ap);
}
void
fprintf_stderr(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf_stderr(fmt, ap);
va_end(ap);
} }
/* /*
@ -1278,11 +1247,14 @@ cmdarg_err(const char *fmt, ...)
{ {
va_list ap; va_list ap;
fprintf_stderr("wireshark: "); #ifdef _WIN32
create_console();
#endif
fprintf(stderr, "wireshark: ");
va_start(ap, fmt); va_start(ap, fmt);
vfprintf_stderr(fmt, ap); vfprintf(stderr, fmt, ap);
va_end(ap); va_end(ap);
fprintf_stderr("\n"); fprintf(stderr, "\n");
} }
/* /*
@ -1296,9 +1268,12 @@ cmdarg_err_cont(const char *fmt, ...)
{ {
va_list ap; va_list ap;
#ifdef _WIN32
create_console();
#endif
va_start(ap, fmt); va_start(ap, fmt);
vfprintf_stderr(fmt, ap); vfprintf(stderr, fmt, ap);
fprintf_stderr("\n"); fprintf(stderr, "\n");
va_end(ap); va_end(ap);
} }
@ -2333,13 +2308,19 @@ main(int argc, char *argv[])
} }
exit(2); exit(2);
} }
#ifdef _WIN32
create_console();
#endif /* _WIN32 */
capture_opts_print_interfaces(if_list); capture_opts_print_interfaces(if_list);
free_interface_list(if_list); free_interface_list(if_list);
#ifdef _WIN32
destroy_console();
#endif /* _WIN32 */
exit(0); exit(0);
#else #else /* HAVE_LIBPCAP */
capture_option_specified = TRUE; capture_option_specified = TRUE;
arg_error = TRUE; arg_error = TRUE;
#endif #endif /* HAVE_LIBPCAP */
break; break;
case 'h': /* Print help and exit */ case 'h': /* Print help and exit */
print_usage(TRUE); print_usage(TRUE);
@ -2359,7 +2340,13 @@ main(int argc, char *argv[])
} }
break; break;
case 'v': /* Show version and exit */ case 'v': /* Show version and exit */
#ifdef _WIN32
create_console();
#endif
show_version(); show_version();
#ifdef _WIN32
destroy_console();
#endif
exit(0); exit(0);
break; break;
case 'X': case 'X':
@ -2892,11 +2879,17 @@ main(int argc, char *argv[])
cmdarg_err("The capture device \"%s\" has no data link types.", device.name); cmdarg_err("The capture device \"%s\" has no data link types.", device.name);
exit(2); exit(2);
} }
#ifdef _WIN32
create_console();
#endif /* _WIN32 */
#if defined(HAVE_PCAP_CREATE) #if defined(HAVE_PCAP_CREATE)
capture_opts_print_if_capabilities(caps, device.name, device.monitor_mode_supported); capture_opts_print_if_capabilities(caps, device.name, device.monitor_mode_supported);
#else #else
capture_opts_print_if_capabilities(caps, device.name, FALSE); capture_opts_print_if_capabilities(caps, device.name, FALSE);
#endif #endif
#ifdef _WIN32
destroy_console();
#endif /* _WIN32 */
free_if_capabilities(caps); free_if_capabilities(caps);
} }
} }

View File

@ -75,7 +75,6 @@
#include "ringbuffer.h" #include "ringbuffer.h"
#include "ui/util.h" #include "ui/util.h"
#include "clopts_common.h" #include "clopts_common.h"
#include "console_io.h"
#include "cmdarg_err.h" #include "cmdarg_err.h"
#include "version_info.h" #include "version_info.h"
#include "merge.h" #include "merge.h"
@ -293,10 +292,6 @@ print_usage(gboolean print_ver) {
static void static void
show_version(void) show_version(void)
{ {
#ifdef _WIN32
create_console();
#endif
printf(PACKAGE " " VERSION "%s\n" printf(PACKAGE " " VERSION "%s\n"
"\n" "\n"
"%s" "%s"
@ -306,36 +301,6 @@ show_version(void)
"%s", "%s",
wireshark_svnversion, get_copyright_info(), comp_info_str->str, wireshark_svnversion, get_copyright_info(), comp_info_str->str,
runtime_info_str->str); runtime_info_str->str);
#ifdef _WIN32
destroy_console();
#endif
}
/*
* Print to the standard error. On Windows, create a console for the
* standard error to show up on, if necessary.
* XXX - pop this up in a window of some sort on UNIX+X11 if the controlling
* terminal isn't the standard error?
*/
// xxx copied from ../gtk/main.c
void
vfprintf_stderr(const char *fmt, va_list ap)
{
#ifdef _WIN32
create_console();
#endif
vfprintf(stderr, fmt, ap);
}
void
fprintf_stderr(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf_stderr(fmt, ap);
va_end(ap);
} }
/* /*
@ -348,11 +313,14 @@ cmdarg_err(const char *fmt, ...)
{ {
va_list ap; va_list ap;
fprintf_stderr("wireshark: "); #ifdef _WIN32
create_console();
#endif
fprintf(stderr, "wireshark: ");
va_start(ap, fmt); va_start(ap, fmt);
vfprintf_stderr(fmt, ap); vfprintf(stderr, fmt, ap);
va_end(ap); va_end(ap);
fprintf_stderr("\n"); fprintf(stderr, "\n");
} }
/* /*
@ -367,9 +335,12 @@ cmdarg_err_cont(const char *fmt, ...)
{ {
va_list ap; va_list ap;
#ifdef _WIN32
create_console();
#endif
va_start(ap, fmt); va_start(ap, fmt);
vfprintf_stderr(fmt, ap); vfprintf(stderr, fmt, ap);
fprintf_stderr("\n"); fprintf(stderr, "\n");
va_end(ap); va_end(ap);
} }
@ -725,13 +696,19 @@ int main(int argc, char *argv[])
} }
exit(2); exit(2);
} }
#ifdef _WIN32
create_console();
#endif /* _WIN32 */
capture_opts_print_interfaces(if_list); capture_opts_print_interfaces(if_list);
free_interface_list(if_list); free_interface_list(if_list);
#ifdef _WIN32
destroy_console();
#endif /* _WIN32 */
exit(0); exit(0);
#else #else /* HAVE_LIBPCAP */
capture_option_specified = TRUE; capture_option_specified = TRUE;
arg_error = TRUE; arg_error = TRUE;
#endif #endif /* HAVE_LIBPCAP */
break; break;
case 'h': /* Print help and exit */ case 'h': /* Print help and exit */
print_usage(TRUE); print_usage(TRUE);
@ -751,15 +728,21 @@ int main(int argc, char *argv[])
} }
break; break;
case 'v': /* Show version and exit */ case 'v': /* Show version and exit */
#ifdef _WIN32
create_console();
#endif
show_version(); show_version();
#ifdef _WIN32
destroy_console();
#endif
exit(0); exit(0);
break; break;
case 'X': case 'X':
/* /*
* Extension command line options have to be processed before * Extension command line options have to be processed before
* we call epan_init() as they are supposed to be used by dissectors * we call epan_init() as they are supposed to be used by dissectors
* or taps very early in the registration process. * or taps very early in the registration process.
*/ */
ex_opt_add(optarg); ex_opt_add(optarg);
break; break;
case '?': /* Ignore errors - the "real" scan will catch them. */ case '?': /* Ignore errors - the "real" scan will catch them. */
@ -954,10 +937,16 @@ int main(int argc, char *argv[])
// exit(2); // exit(2);
// } // }
//#if defined(HAVE_PCAP_CREATE) //#if defined(HAVE_PCAP_CREATE)
//#ifdef _WIN32
// create_console();
//#endif /* _WIN32 */
// capture_opts_print_if_capabilities(caps, device.name, device.monitor_mode_supported); // capture_opts_print_if_capabilities(caps, device.name, device.monitor_mode_supported);
//#else //#else
// capture_opts_print_if_capabilities(caps, device.name, FALSE); // capture_opts_print_if_capabilities(caps, device.name, FALSE);
//#endif //#endif
//#ifdef _WIN32
// destroy_console();
//#endif /* _WIN32 */
// free_if_capabilities(caps); // free_if_capabilities(caps);
// } // }
// } // }

View File

@ -34,7 +34,6 @@
#include <wsutil/file_util.h> #include <wsutil/file_util.h>
#include "console_win32.h" #include "console_win32.h"
#include "../../console_io.h"
#if _MSC_VER < 1500 #if _MSC_VER < 1500
/* AttachConsole() needs this #define! */ /* AttachConsole() needs this #define! */