#include "../ui_util.h"
#include "../util.h"
#include "../clopts_common.h"
+#include "../console_io.h"
#include "../cmdarg_err.h"
#include "../version_info.h"
#include "../merge.h"
#ifdef HAVE_LIBPCAP
#include "../capture-pcap-util.h"
+#include "../capture_ifinfo.h"
#include "../capture.h"
#include "../capture_sync.h"
#endif
#include "gtk/capture_if_dlg.h"
#include "gtk/tap_dfilter_dlg.h"
#include "gtk/prefs_column.h"
+#include "gtk/prefs_dlg.h"
#ifdef HAVE_LIBPCAP
#include "../image/wsicon16.xpm"
capture_file cfile;
/* "exported" main widgets */
-GtkWidget *top_level = NULL, *pkt_scrollw, *tree_view, *byte_nb_ptr;
+GtkWidget *top_level = NULL, *pkt_scrollw, *tree_view_gbl, *byte_nb_ptr_gbl;
/* placement widgets (can be a bit confusing, because of the many layout possibilities */
static GtkWidget *main_vbox, *main_pane_v1, *main_pane_v2, *main_pane_h1, *main_pane_h2;
}
}
+static gboolean
+is_address_column (gint column)
+{
+ if (((cfile.cinfo.col_fmt[column] == COL_DEF_SRC) ||
+ (cfile.cinfo.col_fmt[column] == COL_RES_SRC) ||
+ (cfile.cinfo.col_fmt[column] == COL_DEF_DST) ||
+ (cfile.cinfo.col_fmt[column] == COL_RES_DST)) &&
+ strlen(cfile.cinfo.col_expr.col_expr_val[column]))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+GList *
+get_ip_address_list_from_packet_list_row(gpointer data)
+{
+ gint row = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_ROW_KEY));
+ gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_COL_KEY));
+ gint col;
+ frame_data *fdata;
+ GList *addr_list = NULL;
+ int err;
+ gchar *err_info;
+
+#ifdef NEW_PACKET_LIST
+ fdata = (frame_data *) new_packet_list_get_row_data(row);
+#else
+ fdata = (frame_data *) packet_list_get_row_data(row);
+#endif
+
+ if (fdata != NULL) {
+ epan_dissect_t edt;
+
+ if (!wtap_seek_read(cfile.wth, fdata->file_off, &cfile.pseudo_header,
+ cfile.pd, fdata->cap_len, &err, &err_info))
+ {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ cf_read_error_message(err, err_info), cfile.filename);
+ return NULL;
+ }
+
+ epan_dissect_init(&edt, FALSE, FALSE);
+ col_custom_prime_edt(&edt, &cfile.cinfo);
+
+ epan_dissect_run(&edt, &cfile.pseudo_header, cfile.pd, fdata, &cfile.cinfo);
+ epan_dissect_fill_in_columns(&edt, TRUE, TRUE);
+
+ /* First check selected column */
+ if (is_address_column (column)) {
+ addr_list = g_list_append (addr_list, se_strdup_printf("%s", cfile.cinfo.col_expr.col_expr_val[column]));
+ }
+
+ for (col = 0; col < cfile.cinfo.num_cols; col++) {
+ /* Then check all columns except the selected */
+ if ((col != column) && (is_address_column (col))) {
+ addr_list = g_list_append (addr_list, se_strdup_printf("%s", cfile.cinfo.col_expr.col_expr_val[col]));
+ }
+ }
+
+ epan_dissect_cleanup(&edt);
+ }
+
+ return addr_list;
+}
+
static gchar *
get_filter_from_packet_list_row_and_column(gpointer data)
{
if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 &&
strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) {
- /* leak a little but safer than ep_ here*/
- buf = se_strdup_printf("%s == %s", cfile.cinfo.col_expr.col_expr[column],
- cfile.cinfo.col_expr.col_expr_val[column]);
+ /* leak a little but safer than ep_ here */
+ if (cfile.cinfo.col_fmt[column] == COL_CUSTOM) {
+ header_field_info *hfi = proto_registrar_get_byname(cfile.cinfo.col_custom_field[column]);
+ if (hfi->parent == -1) {
+ /* Protocol only */
+ buf = se_strdup(cfile.cinfo.col_expr.col_expr[column]);
+ } else if (hfi->type == FT_STRING) {
+ /* Custom string, add quotes */
+ buf = se_strdup_printf("%s == \"%s\"", cfile.cinfo.col_expr.col_expr[column],
+ cfile.cinfo.col_expr.col_expr_val[column]);
+ }
+ }
+ if (buf == NULL) {
+ buf = se_strdup_printf("%s == %s", cfile.cinfo.col_expr.col_expr[column],
+ cfile.cinfo.col_expr.col_expr_val[column]);
+ }
}
epan_dissect_cleanup(&edt);
* Which byte view is displaying the current protocol tree
* row's data?
*/
- byte_view = get_notebook_bv_ptr(byte_nb_ptr);
+ byte_view = get_notebook_bv_ptr(byte_nb_ptr_gbl);
if (byte_view == NULL)
return; /* none */
gtk_tree_model_get(model, &iter, 1, &finfo, -1);
if (!finfo) return;
- set_notebook_page(byte_nb_ptr, finfo->ds_tvb);
+ set_notebook_page(byte_nb_ptr_gbl, finfo->ds_tvb);
- byte_view = get_notebook_bv_ptr(byte_nb_ptr);
+ byte_view = get_notebook_bv_ptr(byte_nb_ptr_gbl);
byte_data = get_byte_view_data_and_length(byte_view, &byte_len);
g_assert(byte_data != NULL);
void collapse_all_cb(GtkWidget *widget _U_, gpointer data _U_) {
if (cfile.edt->tree)
- collapse_all_tree(cfile.edt->tree, tree_view);
+ collapse_all_tree(cfile.edt->tree, tree_view_gbl);
}
void expand_all_cb(GtkWidget *widget _U_, gpointer data _U_) {
if (cfile.edt->tree)
- expand_all_tree(cfile.edt->tree, tree_view);
+ expand_all_tree(cfile.edt->tree, tree_view_gbl);
}
void apply_as_custom_column_cb (GtkWidget *widget _U_, gpointer data _U_)
{
if (cfile.finfo_selected) {
- column_prefs_add_custom(COL_CUSTOM, cfile.finfo_selected->hfinfo->name,
+ column_prefs_add_custom(COL_CUSTOM, cfile.finfo_selected->hfinfo->name,
cfile.finfo_selected->hfinfo->abbrev);
/* Recreate the packet list according to new preferences */
#ifdef NEW_PACKET_LIST
#else
packet_list_recreate ();
#endif
+ if (!prefs.gui_use_pref_save) {
+ prefs_main_write();
+ }
cfile.cinfo.columns_changed = FALSE; /* Reset value */
}
}
void expand_tree_cb(GtkWidget *widget _U_, gpointer data _U_) {
GtkTreePath *path;
- path = tree_find_by_field_info(GTK_TREE_VIEW(tree_view), cfile.finfo_selected);
+ path = tree_find_by_field_info(GTK_TREE_VIEW(tree_view_gbl), cfile.finfo_selected);
if(path) {
/* the mouse position is at an entry, expand that one */
- gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view), path, TRUE);
+ gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view_gbl), path, TRUE);
gtk_tree_path_free(path);
}
}
if (cfile.edt->tree) {
guint32 tmp = g_resolv_flags;
g_resolv_flags = RESOLV_ALL;
- proto_tree_draw(cfile.edt->tree, tree_view);
+ proto_tree_draw(cfile.edt->tree, tree_view_gbl);
g_resolv_flags = tmp;
}
}
fprintf(output, " -Q quit Wireshark after capturing\n");
fprintf(output, " -S update packet display when new packets are captured\n");
fprintf(output, " -l turn on automatic scrolling while -S is in use\n");
-#ifdef _WIN32
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
fprintf(output, " -B <buffer size> size of kernel buffer (def: 1MB)\n");
#endif
fprintf(output, " -y <link type> link layer type (def: first appropriate)\n");
fprintf(output, "User interface:\n");
fprintf(output, " -C <config profile> start with specified configuration profile\n");
fprintf(output, " -g <packet number> go to specified packet number after \"-r\"\n");
+ fprintf(output, " -J <jump filter> jump to the first packet matching the (display) filter\n");
+ fprintf(output, " -j search backwards for a matching packet after \"-J\"\n");
fprintf(output, " -m <font> set the font name used for most text\n");
fprintf(output, " -t ad|a|r|d|dd|e output format of time stamps (def: r: rel. to first)\n");
+ fprintf(output, " -u s|hms output format of seconds (def: s: seconds)\n");
fprintf(output, " -X <key>:<value> eXtension options, see man page for details\n");
fprintf(output, " -z <statistics> show various statistics, see man page for details\n");
}
/*
- * Report an error in command-line arguments.
- * Creates a console on Windows.
+ * Print to the standard error. On Windows, create a console for the
+ * standard error to show up on, if necessary.
* XXX - pop this up in a window of some sort on UNIX+X11 if the controlling
* terminal isn't the standard error?
*/
void
-cmdarg_err(const char *fmt, ...)
+vfprintf_stderr(const char *fmt, va_list ap)
{
- va_list ap;
-
#ifdef _WIN32
create_console();
#endif
- va_start(ap, fmt);
- fprintf(stderr, "wireshark: ");
vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
+}
+
+void
+fprintf_stderr(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf_stderr(fmt, ap);
+ va_end(ap);
+}
+
+/*
+ * Report an error in command-line arguments.
+ * Creates a console on Windows.
+ */
+void
+cmdarg_err(const char *fmt, ...)
+{
+ va_list ap;
+
+ fprintf_stderr("wireshark: ");
+ va_start(ap, fmt);
+ vfprintf_stderr(fmt, ap);
va_end(ap);
+ fprintf_stderr("\n");
}
/*
{
va_list ap;
-#ifdef _WIN32
- create_console();
-#endif
va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
+ vfprintf_stderr(fmt, ap);
+ fprintf_stderr("\n");
va_end(ap);
}
worry about any locking or critical regions.
*/
static gboolean
-update_cb(gpointer data _U_)
+tap_update_cb(gpointer data _U_)
{
draw_tap_listeners(FALSE);
return TRUE;
void reset_tap_update_timer(void)
{
g_source_remove(tap_update_timer_id);
- tap_update_timer_id = g_timeout_add(prefs.tap_update_interval, update_cb, NULL);
+ tap_update_timer_id = g_timeout_add(prefs.tap_update_interval, tap_update_cb, NULL);
}
#else
#endif
}
+/*
+ * Periodically process outstanding hostname lookups. If we have new items,
+ * redraw the packet list and tree view.
+ */
+
+static gboolean
+resolv_update_cb(gpointer data _U_)
+{
+ /* Anything new show up? */
+ if (host_name_lookup_process(NULL)) {
+ if (pkt_scrollw->window)
+ gdk_window_invalidate_rect(pkt_scrollw->window, NULL, TRUE);
+ if (tv_scrollw->window)
+ gdk_window_invalidate_rect(tv_scrollw->window, NULL, TRUE);
+ }
+
+ /* Always check. Even if we don't do async lookups we could still get
+ passive updates, e.g. from DNS packets. */
+ return TRUE;
+}
+
+
/* Set the file name in the name for the main window and in the name for the main window's icon. */
static void
set_display_filename(capture_file *cf)
static void
-main_cf_cb_file_read_start(capture_file *cf _U_)
+main_cf_cb_file_read_started(capture_file *cf _U_)
{
tap_dfilter_dlg_update();
}
static void
-main_capture_cb_capture_prepared(capture_options *capture_opts)
+main_capture_set_main_window_title(capture_options *capture_opts)
{
- gchar *title;
- static GList *icon_list = NULL;
-
+ GString *title = g_string_new("");
+ g_string_append(title, "Capturing ");
if(capture_opts->iface) {
- title = g_strdup_printf("%s: Capturing - Wireshark",
- get_iface_description(capture_opts));
- } else {
- title = g_strdup_printf("Capturing - Wireshark");
+ g_string_append_printf(title, "from %s ", cf_get_tempfile_source(capture_opts->cf));
}
- set_main_window_name(title);
- g_free(title);
+ g_string_append(title, "- Wireshark");
+
+ set_main_window_name(title->str);
+ g_string_free(title, TRUE);
+}
+
+static void
+main_capture_cb_capture_prepared(capture_options *capture_opts)
+{
+ static GList *icon_list = NULL;
+
+ main_capture_set_main_window_title(capture_opts);
if(icon_list == NULL) {
icon_list = icon_list_create(wsiconcap16_xpm, wsiconcap32_xpm, wsiconcap48_xpm, NULL);
static void
main_capture_cb_capture_update_started(capture_options *capture_opts)
{
- gchar *title;
-
/* We've done this in "prepared" above, but it will be cleared while
switching to the next multiple file. */
- if(capture_opts->iface) {
- title = g_strdup_printf("%s: Capturing - Wireshark",
- get_iface_description(capture_opts));
- } else {
- title = g_strdup_printf("Capturing - Wireshark");
- }
- set_main_window_name(title);
- g_free(title);
+ main_capture_set_main_window_title(capture_opts);
set_menus_for_capture_in_progress(TRUE);
set_capture_if_dialog_for_capture_in_progress(TRUE);
* highlight the field that is found in the tree and hex displays. */
if((cfile.string || cfile.hex) && cfile.search_pos != 0) {
highlight_field(cf->edt->tvb, cfile.search_pos,
- (GtkTreeView *)tree_view, cf->edt->tree);
+ (GtkTreeView *)tree_view_gbl, cf->edt->tree);
cfile.search_pos = 0; /* Reset the position */
}
}
static void
-main_cf_cb_file_safe_reload_finished(gpointer data _U_)
+main_cf_cb_file_save_reload_finished(gpointer data _U_)
{
+ set_display_filename(&cfile);
set_menus_for_capture_file(&cfile);
}
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Closed");
main_cf_cb_file_closed(data);
break;
- case(cf_cb_file_read_start):
- g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Read start");
- main_cf_cb_file_read_start(data);
+ case(cf_cb_file_read_started):
+ g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Read started");
+ main_cf_cb_file_read_started(data);
break;
case(cf_cb_file_read_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Read finished");
case(cf_cb_field_unselected):
main_cf_cb_field_unselected(data);
break;
- case(cf_cb_file_safe_started):
- g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: safe started");
+ case(cf_cb_file_save_started):
+ g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save started");
break;
- case(cf_cb_file_safe_finished):
- g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: safe finished");
+ case(cf_cb_file_save_finished):
+ g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save finished");
break;
- case(cf_cb_file_safe_reload_finished):
- g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: reload finished");
- main_cf_cb_file_safe_reload_finished(data);
+ case(cf_cb_file_save_reload_finished):
+ g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Reload finished");
+ main_cf_cb_file_save_reload_finished(data);
break;
- case(cf_cb_file_safe_failed):
- g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: safe failed");
+ case(cf_cb_file_save_failed):
+ g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save failed");
break;
default:
g_warning("main_cf_callback: event %u unknown", event);
char *gpf_path, *pf_path;
char *cf_path, *df_path;
int pf_open_errno, pf_read_errno;
- e_prefs *prefs;
+ e_prefs *prefs_p;
/* Read the preference files. */
- prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
+ prefs_p = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
&pf_open_errno, &pf_read_errno, &pf_path);
if (gpf_path != NULL) {
#ifdef _WIN32
/* if the user wants a console to be always there, well, we should open one for him */
- if (prefs->gui_console_open == console_open_always) {
+ if (prefs_p->gui_console_open == console_open_always) {
create_console();
}
#endif
*dp_path = NULL;
}
- return prefs;
+ return prefs_p;
+}
+
+/* Check if there's something important to tell the user during startup.
+ * We want to do this *after* showing the main window so that any windows
+ * we pop up will be above the main window.
+ */
+static void
+#ifdef _WIN32
+check_and_warn_user_startup(gchar *cf_name)
+#else
+check_and_warn_user_startup(gchar *cf_name _U_)
+#endif
+{
+ gchar *cur_user, *cur_group;
+ gpointer priv_warning_dialog;
+
+ /* Tell the user not to run as root. */
+ if (running_with_special_privs() && recent.privs_warn_if_elevated) {
+ cur_user = get_cur_username();
+ cur_group = get_cur_groupname();
+ priv_warning_dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
+ "Running as user \"%s\" and group \"%s\".\n"
+ "This could be dangerous.", cur_user, cur_group);
+ g_free(cur_user);
+ g_free(cur_group);
+ simple_dialog_check_set(priv_warning_dialog, "Don't show this message again.");
+ simple_dialog_set_cb(priv_warning_dialog, priv_warning_dialog_cb, NULL);
+ }
+
+#ifdef _WIN32
+ /* Warn the user if npf.sys isn't loaded. */
+ if (!stdin_capture && !cf_name && !npf_sys_is_running() && recent.privs_warn_if_no_npf && get_os_major_version() >= 6) {
+ priv_warning_dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
+ "The NPF driver isn't running. You may have trouble\n"
+ "capturing or listing interfaces.");
+ simple_dialog_check_set(priv_warning_dialog, "Don't show this message again.");
+ simple_dialog_set_cb(priv_warning_dialog, npf_warning_dialog_cb, NULL);
+ }
+#endif
+
}
+
/* And now our feature presentation... [ fade to music ] */
int
main(int argc, char *argv[])
int opt;
gboolean arg_error = FALSE;
- extern int splash_register_freq; /* Found in about_dlg.c */
+ extern int info_update_freq; /* Found in about_dlg.c. */
const gchar *filter;
#ifdef _WIN32
#ifdef HAVE_LIBPCAP
gboolean start_capture = FALSE;
gboolean list_link_layer_types = FALSE;
+ GList *if_list;
+ gchar *err_str;
#else
gboolean capture_option_specified = FALSE;
+#ifdef _WIN32
+#ifdef HAVE_AIRPCAP
+ gchar *err_str;
+#endif
+#endif
#endif
gint pl_size = 280, tv_size = 95, bv_size = 75;
- gchar *rc_file, *cf_name = NULL, *rfilter = NULL;
+ gchar *rc_file, *cf_name = NULL, *rfilter = NULL, *jfilter = NULL;
dfilter_t *rfcode = NULL;
gboolean rfilter_parse_failed = FALSE;
- e_prefs *prefs;
+ e_prefs *prefs_p;
char badopt;
GtkWidget *splash_win = NULL;
- gpointer priv_warning_dialog;
GLogLevelFlags log_flags;
guint go_to_packet = 0;
+ gboolean jump_backwards = FALSE, saved_bw = FALSE;
+ dfilter_t *jump_to_filter = NULL;
int optind_initial;
int status;
- gchar *cur_user, *cur_group;
-#ifdef _WIN32
-#ifdef HAVE_AIRPCAP
- char *err_str;
-#endif
-#endif
-
-#define OPTSTRING_INIT "a:b:c:C:Df:g:Hhi:kK:lLm:nN:o:P:pQr:R:Ss:t:vw:X:y:z:"
+#ifdef HAVE_LIBPCAP
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
+#define OPTSTRING_B "B:"
+#else
+#define OPTSTRING_B ""
+#endif /* _WIN32 or HAVE_PCAP_CREATE */
+#else /* HAVE_LIBPCAP */
+#define OPTSTRING_B ""
+#endif /* HAVE_LIBPCAP */
-#if defined HAVE_LIBPCAP && defined _WIN32
-#define OPTSTRING_WIN32 "B:"
+#ifdef HAVE_PCAP_CREATE
+#define OPTSTRING_I "I"
#else
-#define OPTSTRING_WIN32 ""
+#define OPTSTRING_I ""
#endif
- char optstring[sizeof(OPTSTRING_INIT) + sizeof(OPTSTRING_WIN32) - 1] =
- OPTSTRING_INIT OPTSTRING_WIN32;
+#define OPTSTRING "a:b:" OPTSTRING_B "c:C:Df:g:Hhi:" OPTSTRING_I "jJ:kK:lLm:nN:o:P:pQr:R:Ss:t:u:vw:X:y:z:"
+
+ static const char optstring[] = OPTSTRING;
/*
* Get credential information for later use, and drop privileges
WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
#endif /* _WIN32 */
+ profile_store_persconffiles (TRUE);
+
/* Assemble the compile-time version information string */
comp_info_str = g_string_new("Compiled ");
/* Initialize whatever we need to allocate colors for GTK+ */
colors_init();
- /* Non-blank filter means we're remote. Throttle splash screen updates. */
+ /* Non-blank filter means we're remote. Throttle splash screen and resolution updates. */
filter = get_conn_cfilter();
- if ( *filter != '\0' )
- splash_register_freq = 1000; /* Milliseconds */
+ if ( *filter != '\0' ) {
+ info_update_freq = 1000; /* Milliseconds */
+ }
/* We won't come till here, if we had a "console only" command line parameter. */
splash_win = splash_new("Loading Wireshark ...");
We must do that before we read the preferences as well. */
prefs_register_modules();
- prefs = read_configuration_files (&gdp_path, &dp_path);
+ prefs_p = read_configuration_files (&gdp_path, &dp_path);
/* multithread support currently doesn't seem to work in win32 gtk2.0.6 */
#if !defined(_WIN32) && defined(G_THREADS_ENABLED) && defined USE_THREADS
}
#else /* !_WIN32 && G_THREADS_ENABLED && USE_THREADS */
/* this is to keep tap extensions updating once every 3 seconds */
- tap_update_timer_id = g_timeout_add(prefs->tap_update_interval, update_cb, NULL);
+ tap_update_timer_id = g_timeout_add(prefs_p->tap_update_interval, tap_update_cb, NULL);
#endif /* !_WIN32 && G_THREADS_ENABLED && USE_THREADS */
-#if HAVE_GNU_ADNS || HAVE_C_ARES
- g_timeout_add(750, host_name_lookup_process, NULL);
-#endif
-
splash_update(RA_CONFIGURATION, NULL, (gpointer)splash_win);
case 'H': /* Hide capture info dialog box */
case 'i': /* Use interface xxx */
case 'p': /* Don't capture in promiscuous mode */
+#ifdef HAVE_PCAP_CREATE
+ case 'I': /* Capture in monitor mode, if available */
+#endif
case 'Q': /* Quit after capture (just capture to file) */
case 's': /* Set the snapshot (capture) length */
case 'S': /* "Sync" mode: used for following file ala tail -f */
case 'w': /* Write to capture file xxx */
case 'y': /* Set the pcap data link type */
-#ifdef _WIN32
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
case 'B': /* Buffer size */
-#endif /* _WIN32 */
+#endif /* _WIN32 or HAVE_PCAP_CREATE */
#ifdef HAVE_LIBPCAP
status = capture_opts_add_opt(&global_capture_opts, opt, optarg,
&start_capture);
break;
case 'D': /* Print a list of capture devices and exit */
#ifdef HAVE_LIBPCAP
- capture_opts_list_interfaces(FALSE);
+ if_list = capture_interface_list(&err, &err_str);
+ if (if_list == NULL) {
+ switch (err) {
+ case CANT_GET_INTERFACE_LIST:
+ 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;
+ }
+ exit(2);
+ }
+ capture_opts_print_interfaces(if_list);
+ free_interface_list(if_list);
exit(0);
#else
capture_option_specified = TRUE;
arg_error = TRUE;
#endif
break;
- case 'g': /* Go to packet */
+ case 'j': /* Search backwards for a matching packet from filter in option J */
+ jump_backwards = TRUE;
+ break;
+ case 'g': /* Go to packet with the given packet number */
go_to_packet = get_positive_int(optarg, "go to packet");
break;
+ case 'J': /* Jump to the first packet which matches the filter criteria */
+ jfilter = optarg;
+ break;
case 'l': /* Automatic scrolling in live capture mode */
#ifdef HAVE_LIBPCAP
auto_scroll_live = TRUE;
#endif
break;
case 'm': /* Fixed-width font for the display */
- g_free(prefs->gui_font_name);
- prefs->gui_font_name = g_strdup(optarg);
+ g_free(prefs_p->gui_font_name);
+ prefs_p->gui_font_name = g_strdup(optarg);
break;
case 'n': /* No name resolution */
g_resolv_flags = RESOLV_NONE;
exit(1);
}
break;
+ case 'u': /* Seconds type */
+ if (strcmp(optarg, "s") == 0)
+ timestamp_set_seconds_type(TS_SECONDS_DEFAULT);
+ else if (strcmp(optarg, "hms") == 0)
+ timestamp_set_seconds_type(TS_SECONDS_HOUR_MIN_SEC);
+ else {
+ cmdarg_err("Invalid seconds type \"%s\"", optarg);
+ cmdarg_err_cont("It must be \"s\" for seconds or \"hms\" for hours, minutes and seconds.");
+ exit(1);
+ }
+ break;
case 'X':
/* ext ops were already processed just ignore them this time*/
break;
if (start_capture || list_link_layer_types) {
/* Did the user specify an interface to use? */
if (!capture_opts_trim_iface(&global_capture_opts,
- (prefs->capture_device) ? get_if_name(prefs->capture_device) : NULL)) {
+ (prefs_p->capture_device) ? get_if_name(prefs_p->capture_device) : NULL)) {
exit(2);
}
}
if (list_link_layer_types) {
- status = capture_opts_list_link_layer_types(&global_capture_opts, FALSE);
- exit(status);
+ /* Get the list of link-layer types for the capture device. */
+ if_capabilities_t *caps;
+
+ caps = capture_get_if_capabilities(global_capture_opts.iface,
+ global_capture_opts.monitor_mode,
+ &err_str);
+ if (caps == NULL) {
+ cmdarg_err("The capabilities of the capture device \"%s\" could not be obtained (%s)."
+ "Please check to make sure you have sufficient permissions, and that\n"
+ "you have the proper interface or pipe specified.\n", global_capture_opts.iface, err_str);
+ g_free(err_str);
+ exit(2);
+ }
+ if (caps->data_link_types == NULL) {
+ cmdarg_err("The capture device \"%s\" has no data link types.", global_capture_opts.iface);
+ exit(2);
+ }
+ capture_opts_print_if_capabilities(caps, global_capture_opts.monitor_mode);
+ free_if_capabilities(caps);
+ exit(0);
}
capture_opts_trim_snaplen(&global_capture_opts, MIN_PACKET_SIZE);
set_disabled_protos_list();
}
- build_column_format_array(&cfile.cinfo, prefs->num_cols, TRUE);
+ build_column_format_array(&cfile.cinfo, prefs_p->num_cols, TRUE);
/* read in rc file from global and personal configuration paths. */
rc_file = get_datafile_path(RC_FILE);
/* Everything is prepared now, preferences and command line was read in */
/* Pop up the main window. */
- create_main_window(pl_size, tv_size, bv_size, prefs);
+ create_main_window(pl_size, tv_size, bv_size, prefs_p);
/* Read the dynamic part of the recent file, as we have the gui now ready for it. */
recent_read_dynamic(&rf_path, &rf_open_errno);
/* the window can be sized only, if it's not already shown, so do it now! */
main_load_window_geometry(top_level);
- /* Tell the user not to run as root. */
- if (running_with_special_privs() && recent.privs_warn_if_elevated) {
- cur_user = get_cur_username();
- cur_group = get_cur_groupname();
- priv_warning_dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "Running as user \"%s\" and group \"%s\".\n"
- "This could be dangerous.", cur_user, cur_group);
- g_free(cur_user);
- g_free(cur_group);
- simple_dialog_check_set(priv_warning_dialog, "Don't show this message again.");
- simple_dialog_set_cb(priv_warning_dialog, priv_warning_dialog_cb, NULL);
- }
+ g_timeout_add(info_update_freq, resolv_update_cb, NULL);
-#ifdef _WIN32
- /* Warn the user if npf.sys isn't loaded. */
- if (!npf_sys_is_running() && recent.privs_warn_if_no_npf && get_os_major_version() >= 6) {
- priv_warning_dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- "The NPF driver isn't running. You may have trouble\n"
- "capturing or listing interfaces.");
- simple_dialog_check_set(priv_warning_dialog, "Don't show this message again.");
- simple_dialog_set_cb(priv_warning_dialog, npf_warning_dialog_cb, NULL);
- }
-#endif
/* If we were given the name of a capture file, read it in now;
we defer it until now, so that, if we can't open it, and pop
up on top of us. */
if (cf_name) {
show_main_window(TRUE);
+ check_and_warn_user_startup(cf_name);
if (rfilter != NULL) {
if (!dfilter_compile(rfilter, &rfcode)) {
bad_dfilter_alert_box(rfilter);
start_requested_stats();
/* Read the capture file. */
- switch (cf_read(&cfile)) {
+ switch (cf_read(&cfile, FALSE)) {
case CF_READ_OK:
case CF_READ_ERROR:
file. */
/* if the user told us to jump to a specific packet, do it now */
if(go_to_packet != 0) {
+ /* Jump to the specified frame number, kept for backward
+ compatibility. */
cf_goto_frame(&cfile, go_to_packet);
+ } else if (jfilter != NULL) {
+ /* try to compile given filter */
+ if (!dfilter_compile(jfilter, &jump_to_filter)) {
+ bad_dfilter_alert_box(jfilter);
+ } else
+ {
+ /* Filter ok, jump to the first packet matching the filter
+ conditions. Default search direction is forward, but if
+ option d was given, search backwards */
+ saved_bw = cfile.sbackward;
+ cfile.sbackward = jump_backwards;
+ cf_find_packet_dfilter(&cfile, jump_to_filter);
+ cfile.sbackward = saved_bw;
+ }
}
break;
dfilter_free(rfcode);
cfile.rfcode = NULL;
show_main_window(FALSE);
+ /* Don't call check_and_warn_user_startup(): we did it above */
set_menus_for_capture_in_progress(FALSE);
set_capture_if_dialog_for_capture_in_progress(FALSE);
}
}
/* "-k" was specified; start a capture. */
show_main_window(TRUE);
+ check_and_warn_user_startup(cf_name);
if (capture_start(&global_capture_opts)) {
/* The capture started. Open stat windows; we do so after creating
the main window, to avoid GTK warnings, and after successfully
}
else {
show_main_window(FALSE);
+ check_and_warn_user_startup(cf_name);
set_menus_for_capture_in_progress(FALSE);
set_capture_if_dialog_for_capture_in_progress(FALSE);
}
}
#else /* HAVE_LIBPCAP */
show_main_window(FALSE);
+ check_and_warn_user_startup(cf_name);
set_menus_for_capture_in_progress(FALSE);
set_capture_if_dialog_for_capture_in_progress(FALSE);
#endif /* HAVE_LIBPCAP */
/* register our pid if we are being run from a U3 device */
u3_register_pid();
+ profile_store_persconffiles (FALSE);
+
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_INFO, "Wireshark is up and ready to go");
/* we'll enter the GTK loop now and hand the control over to GTK ... */
case(layout_pane_content_pdetails):
return tv_scrollw;
case(layout_pane_content_pbytes):
- return byte_nb_ptr;
+ return byte_nb_ptr_gbl;
default:
g_assert_not_reached();
return NULL;
#endif
g_object_ref(G_OBJECT(pkt_scrollw));
g_object_ref(G_OBJECT(tv_scrollw));
- g_object_ref(G_OBJECT(byte_nb_ptr));
+ g_object_ref(G_OBJECT(byte_nb_ptr_gbl));
g_object_ref(G_OBJECT(statusbar));
g_object_ref(G_OBJECT(main_pane_v1));
g_object_ref(G_OBJECT(main_pane_v2));
}
if (recent.byte_view_show && have_capture_file) {
- gtk_widget_show(byte_nb_ptr);
+ gtk_widget_show(byte_nb_ptr_gbl);
} else {
- gtk_widget_hide(byte_nb_ptr);
+ gtk_widget_hide(byte_nb_ptr_gbl);
}
if (have_capture_file) {
}
static void
-create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs)
+create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs_p)
{
GtkAccelGroup *accel;
gchar *title;
#ifdef HAVE_IGE_MAC_INTEGRATION
/* MacOS X native menus are created and displayed by main_menu_new() */
- if(!prefs->gui_macosx_style) {
+ if(!prefs_p->gui_macosx_style) {
#endif
gtk_window_add_accel_group(GTK_WINDOW(top_level), accel);
gtk_widget_show(menubar);
gtk_widget_set_size_request(pkt_scrollw, -1, pl_size);
gtk_widget_show_all(pkt_scrollw);
#else
- pkt_scrollw = packet_list_new(prefs);
+ pkt_scrollw = packet_list_new(prefs_p);
gtk_widget_set_size_request(packet_list, -1, pl_size);
gtk_widget_show(pkt_scrollw);
#endif
/* Tree view */
- tv_scrollw = main_tree_view_new(prefs, &tree_view);
+ tv_scrollw = main_tree_view_new(prefs_p, &tree_view_gbl);
gtk_widget_set_size_request(tv_scrollw, -1, tv_size);
gtk_widget_show(tv_scrollw);
- g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)),
+ g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view_gbl)),
"changed", G_CALLBACK(tree_view_selection_changed_cb), NULL);
- g_signal_connect(tree_view, "button_press_event", G_CALLBACK(popup_menu_handler),
+ g_signal_connect(tree_view_gbl, "button_press_event", G_CALLBACK(popup_menu_handler),
g_object_get_data(G_OBJECT(popup_menu_object), PM_TREE_VIEW_KEY));
- gtk_widget_show(tree_view);
+ gtk_widget_show(tree_view_gbl);
/* Byte view. */
- byte_nb_ptr = byte_view_new();
- gtk_widget_set_size_request(byte_nb_ptr, -1, bv_size);
- gtk_widget_show(byte_nb_ptr);
+ byte_nb_ptr_gbl = byte_view_new();
+ gtk_widget_set_size_request(byte_nb_ptr_gbl, -1, bv_size);
+ gtk_widget_show(byte_nb_ptr_gbl);
- g_signal_connect(byte_nb_ptr, "button_press_event", G_CALLBACK(popup_menu_handler),
+ g_signal_connect(byte_nb_ptr_gbl, "button_press_event", G_CALLBACK(popup_menu_handler),
g_object_get_data(G_OBJECT(popup_menu_object), PM_BYTES_VIEW_KEY));
/* Panes for the packet list, tree, and byte view */
rf_path, strerror(rf_open_errno));
}
timestamp_set_type (recent.gui_time_format);
+ timestamp_set_seconds_type (recent.gui_seconds_format);
color_filters_enable(recent.packet_list_colorize);
prefs_to_capture_opts();