aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2006-04-16 02:04:42 +0000
committerGuy Harris <guy@alum.mit.edu>2006-04-16 02:04:42 +0000
commit3a1b1fc8ff252ac9d7d5745ae2f107a44a42c282 (patch)
tree6af0cbf829383c2d53b21217195fd699ba32c1f5 /wiretap
parent749faec6a375f8d60e9b3f8859e0e98f90391809 (diff)
Add a loop to process TLVs in the file header.
Advertise nanosecond resolution. svn path=/trunk/; revision=17871
Diffstat (limited to 'wiretap')
-rw-r--r--wiretap/network_instruments.c68
1 files changed, 52 insertions, 16 deletions
diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c
index c6c19bec36..086fe65af4 100644
--- a/wiretap/network_instruments.c
+++ b/wiretap/network_instruments.c
@@ -106,11 +106,15 @@ static gboolean observer_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
int network_instruments_open(wtap *wth, int *err, gchar **err_info)
{
int bytes_read;
-
+ int offset;
capture_file_header file_header;
+ guint i;
+ tlv_header tlvh;
+ int seek_increment;
packet_entry_header packet_header;
errno = WTAP_ERR_CANT_READ;
+ offset = 0;
/* Read in the buffer file header */
bytes_read = file_read(&file_header, sizeof file_header, 1, wth->fh);
@@ -120,6 +124,7 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info)
return -1;
return 0;
}
+ offset += bytes_read;
/* check the magic number */
if (memcmp(file_header.observer_version, network_instruments_magic, true_magic_length)!=0) {
@@ -133,14 +138,48 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info)
return -1;
}
+ /* process extra information */
+ for (i = 0; i < file_header.number_of_information_elements; i++) {
+ /* read the TLV header */
+ bytes_read = file_read(&tlvh, sizeof tlvh, 1, wth->fh);
+ if (bytes_read != sizeof tlvh) {
+ *err = file_error(wth->fh);
+ if (*err == 0)
+ *err = WTAP_ERR_SHORT_READ;
+ return -1;
+ }
+ offset += bytes_read;
+
+ tlvh.length = GUINT16_FROM_LE(tlvh.length);
+ if (tlvh.length < sizeof tlvh) {
+ *err = WTAP_ERR_BAD_RECORD;
+ *err_info = g_strdup_printf("Observer: bad record (TLV length %u < %lu)",
+ tlvh.length, (unsigned long)sizeof tlvh);
+ return -1;
+ }
+
+ /* skip the TLV data */
+ seek_increment = tlvh.length - sizeof tlvh;
+ if (seek_increment > 0) {
+ if (file_seek(wth->fh, seek_increment, SEEK_CUR, err) == -1)
+ return -1;
+ }
+ offset += seek_increment;
+ }
+
/* get to the first packet */
file_header.offset_to_first_packet =
GUINT16_FROM_LE(file_header.offset_to_first_packet);
- if (file_seek(wth->fh, file_header.offset_to_first_packet, SEEK_SET,
- err) == -1) {
- if (*err != 0)
+ if (file_header.offset_to_first_packet < offset) {
+ *err = WTAP_ERR_BAD_RECORD;
+ *err_info = g_strdup_printf("Observer: bad record (offset to first packet %d < %d)",
+ file_header.offset_to_first_packet, offset);
+ return FALSE;
+ }
+ seek_increment = file_header.offset_to_first_packet - offset;
+ if (seek_increment > 0) {
+ if (file_seek(wth->fh, seek_increment, SEEK_CUR, err) == -1)
return -1;
- return 0;
}
/* pull off the packet header */
@@ -175,16 +214,13 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info)
wth->subtype_seek_read = observer_seek_read;
wth->subtype_close = NULL;
wth->subtype_sequential_close = NULL;
- wth->snapshot_length = 0;
- wth->tsprecision = WTAP_FILE_TSPREC_USEC;
+ wth->snapshot_length = 0; /* not available in header */
+ wth->tsprecision = WTAP_FILE_TSPREC_NSEC;
/* reset the pointer to the first packet */
if (file_seek(wth->fh, file_header.offset_to_first_packet, SEEK_SET,
- err) == -1) {
- if (*err != 0)
- return -1;
- return 0;
- }
+ err) == -1)
+ return -1;
wth->data_offset = file_header.offset_to_first_packet;
init_time_offset();
@@ -356,7 +392,7 @@ read_packet_header(FILE_T fh, packet_entry_header *packet_header, int *err,
/* skip the TLV data */
seek_increment = tlvh.length - sizeof tlvh;
- if(seek_increment>0) {
+ if (seek_increment > 0) {
if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1)
return -1;
}
@@ -378,12 +414,12 @@ read_packet_data(FILE_T fh, int offset_to_frame, int offset, guint8 *pd,
/* get to the packet data */
if (offset_to_frame < offset) {
*err = WTAP_ERR_BAD_RECORD;
- *err_info = g_strdup_printf("Observer: bad record (offset to frame %d < %d)",
+ *err_info = g_strdup_printf("Observer: bad record (offset to packet data %d < %d)",
offset_to_frame, offset);
return FALSE;
}
seek_increment = offset_to_frame - offset;
- if(seek_increment>0) {
+ if (seek_increment > 0) {
if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1)
return FALSE;
}
@@ -406,7 +442,7 @@ skip_to_next_packet(wtap *wth, int offset, int offset_to_next_packet, int *err,
return FALSE;
}
seek_increment = offset_to_next_packet - offset;
- if(seek_increment>0) {
+ if (seek_increment > 0) {
if (file_seek(wth->fh, seek_increment, SEEK_CUR, err) == -1)
return FALSE;
}