diff --git a/capture.c b/capture.c index 507417a7a6..3b3dd11ece 100644 --- a/capture.c +++ b/capture.c @@ -145,15 +145,10 @@ capture_start(capture_options *capture_opts) g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture Start ..."); - if (capture_opts->ifaces->len == 0) { - g_string_printf(source, "%s", get_iface_description(capture_opts)); - if (capture_opts->cfilter && capture_opts->cfilter[0]) { - g_string_append_printf(source, " (%s)", capture_opts->cfilter); - } #ifdef _WIN32 - } else if (capture_opts->ifaces->len < 2) { + if (capture_opts->ifaces->len < 2) { #else - } else if (capture_opts->ifaces->len < 4) { + if (capture_opts->ifaces->len < 4) { #endif for (i = 0; i < capture_opts->ifaces->len; i++) { interface_options interface_opts; @@ -498,18 +493,23 @@ capture_input_error_message(capture_options *capture_opts, char *error_msg, char capture filter when starting/running the capture. */ void -capture_input_cfilter_error_message(capture_options *capture_opts, char *error_message) +capture_input_cfilter_error_message(capture_options *capture_opts, guint i, char *error_message) { - dfilter_t *rfcode = NULL; - gchar *safe_cfilter = simple_dialog_format_message(capture_opts->cfilter); - gchar *safe_cfilter_error_msg = simple_dialog_format_message(error_message); + dfilter_t *rfcode = NULL; + gchar *safe_cfilter; + gchar *safe_cfilter_error_msg; + interface_options interface_opts; g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_MESSAGE, "Capture filter error message from child: \"%s\"", error_message); g_assert(capture_opts->state == CAPTURE_PREPARING || capture_opts->state == CAPTURE_RUNNING); + g_assert(i < capture_opts->ifaces->len); + interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); + safe_cfilter = simple_dialog_format_message(interface_opts.cfilter); + safe_cfilter_error_msg = simple_dialog_format_message(error_message); /* Did the user try a display filter? */ - if (dfilter_compile(capture_opts->cfilter, &rfcode) && rfcode != NULL) { + if (dfilter_compile(interface_opts.cfilter, &rfcode) && rfcode != NULL) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%sInvalid capture filter: \"%s\"!%s\n" "\n" diff --git a/capture.h b/capture.h index 4c01d7dafa..a09829d58e 100644 --- a/capture.h +++ b/capture.h @@ -94,7 +94,7 @@ extern void capture_input_error_message(capture_options *capture_opts, char *err * Capture child told us that an error has occurred while parsing a * capture filter when starting/running the capture. */ -extern void capture_input_cfilter_error_message(capture_options *capture_opts, char *error_message); +extern void capture_input_cfilter_error_message(capture_options *capture_opts, guint i, char *error_message); /** * Capture child closed its side of the pipe, report any error and diff --git a/capture_opts.c b/capture_opts.c index 3df0d8cdee..2da8dd2984 100644 --- a/capture_opts.c +++ b/capture_opts.c @@ -56,13 +56,11 @@ void capture_opts_init(capture_options *capture_opts, void *cf) { capture_opts->cf = cf; - capture_opts->cfilter = NULL; /* No capture filter string specified */ - capture_opts->iface = NULL; /* Default is "pick the first interface" */ - capture_opts->iface_descr = NULL; capture_opts->ifaces = g_array_new(FALSE, FALSE, sizeof(interface_options)); capture_opts->default_options.name = NULL; capture_opts->default_options.descr = NULL; capture_opts->default_options.cfilter = NULL; + capture_opts->default_options.has_snaplen = FALSE; capture_opts->default_options.snaplen = WTAP_MAX_PACKET_SIZE; capture_opts->default_options.linktype = -1; capture_opts->default_options.promisc_mode = TRUE; @@ -85,30 +83,6 @@ capture_opts_init(capture_options *capture_opts, void *cf) capture_opts->default_options.sampling_method = CAPTURE_SAMP_NONE; capture_opts->default_options.sampling_param = 0; #endif -#ifdef HAVE_PCAP_REMOTE - capture_opts->src_type = CAPTURE_IFLOCAL; - capture_opts->remote_host = NULL; - capture_opts->remote_port = NULL; - capture_opts->auth_type = CAPTURE_AUTH_NULL; - capture_opts->auth_username = NULL; - capture_opts->auth_password = NULL; - capture_opts->datatx_udp = FALSE; - capture_opts->nocap_rpcap = TRUE; - capture_opts->nocap_local = FALSE; -#endif -#ifdef HAVE_PCAP_SETSAMPLING - capture_opts->sampling_method = CAPTURE_SAMP_NONE; - capture_opts->sampling_param = 0; -#endif -#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - capture_opts->buffer_size = 1; /* 1 MB */ -#endif - capture_opts->has_snaplen = FALSE; - capture_opts->snaplen = WTAP_MAX_PACKET_SIZE; /* snapshot length - default is - infinite, in effect */ - capture_opts->promisc_mode = TRUE; /* promiscuous mode is the default */ - capture_opts->monitor_mode = FALSE; - capture_opts->linktype = -1; /* the default linktype */ capture_opts->saving_to_file = FALSE; capture_opts->save_file = NULL; capture_opts->group_read_access = FALSE; @@ -158,7 +132,6 @@ capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_optio g_log(log_domain, log_level, "CAPTURE OPTIONS :"); g_log(log_domain, log_level, "CFile : %p", capture_opts->cf); - g_log(log_domain, log_level, "Filter : %s", capture_opts->cfilter); for (i = 0; i < capture_opts->ifaces->len; i++) { interface_options interface_opts; @@ -167,7 +140,7 @@ capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_optio g_log(log_domain, log_level, "Interface name[%02d] : %s", i, interface_opts.name); g_log(log_domain, log_level, "Interface Descr[%02d]: %s", i, interface_opts.descr); g_log(log_domain, log_level, "Capture filter[%02d] : %s", i, interface_opts.cfilter); - g_log(log_domain, log_level, "Snap length[%02d] : %d", i, interface_opts.snaplen); + 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); g_log(log_domain, log_level, "Promiscous Mode[%02d]: %s", i, interface_opts.promisc_mode?"TRUE":"FALSE"); #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) @@ -203,7 +176,7 @@ capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_optio g_log(log_domain, log_level, "Interface name[df] : %s", capture_opts->default_options.name); g_log(log_domain, log_level, "Interface Descr[df]: %s", capture_opts->default_options.descr); g_log(log_domain, log_level, "Capture filter[df] : %s", capture_opts->default_options.cfilter); - g_log(log_domain, log_level, "Snap length[df] : %d", capture_opts->default_options.snaplen); + g_log(log_domain, log_level, "Snap length[df] (%u): %d", capture_opts->default_options.has_snaplen, capture_opts->default_options.snaplen); g_log(log_domain, log_level, "Link Type[df] : %d", capture_opts->default_options.linktype); g_log(log_domain, log_level, "Promiscous Mode[df]: %s", capture_opts->default_options.promisc_mode?"TRUE":"FALSE"); #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) @@ -235,40 +208,6 @@ capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_optio g_log(log_domain, log_level, "Sampling meth. [df]: %d", capture_opts->default_options.sampling_method); g_log(log_domain, log_level, "Sampling param.[df]: %d", capture_opts->default_options.sampling_param); #endif - -#ifdef HAVE_PCAP_REMOTE - g_log(log_domain, log_level, "Capture source : %s", - capture_opts->src_type == CAPTURE_IFLOCAL ? "Local interface" : - capture_opts->src_type == CAPTURE_IFREMOTE ? "Remote interface" : - "Unknown"); - if (capture_opts->src_type == CAPTURE_IFREMOTE) { - g_log(log_domain, log_level, "Remote host : %s", capture_opts->remote_host); - g_log(log_domain, log_level, "Remote port : %s", capture_opts->remote_port); - } - g_log(log_domain, log_level, "Authentication : %s", - capture_opts->auth_type == CAPTURE_AUTH_NULL ? "Null" : - capture_opts->auth_type == CAPTURE_AUTH_PWD ? "By username/password" : - "Unknown"); - if (capture_opts->auth_type == CAPTURE_AUTH_PWD) { - g_log(log_domain, log_level, "Auth username : %s", capture_opts->auth_username); - g_log(log_domain, log_level, "Auth password : "); - } - g_log(log_domain, log_level, "UDP data transfer : %u", capture_opts->datatx_udp); - g_log(log_domain, log_level, "No capture RPCAP : %u", capture_opts->nocap_rpcap); - g_log(log_domain, log_level, "No capture local : %u", capture_opts->nocap_local); -#endif -#ifdef HAVE_PCAP_SETSAMPLING - g_log(log_domain, log_level, "Sampling meth. : %d", capture_opts->sampling_method); - g_log(log_domain, log_level, "Sampling param. : %d", capture_opts->sampling_param); -#endif -#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - g_log(log_domain, log_level, "BufferSize : %u (MB)", capture_opts->buffer_size); -#endif - g_log(log_domain, log_level, "Interface Name : %s", capture_opts->iface); - g_log(log_domain, log_level, "Interface Descr. : %s", capture_opts->iface_descr); - g_log(log_domain, log_level, "SnapLen (%u): %u", capture_opts->has_snaplen, capture_opts->snaplen); - g_log(log_domain, log_level, "Promisc : %u", capture_opts->promisc_mode); - g_log(log_domain, log_level, "LinkType : %d", capture_opts->linktype); g_log(log_domain, log_level, "SavingToFile : %u", capture_opts->saving_to_file); g_log(log_domain, log_level, "SaveFile : %s", (capture_opts->save_file) ? capture_opts->save_file : ""); g_log(log_domain, log_level, "GroupReadAccess : %u", capture_opts->group_read_access); @@ -420,8 +359,6 @@ get_sampling_arguments(capture_options *capture_opts, const char *arg) } if (strcmp(arg, "count") == 0) { - capture_opts->sampling_method = CAPTURE_SAMP_BY_COUNT; - capture_opts->sampling_param = get_positive_int(p, "sampling count"); if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -435,8 +372,6 @@ get_sampling_arguments(capture_options *capture_opts, const char *arg) capture_opts->default_options.sampling_param = get_positive_int(p, "sampling count"); } } else if (strcmp(arg, "timer") == 0) { - capture_opts->sampling_method = CAPTURE_SAMP_BY_TIMER; - capture_opts->sampling_param = get_positive_int(p, "sampling timer"); if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -446,7 +381,7 @@ get_sampling_arguments(capture_options *capture_opts, const char *arg) interface_opts.sampling_param = get_positive_int(p, "sampling timer"); g_array_append_val(capture_opts->ifaces, interface_opts); } else { - capture_opts->default_options.sampling_method = CAPTURE_SAMP_BY_COUNT; + capture_opts->default_options.sampling_method = CAPTURE_SAMP_BY_TIMER; capture_opts->default_options.sampling_param = get_positive_int(p, "sampling timer"); } } @@ -477,9 +412,6 @@ get_auth_arguments(capture_options *capture_opts, const char *arg) while (isspace((guchar)*p)) p++; - capture_opts->auth_type = CAPTURE_AUTH_PWD; - capture_opts->auth_username = g_strdup(arg); - capture_opts->auth_password = g_strdup(p); if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -554,7 +486,6 @@ 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; } - capture_opts->iface = g_strdup(if_info->name); interface_opts.name = g_strdup(if_info->name); /* We don't set iface_descr here because doing so requires * capture_ui_utils.c which requires epan/prefs.c which is @@ -562,7 +493,6 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str */ free_interface_list(if_list); } else { - capture_opts->iface = g_strdup(optarg_str_p); interface_opts.name = g_strdup(optarg_str_p); } if (capture_opts->default_options.descr) { @@ -572,6 +502,7 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str } 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; #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) @@ -618,7 +549,7 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg_str int capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_str_p, gboolean *start_capture) { - int status; + int status, snaplen; switch(opt) { case 'a': /* autostop criteria */ @@ -644,7 +575,6 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ break; #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) case 'B': /* Buffer size */ - capture_opts->buffer_size = get_positive_int(optarg_str_p, "buffer size"); if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -662,19 +592,17 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ capture_opts->autostop_packets = get_positive_int(optarg_str_p, "packet count"); break; case 'f': /* capture filter */ - g_free(capture_opts->cfilter); - capture_opts->cfilter = g_strdup(optarg_str_p); if (capture_opts->ifaces->len > 0) { interface_options interface_opts; interface_opts = g_array_index(capture_opts->ifaces, interface_options, capture_opts->ifaces->len - 1); capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, capture_opts->ifaces->len - 1); g_free(interface_opts.cfilter); - interface_opts.cfilter = g_strdup(capture_opts->cfilter); + interface_opts.cfilter = g_strdup(optarg_str_p); g_array_append_val(capture_opts->ifaces, interface_opts); } else { g_free(capture_opts->default_options.cfilter); - capture_opts->default_options.cfilter = g_strdup(capture_opts->cfilter); + capture_opts->default_options.cfilter = g_strdup(optarg_str_p); } break; case 'H': /* Hide capture info dialog box */ @@ -688,7 +616,6 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ break; #ifdef HAVE_PCAP_CREATE case 'I': /* Capture in monitor mode */ - capture_opts->monitor_mode = TRUE; if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -717,7 +644,6 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ capture_opts->use_pcapng = TRUE; break; case 'p': /* Don't capture in promiscuous mode */ - capture_opts->promisc_mode = FALSE; if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -738,7 +664,6 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ break; #ifdef HAVE_PCAP_REMOTE case 'r': - capture_opts->nocap_rpcap = FALSE; if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -752,23 +677,24 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ break; #endif case 's': /* Set the snapshot (capture) length */ - capture_opts->has_snaplen = TRUE; - capture_opts->snaplen = get_natural_int(optarg_str_p, "snapshot length"); + snaplen = get_natural_int(optarg_str_p, "snapshot length"); /* * Make a snapshot length of 0 equivalent to the maximum packet * length, mirroring what tcpdump does. */ - if (capture_opts->snaplen == 0) - capture_opts->snaplen = WTAP_MAX_PACKET_SIZE; + if (snaplen == 0) + snaplen = WTAP_MAX_PACKET_SIZE; if (capture_opts->ifaces->len > 0) { interface_options interface_opts; interface_opts = g_array_index(capture_opts->ifaces, interface_options, capture_opts->ifaces->len - 1); capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, capture_opts->ifaces->len - 1); - interface_opts.snaplen = capture_opts->snaplen; + interface_opts.has_snaplen = TRUE; + interface_opts.snaplen = snaplen; g_array_append_val(capture_opts->ifaces, interface_opts); } else { - capture_opts->default_options.snaplen = capture_opts->snaplen; + capture_opts->default_options.snaplen = snaplen; + capture_opts->default_options.has_snaplen = TRUE; } break; case 'S': /* "Real-Time" mode: used for following file ala tail -f */ @@ -776,7 +702,6 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ break; #ifdef HAVE_PCAP_REMOTE case 'u': - capture_opts->datatx_udp = TRUE; if (capture_opts->ifaces->len > 0) { interface_options interface_opts; @@ -804,21 +729,25 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg_ capture_opts->group_read_access = TRUE; break; case 'y': /* Set the pcap data link type */ - capture_opts->linktype = linktype_name_to_val(optarg_str_p); - if (capture_opts->linktype == -1) { - cmdarg_err("The specified data link type \"%s\" isn't valid", - optarg_str_p); - return 1; - } if (capture_opts->ifaces->len > 0) { interface_options interface_opts; interface_opts = g_array_index(capture_opts->ifaces, interface_options, capture_opts->ifaces->len - 1); capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, capture_opts->ifaces->len - 1); interface_opts.linktype = linktype_name_to_val(optarg_str_p); + if (interface_opts.linktype == -1) { + cmdarg_err("The specified data link type \"%s\" isn't valid", + optarg_str_p); + return 1; + } g_array_append_val(capture_opts->ifaces, interface_opts); } else { capture_opts->default_options.linktype = linktype_name_to_val(optarg_str_p); + if (capture_opts->default_options.linktype == -1) { + cmdarg_err("The specified data link type \"%s\" isn't valid", + optarg_str_p); + return 1; + } } break; default: @@ -880,19 +809,21 @@ void capture_opts_trim_snaplen(capture_options *capture_opts, int snaplen_min) guint i; interface_options interface_opts; - if (capture_opts->snaplen < 1) - capture_opts->snaplen = WTAP_MAX_PACKET_SIZE; - else if (capture_opts->snaplen < snaplen_min) - capture_opts->snaplen = snaplen_min; - - for (i = 0; i < capture_opts->ifaces->len; i++) { - interface_opts = g_array_index(capture_opts->ifaces, interface_options, 0); - capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, 0); - if (interface_opts.snaplen < 1) - interface_opts.snaplen = WTAP_MAX_PACKET_SIZE; - else if (interface_opts.snaplen < snaplen_min) - interface_opts.snaplen = snaplen_min; - g_array_append_val(capture_opts->ifaces, interface_opts); + if (capture_opts->ifaces->len > 0) { + for (i = 0; i < capture_opts->ifaces->len; i++) { + interface_opts = g_array_index(capture_opts->ifaces, interface_options, 0); + capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, 0); + if (interface_opts.snaplen < 1) + interface_opts.snaplen = WTAP_MAX_PACKET_SIZE; + else if (interface_opts.snaplen < snaplen_min) + interface_opts.snaplen = snaplen_min; + g_array_append_val(capture_opts->ifaces, interface_opts); + } + } else { + if (capture_opts->default_options.snaplen < 1) + capture_opts->default_options.snaplen = WTAP_MAX_PACKET_SIZE; + else if (capture_opts->default_options.snaplen < snaplen_min) + capture_opts->default_options.snaplen = snaplen_min; } } @@ -928,7 +859,6 @@ gboolean capture_opts_trim_iface(capture_options *capture_opts, const char *capt /* No - is a default specified in the preferences file? */ if (capture_device != NULL) { /* Yes - use it. */ - capture_opts->iface = g_strdup(capture_device); interface_opts.name = g_strdup(capture_device); /* We don't set iface_descr here because doing so requires * capture_ui_utils.c which requires epan/prefs.c which is @@ -952,7 +882,6 @@ gboolean capture_opts_trim_iface(capture_options *capture_opts, const char *capt return FALSE; } if_info = (if_info_t *)if_list->data; /* first interface */ - capture_opts->iface = g_strdup(if_info->name); interface_opts.name = g_strdup(if_info->name); /* We don't set iface_descr here because doing so requires * capture_ui_utils.c which requires epan/prefs.c which is @@ -967,6 +896,7 @@ gboolean capture_opts_trim_iface(capture_options *capture_opts, const char *capt } 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; #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) @@ -975,27 +905,11 @@ gboolean capture_opts_trim_iface(capture_options *capture_opts, const char *capt interface_opts.monitor_mode = capture_opts->default_options.monitor_mode; #ifdef HAVE_PCAP_REMOTE interface_opts.src_type = capture_opts->default_options.src_type; - if (capture_opts->default_options.remote_host) { - interface_opts.remote_host = g_strdup(capture_opts->default_options.remote_host); - } else { - interface_opts.remote_host = NULL; - } - if (capture_opts->default_options.remote_port) { - interface_opts.remote_port = g_strdup(capture_opts->default_options.remote_port); - } else { - interface_opts.remote_port = NULL; - } + 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; - if (capture_opts->default_options.auth_username) { - interface_opts.auth_username = g_strdup(capture_opts->default_options.auth_username); - } else { - interface_opts.auth_username = NULL; - } - if (capture_opts->default_options.auth_password) { - interface_opts.auth_password = g_strdup(capture_opts->default_options.auth_password); - } else { - interface_opts.auth_password = NULL; - } + 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; diff --git a/capture_opts.h b/capture_opts.h index fc020cb346..7778bf49af 100644 --- a/capture_opts.h +++ b/capture_opts.h @@ -77,6 +77,7 @@ typedef struct interface_options_tag { gchar *name; gchar *descr; gchar *cfilter; + gboolean has_snaplen; int snaplen; int linktype; gboolean promisc_mode; @@ -105,68 +106,9 @@ typedef struct interface_options_tag { typedef struct capture_options_tag { /* general */ void *cf; /**< handle to cfile (note: untyped handle) */ - gchar *cfilter; /**< Capture filter string - *< XXX: Can finally be be removed. - *< Replaced by interface_options.cfilter */ - gchar *iface; /**< the network interface to capture from - *< XXX: Can finally be be removed. - *< Replaced by interface_options.name */ - gchar *iface_descr; /**< A human readable description of iface. - *< NOTE: capture_opts.c is not able to - *< set this field because doing so - *< requires too many dependencies. - *< Readers of this field should use - *< get_iface_description() from - *< "capture_ui_utils.h" to access it. - *< XXX: Can finally be be removed. - *< Replaced by interface_options.descr */ GArray *ifaces; /**< array of interfaces. Currently only used by dumpcap. */ interface_options default_options; -#ifdef HAVE_PCAP_REMOTE - /**< XXX: Should this whole block moved to - *< interface_options ? Yes!*/ - capture_source src_type; /**< Capturing on remote interface */ - gchar *remote_host; /**< Host name or network address - *< for remote capturing */ - gchar *remote_port; /**< TCP port of remote RPCAP server */ - - capture_auth auth_type; - gchar *auth_username; - gchar *auth_password; /**< Remote authentication parameters */ - - gboolean datatx_udp; /**< Whether to use UDP for data transfer */ - gboolean nocap_rpcap; /**< Whether to capture RPCAP own traffic */ - gboolean nocap_local; /**< TODO: Whether to capture local traffic */ -#endif -#ifdef HAVE_PCAP_SETSAMPLING - capture_sampling sampling_method; /**< PCAP packet sampling method - *< XXX: Can finally be be removed. - *< Replaced by interface_options.sampling_method */ - int sampling_param; /**< PCAP packet sampling parameter - *< XXX: Can finally be be removed. - *< Replaced by interface_options.sampling_param */ -#endif -#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - int buffer_size; /**< the capture buffer size (MB) - *< XXX: Can finally be be removed. - *< Replaced by interface_options.buffer_size */ -#endif - gboolean has_snaplen; /**< TRUE if maximum capture packet length - is specified */ - int snaplen; /**< Maximum captured packet length - *< XXX: Can finally be be removed. - *< Replaced by interface_options.snaplen */ - gboolean promisc_mode; /**< Capture in promiscuous mode - *< XXX: Can finally be be removed. - *< Replaced by interface_options.promisc_mode */ - int linktype; /**< Data link type to use, or -1 for - "use default" - *< XXX: Can finally be be removed. - *< Replaced by interface_options.linktype */ - gboolean monitor_mode; /**< Capture in monitor mode, if available - *< XXX: Can finally be be removed. - *< Replaced by interface_options.monitor_mode */ gboolean saving_to_file; /**< TRUE if capture is writing to a file */ gchar *save_file; /**< the capture file name */ gboolean group_read_access; /**< TRUE is group read permission needs to be set */ diff --git a/capture_sync.c b/capture_sync.c index 0e00856d5f..fbc374bc39 100644 --- a/capture_sync.c +++ b/capture_sync.c @@ -361,7 +361,6 @@ sync_pipe_start(capture_options *capture_opts) { int i; guint j; interface_options interface_opts; - gboolean no_ifaces; if (capture_opts->ifaces->len > 1) capture_opts->use_pcapng = TRUE; @@ -428,57 +427,6 @@ sync_pipe_start(capture_options *capture_opts) { g_snprintf(sautostop_duration, ARGV_NUMBER_LEN, "duration:%d",capture_opts->autostop_duration); argv = sync_pipe_add_arg(argv, &argc, sautostop_duration); } - if (capture_opts->ifaces->len == 0) { - no_ifaces = TRUE; - interface_opts.name = g_strdup(capture_opts->iface); - if (capture_opts->iface_descr) { - interface_opts.descr = g_strdup(capture_opts->iface_descr); - } else { - interface_opts.descr = NULL; - } - interface_opts.cfilter = g_strdup(capture_opts->cfilter); - interface_opts.snaplen = capture_opts->snaplen; - interface_opts.linktype = capture_opts->linktype; - interface_opts.promisc_mode = capture_opts->promisc_mode; -#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - interface_opts.buffer_size = capture_opts->buffer_size; -#endif - interface_opts.monitor_mode = capture_opts->monitor_mode; -#ifdef HAVE_PCAP_REMOTE - interface_opts.src_type = capture_opts->src_type; - if (capture_opts->remote_host) { - interface_opts.remote_host = g_strdup(capture_opts->remote_host); - } else { - interface_opts.remote_host = NULL; - } - if (capture_opts->remote_port) { - interface_opts.remote_port = g_strdup(capture_opts->remote_port); - } else { - interface_opts.remote_port = NULL; - } - interface_opts.auth_type = capture_opts->auth_type; - if (capture_opts->auth_username) { - interface_opts.auth_username = g_strdup(capture_opts->auth_username); - } else { - interface_opts.auth_username = NULL; - } - if (capture_opts->auth_password) { - interface_opts.auth_password = g_strdup(capture_opts->auth_password); - } else { - interface_opts.auth_password = NULL; - } - interface_opts.datatx_udp = capture_opts->datatx_udp; - interface_opts.nocap_rpcap = capture_opts->nocap_rpcap; - interface_opts.nocap_local = capture_opts->nocap_local; -#endif -#ifdef HAVE_PCAP_SETSAMPLING - interface_opts.sampling_method = capture_opts->sampling_method; - interface_opts.sampling_param = capture_opts->sampling_param; -#endif - g_array_append_val(capture_opts->ifaces, interface_opts); - } else { - no_ifaces = FALSE; - } for (j = 0; j < capture_opts->ifaces->len; j++) { interface_opts = g_array_index(capture_opts->ifaces, interface_options, j); @@ -490,7 +438,12 @@ sync_pipe_start(capture_options *capture_opts) { argv = sync_pipe_add_arg(argv, &argc, "-f"); argv = sync_pipe_add_arg(argv, &argc, interface_opts.cfilter); } - + if (interface_opts.cfilter == NULL && + capture_opts->default_options.cfilter != NULL && + strlen(capture_opts->default_options.cfilter) != 0) { + argv = sync_pipe_add_arg(argv, &argc, "-f"); + argv = sync_pipe_add_arg(argv, &argc, capture_opts->default_options.cfilter); + } if (interface_opts.snaplen != WTAP_MAX_PACKET_SIZE) { argv = sync_pipe_add_arg(argv, &argc, "-s"); g_snprintf(ssnap, ARGV_NUMBER_LEN, "%d", interface_opts.snaplen); @@ -547,9 +500,6 @@ sync_pipe_start(capture_options *capture_opts) { } #endif } - if (no_ifaces) { - capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, 0); - } /* dumpcap should be running in capture child mode (hidden feature) */ #ifndef DEBUG_CHILD @@ -1674,7 +1624,8 @@ sync_pipe_input_cb(gint source, gpointer user_data) /* (an error message doesn't mean we have to stop capturing) */ break; case SP_BAD_FILTER: - capture_input_cfilter_error_message(capture_opts, buffer); + /* FIXME: Indicate the correct index */ + capture_input_cfilter_error_message(capture_opts, 0, buffer); /* the capture child will close the sync_pipe, nothing to do for now */ break; case SP_DROPS: diff --git a/capture_ui_utils.c b/capture_ui_utils.c index 90b8b435bc..1ebe978c68 100644 --- a/capture_ui_utils.c +++ b/capture_ui_utils.c @@ -395,33 +395,26 @@ get_if_name(const char *if_text) return if_name; } -/* Return capture_opts->iface_descr (after setting it if it is not set) - * This is necessary because capture_opts.c can't set iface_descr (at least +/* Return interface_opts->descr (after setting it if it is not set) + * This is necessary because capture_opts.c can't set descr (at least * not without adding significant dependencies there). */ -const char * -get_iface_description(capture_options *capture_opts) -{ - if (!capture_opts->iface_descr && capture_opts->iface) - capture_opts->iface_descr = get_interface_descriptive_name(capture_opts->iface); - - return(capture_opts->iface_descr); - -} - const char * get_iface_description_for_interface(capture_options *capture_opts, guint i) { - interface_options interface_opts; + interface_options interface_opts; - interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); - if (!interface_opts.descr && interface_opts.name) { - interface_opts.descr = get_interface_descriptive_name(interface_opts.name); - } - capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, i); - g_array_insert_val(capture_opts->ifaces, i, interface_opts); - - return (interface_opts.descr); + if (i < capture_opts->ifaces->len) { + interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); + if (!interface_opts.descr && interface_opts.name) { + interface_opts.descr = get_interface_descriptive_name(interface_opts.name); + capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, i); + g_array_insert_val(capture_opts->ifaces, i, interface_opts); + } + return (interface_opts.descr); + } else { + return (NULL); + } } #endif /* HAVE_LIBPCAP */ diff --git a/capture_ui_utils.h b/capture_ui_utils.h index 0b50d6b4dc..a7531b5b60 100644 --- a/capture_ui_utils.h +++ b/capture_ui_utils.h @@ -93,10 +93,10 @@ char *build_capture_combo_name(GList *if_list, gchar *if_name); /** Return the interface description (after setting it if not already set) * * @param capture_opts The capture_options structure that contains the used interface + * @param i The index of the interface * - * @return A pointer to capture_ops->iface_descr + * @return A pointer to interface_opts->descr */ -const char *get_iface_description(capture_options *capture_opts); const char *get_iface_description_for_interface(capture_options *capture_opts, guint i); #endif diff --git a/dumpcap.c b/dumpcap.c index 9d4d0139c2..1b46f50415 100644 --- a/dumpcap.c +++ b/dumpcap.c @@ -3948,9 +3948,6 @@ main(int argc, char *argv[]) by the command line parameters. */ capture_opts_init(&global_capture_opts, NULL); - /* Default to capturing the entire packet. */ - global_capture_opts.snaplen = WTAP_MAX_PACKET_SIZE; - /* We always save to a file - if no file was specified, we save to a temporary file. */ global_capture_opts.saving_to_file = TRUE; diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c index b183979ef9..6d25d6b7ce 100644 --- a/gtk/capture_dlg.c +++ b/gtk/capture_dlg.c @@ -284,7 +284,7 @@ capture_filter_check_syntax_cb(GtkWidget *w _U_, gpointer user_data _U_) /* pcap_compile_nopcap will not alter the filter string, so the (char *) cast is "safe" */ if (pcap_compile_nopcap(DUMMY_SNAPLENGTH /* use a dummy snaplength for syntax-checking */, - global_capture_opts.linktype, &fcode, (char *)filter_text, 1 /* Do optimize */, + g_array_index(global_capture_opts.ifaces, interface_options, 0).linktype, &fcode, (char *)filter_text, 1 /* Do optimize */, DUMMY_NETMASK /* use a dummy netmask for syntax-checking */) < 0) { colorize_filter_te_as_invalid(filter_te); } else { @@ -334,6 +334,7 @@ set_if_capabilities(gboolean monitor_mode_changed) GtkWidget *advanced_bt; #endif + interface_options interface_opts; #if GTK_CHECK_VERSION(2,24,0) entry_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(if_cb)); #else @@ -505,14 +506,17 @@ set_if_capabilities(gboolean monitor_mode_changed) FALSE); g_free(str); } + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); if (linktype_count==0) { /* default to first dlt of the interface */ - global_capture_opts.linktype = data_link_info->dlt; + interface_opts.linktype = data_link_info->dlt; } else if (data_link_info->dlt == cap_settings.linktype) { /* Found a matching dlt, select this */ linktype_select = linktype_count; - global_capture_opts.linktype = data_link_info->dlt; + interface_opts.linktype = data_link_info->dlt; } + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); linktype_count++; } /* for (lt_entry = ... */ free_if_capabilities(caps); @@ -806,14 +810,14 @@ iftype_combo_box_add (GtkWidget *iftype_cbx) gchar *string; guint i, pos = REMOTE_HOST_START; - rh = g_hash_table_lookup (remote_host_list, global_capture_opts.remote_host); + rh = g_hash_table_lookup (remote_host_list, g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host); if (!rh) { rh = g_malloc0 (sizeof (*rh)); if (g_hash_table_size (remote_host_list) == 0) { iftype_combo_box_add_remote_separators (iftype_cbx); } - gtk_combo_box_insert_text(GTK_COMBO_BOX(iftype_cbx), pos, global_capture_opts.remote_host); - rh->remote_host = g_strdup (global_capture_opts.remote_host); + gtk_combo_box_insert_text(GTK_COMBO_BOX(iftype_cbx), pos, g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host); + rh->remote_host = g_strdup (g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host); create_new = TRUE; } else { model = gtk_combo_box_get_model(GTK_COMBO_BOX(iftype_cbx)); @@ -824,7 +828,7 @@ iftype_combo_box_add (GtkWidget *iftype_cbx) do { gtk_tree_model_get(model, &iter, 0, &string, -1); if (string) { - if (strcmp (global_capture_opts.remote_host, string) == 0) { + if (strcmp (g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host, string) == 0) { /* Found match, show this position in combo box */ g_free (string); break; @@ -840,13 +844,13 @@ iftype_combo_box_add (GtkWidget *iftype_cbx) g_free (rh->auth_password); } - rh->remote_port = g_strdup (global_capture_opts.remote_port); - rh->auth_type = global_capture_opts.auth_type; - rh->auth_username = g_strdup (global_capture_opts.auth_username); - rh->auth_password = g_strdup (global_capture_opts.auth_password); + rh->remote_port = g_strdup (g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_port); + rh->auth_type = g_array_index(global_capture_opts.ifaces, interface_options, 0).auth_type; + rh->auth_username = g_strdup (g_array_index(global_capture_opts.ifaces, interface_options, 0).auth_username); + rh->auth_password = g_strdup (g_array_index(global_capture_opts.ifaces, interface_options, 0).auth_password); if (create_new) { - g_hash_table_insert (remote_host_list, g_strdup (global_capture_opts.remote_host), rh); + g_hash_table_insert (remote_host_list, g_strdup (g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host), rh); } g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_VALUE_KEY, GINT_TO_POINTER(pos)); @@ -860,9 +864,9 @@ iftype_combo_box_add_remote_host (gpointer key, gpointer value _U_, gpointer use { gtk_combo_box_insert_text(GTK_COMBO_BOX(user_data), REMOTE_HOST_START, key); - if (global_capture_opts.src_type == CAPTURE_IFREMOTE) { + if (g_array_index(global_capture_opts.ifaces, interface_options, 0).src_type == CAPTURE_IFREMOTE) { /* Ensure we select the correct entry */ - if (strcmp ((char *)key, global_capture_opts.remote_host) == 0) { + if (strcmp ((char *)key, g_array_index(global_capture_opts.ifaces, interface_options, 0).remote_host) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(user_data), REMOTE_HOST_START); } } @@ -887,7 +891,7 @@ iftype_combo_box_new(void) g_hash_table_foreach (remote_host_list, iftype_combo_box_add_remote_host, iftype_cbx); } - if (global_capture_opts.src_type == CAPTURE_IFLOCAL) { + if (g_array_index(global_capture_opts.ifaces, interface_options, 0).src_type == CAPTURE_IFLOCAL) { gtk_combo_box_set_active(GTK_COMBO_BOX(iftype_cbx), CAPTURE_IFLOCAL); } else { int iftype = gtk_combo_box_get_active(GTK_COMBO_BOX(iftype_cbx)); @@ -948,11 +952,13 @@ update_interface_list() free_interface_list(if_list); } if (iftype >= CAPTURE_IFREMOTE) { - if_list = get_remote_interface_list(global_capture_opts.remote_host, - global_capture_opts.remote_port, - global_capture_opts.auth_type, - global_capture_opts.auth_username, - global_capture_opts.auth_password, + interface_options interface_opts; + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + if_list = get_remote_interface_list(interface_opts.remote_host, + interface_opts.remote_port, + interface_opts.auth_type, + interface_opts.auth_username, + interface_opts.auth_password, &err, &err_str); g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY, if_list); } else { @@ -1047,6 +1053,7 @@ capture_remote_ok_cb(GtkWidget *win _U_, GtkWidget *remote_w) GtkWidget *host_te, *port_te, *auth_pwd_rb, *username_te, *passwd_te, *auth_null_rb, *auth_passwd_rb, *iftype_cbx; int prev_iftype; + interface_options interface_opts; if (remote_w == NULL) return; @@ -1064,23 +1071,26 @@ capture_remote_ok_cb(GtkWidget *win _U_, GtkWidget *remote_w) prev_iftype = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_VALUE_KEY)); - g_free(global_capture_opts.remote_host); - global_capture_opts.remote_host = g_strdup(gtk_entry_get_text(GTK_ENTRY(host_te))); - g_free(global_capture_opts.remote_port); - global_capture_opts.remote_port = g_strdup(gtk_entry_get_text(GTK_ENTRY(port_te))); + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); + g_free(interface_opts.remote_host); + interface_opts.remote_host = g_strdup(gtk_entry_get_text(GTK_ENTRY(host_te))); + g_free(interface_opts.remote_port); + interface_opts.remote_port = g_strdup(gtk_entry_get_text(GTK_ENTRY(port_te))); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auth_passwd_rb))) - global_capture_opts.auth_type = CAPTURE_AUTH_PWD; + interface_opts.auth_type = CAPTURE_AUTH_PWD; else - global_capture_opts.auth_type = CAPTURE_AUTH_NULL; + interface_opts.auth_type = CAPTURE_AUTH_NULL; - g_free(global_capture_opts.auth_username); - global_capture_opts.auth_username = + g_free(interface_opts.auth_username); + interface_opts.auth_username = g_strdup(gtk_entry_get_text(GTK_ENTRY(username_te))); - g_free(global_capture_opts.auth_password); - global_capture_opts.auth_password = + g_free(interface_opts.auth_password); + interface_opts.auth_password = g_strdup(gtk_entry_get_text(GTK_ENTRY(passwd_te))); + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_PREV_IFTYPE_VALUE_KEY, GINT_TO_POINTER(prev_iftype)); g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_VALUE_KEY, @@ -1120,6 +1130,7 @@ capture_remote_cb(GtkWidget *w, gboolean focus_username) GtkTooltips *tooltips = gtk_tooltips_new(); #endif GSList *auth_group; + interface_options interface_opts; caller = gtk_widget_get_toplevel(w); remote_w = g_object_get_data(G_OBJECT(caller), E_CAP_REMOTE_DIALOG_PTR_KEY); @@ -1157,8 +1168,9 @@ capture_remote_cb(GtkWidget *w, gboolean focus_username) "for remote capture.", NULL); #endif gtk_table_attach_defaults(GTK_TABLE(host_tb), host_te, 1, 2, 0, 1); - if (global_capture_opts.remote_host != NULL) - gtk_entry_set_text(GTK_ENTRY(host_te), global_capture_opts.remote_host); + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + if (interface_opts.remote_host != NULL) + gtk_entry_set_text(GTK_ENTRY(host_te), interface_opts.remote_host); /* Port row */ port_lb = gtk_label_new("Port:"); @@ -1174,8 +1186,8 @@ capture_remote_cb(GtkWidget *w, gboolean focus_username) "(leave it empty for default port number).", NULL); #endif gtk_table_attach_defaults(GTK_TABLE(host_tb), port_te, 1, 2, 1, 2); - if (global_capture_opts.remote_port != NULL) - gtk_entry_set_text(GTK_ENTRY(port_te), global_capture_opts.remote_port); + if (interface_opts.remote_port != NULL) + gtk_entry_set_text(GTK_ENTRY(port_te), interface_opts.remote_port); /* Authentication options frame */ auth_fr = gtk_frame_new("Authentication"); @@ -1206,8 +1218,8 @@ capture_remote_cb(GtkWidget *w, gboolean focus_username) user_te = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(auth_passwd_tb), user_te, 1, 2, 0, 1); - if (global_capture_opts.auth_username != NULL) - gtk_entry_set_text(GTK_ENTRY(user_te), global_capture_opts.auth_username); + if (interface_opts.auth_username != NULL) + gtk_entry_set_text(GTK_ENTRY(user_te), interface_opts.auth_username); passwd_lb = gtk_label_new("Password:"); gtk_table_attach_defaults(GTK_TABLE(auth_passwd_tb), passwd_lb, 0, 1, 1, 2); @@ -1215,8 +1227,8 @@ capture_remote_cb(GtkWidget *w, gboolean focus_username) passwd_te = gtk_entry_new(); gtk_entry_set_visibility(GTK_ENTRY(passwd_te), FALSE); gtk_table_attach_defaults(GTK_TABLE(auth_passwd_tb), passwd_te, 1, 2, 1, 2); - if (global_capture_opts.auth_password != NULL) - gtk_entry_set_text(GTK_ENTRY(passwd_te), global_capture_opts.auth_password); + if (interface_opts.auth_password != NULL) + gtk_entry_set_text(GTK_ENTRY(passwd_te), interface_opts.auth_password); /* Button row: "Start" and "Cancel" buttons */ bbox = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL); @@ -1271,7 +1283,7 @@ capture_remote_cb(GtkWidget *w, gboolean focus_username) g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_LB_KEY, passwd_lb); g_object_set_data(G_OBJECT(remote_w), E_REMOTE_PASSWD_TE_KEY, passwd_te); - if (global_capture_opts.auth_type == CAPTURE_AUTH_PWD) + if (interface_opts.auth_type == CAPTURE_AUTH_PWD) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_passwd_rb), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auth_null_rb), TRUE); @@ -1300,6 +1312,7 @@ options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w) GtkWidget *samp_none_rb, *samp_count_rb, *samp_timer_rb, *samp_count_sb, *samp_timer_sb; #endif + interface_options interface_opts; if (parent_w == NULL) return; @@ -1307,9 +1320,11 @@ options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w) datatx_udp_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_DATATX_UDP_CB_KEY); nocap_rpcap_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_NOCAP_RPCAP_CB_KEY); - global_capture_opts.datatx_udp = + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); + interface_opts.datatx_udp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(datatx_udp_cb)); - global_capture_opts.nocap_rpcap = + interface_opts.nocap_rpcap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb)); #ifdef HAVE_PCAP_SETSAMPLING @@ -1320,16 +1335,17 @@ options_remote_ok_cb(GtkWidget *win _U_, GtkWidget *parent_w) samp_timer_sb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_SAMP_TIMER_SB_KEY); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_none_rb))) - global_capture_opts.sampling_method = CAPTURE_SAMP_NONE; + interface_opts.sampling_method = CAPTURE_SAMP_NONE; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_count_rb))) { - global_capture_opts.sampling_method = CAPTURE_SAMP_BY_COUNT; - global_capture_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_count_sb)); + interface_opts.sampling_method = CAPTURE_SAMP_BY_COUNT; + interface_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_count_sb)); } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(samp_timer_rb))) { - global_capture_opts.sampling_method = CAPTURE_SAMP_BY_TIMER; - global_capture_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_timer_sb)); + interface_opts.sampling_method = CAPTURE_SAMP_BY_TIMER; + interface_opts.sampling_param = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(samp_timer_sb)); } #endif + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); window_destroy(GTK_WIDGET(parent_w)); } @@ -1372,6 +1388,7 @@ options_remote_cb(GtkWidget *w _U_, gpointer d _U_) GtkAdjustment *samp_count_adj, *samp_timer_adj; GSList *samp_group; #endif + interface_options interface_opts; caller = gtk_widget_get_toplevel(w); opt_remote_w = g_object_get_data(G_OBJECT(caller), E_OPT_REMOTE_DIALOG_PTR_KEY); @@ -1399,14 +1416,15 @@ options_remote_cb(GtkWidget *w _U_, gpointer d _U_) gtk_container_set_border_width(GTK_CONTAINER(capture_vb), 5); gtk_container_add(GTK_CONTAINER(capture_fr), capture_vb); + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); nocap_rpcap_cb = gtk_check_button_new_with_mnemonic("Do not capture own RPCAP traffic"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nocap_rpcap_cb), - global_capture_opts.nocap_rpcap); + interface_opts.nocap_rpcap); gtk_container_add(GTK_CONTAINER(capture_vb), nocap_rpcap_cb); datatx_udp_cb = gtk_check_button_new_with_mnemonic("Use UDP for data transfer"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(datatx_udp_cb), - global_capture_opts.datatx_udp); + interface_opts.datatx_udp); gtk_container_add(GTK_CONTAINER(capture_vb), datatx_udp_cb); #ifdef HAVE_PCAP_SETSAMPLING @@ -1425,7 +1443,7 @@ options_remote_cb(GtkWidget *w _U_, gpointer d _U_) /* "No sampling" row */ samp_none_rb = gtk_radio_button_new_with_label(NULL, "None"); - if (global_capture_opts.sampling_method == CAPTURE_SAMP_NONE) + if (interface_opts.sampling_method == CAPTURE_SAMP_NONE) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_none_rb), TRUE); g_signal_connect(samp_none_rb, "toggled", G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w); @@ -1434,14 +1452,14 @@ options_remote_cb(GtkWidget *w _U_, gpointer d _U_) /* "Sampling by counter" row */ samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_none_rb)); samp_count_rb = gtk_radio_button_new_with_label(samp_group, "1 of"); - if (global_capture_opts.sampling_method == CAPTURE_SAMP_BY_COUNT) + if (interface_opts.sampling_method == CAPTURE_SAMP_BY_COUNT) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_count_rb), TRUE); g_signal_connect(samp_count_rb, "toggled", G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w); gtk_table_attach_defaults(GTK_TABLE(sampling_tb), samp_count_rb, 0, 1, 1, 2); samp_count_adj = (GtkAdjustment *) gtk_adjustment_new( - (gfloat)global_capture_opts.sampling_param, + (gfloat)interface_opts.sampling_param, 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0); samp_count_sb = gtk_spin_button_new(samp_count_adj, 0, 0); gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_count_sb), TRUE); @@ -1454,14 +1472,14 @@ options_remote_cb(GtkWidget *w _U_, gpointer d _U_) /* "Sampling by timer" row */ samp_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(samp_count_rb)); samp_timer_rb = gtk_radio_button_new_with_label(samp_group, "1 every"); - if (global_capture_opts.sampling_method == CAPTURE_SAMP_BY_TIMER) + if (interface_opts.sampling_method == CAPTURE_SAMP_BY_TIMER) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(samp_timer_rb), TRUE); g_signal_connect(samp_timer_rb, "toggled", G_CALLBACK(options_prep_adjust_sensitivity), opt_remote_w); gtk_table_attach_defaults(GTK_TABLE(sampling_tb), samp_timer_rb, 0, 1, 2, 3); samp_timer_adj = (GtkAdjustment *) gtk_adjustment_new( - (gfloat)global_capture_opts.sampling_param, + (gfloat)interface_opts.sampling_param, 1, (gfloat)INT_MAX, 1.0, 10.0, 0.0); samp_timer_sb = gtk_spin_button_new(samp_timer_adj, 0, 0); gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(samp_timer_sb), TRUE); @@ -1608,7 +1626,7 @@ capture_filter_compile_cb(GtkWidget *w _U_, gpointer user_data _U_) GtkTreeModel *model; #endif - pd = pcap_open_dead(global_capture_opts.linktype, DUMMY_SNAPLENGTH); + pd = pcap_open_dead(g_array_index(global_capture_opts.ifaces, interface_options, 0).linktype, DUMMY_SNAPLENGTH); filter_cm = g_object_get_data(G_OBJECT(top_level), E_CFILTER_CM_KEY); #if GTK_CHECK_VERSION(2,24,0) @@ -1757,6 +1775,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) gchar *if_device = NULL; if_info_t *if_info; int if_index = 0; + interface_options interface_opts; if (cap_open_w != NULL) { /* There's already a "Capture Options" dialog box; reactivate it. */ @@ -1783,26 +1802,73 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) cap_open_w = dlg_window_new(cap_title); g_free(cap_title); + if (global_capture_opts.ifaces->len > 0) { + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + } else { + interface_opts.name = NULL; + interface_opts.descr = NULL; + interface_opts.cfilter = g_strdup(global_capture_opts.default_options.cfilter); + interface_opts.snaplen = global_capture_opts.default_options.snaplen; + interface_opts.has_snaplen = global_capture_opts.default_options.has_snaplen; + interface_opts.linktype = global_capture_opts.default_options.linktype; + interface_opts.promisc_mode = global_capture_opts.default_options.promisc_mode; +#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) + interface_opts.buffer_size = global_capture_opts.default_options.buffer_size; +#endif + interface_opts.monitor_mode = global_capture_opts.default_options.monitor_mode; #ifdef HAVE_PCAP_REMOTE - if (global_capture_opts.src_type == CAPTURE_IFREMOTE) { - if_list = get_remote_interface_list(global_capture_opts.remote_host, - global_capture_opts.remote_port, - global_capture_opts.auth_type, - global_capture_opts.auth_username, - global_capture_opts.auth_password, + interface_opts.src_type = global_capture_opts.default_options.src_type; + if (global_capture_opts.default_options.remote_host) { + interface_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host); + } else { + interface_opts.remote_host = NULL; + } + if (global_capture_opts.default_options.remote_port) { + interface_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port); + } else { + interface_opts.remote_port = NULL; + } + interface_opts.auth_type = global_capture_opts.default_options.auth_type; + if (global_capture_opts.default_options.auth_username) { + interface_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username); + } else { + interface_opts.auth_username = NULL; + } + if (global_capture_opts.default_options.auth_password) { + interface_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password); + } else { + interface_opts.auth_password = NULL; + } + interface_opts.datatx_udp = global_capture_opts.default_options.datatx_udp; + interface_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap; + interface_opts.nocap_local = global_capture_opts.default_options.nocap_local; +#endif +#ifdef HAVE_PCAP_SETSAMPLING + interface_opts.sampling_method = global_capture_opts.default_options.sampling_method; + interface_opts.sampling_param = global_capture_opts.default_options.sampling_param; +#endif + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); + } +#ifdef HAVE_PCAP_REMOTE + if (interface_opts.src_type == CAPTURE_IFREMOTE) { + if_list = get_remote_interface_list(interface_opts.remote_host, + interface_opts.remote_port, + interface_opts.auth_type, + interface_opts.auth_username, + interface_opts.auth_password, &err, NULL); if (if_list == NULL && err == CANT_GET_INTERFACE_LIST) { /* Silently fall back to local interface list */ - if (global_capture_opts.iface) { - g_free (global_capture_opts.iface); - global_capture_opts.iface = NULL; + if (interface_opts.name) { + g_free (interface_opts.name); + interface_opts.name = NULL; } - if (global_capture_opts.iface_descr) { - g_free (global_capture_opts.iface_descr); - global_capture_opts.iface_descr = NULL; + if (interface_opts.descr) { + g_free (interface_opts.descr); + interface_opts.descr = NULL; } if_list = capture_interface_list(&err, &err_str); /* Warning: see capture_prep_cb() */ - global_capture_opts.src_type = CAPTURE_IFLOCAL; + interface_opts.src_type = CAPTURE_IFLOCAL; g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY, NULL); } else { g_object_set_data(G_OBJECT(cap_open_w), E_CAP_IF_LIST_KEY, if_list); @@ -1876,7 +1942,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) gtk_box_pack_start(GTK_BOX(if_hb), iftype_cbx, FALSE, FALSE, 0); #endif - if (global_capture_opts.iface == NULL && prefs.capture_device != NULL) { + if (interface_opts.name == NULL && prefs.capture_device != NULL) { /* No interface was specified on the command line or in a previous capture, but there is one specified in the preferences file; make the one from the preferences file the default */ @@ -1884,11 +1950,11 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) for (if_entry = if_list; if_entry != NULL; if_entry = g_list_next(if_entry)) { if_info = (if_info_t*)if_entry->data; if (strcmp(if_info->name, get_if_name(if_device)) == 0) { - global_capture_opts.iface = g_strdup(get_if_name(if_device)); + interface_opts.name = g_strdup(get_if_name(if_device)); /* Warning: see capture_prep_cb() */ /* XXX: Could the following code be changed to use the if_list obtained above instead */ /* of maybe calling capture_interface_list() again ? */ - global_capture_opts.iface_descr = get_interface_descriptive_name(global_capture_opts.iface); + interface_opts.descr = get_interface_descriptive_name(interface_opts.name); break; } } @@ -1897,8 +1963,8 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) } /* If we have a prefered interface, get the string to compare with to select the active text*/ - if (global_capture_opts.iface != NULL) { - if_device = build_capture_combo_name(if_list, global_capture_opts.iface); + if (interface_opts.name != NULL) { + if_device = build_capture_combo_name(if_list, interface_opts.name); } #if GTK_CHECK_VERSION(2,24,0) if_cb = gtk_combo_box_text_new_with_entry(); @@ -1939,13 +2005,13 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) #ifdef HAVE_AIRPCAP /* get the airpcap interface (if it IS an airpcap interface, and update the toolbar... and of course enable the advanced button...)*/ - airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list,global_capture_opts.iface); + airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list,interface_opts.name); #endif free_capture_combo_list(combo_list); #ifdef HAVE_PCAP_REMOTE /* Only delete if fetched local */ - if (global_capture_opts.src_type == CAPTURE_IFLOCAL) + if (interface_opts.src_type == CAPTURE_IFLOCAL) #endif free_interface_list(if_list); #if GTK_CHECK_VERSION(2,12,0) @@ -2045,7 +2111,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) promisc_cb = gtk_check_button_new_with_mnemonic( "Capture packets in _promiscuous mode"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), - global_capture_opts.promisc_mode); + interface_opts.promisc_mode); #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(promisc_cb, "Usually a network adapter will only capture the traffic sent to its own network address. " @@ -2064,7 +2130,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) monitor_cb = gtk_check_button_new_with_mnemonic( "Capture packets in monitor mode"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitor_cb), - global_capture_opts.monitor_mode); + interface_opts.monitor_mode); g_signal_connect(monitor_cb, "toggled", G_CALLBACK(capture_prep_monitor_changed_cb), NULL); @@ -2116,7 +2182,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) snap_cb = gtk_check_button_new_with_mnemonic("_Limit each packet to"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(snap_cb), - global_capture_opts.has_snaplen); + interface_opts.has_snaplen); g_signal_connect(snap_cb, "toggled", G_CALLBACK(capture_prep_adjust_sensitivity), cap_open_w); #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(snap_cb, @@ -2129,7 +2195,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) #endif gtk_box_pack_start(GTK_BOX(snap_hb), snap_cb, FALSE, FALSE, 0); - snap_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.snaplen, + snap_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) interface_opts.snaplen, MIN_PACKET_SIZE, WTAP_MAX_PACKET_SIZE, 1.0, 10.0, 0.0); snap_sb = gtk_spin_button_new (snap_adj, 0, 0); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (snap_sb), TRUE); @@ -2182,11 +2248,11 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) #endif } } - if (global_capture_opts.cfilter) + if (g_array_index(global_capture_opts.ifaces, interface_options, 0).cfilter) #if GTK_CHECK_VERSION(2,24,0) - gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), global_capture_opts.cfilter); + gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(filter_cm), g_array_index(global_capture_opts.ifaces, interface_options, 0).cfilter); #else - gtk_combo_box_prepend_text(GTK_COMBO_BOX(filter_cm), global_capture_opts.cfilter); + gtk_combo_box_prepend_text(GTK_COMBO_BOX(filter_cm), g_array_index(global_capture_opts.ifaces, interface_options, 0).cfilter); #endif #if GTK_CHECK_VERSION(2,12,0) gtk_widget_set_tooltip_text(filter_cm, @@ -2249,7 +2315,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) g_signal_connect(remote_bt,"clicked", G_CALLBACK(options_remote_cb),NULL); g_object_set_data(G_OBJECT(iftype_cbx), E_OPT_REMOTE_BT_KEY, remote_bt); - if (global_capture_opts.src_type == CAPTURE_IFREMOTE) { + if (interface_opts.src_type == CAPTURE_IFREMOTE) { gtk_widget_set_sensitive(remote_bt, TRUE); } else { gtk_widget_set_sensitive(remote_bt, FALSE); @@ -2264,10 +2330,10 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) buffer_size_lb = gtk_label_new("Buffer size:"); gtk_box_pack_start (GTK_BOX(buffer_size_hb), buffer_size_lb, FALSE, FALSE, 0); - buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) global_capture_opts.buffer_size, + buffer_size_adj = (GtkAdjustment *) gtk_adjustment_new((gfloat) interface_opts.buffer_size, 1, 65535, 1.0, 10.0, 0.0); buffer_size_sb = gtk_spin_button_new (buffer_size_adj, 0, 0); - gtk_spin_button_set_value(GTK_SPIN_BUTTON (buffer_size_sb), (gfloat) global_capture_opts.buffer_size); + gtk_spin_button_set_value(GTK_SPIN_BUTTON (buffer_size_sb), (gfloat) interface_opts.buffer_size); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (buffer_size_sb), TRUE); gtk_widget_set_size_request(buffer_size_sb, 80, -1); #if GTK_CHECK_VERSION(2,12,0) @@ -2710,6 +2776,8 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) #endif g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer)HELP_CAPTURE_OPTIONS_DIALOG); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); gtk_widget_grab_default(ok_bt); /* Attach pointers to needed widgets to the capture prefs window/object */ @@ -2807,9 +2875,12 @@ capture_start_confirmed(void) { + interface_options interface_opts; + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); /* init iface, if never used before */ /* XXX - would better be doing this in main.c */ - if(global_capture_opts.iface == NULL) { + if(interface_opts.name == NULL) { gchar *if_device; const gchar *if_name; @@ -2826,8 +2897,8 @@ capture_start_confirmed(void) } if_device = g_strdup(prefs.capture_device); if_name = get_if_name(if_device); - global_capture_opts.iface = g_strdup(if_name); - global_capture_opts.iface_descr = get_interface_descriptive_name(global_capture_opts.iface); + interface_opts.name = g_strdup(if_name); + interface_opts.descr = get_interface_descriptive_name(interface_opts.name); g_free(if_device); } @@ -2835,10 +2906,11 @@ capture_start_confirmed(void) /* XXX - we might need to init other pref data as well... */ menu_auto_scroll_live_changed(auto_scroll_live); + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); if (capture_start(&global_capture_opts)) { /* The capture succeeded, which means the capture filter syntax is valid; add this capture filter to the recent capture filter list. */ - cfilter_combo_add_recent(global_capture_opts.cfilter); + cfilter_combo_add_recent(interface_opts.cfilter); } } @@ -2906,8 +2978,12 @@ capture_start_cb(GtkWidget *w _U_, gpointer d _U_) if (!success) return; /* error in options dialog */ } + if (global_capture_opts.ifaces->len > 0) { + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); + } - if (global_capture_opts.iface == NULL) { + if (interface_opts.name == NULL) { if (prefs.capture_device == NULL) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "You didn't specify an interface on which to capture packets."); @@ -2915,10 +2991,10 @@ capture_start_cb(GtkWidget *w _U_, gpointer d _U_) } if_name = g_strdup(get_if_name(prefs.capture_device)); } else { - if_name = g_strdup(global_capture_opts.iface); + if_name = g_strdup(interface_opts.name); } - while (global_capture_opts.ifaces->len > 0) { + /* while (global_capture_opts.ifaces->len > 0) { interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); g_free(interface_opts.name); @@ -2930,7 +3006,7 @@ capture_start_cb(GtkWidget *w _U_, gpointer d _U_) g_free(interface_opts.auth_username); g_free(interface_opts.auth_password); #endif - } + }*/ if (cap_settings_history != NULL) { cap_settings_p = g_hash_table_lookup(cap_settings_history, if_name); @@ -2940,14 +3016,15 @@ capture_start_cb(GtkWidget *w _U_, gpointer d _U_) } else { g_free(if_name); } - cap_settings_p->monitor_mode = global_capture_opts.monitor_mode; - cap_settings_p->linktype = global_capture_opts.linktype; + cap_settings_p->monitor_mode = interface_opts.monitor_mode; + cap_settings_p->linktype = interface_opts.linktype; } else { - global_capture_opts.monitor_mode = prefs_capture_device_monitor_mode(if_name); - global_capture_opts.linktype = capture_dev_user_linktype_find(if_name); + interface_opts.monitor_mode = prefs_capture_device_monitor_mode(if_name); + interface_opts.linktype = capture_dev_user_linktype_find(if_name); g_free(if_name); } + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); if((cfile.state != FILE_CLOSED) && !cfile.user_saved && prefs.gui_ask_unsaved) { /* user didn't saved his current file, ask him */ dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL, @@ -2965,19 +3042,24 @@ static void capture_cancel_cb(GtkWidget *win, gpointer data) { #ifdef HAVE_PCAP_REMOTE + interface_options interface_opts; + + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); if (g_hash_table_size (remote_host_list) == 0) { /* Ensure we fall back to local interfaces */ - global_capture_opts.src_type = CAPTURE_IFLOCAL; + interface_opts.src_type = CAPTURE_IFLOCAL; - if (global_capture_opts.iface) { - g_free (global_capture_opts.iface); - global_capture_opts.iface = NULL; + if (interface_opts.name) { + g_free (interface_opts.name); + interface_opts.name = NULL; } - if (global_capture_opts.iface_descr) { - g_free (global_capture_opts.iface_descr); - global_capture_opts.iface_descr = NULL; + if (interface_opts.descr) { + g_free (interface_opts.descr); + interface_opts.descr = NULL; } } + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); #endif window_cancel_button_cb (win, data); @@ -2989,6 +3071,10 @@ select_link_type_cb(GtkWidget *linktype_combo_box, gpointer data _U_) { gpointer ptr; int dlt; + interface_options interface_opts; + + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); if (! ws_combo_box_get_active_pointer(GTK_COMBO_BOX(linktype_combo_box), &ptr)) { g_assert_not_reached(); /* Programming error: somehow nothing is active */ @@ -2996,8 +3082,9 @@ select_link_type_cb(GtkWidget *linktype_combo_box, gpointer data _U_) if ((dlt = GPOINTER_TO_INT(ptr)) == -1) { g_assert_not_reached(); /* Programming error: somehow managed to select an "unsupported" entry */ } - global_capture_opts.linktype = dlt; + interface_opts.linktype = dlt; capture_filter_check_syntax_cb(linktype_combo_box, data); + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); } #ifdef HAVE_PCAP_REMOTE @@ -3024,6 +3111,8 @@ select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_) int no_update = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_NOUPDATE_KEY)); gint num_remote = g_hash_table_size (remote_host_list); + interface_options interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); if (new_iftype == CAPTURE_IFREMOTE) { g_object_set_data(G_OBJECT(iftype_cbx), E_CAP_CBX_PREV_IFTYPE_VALUE_KEY, @@ -3060,21 +3149,21 @@ select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_) rh = g_hash_table_lookup (remote_host_list, string); g_free (string); - g_free(global_capture_opts.remote_host); - global_capture_opts.remote_host = g_strdup(rh->remote_host); - g_free(global_capture_opts.remote_port); - global_capture_opts.remote_port = g_strdup(rh->remote_port); - global_capture_opts.auth_type = rh->auth_type; - if (global_capture_opts.auth_type == CAPTURE_AUTH_PWD && strlen(rh->auth_username) == 0) { + g_free(interface_opts.remote_host); + interface_opts.remote_host = g_strdup(rh->remote_host); + g_free(interface_opts.remote_port); + interface_opts.remote_port = g_strdup(rh->remote_port); + interface_opts.auth_type = rh->auth_type; + if (interface_opts.auth_type == CAPTURE_AUTH_PWD && strlen(rh->auth_username) == 0) { /* Empty username, ask for one */ capture_remote_cb(GTK_WIDGET(iftype_cbx), TRUE); no_update = TRUE; } else { /* Already entered username and password */ - g_free(global_capture_opts.auth_username); - global_capture_opts.auth_username = g_strdup(rh->auth_username); - g_free(global_capture_opts.auth_password); - global_capture_opts.auth_password = g_strdup(rh->auth_password); + g_free(interface_opts.auth_username); + interface_opts.auth_username = g_strdup(rh->auth_username); + g_free(interface_opts.auth_password); + interface_opts.auth_password = g_strdup(rh->auth_password); } } } @@ -3086,6 +3175,7 @@ select_if_type_cb(GtkComboBox *iftype_cbx, gpointer data _U_) update_interface_list(); } } + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); } #endif @@ -3133,6 +3223,12 @@ capture_dlg_prep(gpointer parent_w) { GtkTreeIter iter; GtkTreeModel *model; #endif +interface_options interface_opts; + +if (global_capture_opts.ifaces->len > 0) { + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); +} if_cb = (GtkWidget *) g_object_get_data(G_OBJECT(parent_w), E_CAP_IFACE_KEY); #ifdef HAVE_PCAP_REMOTE @@ -3199,42 +3295,42 @@ capture_dlg_prep(gpointer parent_w) { g_free(entry_text); return FALSE; } - g_free(global_capture_opts.iface); - g_free(global_capture_opts.iface_descr); - global_capture_opts.iface = g_strdup(if_name); - global_capture_opts.iface_descr = get_interface_descriptive_name(global_capture_opts.iface); + g_free(interface_opts.name); + g_free(interface_opts.descr); + interface_opts.name = g_strdup(if_name); + interface_opts.descr = get_interface_descriptive_name(interface_opts.name); g_free(entry_text); /* The Linktype is stored when the interface is changed, or if not, the acquisition will be performed on the default datalink for the device */ #ifdef HAVE_PCAP_REMOTE - global_capture_opts.src_type = (capture_source) + interface_opts.src_type = (capture_source) GPOINTER_TO_INT(g_object_get_data(G_OBJECT(iftype_cbx), E_CAP_CBX_IFTYPE_VALUE_KEY)); - if (global_capture_opts.src_type > CAPTURE_IFREMOTE) - global_capture_opts.src_type = CAPTURE_IFREMOTE; + if (interface_opts.src_type > CAPTURE_IFREMOTE) + interface_opts.src_type = CAPTURE_IFREMOTE; #endif #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - global_capture_opts.buffer_size = + interface_opts.buffer_size = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(buffer_size_sb)); #endif - global_capture_opts.has_snaplen = + interface_opts.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)); - if (global_capture_opts.has_snaplen) { - global_capture_opts.snaplen = + if (interface_opts.has_snaplen) { + interface_opts.snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb)); - if (global_capture_opts.snaplen < 1) - global_capture_opts.snaplen = WTAP_MAX_PACKET_SIZE; - else if (global_capture_opts.snaplen < MIN_PACKET_SIZE) - global_capture_opts.snaplen = MIN_PACKET_SIZE; + if (interface_opts.snaplen < 1) + interface_opts.snaplen = WTAP_MAX_PACKET_SIZE; + else if (interface_opts.snaplen < MIN_PACKET_SIZE) + interface_opts.snaplen = MIN_PACKET_SIZE; } else { - global_capture_opts.snaplen = WTAP_MAX_PACKET_SIZE; + interface_opts.snaplen = WTAP_MAX_PACKET_SIZE; } - global_capture_opts.promisc_mode = + interface_opts.promisc_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb)); #ifdef HAVE_PCAP_CREATE - global_capture_opts.monitor_mode = + interface_opts.monitor_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor_cb)); #endif global_capture_opts.use_pcapng = @@ -3259,10 +3355,10 @@ capture_dlg_prep(gpointer parent_w) { gtk_tree_model_get(model, &iter, 0, &filter_text, -1); #endif #endif /* GTK_CHECK_VERSION(2,24,0 */ - if (global_capture_opts.cfilter) - g_free(global_capture_opts.cfilter); + if (interface_opts.cfilter) + g_free(interface_opts.cfilter); g_assert(filter_text != NULL); - global_capture_opts.cfilter = g_strdup(filter_text); + interface_opts.cfilter = g_strdup(filter_text); /* Wireshark always saves to a capture file. */ global_capture_opts.saving_to_file = TRUE; @@ -3398,6 +3494,7 @@ capture_dlg_prep(gpointer parent_w) { } } } /* multi_files_on */ + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); return TRUE; } diff --git a/gtk/capture_if_dlg.c b/gtk/capture_if_dlg.c index 6ac17f53e4..30a40e2062 100644 --- a/gtk/capture_if_dlg.c +++ b/gtk/capture_if_dlg.c @@ -139,6 +139,7 @@ static void capture_do_cb(GtkWidget *capture_bt _U_, gpointer if_data) { interface_options interface_opts; + cap_settings_t cap_settings; if_dlg_data_t *if_dlg_data = if_data; #ifdef HAVE_AIRPCAP @@ -146,12 +147,6 @@ capture_do_cb(GtkWidget *capture_bt _U_, gpointer if_data) airpcap_if_selected = airpcap_if_active; #endif - g_free(global_capture_opts.iface); - g_free(global_capture_opts.iface_descr); - - global_capture_opts.iface = g_strdup(if_dlg_data->device); - global_capture_opts.iface_descr = get_interface_descriptive_name(global_capture_opts.iface); - while (global_capture_opts.ifaces->len > 0) { interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); @@ -165,6 +160,34 @@ capture_do_cb(GtkWidget *capture_bt _U_, gpointer if_data) g_free(interface_opts.auth_password); #endif } + interface_opts.name = g_strdup(if_dlg_data->device); + interface_opts.descr = get_interface_descriptive_name(interface_opts.name); + cap_settings = capture_get_cap_settings (interface_opts.name);; + interface_opts.monitor_mode = cap_settings.monitor_mode; + interface_opts.linktype = capture_dev_user_linktype_find(interface_opts.name); + interface_opts.cfilter = global_capture_opts.default_options.cfilter; + interface_opts.snaplen = global_capture_opts.default_options.snaplen; + interface_opts.has_snaplen = global_capture_opts.default_options.has_snaplen; + interface_opts.promisc_mode = global_capture_opts.default_options.promisc_mode; +#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) + interface_opts.buffer_size = global_capture_opts.default_options.buffer_size; +#endif +#ifdef HAVE_PCAP_REMOTE + interface_opts.src_type = global_capture_opts.default_options.src_type; + interface_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host); + interface_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port); + interface_opts.auth_type = global_capture_opts.default_options.auth_type; + interface_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username); + interface_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password); + interface_opts.datatx_udp = global_capture_opts.default_options.datatx_udp; + interface_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap; + interface_opts.nocap_local = global_capture_opts.default_options.nocap_local; +#endif +#ifdef HAVE_PCAP_SETSAMPLING + interface_opts.sampling_method = global_capture_opts.default_options.sampling_method; + interface_opts.sampling_param = global_capture_opts.default_options.sampling_param; +#endif + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); /* XXX - remove this? */ if (global_capture_opts.save_file) { @@ -183,14 +206,51 @@ capture_do_cb(GtkWidget *capture_bt _U_, gpointer if_data) static void capture_prepare_cb(GtkWidget *prepare_bt _U_, gpointer if_data) { + interface_options interface_opts; + cap_settings_t cap_settings; if_dlg_data_t *if_dlg_data = if_data; - g_free(global_capture_opts.iface); - g_free(global_capture_opts.iface_descr); - - global_capture_opts.iface = g_strdup(if_dlg_data->device); - global_capture_opts.iface_descr = get_interface_descriptive_name(global_capture_opts.iface); - + while (global_capture_opts.ifaces->len > 0) { + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); + global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); + g_free(interface_opts.name); + g_free(interface_opts.descr); + g_free(interface_opts.cfilter); +#ifdef HAVE_PCAP_REMOTE + g_free(interface_opts.remote_host); + g_free(interface_opts.remote_port); + g_free(interface_opts.auth_username); + g_free(interface_opts.auth_password); +#endif + } + interface_opts.name = g_strdup(if_dlg_data->device); + interface_opts.descr = get_interface_descriptive_name(interface_opts.name); + cap_settings = capture_get_cap_settings (interface_opts.name);; + interface_opts.monitor_mode = cap_settings.monitor_mode; + interface_opts.linktype = capture_dev_user_linktype_find(interface_opts.name); + interface_opts.cfilter = global_capture_opts.default_options.cfilter; + interface_opts.snaplen = global_capture_opts.default_options.snaplen; + interface_opts.has_snaplen = global_capture_opts.default_options.has_snaplen; + interface_opts.promisc_mode = global_capture_opts.default_options.promisc_mode; +#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) + interface_opts.buffer_size = global_capture_opts.default_options.buffer_size; +#endif +#ifdef HAVE_PCAP_REMOTE + interface_opts.src_type = global_capture_opts.default_options.src_type; + interface_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host); + interface_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port); + interface_opts.auth_type = global_capture_opts.default_options.auth_type; + interface_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username); + interface_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password); + interface_opts.datatx_udp = global_capture_opts.default_options.datatx_udp; + interface_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap; + interface_opts.nocap_local = global_capture_opts.default_options.nocap_local; +#endif +#ifdef HAVE_PCAP_SETSAMPLING + interface_opts.sampling_method = global_capture_opts.default_options.sampling_method; + interface_opts.sampling_param = global_capture_opts.default_options.sampling_param; +#endif + g_array_insert_val(global_capture_opts.ifaces, 0, interface_opts); /* stop capturing from all interfaces, we are going to do real work now ... */ window_destroy(cap_if_w); diff --git a/gtk/main.c b/gtk/main.c index 4b4142e736..faff151a83 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -2958,9 +2958,9 @@ main(int argc, char *argv[]) set_capture_if_dialog_for_capture_in_progress(FALSE); } - /* if the user didn't supplied a capture filter, use the one to filter out remote connections like SSH */ - if (!start_capture && !global_capture_opts.cfilter) { - global_capture_opts.cfilter = g_strdup(get_conn_cfilter()); + /* if the user didn't supply a capture filter, use the one to filter out remote connections like SSH */ + if (!start_capture && !global_capture_opts.default_options.cfilter) { + global_capture_opts.default_options.cfilter = g_strdup(get_conn_cfilter()); } #else /* HAVE_LIBPCAP */ show_main_window(FALSE); @@ -3638,11 +3638,11 @@ prefs_to_capture_opts(void) #ifdef HAVE_LIBPCAP /* Set promiscuous mode from the preferences setting. */ /* the same applies to other preferences settings as well. */ - global_capture_opts.promisc_mode = prefs.capture_prom_mode; - global_capture_opts.use_pcapng = prefs.capture_pcap_ng; - global_capture_opts.show_info = prefs.capture_show_info; - global_capture_opts.real_time_mode = prefs.capture_real_time; - auto_scroll_live = prefs.capture_auto_scroll; + global_capture_opts.default_options.promisc_mode = prefs.capture_prom_mode; + global_capture_opts.use_pcapng = prefs.capture_pcap_ng; + global_capture_opts.show_info = prefs.capture_show_info; + global_capture_opts.real_time_mode = prefs.capture_real_time; + auto_scroll_live = prefs.capture_auto_scroll; #endif /* HAVE_LIBPCAP */ /* Set the name resolution code's flags from the preferences. */ diff --git a/gtk/main_statusbar.c b/gtk/main_statusbar.c index 29f184d926..a4ae76466f 100644 --- a/gtk/main_statusbar.c +++ b/gtk/main_statusbar.c @@ -696,12 +696,10 @@ statusbar_get_interface_names(capture_options *capture_opts) interface_names = g_string_new(""); - if (capture_opts->ifaces->len == 0) { - g_string_append_printf(interface_names, "%s", get_iface_description(capture_opts)); #ifdef _WIN32 - } else if (capture_opts->ifaces->len < 2) { + if (capture_opts->ifaces->len < 2) { #else - } else if (capture_opts->ifaces->len < 4) { + if (capture_opts->ifaces->len < 4) { #endif for (i = 0; i < capture_opts->ifaces->len; i++) { if (i > 0) { diff --git a/gtk/main_welcome.c b/gtk/main_welcome.c index 3bf21330df..f02b9e6dfd 100644 --- a/gtk/main_welcome.c +++ b/gtk/main_welcome.c @@ -572,12 +572,6 @@ welcome_if_press_cb(GtkWidget *widget _U_, GdkEventButton *event _U_, gpointer d cap_settings_t cap_settings; interface_options interface_opts; - g_free(global_capture_opts.iface); - g_free(global_capture_opts.iface_descr); - - global_capture_opts.iface = g_strdup(data); - global_capture_opts.iface_descr = NULL; - while (global_capture_opts.ifaces->len > 0) { interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, 0); global_capture_opts.ifaces = g_array_remove_index(global_capture_opts.ifaces, 0); @@ -594,22 +588,45 @@ welcome_if_press_cb(GtkWidget *widget _U_, GdkEventButton *event _U_, gpointer d /* XXX - fix this */ /*global_capture_opts.iface_descr = get_interface_descriptive_name(global_capture_opts.iface);*/ - cap_settings = capture_get_cap_settings (global_capture_opts.iface);; - global_capture_opts.monitor_mode = cap_settings.monitor_mode; - global_capture_opts.linktype = cap_settings.linktype; + interface_opts.name = g_strdup(data); + interface_opts.descr = NULL; + cap_settings = capture_get_cap_settings(interface_opts.name); + interface_opts.monitor_mode = cap_settings.monitor_mode; + interface_opts.linktype = cap_settings.linktype; + interface_opts.cfilter = g_strdup(global_capture_opts.default_options.cfilter); + interface_opts.snaplen = global_capture_opts.default_options.snaplen; + interface_opts.has_snaplen = global_capture_opts.default_options.has_snaplen; + interface_opts.promisc_mode = global_capture_opts.default_options.promisc_mode; +#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) + interface_opts.buffer_size = global_capture_opts.default_options.buffer_size; +#endif +#ifdef HAVE_PCAP_REMOTE + interface_opts.src_type = global_capture_opts.default_options.src_type; + interface_opts.remote_host = g_strdup(global_capture_opts.default_options.remote_host); + interface_opts.remote_port = g_strdup(global_capture_opts.default_options.remote_port); + interface_opts.auth_type = global_capture_opts.default_options.auth_type; + interface_opts.auth_username = g_strdup(global_capture_opts.default_options.auth_username); + interface_opts.auth_password = g_strdup(global_capture_opts.default_options.auth_password); + interface_opts.datatx_udp = global_capture_opts.default_options.datatx_udp; + interface_opts.nocap_rpcap = global_capture_opts.default_options.nocap_rpcap; + interface_opts.nocap_local = global_capture_opts.default_options.nocap_local; +#endif +#ifdef HAVE_PCAP_SETSAMPLING + interface_opts.sampling_method = global_capture_opts.default_options.sampling_method; + interface_opts.sampling_param = global_capture_opts.default_options.sampling_param; +#endif /* XXX - remove this? */ if (global_capture_opts.save_file) { g_free(global_capture_opts.save_file); global_capture_opts.save_file = NULL; } - #ifdef HAVE_AIRPCAP - airpcap_if_active = get_airpcap_if_from_name(airpcap_if_list, global_capture_opts.iface); + airpcap_if_active = get_airpcap_if_from_name(airpcap_if_list, interface_opts.name); airpcap_if_selected = airpcap_if_active; airpcap_set_toolbar_start_capture(airpcap_if_active); #endif - + g_array_append_val(global_capture_opts.ifaces, interface_opts); capture_start_cb(NULL, NULL); return FALSE; diff --git a/summary.c b/summary.c index 7686e04bbc..6e30bab551 100644 --- a/summary.c +++ b/summary.c @@ -139,11 +139,14 @@ summary_fill_in(capture_file *cf, summary_tally *st) #ifdef HAVE_LIBPCAP +/* FIXME: This needs additional functionality to support multiple interfaces */ void summary_fill_in_capture(capture_options *capture_opts, summary_tally *st) { - st->cfilter = capture_opts->cfilter; - st->iface = capture_opts->iface; - st->iface_descr = get_iface_description(capture_opts); + if (capture_opts->ifaces->len > 0) { + st->cfilter = g_array_index(capture_opts->ifaces, interface_options, 0).cfilter; + st->iface = g_array_index(capture_opts->ifaces, interface_options, 0).name; + st->iface_descr = get_iface_description_for_interface(capture_opts, 0); + } } #endif diff --git a/tshark.c b/tshark.c index 6ef57c63f9..97f168af08 100644 --- a/tshark.c +++ b/tshark.c @@ -1392,12 +1392,12 @@ main(int argc, char *argv[]) rfilter = get_args_as_string(argc, argv, optind); } else { #ifdef HAVE_LIBPCAP - if (global_capture_opts.cfilter) { - cmdarg_err("Capture filters were specified both with \"-f\"" + if (global_capture_opts.default_options.cfilter) { + cmdarg_err("A default capture filter was specified both with \"-f\"" " and with additional command-line arguments"); return 1; } - global_capture_opts.cfilter = get_args_as_string(argc, argv, optind); + global_capture_opts.default_options.cfilter = get_args_as_string(argc, argv, optind); #else capture_option_specified = TRUE; #endif @@ -1443,7 +1443,7 @@ main(int argc, char *argv[]) support in capture files we read). */ #ifdef HAVE_LIBPCAP if (cf_name != NULL) { - if (global_capture_opts.cfilter) { + if (global_capture_opts.default_options.cfilter) { cmdarg_err("Only read filters, not capture filters, " "can be specified when reading a capture file."); return 1; @@ -2149,14 +2149,17 @@ capture_input_error_message(capture_options *capture_opts _U_, char *error_msg, /* capture child detected an capture filter related error */ void -capture_input_cfilter_error_message(capture_options *capture_opts, char *error_message) +capture_input_cfilter_error_message(capture_options *capture_opts, guint i, char *error_message) { dfilter_t *rfcode = NULL; + interface_options interface_opts; + g_assert(i < capture_opts->ifaces->len); + interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); - if (dfilter_compile(capture_opts->cfilter, &rfcode) && rfcode != NULL) { + if (dfilter_compile(interface_opts.cfilter, &rfcode) && rfcode != NULL) { cmdarg_err( - "Invalid capture filter: \"%s\"!\n" + "Invalid capture filter: \"%s\" for interface %s!\n" "\n" "That string looks like a valid display filter; however, it isn't a valid\n" "capture filter (%s).\n" @@ -2165,15 +2168,15 @@ capture_input_cfilter_error_message(capture_options *capture_opts, char *error_m "so you can't use most display filter expressions as capture filters.\n" "\n" "See the User's Guide for a description of the capture filter syntax.", - capture_opts->cfilter, error_message); + interface_opts.cfilter, interface_opts.name, error_message); dfilter_free(rfcode); } else { cmdarg_err( - "Invalid capture filter: \"%s\"!\n" + "Invalid capture filter: \"%s\" for interface %s!\n" "\n" "That string isn't a valid capture filter (%s).\n" "See the User's Guide for a description of the capture filter syntax.", - capture_opts->cfilter, error_message); + interface_opts.cfilter, interface_opts.name, error_message); } }