diff options
author | Guy Harris <guy@alum.mit.edu> | 1999-08-10 07:16:47 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 1999-08-10 07:16:47 +0000 |
commit | 8eb998e3600cbb1bcf76e64d42baca1eb9d66d46 (patch) | |
tree | 2a160810c80b8a18d317238edf220c323ae0ef1c /file.c | |
parent | 7ec128ccb261ed3c1b59bd4866c0f69d3e19117d (diff) |
Add the ability to specify a filter to be used when reading the file to
the "Open File" dialog box (the "Open File" dialog box equivalent of the
"-R" flag). Have "load_cap_file()" take the filter expression as an
argument, and make the global "rfilter" into a member of a
"capture_file" structure.
When reading a temporary capture file after a live capture, don't apply
any filter.
Move the code that pops up error boxes on file opens when reading a
capture file back to "load_cap_file()"; it also pops up error boxes if
the filter expression can't be parsed.
Don't enable "File/Save" or "File/Save As..." if an attempt to read a
capture file fails - if there was already an open capture file, it was
closed by "load_cap_file()", so we no longer have an open file to save.
svn path=/trunk/; revision=460
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 96 |
1 files changed, 54 insertions, 42 deletions
@@ -1,7 +1,7 @@ /* file.c * File I/O routines * - * $Id: file.c,v 1.60 1999/08/10 06:54:12 guy Exp $ + * $Id: file.c,v 1.61 1999/08/10 07:12:52 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -82,7 +82,6 @@ extern GtkWidget *packet_list, *prog_bar, *info_bar, *byte_view, *tree_view; extern guint file_ctx; extern int sync_mode; extern int sync_pipe[]; -extern gchar *rfilter; guint cap_input_id; @@ -187,7 +186,7 @@ close_cap_file(capture_file *cf, void *w, guint context) { } int -load_cap_file(char *fname, capture_file *cf) { +load_cap_file(char *fname, char *rfilter, capture_file *cf) { gchar *name_ptr, *load_msg, *load_fmt = " Loading: %s..."; gchar *done_fmt = " File: %s Drops: %d"; gchar *err_fmt = " Error: Could not load '%s'"; @@ -204,62 +203,75 @@ load_cap_file(char *fname, capture_file *cf) { name_ptr = fname; else name_ptr++; - load_msg = g_malloc(strlen(name_ptr) + strlen(load_fmt) + 2); - sprintf(load_msg, load_fmt, name_ptr); - gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg); - - timeout = gtk_timeout_add(250, file_progress_cb, (gpointer) cf); rfcode = NULL; if (rfilter) if (dfilter_compile(rfilter, &rfcode) != 0) { simple_dialog(ESD_TYPE_WARN, NULL, - "Unable to parse filter string \"%s\".", rfilter); + "Unable to parse filter string \"%s\".", rfilter); + goto fail; } err = open_cap_file(fname, cf); - if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) { - freeze_clist(cf); - wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf); - wtap_close(cf->wth); - cf->wth = NULL; - cf->fh = fopen(fname, "r"); - thaw_clist(cf); + if (err != 0) { + simple_dialog(ESD_TYPE_WARN, NULL, + file_open_error_message(err, FALSE), fname); + goto fail; } + + load_msg = g_malloc(strlen(name_ptr) + strlen(load_fmt) + 2); + sprintf(load_msg, load_fmt, name_ptr); + gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg); + + timeout = gtk_timeout_add(250, file_progress_cb, (gpointer) cf); + + freeze_clist(cf); + wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf); + wtap_close(cf->wth); + cf->wth = NULL; + cf->fh = fopen(fname, "r"); + thaw_clist(cf); gtk_timeout_remove(timeout); gtk_progress_bar_update(GTK_PROGRESS_BAR(prog_bar), 0); gtk_statusbar_pop(GTK_STATUSBAR(info_bar), file_ctx); - if (err == 0) { - msg_len = strlen(name_ptr) + strlen(done_fmt) + 64; - load_msg = g_realloc(load_msg, msg_len); - - if (cf->user_saved || !cf->save_file) - snprintf(load_msg, msg_len, done_fmt, name_ptr, cf->drops); - else - snprintf(load_msg, msg_len, done_fmt, "<none>", cf->drops); - - gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg); - g_free(load_msg); + msg_len = strlen(name_ptr) + strlen(done_fmt) + 64; + load_msg = g_realloc(load_msg, msg_len); -/* name_ptr[-1] = '\0'; Why is this here? It causes problems with capture files */ + if (cf->user_saved || !cf->save_file) + snprintf(load_msg, msg_len, done_fmt, name_ptr, cf->drops); + else + snprintf(load_msg, msg_len, done_fmt, "<none>", cf->drops); - /* Enable menu items that make sense if you have a capture. */ - set_menu_sensitivity("/File/Close", TRUE); - set_menu_sensitivity("/File/Reload", TRUE); - set_menu_sensitivity("/File/Print...", TRUE); - set_menu_sensitivity("/Display/Options...", TRUE); - set_menu_sensitivity("/Tools/Summary", TRUE); - } else { - msg_len = strlen(name_ptr) + strlen(err_fmt) + 2; - load_msg = g_realloc(load_msg, msg_len); - snprintf(load_msg, msg_len, err_fmt, name_ptr); - gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg); - g_free(load_msg); - } - return err; + gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg); + g_free(load_msg); + +/* name_ptr[-1] = '\0'; Why is this here? It causes problems with capture files */ + + /* Remember the new read filter string. */ + if (cf->rfilter != NULL) + g_free(cf->rfilter); + cf->rfilter = rfilter; + + /* Enable menu items that make sense if you have a capture. */ + set_menu_sensitivity("/File/Close", TRUE); + set_menu_sensitivity("/File/Reload", TRUE); + set_menu_sensitivity("/File/Print...", TRUE); + set_menu_sensitivity("/Display/Options...", TRUE); + set_menu_sensitivity("/Tools/Summary", TRUE); + return 0; + +fail: + msg_len = strlen(name_ptr) + strlen(err_fmt) + 2; + load_msg = g_malloc(msg_len); + snprintf(load_msg, msg_len, err_fmt, name_ptr); + gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg); + g_free(load_msg); + if (rfilter != NULL) + g_free(rfilter); /* assumed to be "g_strdup()"ed, if not null */ + return -1; } #ifdef HAVE_LIBPCAP |