2005-02-23 01:01:19 +00:00
/* capture_opts.c
* Routines for capture options setting
*
2006-05-21 05:12:17 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2005-02-23 01:01:19 +00:00
* Copyright 1998 Gerald Combs
*
2018-02-07 11:26:45 +00:00
* SPDX - License - Identifier : GPL - 2.0 - or - later
2005-02-23 01:01:19 +00:00
*/
2014-08-22 21:13:05 +00:00
# include <config.h>
2005-02-23 01:01:19 +00:00
2012-11-21 17:33:02 +00:00
# include <stdio.h>
2013-12-03 22:16:49 +00:00
# include <stdlib.h>
2012-11-21 17:33:02 +00:00
2005-02-23 01:01:19 +00:00
# ifdef HAVE_LIBPCAP
2005-02-24 05:39:59 +00:00
# include <string.h>
2015-11-04 08:45:54 +00:00
# include <errno.h>
2005-02-23 01:01:19 +00:00
# include <glib.h>
2017-12-11 22:41:58 +00:00
# include "capture_opts.h"
2005-02-23 01:01:19 +00:00
# include "ringbuffer.h"
2019-01-01 00:55:23 +00:00
# include <ui/clopts_common.h>
# include <ui/cmdarg_err.h>
2021-04-14 06:14:09 +00:00
# include <ui/exit_codes.h>
2008-05-22 15:46:27 +00:00
# include <wsutil/file_util.h>
2018-03-01 23:31:45 +00:00
# include <wsutil/ws_pipe.h>
2021-06-18 18:21:42 +00:00
# include <wsutil/ws_assert.h>
2005-12-13 22:48:58 +00:00
2021-03-24 22:09:19 +00:00
# include "capture/capture_ifinfo.h"
# include "capture/capture-pcap-util.h"
2014-07-04 07:24:02 +00:00
2017-04-09 04:24:45 +00:00
# include "ui/filter_files.h"
2014-12-20 22:13:05 +00:00
2006-02-10 02:05:30 +00:00
static gboolean capture_opts_output_to_pipe ( const char * save_file , gboolean * is_pipe ) ;
2006-01-07 01:29:45 +00:00
2017-12-11 22:41:58 +00:00
2005-02-23 01:01:19 +00:00
void
2013-05-22 07:44:28 +00:00
capture_opts_init ( capture_options * capture_opts )
2005-02-23 01:01:19 +00:00
{
2014-10-12 18:56:12 +00:00
capture_opts - > ifaces = g_array_new ( FALSE , FALSE , sizeof ( interface_options ) ) ;
capture_opts - > all_ifaces = g_array_new ( FALSE , FALSE , sizeof ( interface_t ) ) ;
capture_opts - > num_selected = 0 ;
capture_opts - > default_options . name = NULL ;
capture_opts - > default_options . descr = NULL ;
2021-03-26 20:04:36 +00:00
capture_opts - > default_options . ifname = NULL ;
2020-03-28 03:08:33 +00:00
capture_opts - > default_options . hardware = NULL ;
capture_opts - > default_options . display_name = NULL ;
2014-10-12 18:56:12 +00:00
capture_opts - > default_options . cfilter = NULL ;
capture_opts - > default_options . has_snaplen = FALSE ;
Allow bigger snapshot lengths for D-Bus captures.
Use WTAP_MAX_PACKET_SIZE_STANDARD, set to 256KB, for everything except
for D-Bus captures. Use WTAP_MAX_PACKET_SIZE_DBUS, set to 128MB, for
them, because that's the largest possible D-Bus message size. See
https://bugs.freedesktop.org/show_bug.cgi?id=100220
for an example of the problems caused by limiting the snapshot length to
256KB for D-Bus.
Have a snapshot length of 0 in a capture_file structure mean "there is
no snapshot length for the file"; we don't need the has_snap field in
that case, a value of 0 mean "no, we don't have a snapshot length".
In dumpcap, start out with a pipe buffer size of 2KB, and grow it as
necessary. When checking for a too-big packet from a pipe, check
against the appropriate maximum - 128MB for DLT_DBUS, 256KB for
everything else.
Change-Id: Ib2ce7a0cf37b971fbc0318024fd011e18add8b20
Reviewed-on: https://code.wireshark.org/review/21952
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
2017-06-05 01:58:40 +00:00
capture_opts - > default_options . snaplen = WTAP_MAX_PACKET_SIZE_STANDARD ;
2014-10-12 18:56:12 +00:00
capture_opts - > default_options . linktype = - 1 ; /* use interface default */
capture_opts - > default_options . promisc_mode = TRUE ;
capture_opts - > default_options . if_type = IF_WIRED ;
capture_opts - > default_options . extcap = NULL ;
capture_opts - > default_options . extcap_fifo = NULL ;
capture_opts - > default_options . extcap_args = NULL ;
2018-03-01 23:31:45 +00:00
capture_opts - > default_options . extcap_pipedata = NULL ;
2018-03-02 17:11:31 +00:00
capture_opts - > default_options . extcap_pid = WS_INVALID_PID ;
2017-08-19 21:39:21 +00:00
# ifdef _WIN32
capture_opts - > default_options . extcap_pipe_h = INVALID_HANDLE_VALUE ;
2017-08-25 09:28:34 +00:00
capture_opts - > default_options . extcap_control_in_h = INVALID_HANDLE_VALUE ;
capture_opts - > default_options . extcap_control_out_h = INVALID_HANDLE_VALUE ;
2017-08-19 21:39:21 +00:00
# endif
2017-04-15 21:30:30 +00:00
capture_opts - > default_options . extcap_control_in = NULL ;
capture_opts - > default_options . extcap_control_out = NULL ;
2015-03-25 03:22:00 +00:00
# ifdef CAN_SET_CAPTURE_BUFFER_SIZE
2014-10-12 18:56:12 +00:00
capture_opts - > default_options . buffer_size = DEFAULT_CAPTURE_BUFFER_SIZE ;
2011-05-16 14:12:35 +00:00
# endif
2014-10-12 18:56:12 +00:00
capture_opts - > default_options . monitor_mode = FALSE ;
2011-05-16 15:19:54 +00:00
# ifdef HAVE_PCAP_REMOTE
2014-10-12 18:56:12 +00:00
capture_opts - > default_options . src_type = CAPTURE_IFLOCAL ;
capture_opts - > default_options . remote_host = NULL ;
capture_opts - > default_options . remote_port = NULL ;
capture_opts - > default_options . auth_type = CAPTURE_AUTH_NULL ;
capture_opts - > default_options . auth_username = NULL ;
capture_opts - > default_options . auth_password = NULL ;
capture_opts - > default_options . datatx_udp = FALSE ;
capture_opts - > default_options . nocap_rpcap = TRUE ;
capture_opts - > default_options . nocap_local = FALSE ;
2011-05-16 15:19:54 +00:00
# endif
2011-05-16 14:12:35 +00:00
# ifdef HAVE_PCAP_SETSAMPLING
2014-10-12 18:56:12 +00:00
capture_opts - > default_options . sampling_method = CAPTURE_SAMP_NONE ;
capture_opts - > default_options . sampling_param = 0 ;
2011-05-12 16:54:16 +00:00
# endif
2017-08-07 14:38:52 +00:00
capture_opts - > default_options . timestamp_type = NULL ;
2014-10-12 18:56:12 +00:00
capture_opts - > saving_to_file = FALSE ;
capture_opts - > save_file = NULL ;
capture_opts - > group_read_access = FALSE ;
2018-01-09 00:38:10 +00:00
capture_opts - > use_pcapng = TRUE ; /* Save as pcapng by default */
2014-10-12 18:56:12 +00:00
capture_opts - > real_time_mode = TRUE ;
capture_opts - > show_info = TRUE ;
capture_opts - > restart = FALSE ;
capture_opts - > orig_save_file = NULL ;
capture_opts - > multi_files_on = FALSE ;
capture_opts - > has_file_duration = FALSE ;
2018-10-31 10:34:35 +00:00
capture_opts - > file_duration = 60.0 ; /* 1 min */
2017-06-27 20:04:33 +00:00
capture_opts - > has_file_interval = FALSE ;
2021-08-23 16:42:04 +00:00
capture_opts - > has_nametimenum = FALSE ;
2017-06-27 20:04:33 +00:00
capture_opts - > file_interval = 60 ; /* 1 min */
2018-10-31 09:03:04 +00:00
capture_opts - > has_file_packets = FALSE ;
capture_opts - > file_packets = 0 ;
2014-10-12 18:56:12 +00:00
capture_opts - > has_ring_num_files = FALSE ;
capture_opts - > ring_num_files = RINGBUFFER_MIN_NUM_FILES ;
2017-12-11 22:41:58 +00:00
2014-10-12 18:56:12 +00:00
capture_opts - > has_autostop_files = FALSE ;
capture_opts - > autostop_files = 1 ;
capture_opts - > has_autostop_packets = FALSE ;
capture_opts - > autostop_packets = 0 ;
capture_opts - > has_autostop_filesize = FALSE ;
capture_opts - > autostop_filesize = 1000 ; /* 1 MB */
capture_opts - > has_autostop_duration = FALSE ;
2018-10-31 10:34:35 +00:00
capture_opts - > autostop_duration = 60.0 ; /* 1 min */
2014-10-12 18:56:12 +00:00
capture_opts - > output_to_pipe = FALSE ;
capture_opts - > capture_child = FALSE ;
2020-07-29 13:36:19 +00:00
capture_opts - > print_file_names = FALSE ;
capture_opts - > print_name_to = NULL ;
2020-08-09 03:12:24 +00:00
capture_opts - > compress_type = NULL ;
2005-02-23 01:01:19 +00:00
}
2017-01-25 09:16:35 +00:00
void
capture_opts_cleanup ( capture_options * capture_opts )
{
2017-02-04 15:26:34 +00:00
if ( ! capture_opts )
return ;
if ( capture_opts - > ifaces ) {
2017-08-28 13:26:42 +00:00
while ( capture_opts - > ifaces - > len > 0 ) {
capture_opts_del_iface ( capture_opts , 0 ) ;
}
2017-02-04 15:26:34 +00:00
g_array_free ( capture_opts - > ifaces , TRUE ) ;
capture_opts - > ifaces = NULL ;
}
if ( capture_opts - > all_ifaces ) {
2017-08-25 08:14:15 +00:00
while ( capture_opts - > all_ifaces - > len > 0 ) {
interface_t * device = & g_array_index ( capture_opts - > all_ifaces , interface_t , 0 ) ;
capture_opts_free_interface_t ( device ) ;
capture_opts - > all_ifaces = g_array_remove_index ( capture_opts - > all_ifaces , 0 ) ;
}
2017-02-04 15:26:34 +00:00
g_array_free ( capture_opts - > all_ifaces , TRUE ) ;
capture_opts - > all_ifaces = NULL ;
}
2018-08-09 00:38:36 +00:00
g_free ( capture_opts - > save_file ) ;
2017-01-25 09:16:35 +00:00
}
2005-03-28 00:19:02 +00:00
2005-05-26 17:50:27 +00:00
/* log content of capture_opts */
2005-03-28 00:19:02 +00:00
void
2021-06-11 12:39:16 +00:00
capture_opts_log ( const char * log_domain , enum ws_log_level log_level , capture_options * capture_opts ) {
2011-05-16 00:55:04 +00:00
guint i ;
2011-05-12 16:54:16 +00:00
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " CAPTURE OPTIONS : " ) ;
2011-05-12 16:54:16 +00:00
2011-05-16 00:55:04 +00:00
for ( i = 0 ; i < capture_opts - > ifaces - > len ; i + + ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , i ) ;
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Interface name[%02d] : %s " , i , interface_opts - > name ? interface_opts - > name : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Interface description[%02d] : %s " , i , interface_opts - > descr ? interface_opts - > descr : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Interface vendor description[%02d] : %s " , i , interface_opts - > hardware ? interface_opts - > hardware : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Display name[%02d]: %s " , i , interface_opts - > display_name ? interface_opts - > display_name : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Capture filter[%02d] : %s " , i , interface_opts - > cfilter ? interface_opts - > cfilter : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Snap length[%02d] (%u) : %d " , i , interface_opts - > has_snaplen , interface_opts - > snaplen ) ;
ws_log ( log_domain , log_level , " Link Type[%02d] : %d " , i , interface_opts - > linktype ) ;
ws_log ( log_domain , log_level , " Promiscuous Mode[%02d]: %s " , i , interface_opts - > promisc_mode ? " TRUE " : " FALSE " ) ;
ws_log ( log_domain , log_level , " Extcap[%02d] : %s " , i , interface_opts - > extcap ? interface_opts - > extcap : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Extcap FIFO[%02d] : %s " , i , interface_opts - > extcap_fifo ? interface_opts - > extcap_fifo : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Extcap PID[%02d] : %d " , i , interface_opts - > extcap_pid ) ;
2015-03-25 03:22:00 +00:00
# ifdef CAN_SET_CAPTURE_BUFFER_SIZE
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Buffer size[%02d] : %d (MB) " , i , interface_opts - > buffer_size ) ;
2011-05-16 14:12:35 +00:00
# endif
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Monitor Mode[%02d] : %s " , i , interface_opts - > monitor_mode ? " TRUE " : " FALSE " ) ;
2011-05-16 15:19:54 +00:00
# ifdef HAVE_PCAP_REMOTE
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Capture source[%02d] : %s " , i ,
2017-08-25 09:27:38 +00:00
interface_opts - > src_type = = CAPTURE_IFLOCAL ? " Local interface " :
interface_opts - > src_type = = CAPTURE_IFREMOTE ? " Remote interface " :
2011-05-16 15:19:54 +00:00
" Unknown " ) ;
2017-08-25 09:27:38 +00:00
if ( interface_opts - > src_type = = CAPTURE_IFREMOTE ) {
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Remote host[%02d] : %s " , i , interface_opts - > remote_host ? interface_opts - > remote_host : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Remote port[%02d] : %s " , i , interface_opts - > remote_port ? interface_opts - > remote_port : " (unspecified) " ) ;
2011-05-16 15:19:54 +00:00
}
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Authentication[%02d] : %s " , i ,
2017-08-25 09:27:38 +00:00
interface_opts - > auth_type = = CAPTURE_AUTH_NULL ? " Null " :
interface_opts - > auth_type = = CAPTURE_AUTH_PWD ? " By username/password " :
2011-05-16 15:19:54 +00:00
" Unknown " ) ;
2017-08-25 09:27:38 +00:00
if ( interface_opts - > auth_type = = CAPTURE_AUTH_PWD ) {
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Auth username[%02d] : %s " , i , interface_opts - > auth_username ? interface_opts - > auth_username : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Auth password[%02d] : <hidden> " , i ) ;
2011-05-16 15:19:54 +00:00
}
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " UDP data tfer[%02d] : %u " , i , interface_opts - > datatx_udp ) ;
ws_log ( log_domain , log_level , " No cap. RPCAP[%02d] : %u " , i , interface_opts - > nocap_rpcap ) ;
ws_log ( log_domain , log_level , " No cap. local[%02d] : %u " , i , interface_opts - > nocap_local ) ;
2011-05-16 15:19:54 +00:00
# endif
2011-05-16 14:12:35 +00:00
# ifdef HAVE_PCAP_SETSAMPLING
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Sampling meth.[%02d] : %d " , i , interface_opts - > sampling_method ) ;
ws_log ( log_domain , log_level , " Sampling param.[%02d] : %d " , i , interface_opts - > sampling_param ) ;
2011-05-12 16:54:16 +00:00
# endif
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Timestamp type [%02d] : %s " , i , interface_opts - > timestamp_type ) ;
2011-05-12 16:54:16 +00:00
}
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Interface name[df] : %s " , capture_opts - > default_options . name ? capture_opts - > default_options . name : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Interface Descr[df] : %s " , capture_opts - > default_options . descr ? capture_opts - > default_options . descr : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Interface Hardware Descr[df] : %s " , capture_opts - > default_options . hardware ? capture_opts - > default_options . hardware : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Interface display name[df] : %s " , capture_opts - > default_options . display_name ? capture_opts - > default_options . display_name : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Capture filter[df] : %s " , capture_opts - > default_options . cfilter ? capture_opts - > default_options . cfilter : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Snap length[df] (%u) : %d " , capture_opts - > default_options . has_snaplen , capture_opts - > default_options . snaplen ) ;
ws_log ( log_domain , log_level , " Link Type[df] : %d " , capture_opts - > default_options . linktype ) ;
ws_log ( log_domain , log_level , " Promiscuous Mode[df]: %s " , capture_opts - > default_options . promisc_mode ? " TRUE " : " FALSE " ) ;
ws_log ( log_domain , log_level , " Extcap[df] : %s " , capture_opts - > default_options . extcap ? capture_opts - > default_options . extcap : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Extcap FIFO[df] : %s " , capture_opts - > default_options . extcap_fifo ? capture_opts - > default_options . extcap_fifo : " (unspecified) " ) ;
2015-03-25 03:22:00 +00:00
# ifdef CAN_SET_CAPTURE_BUFFER_SIZE
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Buffer size[df] : %d (MB) " , capture_opts - > default_options . buffer_size ) ;
2011-05-16 14:12:35 +00:00
# endif
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Monitor Mode[df] : %s " , capture_opts - > default_options . monitor_mode ? " TRUE " : " FALSE " ) ;
2011-05-16 15:19:54 +00:00
# ifdef HAVE_PCAP_REMOTE
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Capture source[df] : %s " ,
2011-05-16 15:19:54 +00:00
capture_opts - > default_options . src_type = = CAPTURE_IFLOCAL ? " Local interface " :
capture_opts - > default_options . src_type = = CAPTURE_IFREMOTE ? " Remote interface " :
" Unknown " ) ;
if ( capture_opts - > default_options . src_type = = CAPTURE_IFREMOTE ) {
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Remote host[df] : %s " , capture_opts - > default_options . remote_host ? capture_opts - > default_options . remote_host : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Remote port[df] : %s " , capture_opts - > default_options . remote_port ? capture_opts - > default_options . remote_port : " (unspecified) " ) ;
2011-05-16 15:19:54 +00:00
}
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Authentication[df] : %s " ,
2011-05-16 15:19:54 +00:00
capture_opts - > default_options . auth_type = = CAPTURE_AUTH_NULL ? " Null " :
capture_opts - > default_options . auth_type = = CAPTURE_AUTH_PWD ? " By username/password " :
" Unknown " ) ;
if ( capture_opts - > default_options . auth_type = = CAPTURE_AUTH_PWD ) {
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Auth username[df] : %s " , capture_opts - > default_options . auth_username ? capture_opts - > default_options . auth_username : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " Auth password[df] : <hidden> " ) ;
2011-05-16 15:19:54 +00:00
}
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " UDP data tfer[df] : %u " , capture_opts - > default_options . datatx_udp ) ;
ws_log ( log_domain , log_level , " No cap. RPCAP[df] : %u " , capture_opts - > default_options . nocap_rpcap ) ;
ws_log ( log_domain , log_level , " No cap. local[df] : %u " , capture_opts - > default_options . nocap_local ) ;
2011-05-16 15:19:54 +00:00
# endif
2011-05-16 14:12:35 +00:00
# ifdef HAVE_PCAP_SETSAMPLING
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Sampling meth. [df] : %d " , capture_opts - > default_options . sampling_method ) ;
ws_log ( log_domain , log_level , " Sampling param.[df] : %d " , capture_opts - > default_options . sampling_param ) ;
2011-05-16 14:12:35 +00:00
# endif
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " Timestamp type [df] : %s " , capture_opts - > default_options . timestamp_type ? capture_opts - > default_options . timestamp_type : " (unspecified) " ) ;
ws_log ( log_domain , log_level , " SavingToFile : %u " , capture_opts - > saving_to_file ) ;
ws_log ( log_domain , log_level , " SaveFile : %s " , ( capture_opts - > save_file ) ? capture_opts - > save_file : " " ) ;
ws_log ( log_domain , log_level , " GroupReadAccess : %u " , capture_opts - > group_read_access ) ;
ws_log ( log_domain , log_level , " Fileformat : %s " , ( capture_opts - > use_pcapng ) ? " PCAPNG " : " PCAP " ) ;
ws_log ( log_domain , log_level , " RealTimeMode : %u " , capture_opts - > real_time_mode ) ;
ws_log ( log_domain , log_level , " ShowInfo : %u " , capture_opts - > show_info ) ;
2011-06-30 22:41:54 +00:00
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " MultiFilesOn : %u " , capture_opts - > multi_files_on ) ;
ws_log ( log_domain , log_level , " FileDuration (%u) : %.3f " , capture_opts - > has_file_duration , capture_opts - > file_duration ) ;
ws_log ( log_domain , log_level , " FileInterval (%u) : %u " , capture_opts - > has_file_interval , capture_opts - > file_interval ) ;
ws_log ( log_domain , log_level , " FilePackets (%u) : %u " , capture_opts - > has_file_packets , capture_opts - > file_packets ) ;
2021-08-23 16:42:04 +00:00
ws_log ( log_domain , log_level , " FileNameType : %s " , ( capture_opts - > has_nametimenum ) ? " prefix_time_num.suffix " : " prefix_num_time.suffix " ) ;
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " RingNumFiles (%u) : %u " , capture_opts - > has_ring_num_files , capture_opts - > ring_num_files ) ;
ws_log ( log_domain , log_level , " RingPrintFiles (%u) : %s " , capture_opts - > print_file_names , ( capture_opts - > print_file_names ? capture_opts - > print_name_to : " " ) ) ;
2011-06-30 22:41:54 +00:00
2021-06-08 01:46:52 +00:00
ws_log ( log_domain , log_level , " AutostopFiles (%u) : %u " , capture_opts - > has_autostop_files , capture_opts - > autostop_files ) ;
ws_log ( log_domain , log_level , " AutostopPackets (%u) : %u " , capture_opts - > has_autostop_packets , capture_opts - > autostop_packets ) ;
ws_log ( log_domain , log_level , " AutostopFilesize(%u) : %u (KB) " , capture_opts - > has_autostop_filesize , capture_opts - > autostop_filesize ) ;
ws_log ( log_domain , log_level , " AutostopDuration(%u) : %.3f " , capture_opts - > has_autostop_duration , capture_opts - > autostop_duration ) ;
2005-03-28 00:19:02 +00:00
}
2005-02-23 01:01:19 +00:00
/*
* Given a string of the form " <autostop criterion>:<value> " , as might appear
* as an argument to a " -a " option , parse it and set the criterion in
* question . Return an indication of whether it succeeded or failed
* in some fashion .
*/
static gboolean
2005-11-17 05:59:21 +00:00
set_autostop_criterion ( capture_options * capture_opts , const char * autostoparg )
2005-02-23 01:01:19 +00:00
{
2014-10-12 18:56:12 +00:00
gchar * p , * colonp ;
colonp = strchr ( autostoparg , ' : ' ) ;
if ( colonp = = NULL )
return FALSE ;
p = colonp ;
* p + + = ' \0 ' ;
2005-02-23 01:01:19 +00:00
/*
2014-10-12 18:56:12 +00:00
* Skip over any white space ( there probably won ' t be any , but
* as we allow it in the preferences file , we might as well
* allow it here ) .
2005-02-23 01:01:19 +00:00
*/
2014-10-17 23:57:28 +00:00
while ( g_ascii_isspace ( * p ) )
2014-10-12 18:56:12 +00:00
p + + ;
if ( * p = = ' \0 ' ) {
/*
* Put the colon back , so if our caller uses , in an
* error message , the string they passed us , the message
* looks correct .
*/
* colonp = ' : ' ;
return FALSE ;
}
if ( strcmp ( autostoparg , " duration " ) = = 0 ) {
capture_opts - > has_autostop_duration = TRUE ;
2018-10-31 10:34:35 +00:00
capture_opts - > autostop_duration = get_positive_double ( p , " autostop duration " ) ;
2014-10-12 18:56:12 +00:00
} else if ( strcmp ( autostoparg , " filesize " ) = = 0 ) {
capture_opts - > has_autostop_filesize = TRUE ;
2016-09-11 20:48:35 +00:00
capture_opts - > autostop_filesize = get_nonzero_guint32 ( p , " autostop filesize " ) ;
2014-10-12 18:56:12 +00:00
} else if ( strcmp ( autostoparg , " files " ) = = 0 ) {
capture_opts - > multi_files_on = TRUE ;
capture_opts - > has_autostop_files = TRUE ;
capture_opts - > autostop_files = get_positive_int ( p , " autostop files " ) ;
2018-10-31 09:03:04 +00:00
} else if ( strcmp ( autostoparg , " packets " ) = = 0 ) {
capture_opts - > has_autostop_packets = TRUE ;
capture_opts - > autostop_packets = get_positive_int ( p , " packet count " ) ;
2014-10-12 18:56:12 +00:00
} else {
return FALSE ;
}
* colonp = ' : ' ; /* put the colon back */
return TRUE ;
2005-02-23 01:01:19 +00:00
}
2014-12-20 22:13:05 +00:00
static gboolean get_filter_arguments ( capture_options * capture_opts , const char * arg )
{
char * colonp ;
char * val ;
char * filter_exp = NULL ;
colonp = strchr ( arg , ' : ' ) ;
if ( colonp ) {
val = colonp ;
* val = ' \0 ' ;
val + + ;
if ( strcmp ( arg , " predef " ) = = 0 ) {
GList * filterItem ;
filterItem = get_filter_list_first ( CFILTER_LIST ) ;
while ( filterItem ! = NULL ) {
filter_def * filterDef ;
filterDef = ( filter_def * ) filterItem - > data ;
if ( strcmp ( val , filterDef - > name ) = = 0 ) {
filter_exp = g_strdup ( filterDef - > strval ) ;
break ;
}
filterItem = filterItem - > next ;
}
}
}
if ( filter_exp = = NULL ) {
/* No filter expression found yet; fallback to previous implemention
and assume the arg contains a filter expression */
if ( colonp ) {
* colonp = ' : ' ; /* restore colon */
}
filter_exp = g_strdup ( arg ) ;
}
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2014-12-20 22:13:05 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
g_free ( interface_opts - > cfilter ) ;
interface_opts - > cfilter = filter_exp ;
2014-12-20 22:13:05 +00:00
return TRUE ;
}
else {
g_free ( capture_opts - > default_options . cfilter ) ;
capture_opts - > default_options . cfilter = filter_exp ;
return TRUE ;
}
}
2005-02-23 01:01:19 +00:00
/*
* Given a string of the form " <ring buffer file>:<duration> " , as might appear
* as an argument to a " -b " option , parse it and set the arguments in
* question . Return an indication of whether it succeeded or failed
* in some fashion .
*/
static gboolean
2005-11-17 05:59:21 +00:00
get_ring_arguments ( capture_options * capture_opts , const char * arg )
2005-02-23 01:01:19 +00:00
{
2014-10-12 18:56:12 +00:00
gchar * p = NULL , * colonp ;
colonp = strchr ( arg , ' : ' ) ;
if ( colonp = = NULL )
return FALSE ;
p = colonp ;
* p + + = ' \0 ' ;
2005-02-23 01:01:19 +00:00
/*
2014-10-12 18:56:12 +00:00
* Skip over any white space ( there probably won ' t be any , but
* as we allow it in the preferences file , we might as well
* allow it here ) .
2005-02-23 01:01:19 +00:00
*/
2014-10-17 23:57:28 +00:00
while ( g_ascii_isspace ( * p ) )
2014-10-12 18:56:12 +00:00
p + + ;
if ( * p = = ' \0 ' ) {
/*
* Put the colon back , so if our caller uses , in an
* error message , the string they passed us , the message
* looks correct .
*/
* colonp = ' : ' ;
return FALSE ;
}
if ( strcmp ( arg , " files " ) = = 0 ) {
capture_opts - > has_ring_num_files = TRUE ;
2016-09-11 20:48:35 +00:00
capture_opts - > ring_num_files = get_nonzero_guint32 ( p , " number of ring buffer files " ) ;
2014-10-12 18:56:12 +00:00
} else if ( strcmp ( arg , " filesize " ) = = 0 ) {
capture_opts - > has_autostop_filesize = TRUE ;
2016-09-11 20:48:35 +00:00
capture_opts - > autostop_filesize = get_nonzero_guint32 ( p , " ring buffer filesize " ) ;
2014-10-12 18:56:12 +00:00
} else if ( strcmp ( arg , " duration " ) = = 0 ) {
capture_opts - > has_file_duration = TRUE ;
2018-10-31 10:34:35 +00:00
capture_opts - > file_duration = get_positive_double ( p , " ring buffer duration " ) ;
2017-06-27 20:04:33 +00:00
} else if ( strcmp ( arg , " interval " ) = = 0 ) {
capture_opts - > has_file_interval = TRUE ;
capture_opts - > file_interval = get_positive_int ( p , " ring buffer interval " ) ;
2021-08-23 16:42:04 +00:00
} else if ( strcmp ( arg , " nametimenum " ) = = 0 ) {
int val = get_positive_int ( p , " file name: time before num " ) ;
capture_opts - > has_nametimenum = ( val > 1 ) ;
2018-10-31 09:03:04 +00:00
} else if ( strcmp ( arg , " packets " ) = = 0 ) {
capture_opts - > has_file_packets = TRUE ;
capture_opts - > file_packets = get_positive_int ( p , " ring buffer packet count " ) ;
2020-07-29 13:36:19 +00:00
} else if ( strcmp ( arg , " printname " ) = = 0 ) {
capture_opts - > print_file_names = TRUE ;
capture_opts - > print_name_to = g_strdup ( p ) ;
2014-10-12 18:56:12 +00:00
}
* colonp = ' : ' ; /* put the colon back */
return TRUE ;
2005-02-23 01:01:19 +00:00
}
2007-12-04 11:19:29 +00:00
# ifdef HAVE_PCAP_SETSAMPLING
/*
* Given a string of the form " <sampling type>:<value> " , as might appear
* as an argument to a " -m " option , parse it and set the arguments in
* question . Return an indication of whether it succeeded or failed
* in some fashion .
*/
static gboolean
get_sampling_arguments ( capture_options * capture_opts , const char * arg )
{
gchar * p = NULL , * colonp ;
colonp = strchr ( arg , ' : ' ) ;
if ( colonp = = NULL )
return FALSE ;
p = colonp ;
* p + + = ' \0 ' ;
2014-10-17 23:57:28 +00:00
while ( g_ascii_isspace ( * p ) )
2007-12-04 11:19:29 +00:00
p + + ;
if ( * p = = ' \0 ' ) {
* colonp = ' : ' ;
return FALSE ;
}
if ( strcmp ( arg , " count " ) = = 0 ) {
2011-05-16 14:12:35 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-16 14:12:35 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > sampling_method = CAPTURE_SAMP_BY_COUNT ;
interface_opts - > sampling_param = get_positive_int ( p , " sampling count " ) ;
2011-05-16 14:12:35 +00:00
} else {
capture_opts - > default_options . sampling_method = CAPTURE_SAMP_BY_COUNT ;
capture_opts - > default_options . sampling_param = get_positive_int ( p , " sampling count " ) ;
}
2007-12-04 11:19:29 +00:00
} else if ( strcmp ( arg , " timer " ) = = 0 ) {
2011-05-16 14:12:35 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-16 14:12:35 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > sampling_method = CAPTURE_SAMP_BY_TIMER ;
interface_opts - > sampling_param = get_positive_int ( p , " sampling timer " ) ;
2011-05-16 14:12:35 +00:00
} else {
2011-06-27 00:09:03 +00:00
capture_opts - > default_options . sampling_method = CAPTURE_SAMP_BY_TIMER ;
2011-05-16 14:12:35 +00:00
capture_opts - > default_options . sampling_param = get_positive_int ( p , " sampling timer " ) ;
}
2007-12-04 11:19:29 +00:00
}
* colonp = ' : ' ;
return TRUE ;
}
# endif
# ifdef HAVE_PCAP_REMOTE
/*
* Given a string of the form " <username>:<password> " , as might appear
* as an argument to a " -A " option , parse it and set the arguments in
* question . Return an indication of whether it succeeded or failed
* in some fashion .
*/
static gboolean
get_auth_arguments ( capture_options * capture_opts , const char * arg )
{
gchar * p = NULL , * colonp ;
colonp = strchr ( arg , ' : ' ) ;
if ( colonp = = NULL )
return FALSE ;
p = colonp ;
* p + + = ' \0 ' ;
2014-10-17 23:57:28 +00:00
while ( g_ascii_isspace ( * p ) )
2007-12-04 11:19:29 +00:00
p + + ;
2011-05-16 15:19:54 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > auth_type = CAPTURE_AUTH_PWD ;
interface_opts - > auth_username = g_strdup ( arg ) ;
interface_opts - > auth_password = g_strdup ( p ) ;
2011-05-16 15:19:54 +00:00
} else {
capture_opts - > default_options . auth_type = CAPTURE_AUTH_PWD ;
capture_opts - > default_options . auth_username = g_strdup ( arg ) ;
capture_opts - > default_options . auth_password = g_strdup ( p ) ;
}
2007-12-04 11:19:29 +00:00
* colonp = ' : ' ;
return TRUE ;
}
# endif
2005-02-23 01:01:19 +00:00
2018-08-13 03:32:01 +00:00
# ifdef _WIN32
static char *
capture_opts_generate_display_name ( const char * friendly_name ,
const char * name _U_ )
{
/*
* Display the friendly name rather than the not - so - friendly
* GUID - based interface name .
*/
return g_strdup ( friendly_name ) ;
}
# else
static char *
capture_opts_generate_display_name ( const char * friendly_name ,
const char * name )
{
/*
* On UN * X , however , users are more used to interface names ,
* and may find it helpful to see them .
*/
2021-12-18 18:48:20 +00:00
return ws_strdup_printf ( " %s: %s " , friendly_name , name ) ;
2018-08-13 03:32:01 +00:00
}
# endif
2018-08-15 07:51:43 +00:00
static void
fill_in_interface_opts_from_ifinfo ( interface_options * interface_opts ,
const if_info_t * if_info )
{
interface_opts - > name = g_strdup ( if_info - > name ) ;
2020-03-28 03:08:33 +00:00
interface_opts - > hardware = g_strdup ( if_info - > vendor_description ) ;
2018-08-15 07:51:43 +00:00
if ( if_info - > friendly_name ! = NULL ) {
/*
* We have a friendly name ; remember it as the
* description . . .
*/
interface_opts - > descr = g_strdup ( if_info - > friendly_name ) ;
/*
* . . . and use it in the console display name .
*/
interface_opts - > display_name = capture_opts_generate_display_name ( if_info - > friendly_name , if_info - > name ) ;
} else {
/* fallback to the interface name */
interface_opts - > descr = NULL ;
interface_opts - > display_name = g_strdup ( if_info - > name ) ;
}
2021-03-25 06:36:29 +00:00
interface_opts - > ifname = NULL ;
2018-08-15 07:51:43 +00:00
interface_opts - > if_type = if_info - > type ;
interface_opts - > extcap = g_strdup ( if_info - > extcap ) ;
}
2018-08-13 03:32:01 +00:00
static gboolean
2018-08-15 07:51:43 +00:00
fill_in_interface_opts_from_ifinfo_by_name ( interface_options * interface_opts ,
const char * name )
2018-08-13 03:32:01 +00:00
{
gboolean matched ;
GList * if_list ;
int err ;
GList * if_entry ;
if_info_t * if_info ;
size_t prefix_length ;
matched = FALSE ;
if_list = capture_interface_list ( & err , NULL , NULL ) ;
if ( if_list ! = NULL ) {
2018-08-15 07:51:43 +00:00
/*
* Try and do an exact match ( case insensitive ) on the
* interface name , the interface description , and the
* hardware description .
*/
2018-08-13 03:32:01 +00:00
for ( if_entry = g_list_first ( if_list ) ; if_entry ! = NULL ;
if_entry = g_list_next ( if_entry ) )
{
if_info = ( if_info_t * ) if_entry - > data ;
/*
* Does the specified name match the interface name
* with a case - insensitive match ?
*/
if ( g_ascii_strcasecmp ( if_info - > name , name ) = = 0 ) {
/*
* Yes .
*/
matched = TRUE ;
break ;
}
/*
* Does this interface have a friendly name and , if so ,
* does the specified name match the friendly name with
* a case - insensitive match ?
*/
if ( if_info - > friendly_name ! = NULL & &
g_ascii_strcasecmp ( if_info - > friendly_name , name ) = = 0 ) {
/*
* Yes .
*/
matched = TRUE ;
break ;
}
}
if ( ! matched ) {
/*
* We didn ' t find it ; attempt a case - insensitive prefix match
* of the friendly name .
*/
prefix_length = strlen ( name ) ;
for ( if_entry = g_list_first ( if_list ) ; if_entry ! = NULL ;
if_entry = g_list_next ( if_entry ) )
{
if_info = ( if_info_t * ) if_entry - > data ;
if ( if_info - > friendly_name ! = NULL & &
g_ascii_strncasecmp ( if_info - > friendly_name , name , prefix_length ) = = 0 ) {
/*
* We found an interface whose friendly name matches
* with a case - insensitive prefix match .
*/
matched = TRUE ;
break ;
}
}
}
}
if ( matched ) {
/*
* We found an interface that matches .
*/
2018-08-15 07:51:43 +00:00
fill_in_interface_opts_from_ifinfo ( interface_opts , if_info ) ;
2018-08-13 03:32:01 +00:00
}
free_interface_list ( if_list ) ;
return matched ;
}
2012-03-12 02:53:21 +00:00
static int
2010-01-29 16:09:25 +00:00
capture_opts_add_iface_opt ( capture_options * capture_opts , const char * optarg_str_p )
2005-12-13 22:48:58 +00:00
{
long adapter_index ;
char * p ;
GList * if_list ;
if_info_t * if_info ;
int err ;
2007-01-21 23:45:36 +00:00
gchar * err_str ;
2011-05-16 14:12:35 +00:00
interface_options interface_opts ;
2005-12-13 22:48:58 +00:00
/*
* If the argument is a number , treat it as an index into the list
2006-05-31 17:38:42 +00:00
* of adapters , as printed by " tshark -D " .
2005-12-13 22:48:58 +00:00
*
2020-06-02 22:19:18 +00:00
* This should be OK on UN * X systems , as interfaces shouldn ' t have
2005-12-13 22:48:58 +00:00
* names that begin with digits . It can be useful on Windows , where
* more than one interface can have the same name .
2020-06-02 22:19:18 +00:00
*
* XXX - " shouldn't have names that begin with digits " is not true
* on Linux ; see
*
* https : //github.com/the-tcpdump-group/tcpdump/issues/522
*
* tcpdump handles that by trying to open the device by name and ,
* if that fails * and * the name is a syntactically valid number
* ( optional sign , followed by decimal digits ) , reports an error
* if it ' s not a valid interface index , and otherwise uses it as
* an interface index .
2005-12-13 22:48:58 +00:00
*/
2010-01-29 16:09:25 +00:00
adapter_index = strtol ( optarg_str_p , & p , 10 ) ;
2005-12-13 22:48:58 +00:00
if ( p ! = NULL & & * p = = ' \0 ' ) {
2011-05-12 10:58:14 +00:00
if ( adapter_index < 0 ) {
cmdarg_err ( " The specified adapter index is a negative number " ) ;
return 1 ;
}
if ( adapter_index > INT_MAX ) {
cmdarg_err ( " The specified adapter index is too large (greater than %d) " ,
INT_MAX ) ;
return 1 ;
}
if ( adapter_index = = 0 ) {
cmdarg_err ( " There is no interface with that adapter index " ) ;
return 1 ;
}
2013-06-27 17:27:41 +00:00
if_list = capture_interface_list ( & err , & err_str , NULL ) ;
2012-11-21 18:11:57 +00:00
if ( if_list = = NULL ) {
2014-07-22 23:53:18 +00:00
if ( err = = 0 )
cmdarg_err ( " There are no interfaces on which a capture can be done " ) ;
else {
2012-11-21 18:11:57 +00:00
cmdarg_err ( " %s " , err_str ) ;
g_free ( err_str ) ;
}
return 2 ;
}
2012-12-26 05:57:06 +00:00
if_info = ( if_info_t * ) g_list_nth_data ( if_list , ( int ) ( adapter_index - 1 ) ) ;
2011-05-12 10:58:14 +00:00
if ( if_info = = NULL ) {
cmdarg_err ( " There is no interface with that adapter index " ) ;
return 1 ;
2005-12-13 22:48:58 +00:00
}
2018-08-15 07:51:43 +00:00
fill_in_interface_opts_from_ifinfo ( & interface_opts , if_info ) ;
2018-08-13 03:32:01 +00:00
free_interface_list ( if_list ) ;
} else if ( capture_opts - > capture_child ) {
/*
* In Wireshark capture child mode , so the exact interface name
* is supplied , and we don ' t need to look it up .
*/
if_info = if_info_get ( optarg_str_p ) ;
2018-08-15 07:51:43 +00:00
fill_in_interface_opts_from_ifinfo ( & interface_opts , if_info ) ;
2018-08-13 03:32:01 +00:00
if_info_free ( if_info ) ;
2005-12-13 22:48:58 +00:00
} else {
2012-11-21 18:11:57 +00:00
/*
2018-08-13 03:32:01 +00:00
* Search for that name in the interface list and , if we found
* it , fill in fields in the interface_opts structure .
2012-11-21 18:11:57 +00:00
*/
2018-08-15 07:51:43 +00:00
if ( ! fill_in_interface_opts_from_ifinfo_by_name ( & interface_opts ,
optarg_str_p ) ) {
2018-08-13 03:32:01 +00:00
/*
* We didn ' t find the interface in the list ; just use
* the specified name , so that , for example , if an
* interface doesn ' t show up in the list for some
* reason , the user can try specifying it explicitly
* for testing purposes .
*/
2012-11-21 17:33:02 +00:00
interface_opts . name = g_strdup ( optarg_str_p ) ;
2018-08-13 03:32:01 +00:00
interface_opts . descr = NULL ;
2020-03-28 03:08:33 +00:00
interface_opts . hardware = NULL ;
2018-08-13 03:32:01 +00:00
interface_opts . display_name = g_strdup ( optarg_str_p ) ;
2021-03-25 06:36:29 +00:00
interface_opts . ifname = NULL ;
2015-04-11 19:49:48 +00:00
interface_opts . if_type = capture_opts - > default_options . if_type ;
interface_opts . extcap = g_strdup ( capture_opts - > default_options . extcap ) ;
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
}
2011-05-16 14:12:35 +00:00
}
2012-11-19 21:00:44 +00:00
2011-07-21 17:30:42 +00:00
interface_opts . cfilter = g_strdup ( capture_opts - > default_options . cfilter ) ;
interface_opts . snaplen = capture_opts - > default_options . snaplen ;
interface_opts . has_snaplen = capture_opts - > default_options . has_snaplen ;
interface_opts . linktype = capture_opts - > default_options . linktype ;
interface_opts . promisc_mode = capture_opts - > default_options . promisc_mode ;
2014-02-25 13:05:11 +00:00
interface_opts . extcap_fifo = g_strdup ( capture_opts - > default_options . extcap_fifo ) ;
interface_opts . extcap_args = NULL ;
2018-03-02 17:11:31 +00:00
interface_opts . extcap_pid = WS_INVALID_PID ;
2018-03-01 23:31:45 +00:00
interface_opts . extcap_pipedata = NULL ;
2017-08-19 21:39:21 +00:00
# ifdef _WIN32
interface_opts . extcap_pipe_h = INVALID_HANDLE_VALUE ;
2017-08-25 09:28:34 +00:00
interface_opts . extcap_control_in_h = INVALID_HANDLE_VALUE ;
interface_opts . extcap_control_out_h = INVALID_HANDLE_VALUE ;
2017-08-19 21:39:21 +00:00
# endif
2017-04-15 21:30:30 +00:00
interface_opts . extcap_control_in = g_strdup ( capture_opts - > default_options . extcap_control_in ) ;
interface_opts . extcap_control_out = g_strdup ( capture_opts - > default_options . extcap_control_out ) ;
2015-03-25 03:22:00 +00:00
# ifdef CAN_SET_CAPTURE_BUFFER_SIZE
2011-07-21 17:30:42 +00:00
interface_opts . buffer_size = capture_opts - > default_options . buffer_size ;
2011-05-16 14:12:35 +00:00
# endif
2011-07-21 17:30:42 +00:00
interface_opts . monitor_mode = capture_opts - > default_options . monitor_mode ;
2011-05-16 15:19:54 +00:00
# ifdef HAVE_PCAP_REMOTE
2011-07-21 17:30:42 +00:00
interface_opts . src_type = capture_opts - > default_options . src_type ;
interface_opts . remote_host = g_strdup ( capture_opts - > default_options . remote_host ) ;
interface_opts . remote_port = g_strdup ( capture_opts - > default_options . remote_port ) ;
interface_opts . auth_type = capture_opts - > default_options . auth_type ;
interface_opts . auth_username = g_strdup ( capture_opts - > default_options . auth_username ) ;
interface_opts . auth_password = g_strdup ( capture_opts - > default_options . auth_password ) ;
interface_opts . datatx_udp = capture_opts - > default_options . datatx_udp ;
interface_opts . nocap_rpcap = capture_opts - > default_options . nocap_rpcap ;
interface_opts . nocap_local = capture_opts - > default_options . nocap_local ;
2011-05-16 15:19:54 +00:00
# endif
2011-05-16 14:12:35 +00:00
# ifdef HAVE_PCAP_SETSAMPLING
2011-07-21 17:30:42 +00:00
interface_opts . sampling_method = capture_opts - > default_options . sampling_method ;
interface_opts . sampling_param = capture_opts - > default_options . sampling_param ;
2011-05-12 16:54:16 +00:00
# endif
2017-08-07 14:38:52 +00:00
interface_opts . timestamp_type = capture_opts - > default_options . timestamp_type ;
2011-05-12 16:54:16 +00:00
2011-07-21 17:30:42 +00:00
g_array_append_val ( capture_opts - > ifaces , interface_opts ) ;
2006-02-10 02:05:30 +00:00
return 0 ;
2005-12-13 22:48:58 +00:00
}
2012-01-25 13:04:32 +00:00
2006-02-10 02:05:30 +00:00
int
2021-04-13 19:35:02 +00:00
capture_opts_add_opt ( capture_options * capture_opts , int opt , const char * optarg_str_p )
2005-04-10 16:43:22 +00:00
{
2011-06-27 00:09:03 +00:00
int status , snaplen ;
2006-02-10 02:05:30 +00:00
2005-02-23 01:01:19 +00:00
switch ( opt ) {
case ' a ' : /* autostop criteria */
2010-01-29 16:09:25 +00:00
if ( set_autostop_criterion ( capture_opts , optarg_str_p ) = = FALSE ) {
2011-05-12 10:58:14 +00:00
cmdarg_err ( " Invalid or unknown -a flag \" %s \" " , optarg_str_p ) ;
return 1 ;
2005-02-23 01:01:19 +00:00
}
break ;
2007-12-04 11:19:29 +00:00
# ifdef HAVE_PCAP_REMOTE
case ' A ' :
2010-01-29 16:09:25 +00:00
if ( get_auth_arguments ( capture_opts , optarg_str_p ) = = FALSE ) {
cmdarg_err ( " Invalid or unknown -A arg \" %s \" " , optarg_str_p ) ;
2007-12-04 11:19:29 +00:00
return 1 ;
}
break ;
# endif
2005-02-23 01:01:19 +00:00
case ' b ' : /* Ringbuffer option */
capture_opts - > multi_files_on = TRUE ;
2010-01-29 16:09:25 +00:00
if ( get_ring_arguments ( capture_opts , optarg_str_p ) = = FALSE ) {
2011-05-12 10:58:14 +00:00
cmdarg_err ( " Invalid or unknown -b arg \" %s \" " , optarg_str_p ) ;
return 1 ;
2005-02-23 01:01:19 +00:00
}
break ;
2015-03-25 03:22:00 +00:00
# ifdef CAN_SET_CAPTURE_BUFFER_SIZE
2005-05-30 04:46:25 +00:00
case ' B ' : /* Buffer size */
2011-05-16 00:55:04 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-12 16:54:16 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > buffer_size = get_positive_int ( optarg_str_p , " buffer size " ) ;
2011-05-12 16:54:16 +00:00
} else {
capture_opts - > default_options . buffer_size = get_positive_int ( optarg_str_p , " buffer size " ) ;
}
2005-05-30 04:46:25 +00:00
break ;
# endif
2006-03-24 02:40:59 +00:00
case ' c ' : /* Capture n packets */
2018-10-31 09:03:04 +00:00
/* XXX Use set_autostop_criterion instead? */
2005-02-23 01:01:19 +00:00
capture_opts - > has_autostop_packets = TRUE ;
2010-01-29 16:09:25 +00:00
capture_opts - > autostop_packets = get_positive_int ( optarg_str_p , " packet count " ) ;
2005-02-23 01:01:19 +00:00
break ;
case ' f ' : /* capture filter */
2014-12-20 22:13:05 +00:00
get_filter_arguments ( capture_opts , optarg_str_p ) ;
2005-02-23 01:01:19 +00:00
break ;
2012-12-12 03:25:35 +00:00
case ' g ' : /* enable group read access on the capture file(s) */
capture_opts - > group_read_access = TRUE ;
break ;
2005-02-23 01:01:19 +00:00
case ' H ' : /* Hide capture info dialog box */
capture_opts - > show_info = FALSE ;
break ;
2017-08-07 14:38:52 +00:00
case LONGOPT_SET_TSTAMP_TYPE : /* Set capture time stamp type */
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2017-08-07 14:38:52 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
g_free ( interface_opts - > timestamp_type ) ;
interface_opts - > timestamp_type = g_strdup ( optarg_str_p ) ;
2017-08-07 14:38:52 +00:00
} else {
2017-08-22 09:00:28 +00:00
g_free ( capture_opts - > default_options . timestamp_type ) ;
2017-08-07 14:38:52 +00:00
capture_opts - > default_options . timestamp_type = g_strdup ( optarg_str_p ) ;
}
break ;
2006-03-24 02:40:59 +00:00
case ' i ' : /* Use interface x */
2010-01-29 16:09:25 +00:00
status = capture_opts_add_iface_opt ( capture_opts , optarg_str_p ) ;
2011-03-01 17:29:09 +00:00
if ( status ! = 0 ) {
2006-02-10 02:05:30 +00:00
return status ;
}
2005-02-23 01:01:19 +00:00
break ;
2010-05-07 01:25:53 +00:00
# ifdef HAVE_PCAP_CREATE
case ' I ' : /* Capture in monitor mode */
2011-05-16 00:55:04 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-12 16:54:16 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > monitor_mode = TRUE ;
2011-05-12 16:54:16 +00:00
} else {
capture_opts - > default_options . monitor_mode = TRUE ;
}
2010-05-07 01:25:53 +00:00
break ;
# endif
2005-02-23 01:01:19 +00:00
/*case 'l':*/ /* Automatic scrolling in live capture mode */
2007-12-04 11:19:29 +00:00
# ifdef HAVE_PCAP_SETSAMPLING
case ' m ' :
2010-01-29 16:09:25 +00:00
if ( get_sampling_arguments ( capture_opts , optarg_str_p ) = = FALSE ) {
cmdarg_err ( " Invalid or unknown -m arg \" %s \" " , optarg_str_p ) ;
2007-12-04 11:19:29 +00:00
return 1 ;
}
break ;
# endif
2009-04-27 08:11:10 +00:00
case ' n ' : /* Use pcapng format */
capture_opts - > use_pcapng = TRUE ;
break ;
2005-02-23 01:01:19 +00:00
case ' p ' : /* Don't capture in promiscuous mode */
2011-05-16 00:55:04 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-12 16:54:16 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > promisc_mode = FALSE ;
2011-05-12 16:54:16 +00:00
} else {
capture_opts - > default_options . promisc_mode = FALSE ;
}
2005-02-23 01:01:19 +00:00
break ;
2011-06-17 17:52:31 +00:00
case ' P ' : /* Use pcap format */
capture_opts - > use_pcapng = FALSE ;
break ;
2007-12-04 11:19:29 +00:00
# ifdef HAVE_PCAP_REMOTE
case ' r ' :
2011-05-16 15:19:54 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-16 15:19:54 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > nocap_rpcap = FALSE ;
2011-05-16 15:19:54 +00:00
} else {
capture_opts - > default_options . nocap_rpcap = FALSE ;
}
2007-12-04 11:19:29 +00:00
break ;
# endif
2005-02-23 01:01:19 +00:00
case ' s ' : /* Set the snapshot (capture) length */
2011-06-27 00:09:03 +00:00
snaplen = get_natural_int ( optarg_str_p , " snapshot length " ) ;
2011-03-01 17:29:09 +00:00
/*
* Make a snapshot length of 0 equivalent to the maximum packet
* length , mirroring what tcpdump does .
*/
2011-06-27 00:09:03 +00:00
if ( snaplen = = 0 )
Allow bigger snapshot lengths for D-Bus captures.
Use WTAP_MAX_PACKET_SIZE_STANDARD, set to 256KB, for everything except
for D-Bus captures. Use WTAP_MAX_PACKET_SIZE_DBUS, set to 128MB, for
them, because that's the largest possible D-Bus message size. See
https://bugs.freedesktop.org/show_bug.cgi?id=100220
for an example of the problems caused by limiting the snapshot length to
256KB for D-Bus.
Have a snapshot length of 0 in a capture_file structure mean "there is
no snapshot length for the file"; we don't need the has_snap field in
that case, a value of 0 mean "no, we don't have a snapshot length".
In dumpcap, start out with a pipe buffer size of 2KB, and grow it as
necessary. When checking for a too-big packet from a pipe, check
against the appropriate maximum - 128MB for DLT_DBUS, 256KB for
everything else.
Change-Id: Ib2ce7a0cf37b971fbc0318024fd011e18add8b20
Reviewed-on: https://code.wireshark.org/review/21952
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
2017-06-05 01:58:40 +00:00
snaplen = WTAP_MAX_PACKET_SIZE_STANDARD ;
2011-05-16 00:55:04 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-12 16:54:16 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > has_snaplen = TRUE ;
interface_opts - > snaplen = snaplen ;
2011-05-12 16:54:16 +00:00
} else {
2011-06-27 00:09:03 +00:00
capture_opts - > default_options . snaplen = snaplen ;
capture_opts - > default_options . has_snaplen = TRUE ;
2011-05-12 16:54:16 +00:00
}
2005-02-23 01:01:19 +00:00
break ;
2005-03-28 16:14:34 +00:00
case ' S ' : /* "Real-Time" mode: used for following file ala tail -f */
capture_opts - > real_time_mode = TRUE ;
2005-02-23 01:01:19 +00:00
break ;
2007-12-04 11:19:29 +00:00
# ifdef HAVE_PCAP_REMOTE
case ' u ' :
2011-05-16 15:19:54 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-16 15:19:54 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > datatx_udp = TRUE ;
2011-05-16 15:19:54 +00:00
} else {
capture_opts - > default_options . datatx_udp = TRUE ;
}
2007-12-04 11:19:29 +00:00
break ;
# endif
2006-03-24 02:40:59 +00:00
case ' w ' : /* Write to capture file x */
2006-04-03 00:52:59 +00:00
capture_opts - > saving_to_file = TRUE ;
2006-11-02 09:45:12 +00:00
g_free ( capture_opts - > save_file ) ;
2011-07-11 22:51:46 +00:00
capture_opts - > save_file = g_strdup ( optarg_str_p ) ;
2019-02-19 18:50:44 +00:00
capture_opts - > orig_save_file = g_strdup ( optarg_str_p ) ;
2006-02-10 02:05:30 +00:00
status = capture_opts_output_to_pipe ( capture_opts - > save_file , & capture_opts - > output_to_pipe ) ;
return status ;
2005-02-23 01:01:19 +00:00
case ' y ' : /* Set the pcap data link type */
2011-05-16 00:55:04 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-12 16:54:16 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , capture_opts - > ifaces - > len - 1 ) ;
interface_opts - > linktype = linktype_name_to_val ( optarg_str_p ) ;
if ( interface_opts - > linktype = = - 1 ) {
2011-06-27 00:09:03 +00:00
cmdarg_err ( " The specified data link type \" %s \" isn't valid " ,
optarg_str_p ) ;
return 1 ;
}
2011-05-12 16:54:16 +00:00
} else {
capture_opts - > default_options . linktype = linktype_name_to_val ( optarg_str_p ) ;
2011-06-27 00:09:03 +00:00
if ( capture_opts - > default_options . linktype = = - 1 ) {
cmdarg_err ( " The specified data link type \" %s \" isn't valid " ,
optarg_str_p ) ;
return 1 ;
}
2011-05-12 16:54:16 +00:00
}
2005-02-23 01:01:19 +00:00
break ;
2020-08-09 03:12:24 +00:00
case LONGOPT_COMPRESS_TYPE : /* compress type */
if ( capture_opts - > compress_type ) {
cmdarg_err ( " --compress-type can be set only once " ) ;
return 1 ;
}
if ( strcmp ( optarg_str_p , " none " ) = = 0 ) {
;
} else if ( strcmp ( optarg_str_p , " gzip " ) = = 0 ) {
2022-01-21 23:04:28 +00:00
# ifdef HAVE_ZLIB
2020-08-09 03:12:24 +00:00
;
2022-01-21 23:04:28 +00:00
# else
cmdarg_err ( " 'gzip' compression is not supported " ) ;
return 1 ;
# endif
2020-08-09 03:12:24 +00:00
} else {
2022-01-21 23:04:28 +00:00
# ifdef HAVE_ZLIB
2020-08-09 03:12:24 +00:00
cmdarg_err ( " parameter of --compress-type can be 'none' or 'gzip' " ) ;
2022-01-21 23:04:28 +00:00
# else
cmdarg_err ( " parameter of --compress-type can only be 'none' " ) ;
# endif
2020-08-09 03:12:24 +00:00
return 1 ;
}
capture_opts - > compress_type = g_strdup ( optarg_str_p ) ;
break ;
2005-02-23 01:01:19 +00:00
default :
/* the caller is responsible to send us only the right opt's */
2021-06-18 18:21:42 +00:00
ws_assert_not_reached ( ) ;
2005-02-23 01:01:19 +00:00
}
2006-02-10 02:05:30 +00:00
return 0 ;
2005-02-23 01:01:19 +00:00
}
2021-04-14 06:14:09 +00:00
int
capture_opts_print_if_capabilities ( if_capabilities_t * caps ,
interface_options * interface_opts ,
int queries )
2005-12-13 22:48:58 +00:00
{
2017-08-07 14:38:52 +00:00
GList * lt_entry , * ts_entry ;
if ( queries & CAPS_QUERY_LINK_TYPES ) {
2021-04-14 06:14:09 +00:00
if ( caps - > data_link_types = = NULL ) {
cmdarg_err ( " The capture device \" %s \" has no data link types. " ,
interface_opts - > name ) ;
return IFACE_HAS_NO_LINK_TYPES ;
}
2017-08-07 14:38:52 +00:00
if ( caps - > can_set_rfmon )
printf ( " Data link types of interface %s when %sin monitor mode (use option -y to set): \n " ,
2021-04-14 06:14:09 +00:00
interface_opts - > name ,
( interface_opts - > monitor_mode ) ? " " : " not " ) ;
2010-05-07 08:06:25 +00:00
else
2021-04-14 06:14:09 +00:00
printf ( " Data link types of interface %s (use option -y to set): \n " ,
interface_opts - > name ) ;
2017-08-07 14:38:52 +00:00
for ( lt_entry = caps - > data_link_types ; lt_entry ! = NULL ;
lt_entry = g_list_next ( lt_entry ) ) {
data_link_info_t * data_link_info = ( data_link_info_t * ) lt_entry - > data ;
printf ( " %s " , data_link_info - > name ) ;
if ( data_link_info - > description ! = NULL )
printf ( " (%s) " , data_link_info - > description ) ;
else
printf ( " (not supported) " ) ;
printf ( " \n " ) ;
}
}
if ( queries & CAPS_QUERY_TIMESTAMP_TYPES ) {
2021-04-14 06:14:09 +00:00
if ( caps - > timestamp_types = = NULL ) {
cmdarg_err ( " The capture device \" %s \" has no timestamp types. " ,
interface_opts - > name ) ;
return IFACE_HAS_NO_TIMESTAMP_TYPES ;
}
2017-08-07 14:38:52 +00:00
printf ( " Timestamp types of the interface (use option --time-stamp-type to set): \n " ) ;
for ( ts_entry = caps - > timestamp_types ; ts_entry ! = NULL ;
ts_entry = g_list_next ( ts_entry ) ) {
timestamp_info_t * timestamp = ( timestamp_info_t * ) ts_entry - > data ;
printf ( " %s " , timestamp - > name ) ;
if ( timestamp - > description ! = NULL )
printf ( " (%s) " , timestamp - > description ) ;
else
printf ( " (none) " ) ;
printf ( " \n " ) ;
}
2005-12-13 22:48:58 +00:00
}
2021-04-14 06:14:09 +00:00
return EXIT_SUCCESS ;
2005-12-13 22:48:58 +00:00
}
2010-05-07 19:24:32 +00:00
/* Print an ASCII-formatted list of interfaces. */
void
capture_opts_print_interfaces ( GList * if_list )
2005-12-13 22:48:58 +00:00
{
2010-05-07 19:24:32 +00:00
int i ;
2005-12-13 22:48:58 +00:00
GList * if_entry ;
if_info_t * if_info ;
i = 1 ; /* Interface id number */
for ( if_entry = g_list_first ( if_list ) ; if_entry ! = NULL ;
2010-03-04 01:12:04 +00:00
if_entry = g_list_next ( if_entry ) ) {
2010-03-04 09:37:05 +00:00
if_info = ( if_info_t * ) if_entry - > data ;
2013-04-25 05:47:11 +00:00
printf ( " %d. %s " , i + + , if_info - > name ) ;
2007-06-11 03:58:58 +00:00
2012-11-22 06:02:49 +00:00
/* Print the interface friendly name, if it exists;
2018-08-15 07:51:43 +00:00
if not , fall back to the vendor description , if it exists . */
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
if ( if_info - > friendly_name ! = NULL ) {
2013-04-25 05:47:11 +00:00
printf ( " (%s) " , if_info - > friendly_name ) ;
2012-11-22 06:02:49 +00:00
} else {
if ( if_info - > vendor_description ! = NULL )
2013-04-25 05:47:11 +00:00
printf ( " (%s) " , if_info - > vendor_description ) ;
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
}
2013-04-25 05:47:11 +00:00
printf ( " \n " ) ;
2005-12-13 22:48:58 +00:00
}
}
2012-12-12 03:25:35 +00:00
void
capture_opts_trim_snaplen ( capture_options * capture_opts , int snaplen_min )
2005-12-05 21:26:01 +00:00
{
2011-05-16 00:55:04 +00:00
guint i ;
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2011-05-12 16:54:16 +00:00
2011-06-27 00:09:03 +00:00
if ( capture_opts - > ifaces - > len > 0 ) {
for ( i = 0 ; i < capture_opts - > ifaces - > len ; i + + ) {
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , 0 ) ;
if ( interface_opts - > snaplen < 1 )
interface_opts - > snaplen = WTAP_MAX_PACKET_SIZE_STANDARD ;
else if ( interface_opts - > snaplen < snaplen_min )
interface_opts - > snaplen = snaplen_min ;
2011-06-27 00:09:03 +00:00
}
} else {
if ( capture_opts - > default_options . snaplen < 1 )
Allow bigger snapshot lengths for D-Bus captures.
Use WTAP_MAX_PACKET_SIZE_STANDARD, set to 256KB, for everything except
for D-Bus captures. Use WTAP_MAX_PACKET_SIZE_DBUS, set to 128MB, for
them, because that's the largest possible D-Bus message size. See
https://bugs.freedesktop.org/show_bug.cgi?id=100220
for an example of the problems caused by limiting the snapshot length to
256KB for D-Bus.
Have a snapshot length of 0 in a capture_file structure mean "there is
no snapshot length for the file"; we don't need the has_snap field in
that case, a value of 0 mean "no, we don't have a snapshot length".
In dumpcap, start out with a pipe buffer size of 2KB, and grow it as
necessary. When checking for a too-big packet from a pipe, check
against the appropriate maximum - 128MB for DLT_DBUS, 256KB for
everything else.
Change-Id: Ib2ce7a0cf37b971fbc0318024fd011e18add8b20
Reviewed-on: https://code.wireshark.org/review/21952
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Guy Harris <guy@alum.mit.edu>
2017-06-05 01:58:40 +00:00
capture_opts - > default_options . snaplen = WTAP_MAX_PACKET_SIZE_STANDARD ;
2011-06-27 00:09:03 +00:00
else if ( capture_opts - > default_options . snaplen < snaplen_min )
capture_opts - > default_options . snaplen = snaplen_min ;
2011-05-12 16:54:16 +00:00
}
2005-12-13 22:48:58 +00:00
}
2005-12-05 21:26:01 +00:00
2012-12-12 03:25:35 +00:00
void
capture_opts_trim_ring_num_files ( capture_options * capture_opts )
2005-12-13 22:48:58 +00:00
{
2011-05-12 10:58:14 +00:00
/* Check the value range of the ring_num_files parameter */
if ( capture_opts - > ring_num_files > RINGBUFFER_MAX_NUM_FILES ) {
cmdarg_err ( " Too many ring buffer files (%u). Reducing to %u. \n " , capture_opts - > ring_num_files , RINGBUFFER_MAX_NUM_FILES ) ;
capture_opts - > ring_num_files = RINGBUFFER_MAX_NUM_FILES ;
} else if ( capture_opts - > ring_num_files > RINGBUFFER_WARN_NUM_FILES ) {
cmdarg_err ( " %u is a lot of ring buffer files. \n " , capture_opts - > ring_num_files ) ;
}
2005-12-05 21:26:01 +00:00
# if RINGBUFFER_MIN_NUM_FILES > 0
2011-05-12 10:58:14 +00:00
else if ( capture_opts - > ring_num_files < RINGBUFFER_MIN_NUM_FILES )
cmdarg_err ( " Too few ring buffer files (%u). Increasing to %u. \n " , capture_opts - > ring_num_files , RINGBUFFER_MIN_NUM_FILES ) ;
capture_opts - > ring_num_files = RINGBUFFER_MIN_NUM_FILES ;
2005-12-05 21:26:01 +00:00
# endif
}
2013-05-22 04:49:31 +00:00
/*
* If no interface was specified explicitly , pick a default .
*/
2012-11-21 17:14:54 +00:00
int
2013-05-22 04:49:31 +00:00
capture_opts_default_iface_if_necessary ( capture_options * capture_opts ,
const char * capture_device )
2005-12-13 22:48:58 +00:00
{
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
int status ;
2005-12-13 22:48:58 +00:00
/* Did the user specify an interface to use? */
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
if ( capture_opts - > num_selected ! = 0 | | capture_opts - > ifaces - > len ! = 0 ) {
2012-11-21 17:14:54 +00:00
/* yes they did, return immediately - nothing further to do here */
return 0 ;
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
}
2011-05-12 12:06:19 +00:00
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
/* No - is a default specified in the preferences file? */
if ( capture_device ! = NULL ) {
/* Yes - use it. */
2012-11-20 01:12:57 +00:00
status = capture_opts_add_iface_opt ( capture_opts , capture_device ) ;
2012-11-21 17:14:54 +00:00
return status ;
2005-12-13 22:48:58 +00:00
}
From Mike Garratt:
Friendly Names for interfaces on Windows
Notes on the changes the patch covers:
* if_info_t struct: addition of friendly_name
* Dumpcap Interface list format changes:
+ Win32: "dumpcap -D" shows friendly_name in place of descript if known
+ All: machine interface "dumpcap -D -Z none" includes friendly_name in the
list in addition to the existing parameters
* interface_options struct: addition of console_display_name
+ When an interface name is displayed in a console, it will typically be the
console_display_name (instead of name).
+ console_display_name is used as the basis of the autogenerated temp
filenames
+ console_display_name is typically set to the friendly_name if known,
otherwise it is set to the interface name
* Enhancements to capture_opts_add_iface_opt() (the function which process -i
options).
+ Can now specify the interface using its name and friendly_name
+ Interface name matching is case insenstive
+ Name matching first attempts exact matching, then falls back to prefix
matching
(e.g. dumpcap -i local)
+ Validates interface names, instead of blindly sending them off to
winpcap/libpcap
+ Interface specification by number is still supported.
* capture_opts_trim_iface() has been refactored:
+ Instead of repeating a decent chunk of the cost in
capture_opts_add_iface_opt(), it calls capture_opts_trim_iface() to specify the
interface.
* introduction of capture_win_ifnames.[ch] (windows only code)
+ Implements static function GetInterfaceFriendlyNameFromDeviceGuid() - a
windows version independant function to convert an interface guid into its
friendly name. Uses published api functions on windows vista and higher, but
falls back to unpublished API functions on older windows releases.
+ void get_windows_interface_friendlyname(/* IN */ char
*interface_devicename, /* OUT */char **interface_friendlyname); - extracts the
GUID from the interface_devicename, then uses
GetInterfaceFriendlyNameFromDeviceGuid() to do the resolution
* Auto temp filename generation:
+ Now uses wireshark_pcapng_* or wireshark_pcap_* depending on file format
+ Basis temp filename format on console_display_name
+ Win32: if console_display_name is a windows interface guid, extracts
numbers from GUID here (instead of in interface option processing)
GUI CHANGES:
* Dialog that displays when you click the "Manage Interfaces" button (within
Capture Options dialog) has been renamed from "Add new interfaces" to
"Interface Management"
* ui/gtk/capture_dlg.c: new_interfaces_w variable renamed to
interface_management_w
* Win32: Local Interfaces tab on Interface Management dialog, shows includes
friendly name as far left column
* Interface Management dialog defaults to larger size on win32 - so it fits
without resizing local interfaces tab
* Interface Management dialog now saves preferences when you click the apply
button (local hidden interfaces was not persisting across restarts)
* Tweaks: "Interface Details" dialog (Interface list->Capture Interfaces ->
Details):
+ "Friendly Name" renamed to "NDIS Friendly Name"
+ Added "OS Friendly Name" to the top of the list
* Win32: The "Capture Interfaces" dialog now shows the friendly name instead of
device guid
* Welcome screen:
+ The height of the interface list scrollbox dynamically adjusts & updates to
the number visible interfaces.
Up to 10 interfaces can be listed without a scroll bar, the minimum height
is for 2 interfaces.
+ Win32: now shows just the Friendly Name if known - in place of
"Interfacename_Guid:(Description)"
svn path=/trunk/; revision=46083
2012-11-19 20:07:27 +00:00
/* No default in preferences file, just pick the first interface from the list of interfaces. */
2012-11-21 17:14:54 +00:00
return capture_opts_add_iface_opt ( capture_opts , " 1 " ) ;
2005-12-13 22:48:58 +00:00
}
2006-01-07 01:29:45 +00:00
# ifndef S_IFIFO
2012-11-20 01:12:57 +00:00
# define S_IFIFO _S_IFIFO
2006-01-07 01:29:45 +00:00
# endif
# ifndef S_ISFIFO
# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
# endif
/* copied from filesystem.c */
2012-12-12 03:25:35 +00:00
static int
capture_opts_test_for_fifo ( const char * path )
2006-01-07 01:29:45 +00:00
{
2014-10-12 18:56:12 +00:00
ws_statb64 statb ;
2006-01-07 01:29:45 +00:00
2014-10-12 18:56:12 +00:00
if ( ws_stat64 ( path , & statb ) < 0 )
return errno ;
2006-01-07 01:29:45 +00:00
2014-10-12 18:56:12 +00:00
if ( S_ISFIFO ( statb . st_mode ) )
return ESPIPE ;
else
return 0 ;
2006-01-07 01:29:45 +00:00
}
2012-12-12 03:25:35 +00:00
static gboolean
capture_opts_output_to_pipe ( const char * save_file , gboolean * is_pipe )
2006-01-07 01:29:45 +00:00
{
2014-10-12 18:56:12 +00:00
int err ;
* is_pipe = FALSE ;
if ( save_file ! = NULL ) {
/* We're writing to a capture file. */
if ( strcmp ( save_file , " - " ) = = 0 ) {
/* Writing to stdout. */
/* XXX - should we check whether it's a pipe? It's arguably
silly to do " -w - >output_file " rather than " -w output_file " ,
but by not checking we might be violating the Principle Of
Least Astonishment . */
* is_pipe = TRUE ;
} else {
/* not writing to stdout, test for a FIFO (aka named pipe) */
err = capture_opts_test_for_fifo ( save_file ) ;
switch ( err ) {
case ENOENT : /* it doesn't exist, so we'll be creating it,
and it won ' t be a FIFO */
case 0 : /* found it, but it's not a FIFO */
break ;
case ESPIPE : /* it is a FIFO */
* is_pipe = TRUE ;
break ;
default : /* couldn't stat it */
break ; /* ignore: later attempt to open */
/* will generate a nice msg */
}
}
2006-01-07 01:29:45 +00:00
}
2014-10-12 18:56:12 +00:00
return 0 ;
2006-01-07 01:29:45 +00:00
}
2012-01-25 13:04:32 +00:00
void
2014-07-14 14:22:53 +00:00
capture_opts_del_iface ( capture_options * capture_opts , guint if_index )
2012-01-25 13:04:32 +00:00
{
2017-08-25 09:27:38 +00:00
interface_options * interface_opts ;
2012-03-13 03:48:27 +00:00
2017-08-25 09:27:38 +00:00
interface_opts = & g_array_index ( capture_opts - > ifaces , interface_options , if_index ) ;
2014-10-12 18:56:12 +00:00
/* XXX - check if found? */
2014-07-04 22:18:07 +00:00
2017-08-25 09:27:38 +00:00
g_free ( interface_opts - > name ) ;
g_free ( interface_opts - > descr ) ;
2020-03-28 03:08:33 +00:00
g_free ( interface_opts - > hardware ) ;
2018-08-13 03:32:01 +00:00
g_free ( interface_opts - > display_name ) ;
2021-03-25 06:36:29 +00:00
g_free ( interface_opts - > ifname ) ;
2017-08-25 09:27:38 +00:00
g_free ( interface_opts - > cfilter ) ;
g_free ( interface_opts - > timestamp_type ) ;
g_free ( interface_opts - > extcap ) ;
g_free ( interface_opts - > extcap_fifo ) ;
if ( interface_opts - > extcap_args )
g_hash_table_unref ( interface_opts - > extcap_args ) ;
2018-03-02 17:11:31 +00:00
if ( interface_opts - > extcap_pid ! = WS_INVALID_PID )
2018-11-01 08:18:37 +00:00
ws_pipe_close ( ( ws_pipe_t * ) interface_opts - > extcap_pipedata ) ;
2018-03-01 23:31:45 +00:00
g_free ( interface_opts - > extcap_pipedata ) ;
2017-08-25 09:27:38 +00:00
g_free ( interface_opts - > extcap_control_in ) ;
g_free ( interface_opts - > extcap_control_out ) ;
2012-03-13 03:48:27 +00:00
# ifdef HAVE_PCAP_REMOTE
2017-08-25 09:27:38 +00:00
if ( interface_opts - > src_type = = CAPTURE_IFREMOTE ) {
g_free ( interface_opts - > remote_host ) ;
g_free ( interface_opts - > remote_port ) ;
g_free ( interface_opts - > auth_username ) ;
g_free ( interface_opts - > auth_password ) ;
2012-03-13 03:48:27 +00:00
}
# endif
2014-07-14 14:22:53 +00:00
capture_opts - > ifaces = g_array_remove_index ( capture_opts - > ifaces , if_index ) ;
2014-07-04 22:18:07 +00:00
}
/*
* Add all non - hidden selected interfaces in the " all interfaces " list
* to the list of interfaces for the capture .
*/
void
collect_ifaces ( capture_options * capture_opts )
{
2014-10-12 18:56:12 +00:00
guint i ;
2017-08-24 14:16:34 +00:00
interface_t * device ;
2014-10-12 18:56:12 +00:00
interface_options interface_opts ;
/* Empty out the existing list of interfaces. */
for ( i = capture_opts - > ifaces - > len ; i ! = 0 ; i - - )
capture_opts_del_iface ( capture_opts , i - 1 ) ;
/* Now fill the list up again. */
for ( i = 0 ; i < capture_opts - > all_ifaces - > len ; i + + ) {
2017-08-24 14:16:34 +00:00
device = & g_array_index ( capture_opts - > all_ifaces , interface_t , i ) ;
if ( ! device - > hidden & & device - > selected ) {
interface_opts . name = g_strdup ( device - > name ) ;
2018-08-13 03:32:01 +00:00
interface_opts . descr = g_strdup ( device - > friendly_name ) ;
2021-03-26 20:04:36 +00:00
interface_opts . ifname = NULL ;
2020-03-28 03:08:33 +00:00
interface_opts . hardware = g_strdup ( device - > vendor_description ) ;
2018-08-13 03:32:01 +00:00
interface_opts . display_name = g_strdup ( device - > display_name ) ;
2017-08-24 14:16:34 +00:00
interface_opts . linktype = device - > active_dlt ;
interface_opts . cfilter = g_strdup ( device - > cfilter ) ;
interface_opts . timestamp_type = g_strdup ( device - > timestamp_type ) ;
interface_opts . snaplen = device - > snaplen ;
interface_opts . has_snaplen = device - > has_snaplen ;
interface_opts . promisc_mode = device - > pmode ;
interface_opts . if_type = device - > if_info . type ;
interface_opts . extcap = g_strdup ( device - > if_info . extcap ) ;
2014-10-12 18:56:12 +00:00
interface_opts . extcap_fifo = NULL ;
2018-03-01 23:31:45 +00:00
interface_opts . extcap_pipedata = NULL ;
2017-08-24 14:16:34 +00:00
interface_opts . extcap_args = device - > external_cap_args_settings ;
2018-03-02 17:11:31 +00:00
interface_opts . extcap_pid = WS_INVALID_PID ;
2014-10-12 18:56:12 +00:00
if ( interface_opts . extcap_args )
g_hash_table_ref ( interface_opts . extcap_args ) ;
2018-03-01 23:31:45 +00:00
interface_opts . extcap_pipedata = NULL ;
2017-08-19 21:39:21 +00:00
# ifdef _WIN32
interface_opts . extcap_pipe_h = INVALID_HANDLE_VALUE ;
2017-08-25 09:28:34 +00:00
interface_opts . extcap_control_in_h = INVALID_HANDLE_VALUE ;
interface_opts . extcap_control_out_h = INVALID_HANDLE_VALUE ;
2017-08-19 21:39:21 +00:00
# endif
2017-04-15 21:30:30 +00:00
interface_opts . extcap_control_in = NULL ;
interface_opts . extcap_control_out = NULL ;
2015-03-25 03:22:00 +00:00
# ifdef CAN_SET_CAPTURE_BUFFER_SIZE
2017-08-24 14:16:34 +00:00
interface_opts . buffer_size = device - > buffer ;
2012-01-25 19:40:22 +00:00
# endif
# ifdef HAVE_PCAP_CREATE
2017-08-24 14:16:34 +00:00
interface_opts . monitor_mode = device - > monitor_mode_enabled ;
2012-01-25 13:04:32 +00:00
# endif
2012-01-25 14:29:09 +00:00
# ifdef HAVE_PCAP_REMOTE
2014-10-12 18:56:12 +00:00
interface_opts . src_type = CAPTURE_IFREMOTE ;
2017-08-24 14:16:34 +00:00
interface_opts . remote_host = g_strdup ( device - > remote_opts . remote_host_opts . remote_host ) ;
interface_opts . remote_port = g_strdup ( device - > remote_opts . remote_host_opts . remote_port ) ;
interface_opts . auth_type = device - > remote_opts . remote_host_opts . auth_type ;
interface_opts . auth_username = g_strdup ( device - > remote_opts . remote_host_opts . auth_username ) ;
interface_opts . auth_password = g_strdup ( device - > remote_opts . remote_host_opts . auth_password ) ;
interface_opts . datatx_udp = device - > remote_opts . remote_host_opts . datatx_udp ;
interface_opts . nocap_rpcap = device - > remote_opts . remote_host_opts . nocap_rpcap ;
interface_opts . nocap_local = device - > remote_opts . remote_host_opts . nocap_local ;
2012-01-25 13:04:32 +00:00
# endif
# ifdef HAVE_PCAP_SETSAMPLING
2017-08-24 14:16:34 +00:00
interface_opts . sampling_method = device - > remote_opts . sampling_method ;
interface_opts . sampling_param = device - > remote_opts . sampling_param ;
2012-01-25 13:04:32 +00:00
# endif
2014-10-12 18:56:12 +00:00
g_array_append_val ( capture_opts - > ifaces , interface_opts ) ;
} else {
continue ;
}
2012-01-25 13:04:32 +00:00
}
}
2015-11-26 08:27:51 +00:00
static void
capture_opts_free_interface_t_links ( gpointer elem , gpointer unused _U_ )
{
link_row * e = ( link_row * ) elem ;
if ( e ! = NULL )
g_free ( e - > name ) ;
g_free ( elem ) ;
}
void
capture_opts_free_interface_t ( interface_t * device )
{
if ( device ! = NULL ) {
g_free ( device - > name ) ;
g_free ( device - > display_name ) ;
2020-03-28 03:08:33 +00:00
g_free ( device - > vendor_description ) ;
2015-11-26 08:27:51 +00:00
g_free ( device - > friendly_name ) ;
g_free ( device - > addresses ) ;
g_free ( device - > cfilter ) ;
2017-08-22 09:00:28 +00:00
g_free ( device - > timestamp_type ) ;
2015-11-26 08:27:51 +00:00
g_list_foreach ( device - > links ,
capture_opts_free_interface_t_links , NULL ) ;
g_list_free ( device - > links ) ;
# ifdef HAVE_PCAP_REMOTE
g_free ( device - > remote_opts . remote_host_opts . remote_host ) ;
g_free ( device - > remote_opts . remote_host_opts . remote_port ) ;
g_free ( device - > remote_opts . remote_host_opts . auth_username ) ;
g_free ( device - > remote_opts . remote_host_opts . auth_password ) ;
# endif
g_free ( device - > if_info . name ) ;
g_free ( device - > if_info . friendly_name ) ;
g_free ( device - > if_info . vendor_description ) ;
2018-04-17 10:48:35 +00:00
g_slist_free_full ( device - > if_info . addrs , g_free ) ;
2015-11-26 08:27:51 +00:00
g_free ( device - > if_info . extcap ) ;
}
}
2012-01-25 13:04:32 +00:00
2005-02-24 05:39:59 +00:00
# endif /* HAVE_LIBPCAP */
2014-10-12 18:56:12 +00:00
/*
2019-07-26 18:43:17 +00:00
* Editor modelines - https : //www.wireshark.org/tools/modelines.html
2014-10-12 18:56:12 +00:00
*
* Local variables :
* c - basic - offset : 4
* tab - width : 8
* indent - tabs - mode : nil
* End :
*
* vi : set shiftwidth = 4 tabstop = 8 expandtab :
* : indentSize = 4 : tabSize = 8 : noTabs = true :
*/