Initialize the cfilter field of a capture_opts structure to a null
pointer, so we can determine whether a capture filter has been set or not. Use that to check in TShark whether the user specified a filter with "-f" or not, rather than using the no-longer-set "capture_filter_specified" variable. Also, check for multiple "-f" options. If no capture filter is specified, use a null string, to work around broken versions of Linux libpcap. svn path=/trunk/; revision=18989
This commit is contained in:
parent
a9469ccb31
commit
fde1140905
|
@ -1112,6 +1112,14 @@ capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct
|
||||||
ld.packet_cb = capture_loop_packet_cb;
|
ld.packet_cb = capture_loop_packet_cb;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some older Linux versions of libpcap don't work right without
|
||||||
|
* a capture filter; if none was specified, use an empty string.
|
||||||
|
* (Yes, that's a libpcap bug, and has been fixed for a while.)
|
||||||
|
*/
|
||||||
|
if (capture_opts->cfilter == NULL)
|
||||||
|
capture_opts->cfilter = g_strdup("");
|
||||||
|
|
||||||
/* We haven't yet gotten the capture statistics. */
|
/* We haven't yet gotten the capture statistics. */
|
||||||
*stats_known = FALSE;
|
*stats_known = FALSE;
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ void
|
||||||
capture_opts_init(capture_options *capture_opts, void *cfile)
|
capture_opts_init(capture_options *capture_opts, void *cfile)
|
||||||
{
|
{
|
||||||
capture_opts->cf = cfile;
|
capture_opts->cf = cfile;
|
||||||
capture_opts->cfilter = g_strdup(""); /* No capture filter string specified */
|
capture_opts->cfilter = NULL; /* No capture filter string specified */
|
||||||
capture_opts->iface = NULL; /* Default is "pick the first interface" */
|
capture_opts->iface = NULL; /* Default is "pick the first interface" */
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
capture_opts->buffer_size = 1; /* 1 MB */
|
capture_opts->buffer_size = 1; /* 1 MB */
|
||||||
|
@ -325,8 +325,10 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg,
|
||||||
capture_opts->autostop_packets = get_positive_int(optarg, "packet count");
|
capture_opts->autostop_packets = get_positive_int(optarg, "packet count");
|
||||||
break;
|
break;
|
||||||
case 'f': /* capture filter */
|
case 'f': /* capture filter */
|
||||||
if (capture_opts->cfilter)
|
if (capture_opts->cfilter) {
|
||||||
g_free(capture_opts->cfilter);
|
cmdarg_err("More than one -f argument specified");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
capture_opts->cfilter = g_strdup(optarg);
|
capture_opts->cfilter = g_strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'H': /* Hide capture info dialog box */
|
case 'H': /* Hide capture info dialog box */
|
||||||
|
|
15
tshark.c
15
tshark.c
|
@ -677,7 +677,6 @@ main(int argc, char *argv[])
|
||||||
int dp_open_errno, dp_read_errno;
|
int dp_open_errno, dp_read_errno;
|
||||||
int err;
|
int err;
|
||||||
#ifdef HAVE_LIBPCAP
|
#ifdef HAVE_LIBPCAP
|
||||||
gboolean capture_filter_specified = FALSE;
|
|
||||||
gboolean list_link_layer_types = FALSE;
|
gboolean list_link_layer_types = FALSE;
|
||||||
gboolean start_capture = FALSE;
|
gboolean start_capture = FALSE;
|
||||||
#else
|
#else
|
||||||
|
@ -1079,7 +1078,7 @@ main(int argc, char *argv[])
|
||||||
default:
|
default:
|
||||||
case '?': /* Bad flag - print usage message */
|
case '?': /* Bad flag - print usage message */
|
||||||
switch(optopt) {
|
switch(optopt) {
|
||||||
case'F':
|
case 'F':
|
||||||
list_capture_types();
|
list_capture_types();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1104,7 +1103,7 @@ main(int argc, char *argv[])
|
||||||
rfilter = get_args_as_string(argc, argv, optind);
|
rfilter = get_args_as_string(argc, argv, optind);
|
||||||
} else {
|
} else {
|
||||||
#ifdef HAVE_LIBPCAP
|
#ifdef HAVE_LIBPCAP
|
||||||
if (capture_filter_specified) {
|
if (capture_opts.cfilter != NULL) {
|
||||||
cmdarg_err("Capture filters were specified both with \"-f\""
|
cmdarg_err("Capture filters were specified both with \"-f\""
|
||||||
" and with additional command-line arguments");
|
" and with additional command-line arguments");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -1148,7 +1147,7 @@ main(int argc, char *argv[])
|
||||||
support in capture files we read). */
|
support in capture files we read). */
|
||||||
#ifdef HAVE_LIBPCAP
|
#ifdef HAVE_LIBPCAP
|
||||||
if (cf_name != NULL) {
|
if (cf_name != NULL) {
|
||||||
if (capture_filter_specified) {
|
if (capture_opts.cfilter != NULL) {
|
||||||
cmdarg_err("Only read filters, not capture filters, "
|
cmdarg_err("Only read filters, not capture filters, "
|
||||||
"can be specified when reading a capture file.");
|
"can be specified when reading a capture file.");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -1562,6 +1561,14 @@ capture(void)
|
||||||
*/
|
*/
|
||||||
relinquish_special_privs_perm();
|
relinquish_special_privs_perm();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some older Linux versions of libpcap don't work right without
|
||||||
|
* a capture filter; if none was specified, use an empty string.
|
||||||
|
* (Yes, that's a libpcap bug, and has been fixed for a while.)
|
||||||
|
*/
|
||||||
|
if (capture_opts.cfilter == NULL)
|
||||||
|
capture_opts.cfilter = g_strdup("");
|
||||||
|
|
||||||
/* init the input filter from the network interface (capture pipe will do nothing) */
|
/* init the input filter from the network interface (capture pipe will do nothing) */
|
||||||
switch (capture_loop_init_filter(ld.pcap_h, ld.from_cap_pipe, capture_opts.iface, capture_opts.cfilter)) {
|
switch (capture_loop_init_filter(ld.pcap_h, ld.from_cap_pipe, capture_opts.iface, capture_opts.cfilter)) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue