X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=capture_opts.c;h=53b6253346c9401bd27cb543cc634e5349f6c220;hb=16b27ad924168718a7216f42dde71e6322731ddb;hp=4e272d19bef4be98590cb3fcb5a1c54c9905051b;hpb=89c33a8266809342954388f7157a7419f4bbad2f;p=metze%2Fwireshark%2Fwip.git diff --git a/capture_opts.c b/capture_opts.c index 4e272d19be..53b6253346 100644 --- a/capture_opts.c +++ b/capture_opts.c @@ -24,6 +24,8 @@ #include "config.h" +#include + #ifdef HAVE_LIBPCAP #include @@ -37,30 +39,23 @@ #include #include -#include "ui/simple_dialog.h" #include "capture_ui_utils.h" #include "capture_opts.h" #include "ringbuffer.h" #include "clopts_common.h" -#include "console_io.h" #include "cmdarg_err.h" #include "capture_ifinfo.h" #include "capture-pcap-util.h" #include -#ifdef _WIN32 -#include "capture_win_ifnames.h" /* windows friendly interface names */ -#endif - static gboolean capture_opts_output_to_pipe(const char *save_file, gboolean *is_pipe); void -capture_opts_init(capture_options *capture_opts, void *cf) +capture_opts_init(capture_options *capture_opts) { - capture_opts->cf = cf; 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; @@ -72,7 +67,7 @@ capture_opts_init(capture_options *capture_opts, void *cf) capture_opts->default_options.linktype = -1; capture_opts->default_options.promisc_mode = TRUE; #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - capture_opts->default_options.buffer_size = 1; /* 1 MB */ + capture_opts->default_options.buffer_size = DEFAULT_CAPTURE_BUFFER_SIZE; #endif capture_opts->default_options.monitor_mode = FALSE; #ifdef HAVE_PCAP_REMOTE @@ -102,6 +97,7 @@ capture_opts_init(capture_options *capture_opts, void *cf) capture_opts->show_info = TRUE; capture_opts->quit_after_cap = getenv("WIRESHARK_QUIT_AFTER_CAPTURE") ? TRUE : FALSE; capture_opts->restart = FALSE; + capture_opts->orig_save_file = NULL; capture_opts->multi_files_on = FALSE; capture_opts->has_file_duration = FALSE; @@ -114,21 +110,13 @@ capture_opts_init(capture_options *capture_opts, void *cf) capture_opts->has_autostop_packets = FALSE; capture_opts->autostop_packets = 0; capture_opts->has_autostop_filesize = FALSE; - capture_opts->autostop_filesize = 1024; /* 1 MB */ + capture_opts->autostop_filesize = 1024; /* 1 MiB */ capture_opts->has_autostop_duration = FALSE; capture_opts->autostop_duration = 60; /* 1 min */ + capture_opts->capture_comment = NULL; - - capture_opts->fork_child = -1; /* invalid process handle */ -#ifdef _WIN32 - capture_opts->signal_pipe_write_fd = -1; -#endif - capture_opts->state = CAPTURE_STOPPED; capture_opts->output_to_pipe = FALSE; -#ifndef _WIN32 - capture_opts->owner = getuid(); - capture_opts->group = getgid(); -#endif + capture_opts->capture_child = FALSE; } @@ -138,15 +126,14 @@ capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_optio guint i; g_log(log_domain, log_level, "CAPTURE OPTIONS :"); - g_log(log_domain, log_level, "CFile : %p", capture_opts->cf); for (i = 0; i < capture_opts->ifaces->len; i++) { interface_options interface_opts; interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); g_log(log_domain, log_level, "Interface name[%02d] : %s", i, interface_opts.name ? interface_opts.name : "(unspecified)"); - g_log(log_domain, log_level, "Interface Descr[%02d] : %s", i, interface_opts.descr ? interface_opts.descr : "(unspecified)"); - g_log(log_domain, log_level, "Con display name[%02d]: %s", i, interface_opts.console_display_name ? interface_opts.console_display_name : "(unspecified)"); + g_log(log_domain, log_level, "Interface description[%02d] : %s", i, interface_opts.descr ? interface_opts.descr : "(unspecified)"); + g_log(log_domain, log_level, "Console display name[%02d]: %s", i, interface_opts.console_display_name ? interface_opts.console_display_name : "(unspecified)"); g_log(log_domain, log_level, "Capture filter[%02d] : %s", i, interface_opts.cfilter ? interface_opts.cfilter : "(unspecified)"); g_log(log_domain, log_level, "Snap length[%02d] (%u) : %d", i, interface_opts.has_snaplen, interface_opts.snaplen); g_log(log_domain, log_level, "Link Type[%02d] : %d", i, interface_opts.linktype); @@ -230,13 +217,8 @@ capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_optio g_log(log_domain, log_level, "AutostopFiles (%u) : %u", capture_opts->has_autostop_files, capture_opts->autostop_files); g_log(log_domain, log_level, "AutostopPackets (%u) : %u", capture_opts->has_autostop_packets, capture_opts->autostop_packets); - g_log(log_domain, log_level, "AutostopFilesize(%u) : %u (KB)", capture_opts->has_autostop_filesize, capture_opts->autostop_filesize); + g_log(log_domain, log_level, "AutostopFilesize(%u) : %u (KiB)", capture_opts->has_autostop_filesize, capture_opts->autostop_filesize); g_log(log_domain, log_level, "AutostopDuration(%u) : %u", capture_opts->has_autostop_duration, capture_opts->autostop_duration); - - g_log(log_domain, log_level, "ForkChild : %d", capture_opts->fork_child); -#ifdef _WIN32 - g_log(log_domain, log_level, "SignalPipeWrite : %d", capture_opts->signal_pipe_write_fd); -#endif } /* @@ -450,25 +432,6 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str gchar *err_str; interface_options interface_opts; - /* retrieve the interface list to compare the option specfied against */ - if_list = capture_interface_list(&err, &err_str); - if (if_list == NULL) { - switch (err) { - - case CANT_GET_INTERFACE_LIST: - case DONT_HAVE_PCAP: - cmdarg_err("%s", err_str); - g_free(err_str); - break; - - case NO_INTERFACES_FOUND: - cmdarg_err("There are no interfaces on which a capture can be done"); - break; - } - return 2; - } - - /* * If the argument is a number, treat it as an index into the list * of adapters, as printed by "tshark -D". @@ -492,80 +455,136 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str cmdarg_err("There is no interface with that adapter index"); return 1; } - if_info = (if_info_t *)g_list_nth_data(if_list, adapter_index - 1); + if_list = capture_interface_list(&err, &err_str, NULL); + if (if_list == NULL) { + switch (err) { + + case CANT_GET_INTERFACE_LIST: + case DONT_HAVE_PCAP: + cmdarg_err("%s", err_str); + g_free(err_str); + break; + + case NO_INTERFACES_FOUND: + cmdarg_err("There are no interfaces on which a capture can be done"); + break; + } + return 2; + } + if_info = (if_info_t *)g_list_nth_data(if_list, (int)(adapter_index - 1)); if (if_info == NULL) { cmdarg_err("There is no interface with that adapter index"); return 1; } interface_opts.name = g_strdup(if_info->name); - if(if_info->friendly_name!=NULL){ - /* we know the friendlyname, so display that instead of the interface name/guid */ + if (if_info->friendly_name != NULL) { + /* + * We have a friendly name for the interface, so display that + * instead of the interface name/guid. + * + * XXX - on UN*X, the interface name is not quite so ugly, + * and might be more familiar to users; display them both? + */ interface_opts.console_display_name = g_strdup(if_info->friendly_name); - }else{ + } else { /* fallback to the interface name */ interface_opts.console_display_name = g_strdup(if_info->name); } + free_interface_list(if_list); + } else if (capture_opts->capture_child) { + /* In Wireshark capture child mode, thus proper device name is supplied. */ + /* No need for trying to match it for friendly names. */ + interface_opts.name = g_strdup(optarg_str_p); + interface_opts.console_display_name = g_strdup(optarg_str_p); } else { - /* try and do an exact match (case insensitive) */ - GList *if_entry; - gboolean matched; - - matched=FALSE; - 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; - /* exact name check */ - if(g_ascii_strcasecmp(if_info->name, optarg_str_p)==0){ - /* exact match on the interface name, use that for displaying etc */ - interface_opts.name = g_strdup(if_info->name); - - if(if_info->friendly_name!=NULL){ - /* if we know a friendly_name, use that for console_display_name, as - * it is the basis for the auto generated temp filename */ - interface_opts.console_display_name = g_strdup(if_info->friendly_name); - }else{ - interface_opts.console_display_name = g_strdup(if_info->name); - } - matched=TRUE; - break; - } - - /* exact friendlyname check */ - if(if_info->friendly_name!=NULL && g_ascii_strcasecmp(if_info->friendly_name, optarg_str_p)==0){ - /* exact match - use the friendly name for display */ - interface_opts.name = g_strdup(if_info->name); - interface_opts.console_display_name = g_strdup(if_info->friendly_name); - matched=TRUE; - break; - } - } + /* + * Retrieve the interface list so that we can search for the + * specified option amongst both the interface names and the + * friendly names and so that we find the friendly name even + * if an interface name was specified. + * + * If we can't get the list, just use the specified option as + * the interface name, so that the user can try specifying an + * interface explicitly for testing purposes. + */ + if_list = capture_interface_list(&err, NULL, NULL); + if (if_list != NULL) { + /* try and do an exact match (case insensitive) */ + GList *if_entry; + gboolean matched; - /* didn't find, attempt a case insensitive prefix match of the friendly name*/ - if(!matched){ - size_t prefix_length; - prefix_length=strlen(optarg_str_p); + matched = FALSE; 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; + /* exact name check */ + if (g_ascii_strcasecmp(if_info->name, optarg_str_p) == 0) { + /* exact match on the interface name, use that for displaying etc */ + interface_opts.name = g_strdup(if_info->name); + + if (if_info->friendly_name != NULL) { + /* + * If we have a friendly name, use that for the + * console display name, as it is the basis for + * the auto generated temp filename. + */ + interface_opts.console_display_name = g_strdup(if_info->friendly_name); + } else { + interface_opts.console_display_name = g_strdup(if_info->name); + } + matched = TRUE; + break; + } - if(if_info->friendly_name!=NULL && g_ascii_strncasecmp(if_info->friendly_name, optarg_str_p, prefix_length)==0){ - /* prefix match - use the friendly name for display */ + /* exact friendly name check */ + if (if_info->friendly_name != NULL && + g_ascii_strcasecmp(if_info->friendly_name, optarg_str_p) == 0) { + /* exact match - use the friendly name for display */ interface_opts.name = g_strdup(if_info->name); interface_opts.console_display_name = g_strdup(if_info->friendly_name); - matched=TRUE; + matched = TRUE; break; } } - } - if (!matched) { - cmdarg_err("Failed to match interface '%s'", optarg_str_p); - return 1; - } + /* didn't find, attempt a case insensitive prefix match of the friendly name*/ + if (!matched) { + size_t prefix_length; + + prefix_length = strlen(optarg_str_p); + 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, optarg_str_p, prefix_length) == 0) { + /* prefix match - use the friendly name for display */ + interface_opts.name = g_strdup(if_info->name); + interface_opts.console_display_name = g_strdup(if_info->friendly_name); + matched = TRUE; + break; + } + } + } + if (!matched) { + /* + * 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. + */ + interface_opts.name = g_strdup(optarg_str_p); + interface_opts.console_display_name = g_strdup(optarg_str_p); + } + free_interface_list(if_list); + } else { + interface_opts.name = g_strdup(optarg_str_p); + interface_opts.console_display_name = g_strdup(optarg_str_p); + } } - free_interface_list(if_list); /* We don't set iface_descr here because doing so requires * capture_ui_utils.c which requires epan/prefs.c which is @@ -609,6 +628,13 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ int status, snaplen; switch(opt) { + case LONGOPT_NUM_CAP_COMMENT: /* capture comment */ + if (capture_opts->capture_comment) { + cmdarg_err("--capture-comment can be set only once per file"); + return 1; + } + capture_opts->capture_comment = g_strdup(optarg_str_p); + break; case 'a': /* autostop criteria */ if (set_autostop_criterion(capture_opts, optarg_str_p) == FALSE) { cmdarg_err("Invalid or unknown -a flag \"%s\"", optarg_str_p); @@ -662,6 +688,9 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ capture_opts->default_options.cfilter = g_strdup(optarg_str_p); } break; + case 'g': /* enable group read access on the capture file(s) */ + capture_opts->group_read_access = TRUE; + break; case 'H': /* Hide capture info dialog box */ capture_opts->show_info = FALSE; break; @@ -773,9 +802,6 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ capture_opts->save_file = g_strdup(optarg_str_p); status = capture_opts_output_to_pipe(capture_opts->save_file, &capture_opts->output_to_pipe); return status; - case 'g': /* enable group read access on the capture file(s) */ - capture_opts->group_read_access = TRUE; - break; case 'y': /* Set the pcap data link type */ if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -814,19 +840,19 @@ capture_opts_print_if_capabilities(if_capabilities_t *caps, char *name, data_link_info_t *data_link_info; if (caps->can_set_rfmon) - fprintf_stderr("Data link types of interface %s when %sin monitor mode (use option -y to set):\n", - name, monitor_mode ? "" : "not "); + printf("Data link types of interface %s when %sin monitor mode (use option -y to set):\n", + name, monitor_mode ? "" : "not "); else - fprintf_stderr("Data link types of interface %s (use option -y to set):\n", name); + printf("Data link types of interface %s (use option -y to set):\n", name); for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) { data_link_info = (data_link_info_t *)lt_entry->data; - fprintf_stderr(" %s", data_link_info->name); + printf(" %s", data_link_info->name); if (data_link_info->description != NULL) - fprintf_stderr(" (%s)", data_link_info->description); + printf(" (%s)", data_link_info->description); else - fprintf_stderr(" (not supported)"); - fprintf_stderr("\n"); + printf(" (not supported)"); + printf("\n"); } } @@ -842,22 +868,23 @@ capture_opts_print_interfaces(GList *if_list) 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; - fprintf_stderr("%d. %s", i++, if_info->name); + printf("%d. %s", i++, if_info->name); - /* print the interface friendly name if known, if not fall back to vendor description */ + /* Print the interface friendly name, if it exists; + if not fall back to vendor description, if it exists. */ if (if_info->friendly_name != NULL){ - fprintf_stderr(" (%s)", if_info->friendly_name); - }else{ - /* Print the description if it exists */ - if (if_info->description != NULL) - fprintf_stderr(" (%s)", if_info->description); + printf(" (%s)", if_info->friendly_name); + } else { + if (if_info->vendor_description != NULL) + printf(" (%s)", if_info->vendor_description); } - fprintf_stderr("\n"); + printf("\n"); } } -void capture_opts_trim_snaplen(capture_options *capture_opts, int snaplen_min) +void +capture_opts_trim_snaplen(capture_options *capture_opts, int snaplen_min) { guint i; interface_options interface_opts; @@ -881,7 +908,8 @@ void capture_opts_trim_snaplen(capture_options *capture_opts, int snaplen_min) } -void capture_opts_trim_ring_num_files(capture_options *capture_opts) +void +capture_opts_trim_ring_num_files(capture_options *capture_opts) { /* Check the value range of the ring_num_files parameter */ if (capture_opts->ring_num_files > RINGBUFFER_MAX_NUM_FILES) { @@ -897,45 +925,41 @@ void capture_opts_trim_ring_num_files(capture_options *capture_opts) #endif } - -gboolean capture_opts_trim_iface(capture_options *capture_opts, const char *capture_device) +/* + * If no interface was specified explicitly, pick a default. + */ +int +capture_opts_default_iface_if_necessary(capture_options *capture_opts, + const char *capture_device) { int status; /* Did the user specify an interface to use? */ if (capture_opts->num_selected != 0 || capture_opts->ifaces->len != 0) { - /* yes they did, exit immediately nothing further to do here */ - return TRUE; + /* yes they did, return immediately - nothing further to do here */ + return 0; } /* No - is a default specified in the preferences file? */ if (capture_device != NULL) { /* Yes - use it. */ - status=capture_opts_add_iface_opt(capture_opts, capture_device); - if(status==0){ - return TRUE; /* interface found */ - } - return FALSE; /* some kind of error finding interface */ + status = capture_opts_add_iface_opt(capture_opts, capture_device); + return status; } /* No default in preferences file, just pick the first interface from the list of interfaces. */ - status=capture_opts_add_iface_opt(capture_opts, "1"); - if(status==0){ - return TRUE; /* success */ - } - return FALSE; /* some kind of error finding the first interface */ + return capture_opts_add_iface_opt(capture_opts, "1"); } - - #ifndef S_IFIFO -#define S_IFIFO _S_IFIFO +#define S_IFIFO _S_IFIFO #endif #ifndef S_ISFIFO #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) #endif /* copied from filesystem.c */ -static int capture_opts_test_for_fifo(const char *path) +static int +capture_opts_test_for_fifo(const char *path) { ws_statb64 statb; @@ -948,7 +972,8 @@ static int capture_opts_test_for_fifo(const char *path) return 0; } -static gboolean capture_opts_output_to_pipe(const char *save_file, gboolean *is_pipe) +static gboolean +capture_opts_output_to_pipe(const char *save_file, gboolean *is_pipe) { int err; @@ -1003,9 +1028,8 @@ collect_ifaces(capture_options *capture_opts) interface_opts = g_array_index(capture_opts->ifaces, interface_options, i - 1); g_free(interface_opts.name); g_free(interface_opts.descr); - if(interface_opts.console_display_name!=NULL){ + if (interface_opts.console_display_name != NULL) g_free(interface_opts.console_display_name); - } g_free(interface_opts.cfilter); #ifdef HAVE_PCAP_REMOTE if (interface_opts.src_type == CAPTURE_IFREMOTE) {