Add APIs to Wiretap to return the file of the size as supplied by the OS
authorGuy Harris <guy@alum.mit.edu>
Fri, 19 Aug 2005 19:40:00 +0000 (19:40 -0000)
committerGuy Harris <guy@alum.mit.edu>
Fri, 19 Aug 2005 19:40:00 +0000 (19:40 -0000)
(so if the file's gzipped, it's *NOT* the size of the file after
uncompressing), and an approximation of the amount of that data read
sequentially so far.

Use those for various progress bars and the like.

Make the fstat() in the Ascend trace reader directly use wth->fd, as
it's inside Wiretap; that gets rid of the last caller of wtap_fd() (as
we're no longer directly using fstat() or lseek() in Ethereal), so get
rid of wtap_fd().

svn path=/trunk/; revision=15437

13 files changed:
capinfos.c
cfile.h
file.c
gtk/file_dlg.c
gtk/fileset_dlg.c
merge.c
merge.h
ringbuffer.c
tethereal.c
wiretap/ascend.c
wiretap/wtap.c
wiretap/wtap.def
wiretap/wtap.h

index fc398bf41e91b1522e96b83ba9d256b609761f20..60c73de3b3ccae1d0da696d61c919979e92bdccd 100644 (file)
 #include <sys/time.h>
 #endif
 
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
 #include <glib.h>
 
 #include <epan/packet.h>
@@ -70,7 +66,7 @@ static gboolean cap_packet_size = FALSE;
 typedef struct _capture_info {
        const char              *filename;
        guint16                 file_type;
-       guint64                 filesize;
+       gint64                  filesize;
        guint64                 packet_bytes;
        double                  start_time;
        double                  stop_time;
@@ -106,7 +102,7 @@ print_stats(capture_info *cf_info)
 
   if (cap_file_type) printf("File type: %s\n", file_type_string);
   if (cap_packet_count) printf("Number of packets: %u \n", cf_info->packet_count);
-  if (cap_file_size) printf("File size: %" PRIu64 " bytes\n", cf_info->filesize);
+  if (cap_file_size) printf("File size: %" PRId64 " bytes\n", cf_info->filesize);
   if (cap_data_size) printf("Data size: %" PRIu64 " bytes\n", cf_info->packet_bytes);
   if (cap_duration) printf("Capture duration: %f seconds\n", cf_info->duration);
   if (cap_start_time) printf("Start time: %s", ctime (&start_time_t));
@@ -121,7 +117,7 @@ process_cap_file(wtap *wth, const char *filename)
 {
   int                  err;
   gchar                        *err_info;
-  struct stat   cf_stat;
+  gint64               size;
   long                 data_offset;
   
   guint32              packet = 0;
@@ -166,14 +162,15 @@ process_cap_file(wtap *wth, const char *filename)
   }
 
   /* File size */
-  if (fstat(wtap_fd(wth), &cf_stat) < 0) {
+  size = wtap_file_size(wth, &err);
+  if (size == -1) {
     fprintf(stderr,
-            "capinfos: Can't fstat \"%s\": %s.\n",
-           filename, strerror(errno));
+            "capinfos: Can't get size of \"%s\": %s.\n",
+           filename, strerror(err));
     return 1;
   }
   
-  cf_info.filesize = cf_stat.st_size;
+  cf_info.filesize = size;
   
   /* File Type */
   cf_info.file_type = wtap_file_type(wth);
diff --git a/cfile.h b/cfile.h
index d78461c72d90f4da6f11cef22baaee0ad5723de5..59f60bb51ffc35e494cdc578c72e828131d3dcf7 100644 (file)
--- a/cfile.h
+++ b/cfile.h
@@ -43,12 +43,11 @@ typedef enum {
 
 typedef struct _capture_file {
   file_state   state;     /* Current state of capture file */
-  int          filed;     /* File descriptor of capture file */
   gchar       *filename;  /* Name of capture file */
   gboolean     is_tempfile; /* Is capture file a temporary file? */
   gboolean     user_saved;/* If capture file is temporary, has it been saved by user yet? */
   long         f_datalen; /* Size of capture file data (uncompressed) */
-  long         f_len;     /* Length of capture file (compressed if file is) */
+  gint64       f_len;     /* Length of capture file (compressed if file is) */
   guint16      cd_t;      /* File type of capture file */
   int          lnk_t;     /* Link-layer type with which to save capture */
   guint32      vers;      /* Version.  For tcpdump minor is appended to major */
diff --git a/file.c b/file.c
index d14ce5cde6577a21c328b8333f82dcbda93ef8a1..8425b6c70e4ad6e88448a226a59ac2f5dcf775ae 100644 (file)
--- a/file.c
+++ b/file.c
 #include <errno.h>
 #include <signal.h>
 
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
@@ -171,18 +167,15 @@ cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
 {
   wtap       *wth;
   gchar       *err_info;
-  int         fd;
-  struct stat cf_stat;
-
+  gint64      size;
 
   wth = wtap_open_offline(fname, err, &err_info, TRUE);
   if (wth == NULL)
     goto fail;
 
   /* Find the size of the file. */
-  fd = wtap_fd(wth);
-  if (fstat(fd, &cf_stat) < 0) {
-    *err = errno;
+  size = wtap_file_size(wth, err);
+  if (size == -1) {
     wtap_close(wth);
     goto fail;
   }
@@ -198,9 +191,8 @@ cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
   cf->state = FILE_READ_IN_PROGRESS;
 
   cf->wth = wth;
-  cf->filed = fd;
   cf->f_datalen = 0;
-  cf->f_len = cf_stat.st_size;
+  cf->f_len = size;
 
   /* Set the file name because we need it to set the follow stream filter.
      XXX - is that still true?  We need it for other reasons, though,
@@ -335,15 +327,8 @@ cf_read(capture_file *cf)
   long         data_offset;
   progdlg_t   *progbar = NULL;
   gboolean     stop_flag;
-  /*
-   * XXX - should be "off_t", but Wiretap would need more work to handle
-   * the full size of "off_t" on platforms where it's more than a "long"
-   * as well.
-   */
-  long         file_pos;
+  gint64       size, file_pos;
   float        prog_val;
-  int          fd;
-  struct stat  cf_stat;
   GTimeVal     start_time;
   gchar        status_str[100];
   int          progbar_nextstep;
@@ -376,17 +361,17 @@ cf_read(capture_file *cf)
        to see if there's any pending input from an X server, and doing
        that for every packet can be costly, especially on a big file. */
     if (data_offset >= progbar_nextstep) {
-        file_pos = lseek(cf->filed, 0, SEEK_CUR);
+        file_pos = wtap_read_so_far(cf->wth, NULL);
         prog_val = (gfloat) file_pos / (gfloat) cf->f_len;
         if (prog_val > 1.0) {
           /* The file probably grew while we were reading it.
              Update "cf->f_len", and try again. */
-          fd = wtap_fd(cf->wth);
-          if (fstat(fd, &cf_stat) >= 0) {
-            cf->f_len = cf_stat.st_size;
+          size = wtap_file_size(cf->wth, NULL);
+          if (size != -1) {
+            cf->f_len = size;
             prog_val = (gfloat) file_pos / (gfloat) cf->f_len;
           }
-          /* If it's still > 1, either the "fstat()" failed (in which
+          /* If it's still > 1, either "wtap_file_size()" failed (in which
              case there's not much we can do about it), or the file
              *shrank* (in which case there's not much we can do about
              it); just clip the progress value at 1.0. */
@@ -400,7 +385,8 @@ cf_read(capture_file *cf)
         }
         if (progbar != NULL) {
           g_snprintf(status_str, sizeof(status_str),
-                     "%luKB of %luKB", file_pos / 1024, cf->f_len / 1024);
+                     "%" PRId64 "KB of %" PRId64 "KB",
+                     file_pos / 1024, cf->f_len / 1024);
           update_progress_dlg(progbar, prog_val, status_str);
         }
         progbar_nextstep += progbar_quantum;
@@ -553,9 +539,7 @@ cf_finish_tail(capture_file *cf, int *err)
 {
   gchar *err_info;
   long data_offset;
-  int         fd;
-  struct stat cf_stat;
-
+  gint64 size;
 
   if(cf->wth == NULL) {
     cf_close(cf);
@@ -595,10 +579,9 @@ cf_finish_tail(capture_file *cf, int *err)
 
   /* we have to update the f_len field */
   /* Find the size of the file. */
-  fd = wtap_fd(cf->wth);
-  if (fstat(fd, &cf_stat) >= 0) {
-      cf->f_len = cf_stat.st_size;
-  }
+  size = wtap_file_size(cf->wth, NULL);
+  if (size != -1)
+       cf->f_len = size;
 
   /* We're done reading sequentially through the file; close the
      sequential I/O side, to free up memory it requires. */
@@ -930,17 +913,12 @@ cf_merge_files(char **out_filenamep, int in_file_count,
   long              data_offset;
   progdlg_t        *progbar = NULL;
   gboolean          stop_flag;
-  /*
-   * XXX - should be "off_t", but Wiretap would need more work to handle
-   * the full size of "off_t" on platforms where it's more than a "long"
-   * as well.
-   */
-  long        f_len, file_pos;
-  float       prog_val;
-  GTimeVal    start_time;
-  gchar       status_str[100];
-  int         progbar_nextstep;
-  int         progbar_quantum;
+  gint64            f_len, file_pos;
+  float             prog_val;
+  GTimeVal          start_time;
+  gchar             status_str[100];
+  int               progbar_nextstep;
+  int               progbar_quantum;
 
   /* open the input files */
   if (!merge_open_in_files(in_file_count, in_filenames, &in_files,
@@ -1020,7 +998,7 @@ cf_merge_files(char **out_filenamep, int in_file_count,
         /* Get the sum of the seek positions in all of the files. */
         file_pos = 0;
         for (i = 0; i < in_file_count; i++)
-          file_pos += lseek(wtap_fd(in_files[i].wth), 0, SEEK_CUR);
+          file_pos += wtap_read_so_far(in_files[i].wth, NULL);
         prog_val = (gfloat) file_pos / (gfloat) f_len;
         if (prog_val > 1.0) {
           /* Some file probably grew while we were reading it.
@@ -1035,7 +1013,8 @@ cf_merge_files(char **out_filenamep, int in_file_count,
         }
         if (progbar != NULL) {
           g_snprintf(status_str, sizeof(status_str),
-                     "%luKB of %luKB", file_pos / 1024, f_len / 1024);
+                     "%" PRId64 "KB of %" PRId64 "KB",
+                     file_pos / 1024, f_len / 1024);
           update_progress_dlg(progbar, prog_val, status_str);
         }
         progbar_nextstep += progbar_quantum;
index 6493738dea8a26e082094239dd852acec7919e56..ac4af2fa1cc8136b4cd593d70bf914aa5a1da023 100644 (file)
@@ -116,10 +116,6 @@ static GtkWidget *cfmark_cb;
 static GtkWidget *ft_om;
 static GtkWidget *range_tb;
 
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
 #define PREVIEW_STR_MAX         200
 
 static double
@@ -137,9 +133,8 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name)
     wtap       *wth;
     int         err = 0;
     gchar      *err_info;
-    struct stat cf_stat;
     gchar       string_buff[PREVIEW_STR_MAX];
-    guint64     filesize;
+    gint64      filesize;
 
 
     /* init preview labels */
@@ -181,14 +176,13 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name)
     }
 
     /* Find the size of the file. */
-    if (fstat(wtap_fd(wth), &cf_stat) < 0) {
+    filesize = wtap_file_size(wth, &err);
+    if (filesize == -1) {
+        gtk_label_set_text(GTK_LABEL(label), "error getting file size");
         wtap_close(wth);
         return NULL;
     }
-
-    /* size */
-    filesize = cf_stat.st_size;
-    g_snprintf(string_buff, PREVIEW_STR_MAX, "%" PRIu64 " bytes", filesize);
+    g_snprintf(string_buff, PREVIEW_STR_MAX, "%" PRId64 " bytes", filesize);
     label = OBJECT_GET_DATA(prev, PREVIEW_SIZE_KEY);
     gtk_label_set_text(GTK_LABEL(label), string_buff);
 
index ef3910d3a44ef0b48ed0415e3604e9fe3699a795..941ab8cc19f14b53e47231a3872db9c69551579c 100644 (file)
 #include <fcntl.h>
 #endif
 
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#ifdef HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif
-
-
 #include <gtk/gtk.h>
 
 #include "globals.h"
diff --git a/merge.c b/merge.c
index d82c14136bca9e24f2fdb60e3638576e1f7b4d38..f2fb294aa205b5de22f220e2d832dde667b43c52 100644 (file)
--- a/merge.c
+++ b/merge.c
 #include <sys/time.h>
 #endif
 
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
 #include <string.h>
 #include "wtap.h"
 #include "merge.h"
@@ -43,7 +39,7 @@ merge_open_in_files(int in_file_count, char *const *in_file_names,
   int i, j;
   int files_size = in_file_count * sizeof(merge_in_file_t);
   merge_in_file_t *files;
-  struct stat statb;
+  gint64 size;
 
   files = g_malloc(files_size);
   *in_files = files;
@@ -60,14 +56,14 @@ merge_open_in_files(int in_file_count, char *const *in_file_names,
       *err_fileno = i;
       return FALSE;
     }
-    if (fstat(wtap_fd(files[i].wth), &statb) < 0) {
-      *err = errno;
+    size = wtap_file_size(files[i].wth, err);
+    if (size == -1) {
       for (j = 0; j <= i; j++)
         wtap_close(files[j].wth);
       *err_fileno = i;
       return FALSE;
     }
-    files[i].size = statb.st_size;
+    files[i].size = size;
   }
   return TRUE;
 }
diff --git a/merge.h b/merge.h
index 887e1b866cec44969568ea492d42f996a1549024..209f78bc053f5ecd99717ed673c42d34f60ac1e9 100644 (file)
--- a/merge.h
+++ b/merge.h
@@ -44,7 +44,7 @@ typedef struct merge_in_file_s {
   wtap           *wth;
   long            data_offset;
   in_file_state_e state;
-  long            size;                /* file size */
+  gint64          size;                /* file size */
 } merge_in_file_t;
 
 /** Open a number of input files to merge.
index 02c66138a23b25b6d146cda539365f8ad62bb242..1400420a68db6fb7411a6e77fbe81d7683c2d47e 100644 (file)
 #include <fcntl.h>
 #endif
 
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
@@ -69,7 +65,7 @@
 #include <time.h>
 #include <errno.h>
 
-#include "wiretap/wtap.h"
+#include <wiretap/wtap.h>
 #include "ringbuffer.h"
 
 /* Win32 needs the O_BINARY flag for open() */
index 13f7ce082030dcc14b5a383a17c642e65192622c..75d67923cfe8c7b4e60933a37bb1609666658b58 100644 (file)
@@ -2970,7 +2970,6 @@ cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
   init_dissection();
 
   cf->wth = wth;
-  cf->filed = -1;      /* not used, but set it anyway */
   cf->f_datalen = 0;   /* not used, but set it anyway */
   cf->f_len = 0;       /* not used, but set it anyway */
 
index 3b239226ce987de921b5eee813e10c92b5933473..5c572799053b76dd4c21660d200300914f53e81c 100644 (file)
@@ -218,7 +218,7 @@ int ascend_open(wtap *wth, int *err, gchar **err_info _U_)
      packet's timestamp from the capture file's ctime, which gives us an
      offset that we can apply to each packet.
    */
-  if (fstat(wtap_fd(wth), &statbuf) == -1) {
+  if (fstat(wth->fd, &statbuf) == -1) {
     *err = errno;
     g_free(wth->capture.ascend);
     return -1;
index 8876b9c06037f48d0d72ccc6955d6c2174179fe3..727c77d286a1d562c6f4e127457957bae38e0d35 100644 (file)
 #include <string.h>
 #include <errno.h>
 
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
+
 #include "wtap-int.h"
 #include "file_wrappers.h"
 #include "buffer.h"
 
-int
-wtap_fd(wtap *wth)
+/*
+ * Return the size of the file, as reported by the OS.
+ * (gint64, in case that's 64 bits.)
+ */
+gint64
+wtap_file_size(wtap *wth, int *err)
 {
-       return wth->fd;
+       struct stat statb;
+
+       if (fstat(wth->fd, &statb) == -1) {
+               if (err != NULL)
+                       *err = errno;
+               return -1;
+       }
+       return statb.st_size;
 }
 
 int
@@ -465,6 +492,24 @@ wtap_read(wtap *wth, int *err, gchar **err_info, long *data_offset)
        return TRUE;    /* success */
 }
 
+/*
+ * Return an approximation of the amount of data we've read sequentially
+ * from the file so far.  (gint64, in case that's 64 bits.)
+ */
+gint64
+wtap_read_so_far(wtap *wth, int *err)
+{
+       off_t file_pos;
+
+       file_pos = lseek(wth->fd, 0, SEEK_CUR);
+       if (file_pos == -1) {
+               if (err != NULL)
+                       *err = errno;
+               return -1;
+       }
+       return file_pos;
+}
+
 struct wtap_pkthdr*
 wtap_phdr(wtap *wth)
 {
index 1554ebefc4eefc68fed38802986e2806d5b54af1..1e314db4750908974cb52b2faef3da003523d67a 100644 (file)
@@ -10,8 +10,8 @@ wtap_dump_file
 wtap_dump_open
 wtap_encap_short_string
 wtap_encap_string
-wtap_fd
 wtap_file_encap
+wtap_file_size
 wtap_file_type
 wtap_file_type_short_string
 wtap_file_type_string
@@ -23,6 +23,7 @@ wtap_phdr
 wtap_process_pcap_packet
 wtap_pseudoheader
 wtap_read
+wtap_read_so_far
 wtap_seek_read
 wtap_sequential_close
 wtap_short_string_to_encap
index 8008dde6508d2fb75229c1de974a288a636c7894..b828a7e4b6cda30e3d24252a7d082ad753ce1073 100644 (file)
@@ -523,11 +523,17 @@ struct wtap* wtap_open_offline(const char *filename, int *err,
 gboolean wtap_read(wtap *wth, int *err, gchar **err_info,
     long *data_offset);
 
+/*
+ * Return an approximation of the amount of data we've read sequentially
+ * from the file so far.  (gint64, in case that's 64 bits.)
+ */
+gint64 wtap_read_so_far(wtap *wth, int *err);
+
 struct wtap_pkthdr *wtap_phdr(wtap *wth);
 union wtap_pseudo_header *wtap_pseudoheader(wtap *wth);
 guint8 *wtap_buf_ptr(wtap *wth);
 
-int wtap_fd(wtap *wth);
+gint64 wtap_file_size(wtap *wth, int *err);
 int wtap_snapshot_length(wtap *wth); /* per file */
 int wtap_file_type(wtap *wth);
 int wtap_file_encap(wtap *wth);