Split "load_cap_file()" into "open_cap_file()" and "read_cap_file()".

The former, which used to be called by "load_cap_file()", now just opens
the file and, if the open succeeds, closes any capture file we
previously had open, reinitializes any protocols that need
reinitialization, and saves information about the new capture file in
the "capture_file" structure to which it was passed a pointer.  The
latter reads the file already opened by "read_cap_file()".

For "File/Open", call "open_cap_file()" before dismissing the file
selection box; if it fails, "open_cap_file()" will have popped up a
message box complaining about it - just return, leaving the file
selection box open so the user can, after dismissing the message box,
either try again with a different file name, or dismiss the file
selection box.  (Other file selection boxes should be made to work the
same way.)  If "open_cap_file()" succeeds, dismiss the file selection
box, and read the capture file in.

svn path=/trunk/; revision=492
This commit is contained in:
Guy Harris 1999-08-15 00:26:11 +00:00
parent 9e58014e7f
commit ea6a522b28
4 changed files with 82 additions and 60 deletions

View File

@ -1,7 +1,7 @@
/* capture.c
* Routines for packet capture windows
*
* $Id: capture.c,v 1.47 1999/08/14 23:47:19 guy Exp $
* $Id: capture.c,v 1.48 1999/08/15 00:26:10 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -625,8 +625,8 @@ capture(void) {
if (pch) {
/* "pch" is non-NULL only if we successfully started a capture.
If we haven't, there's no capture file to load. */
err = load_cap_file(cf.save_file, NULL, &cf);
if (err == 0) {
if ((err = open_cap_file(cf.save_file, &cf)) == 0 &&
(err = read_cap_file(cf.save_file, NULL, &cf)) == 0) {
set_menu_sensitivity("/File/Save", TRUE);
set_menu_sensitivity("/File/Save As...", FALSE);
}

View File

@ -1,6 +1,6 @@
/* ETHEREal.c
*
* $Id: ethereal.c,v 1.85 1999/08/14 19:53:31 gram Exp $
* $Id: ethereal.c,v 1.86 1999/08/15 00:26:09 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -433,11 +433,21 @@ file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
rfilter = g_strdup(s);
else
rfilter = NULL;
/* Try to open the capture file. */
if ((err = open_cap_file(cf_name, &cf)) != 0) {
/* We couldn't open it; don't dismiss the open dialog box,
just leave it around so that the user can, after they
dismiss the alert box popped up for the open error,
try again. */
return;
}
gtk_widget_hide(GTK_WIDGET (fs));
gtk_widget_destroy(GTK_WIDGET (fs));
/* save the directory name. We can write over cf_name */
if ((err = load_cap_file(cf_name, rfilter, &cf)) == 0) {
if ((err = read_cap_file(cf_name, rfilter, &cf)) == 0) {
s = strrchr(cf_name, '/');
if (s && last_open_dir) {
*s = '\0';
@ -517,8 +527,8 @@ file_save_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
g_free(cf.save_file);
cf.save_file = g_strdup(cf_name);
cf.user_saved = 1;
err = load_cap_file(cf_name, g_strdup(cf.rfilter), &cf);
if (err == 0) {
if ((err = open_cap_file(cf_name, &cf)) == 0 &&
(err = read_cap_file(cf_name, g_strdup(cf.rfilter), &cf)) == 0) {
set_menu_sensitivity("/File/Save", FALSE);
set_menu_sensitivity("/File/Save As...", TRUE);
}
@ -537,8 +547,8 @@ file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
g_free(cf.filename);
cf.filename = g_strdup(cf_name);
cf.user_saved = 1;
err = load_cap_file(cf.filename, g_strdup(cf.rfilter), &cf);
if (err == 0) {
if ((err = open_cap_file(cf.filename, &cf)) == 0 &&
(err = read_cap_file(cf.filename, g_strdup(cf.rfilter), &cf)) == 0) {
set_menu_sensitivity("/File/Save", FALSE);
set_menu_sensitivity("/File/Save As...", TRUE);
}
@ -554,7 +564,8 @@ file_reload_cmd_cb(GtkWidget *w, gpointer data) {
if (cf.dfilter) g_free(cf.dfilter);
cf.dfilter = g_strdup(gtk_entry_get_text(GTK_ENTRY(filter_te)));
load_cap_file(cf.filename, g_strdup(cf.rfilter), &cf);
if (open_cap_file(cf.filename, &cf) == 0)
read_cap_file(cf.filename, g_strdup(cf.rfilter), &cf);
/* XXX - change the menu if it fails? */
}
@ -1404,7 +1415,8 @@ main(int argc, char *argv[])
alert box, so, if we get one of those, it's more likely to come
up on top of us. */
if (cf_name) {
err = load_cap_file(cf_name, rfilter, &cf);
if ((err = open_cap_file(cf_name, &cf)) == 0)
err = read_cap_file(cf_name, rfilter, &cf);
cf_name[0] = '\0';
if (err == 0)
set_menu_sensitivity("/File/Save As...", TRUE);

104
file.c
View File

@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
* $Id: file.c,v 1.67 1999/08/14 18:51:26 gram Exp $
* $Id: file.c,v 1.68 1999/08/15 00:26:09 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -102,52 +102,75 @@ static gint dfilter_progress_cb(gpointer p);
int
open_cap_file(char *fname, capture_file *cf) {
struct stat cf_stat;
FILE *fh;
wtap *wth;
int err;
/* First, make sure the file is valid */
if (stat(fname, &cf_stat))
return (errno);
if (stat(fname, &cf_stat)) {
err = errno;
goto fail;
}
#ifndef WIN32
if (! S_ISREG(cf_stat.st_mode) && ! S_ISFIFO(cf_stat.st_mode))
return (OPEN_CAP_FILE_NOT_REGULAR);
if (! S_ISREG(cf_stat.st_mode) && ! S_ISFIFO(cf_stat.st_mode)) {
err = OPEN_CAP_FILE_NOT_REGULAR;
goto fail;
}
#endif
/* Next, try to open the file */
cf->fh = fopen(fname, "r");
if (cf->fh == NULL)
return (errno);
/* Next, try to open the file.
XXX - we only need to do this because "wtap_open_offline()"
doesn't return an indication of whether the open failed because
we don't have access to the file, or because it's not a valid
capture file, so we first have to open it with "fopen()" to
make sure we have access to it as a boring ordinary file. */
fh = fopen(fname, "r");
if (fh == NULL) {
err = errno;
goto fail;
}
fclose(fh);
fseek(cf->fh, 0L, SEEK_END);
cf->f_len = ftell(cf->fh);
fclose(cf->fh);
cf->fh = NULL;
/* set the file name beacuse we need it to set the follow stream filter */
cf->filename = g_strdup( fname );
/* Next, try to open it as a wiretap capture file. */
wth = wtap_open_offline(fname);
if (wth == NULL) {
/* XXX - we assume that, because we were able to open it above,
this must have failed because it's not a capture file in
a format we can read. */
err = OPEN_CAP_FILE_UNKNOWN_FORMAT;
goto fail;
}
/* Next, find out what type of file we're dealing with */
cf->cd_t = WTAP_FILE_UNKNOWN;
cf->cd_t_desc = "unknown";
/* The open succeeded. Close whatever capture file we had open,
and fill in the information for this file. */
close_cap_file(cf, info_bar, file_ctx);
/* Initialize protocol-specific variables */
ncp_init_protocol();
cf->wth = wth;
cf->fh = wtap_file(cf->wth);
cf->f_len = cf_stat.st_size;
/* set the file name because we need it to set the follow stream filter */
cf->filename = g_strdup(fname);
cf->cd_t = wtap_file_type(cf->wth);
cf->cd_t_desc = wtap_file_type_string(cf->wth);
cf->count = 0;
cf->drops = 0;
cf->esec = 0;
cf->eusec = 0;
cf->snap = 0;
cf->snap = wtap_snapshot_length(cf->wth);
firstsec = 0, firstusec = 0;
prevsec = 0, prevusec = 0;
cf->wth = wtap_open_offline(fname);
if (cf->wth == NULL) {
/* XXX - we assume that, because we were able to open it above,
this must have failed because it's not a capture file in
a format we can read. */
return (OPEN_CAP_FILE_UNKNOWN_FORMAT);
}
cf->fh = wtap_file(cf->wth);
cf->cd_t = wtap_file_type(cf->wth);
cf->cd_t_desc = wtap_file_type_string(cf->wth);
cf->snap = wtap_snapshot_length(cf->wth);
return (0);
fail:
simple_dialog(ESD_TYPE_WARN, NULL,
file_open_error_message(err, FALSE), fname);
return (err);
}
/* Reset everything to a pristine state */
@ -187,7 +210,7 @@ close_cap_file(capture_file *cf, void *w, guint context) {
}
int
load_cap_file(char *fname, char *rfilter, capture_file *cf) {
read_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'";
@ -195,11 +218,6 @@ load_cap_file(char *fname, char *rfilter, capture_file *cf) {
size_t msg_len;
int err;
close_cap_file(cf, info_bar, file_ctx);
/* Initialize protocol-specific variables */
ncp_init_protocol();
if ((name_ptr = (gchar *) strrchr(fname, '/')) == NULL)
name_ptr = fname;
else
@ -215,11 +233,8 @@ load_cap_file(char *fname, char *rfilter, capture_file *cf) {
}
err = open_cap_file(fname, cf);
if (err != 0) {
simple_dialog(ESD_TYPE_WARN, NULL,
file_open_error_message(err, FALSE), fname);
if (err != 0)
goto fail;
}
load_msg = g_malloc(strlen(name_ptr) + strlen(load_fmt) + 2);
sprintf(load_msg, load_fmt, name_ptr);
@ -353,11 +368,6 @@ tail_cap_file(char *fname, capture_file *cf) {
int err;
int i;
close_cap_file(cf, info_bar, file_ctx);
/* Initialize protocol-specific variables */
ncp_init_protocol();
err = open_cap_file(fname, cf);
if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) {

4
file.h
View File

@ -1,7 +1,7 @@
/* file.h
* Definitions for file structures and routines
*
* $Id: file.h,v 1.32 1999/08/13 23:47:42 gram Exp $
* $Id: file.h,v 1.33 1999/08/15 00:26:11 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -106,7 +106,7 @@ typedef struct _capture_file {
int open_cap_file(char *, capture_file *);
void close_cap_file(capture_file *, void *, guint);
int load_cap_file(char *, char *, capture_file *);
int read_cap_file(char *, char *, capture_file *);
int tail_cap_file(char *, capture_file *);
/* size_t read_frame_header(capture_file *); */