file_read() can return -1; don't just blindly add it to a previous
[obnox/wireshark/wip.git] / wiretap / packetlogger.c
index 956c11d9e8bdf64746827fe37b3526d2cf659f68..5d00d492d7bbc8c3d9ecda8cf9b8442a0dbdda6b 100644 (file)
@@ -48,24 +48,22 @@ typedef struct packetlogger_header {
        guint64 ts;
 } packetlogger_header_t;
 
-#define PACKETLOGGER_HEADER_SIZE 12
-
-static gboolean packetlogger_read(wtap *wth, int *err, gchar **err_info _U_,
+static gboolean packetlogger_read(wtap *wth, int *err, gchar **err_info,
                                  gint64 *data_offset);
 static gboolean packetlogger_seek_read(wtap *wth, gint64 seek_off,
                                       union wtap_pseudo_header *pseudo_header _U_,
                                       guchar *pd, int length, int *err,
-                                      gchar **err_info _U_);
+                                      gchar **err_info);
 static gboolean packetlogger_read_header(packetlogger_header_t *pl_hdr,
-                                        FILE_T fh, int *err);
+                                        FILE_T fh, int *err, gchar **err_info);
 
 
-int packetlogger_open(wtap *wth, int *err, gchar **err_info _U_)
+int packetlogger_open(wtap *wth, int *err, gchar **err_info)
 {
        packetlogger_header_t pl_hdr;
        guint8 type;
 
-       if(!packetlogger_read_header(&pl_hdr, wth->fh, err))
+       if(!packetlogger_read_header(&pl_hdr, wth->fh, err, err_info))
                return -1;
 
        if (file_read(&type, 1, wth->fh) <= 0)
@@ -100,7 +98,7 @@ packetlogger_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
 
        *data_offset = wth->data_offset;
 
-       if(!packetlogger_read_header(&pl_hdr, wth->fh, err))
+       if(!packetlogger_read_header(&pl_hdr, wth->fh, err, err_info))
                return FALSE;
 
        if (pl_hdr.len < 8) {
@@ -114,7 +112,7 @@ packetlogger_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
                               pl_hdr.len - 8,
                               wth->fh);
        if(bytes_read != pl_hdr.len - 8) {
-               *err = file_error(wth->fh);
+               *err = file_error(wth->fh, err_info);
                if(*err == 0)
                        *err = WTAP_ERR_SHORT_READ;
 
@@ -135,7 +133,7 @@ packetlogger_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
 static gboolean
 packetlogger_seek_read(wtap *wth, gint64 seek_off, union wtap_pseudo_header
                       *pseudo_header _U_, guchar *pd, int length, int *err,
-                      gchar **err_info _U_)
+                      gchar **err_info)
 {
        packetlogger_header_t pl_hdr;
        guint bytes_read;
@@ -143,7 +141,7 @@ packetlogger_seek_read(wtap *wth, gint64 seek_off, union wtap_pseudo_header
        if(file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1)
                return FALSE;
 
-       if(!packetlogger_read_header(&pl_hdr, wth->random_fh, err)) {
+       if(!packetlogger_read_header(&pl_hdr, wth->random_fh, err, err_info)) {
                if(*err == 0)
                        *err = WTAP_ERR_SHORT_READ;
 
@@ -158,7 +156,7 @@ packetlogger_seek_read(wtap *wth, gint64 seek_off, union wtap_pseudo_header
 
        bytes_read = file_read(pd, pl_hdr.len - 8, wth->random_fh);
        if(bytes_read != (pl_hdr.len - 8)) {
-               *err = file_error(wth->random_fh);
+               *err = file_error(wth->random_fh, err_info);
                if(*err == 0)
                        *err = WTAP_ERR_SHORT_READ;
 
@@ -169,24 +167,15 @@ packetlogger_seek_read(wtap *wth, gint64 seek_off, union wtap_pseudo_header
 }
 
 static gboolean
-packetlogger_read_header(packetlogger_header_t *pl_hdr, FILE_T fh, int *err)
+packetlogger_read_header(packetlogger_header_t *pl_hdr, FILE_T fh, int *err,
+                        gchar **err_info)
 {
-       guint bytes_read = 0;
-
-       bytes_read += file_read(&pl_hdr->len, 4, fh);
-       bytes_read += file_read(&pl_hdr->ts, 8, fh);
+       wtap_file_read_expected_bytes(&pl_hdr->len, 4, fh, err, err_info);
+       wtap_file_read_expected_bytes(&pl_hdr->ts, 8, fh, err, err_info);
 
        /* Convert multi-byte values from big endian to host endian */
        pl_hdr->len = GUINT32_FROM_BE(pl_hdr->len);
        pl_hdr->ts = GUINT64_FROM_BE(pl_hdr->ts);
 
-       if(bytes_read < PACKETLOGGER_HEADER_SIZE) {
-               *err = file_error(fh);
-               if(*err == 0 && bytes_read > 0)
-                       *err = WTAP_ERR_SHORT_READ;
-
-               return FALSE;
-       }
-
        return TRUE;
 }