static gboolean _5views_seek_read(wtap *wth, gint64 seek_off, wtap_rec *rec, Buffer *buf, int *err, gchar **err_info) { t_5VW_TimeStamped_Header TimeStamped_Header; if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1) return FALSE; /* * Read the header. */ if (!_5views_read_header(wth, wth->random_fh, &TimeStamped_Header, rec, err, err_info)) { if (*err == 0) *err = WTAP_ERR_SHORT_READ; return FALSE; } /* * Read the packet data. */ return wtap_read_packet_bytes(wth->random_fh, buf, rec->rec_header.packet_header.caplen, err, err_info); }
/* Read the next packet */ static gboolean _5views_read(wtap *wth, wtap_rec *rec, Buffer *buf, int *err, gchar **err_info, gint64 *data_offset) { t_5VW_TimeStamped_Header TimeStamped_Header; /* * Keep reading until we see a record with a subtype of * CST_5VW_FRAME_RECORD. */ do { *data_offset = file_tell(wth->fh); /* Read record header. */ if (!_5views_read_header(wth, wth->fh, &TimeStamped_Header, rec, err, err_info)) return FALSE; if (TimeStamped_Header.RecSubType == CST_5VW_FRAME_RECORD) { /* * OK, this is a packet. */ break; } /* * Not a packet - skip to the next record. */ if (!wtap_read_bytes(wth->fh, NULL, TimeStamped_Header.RecSize, err, err_info)) return FALSE; } while (1); if (rec->rec_header.packet_header.caplen > WTAP_MAX_PACKET_SIZE_STANDARD) { /* * Probably a corrupt capture file; don't blow up trying * to allocate space for an immensely-large packet. */ *err = WTAP_ERR_BAD_FILE; *err_info = g_strdup_printf("5views: File has %u-byte packet, bigger than maximum of %u", rec->rec_header.packet_header.caplen, WTAP_MAX_PACKET_SIZE_STANDARD); return FALSE; } return wtap_read_packet_bytes(wth->fh, buf, rec->rec_header.packet_header.caplen, err, err_info); }
static gboolean _5views_seek_read(wtap *wth, gint64 seek_off, struct wtap_pkthdr *phdr, Buffer *buf, int length, int *err, gchar **err_info) { t_5VW_TimeStamped_Header TimeStamped_Header; if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1) return FALSE; /* * Read the header. */ if (!_5views_read_header(wth, wth->random_fh, &TimeStamped_Header, phdr, err, err_info)) return FALSE; /* * Read the packet data. */ return wtap_read_packet_bytes(wth->random_fh, buf, length, err, err_info); }
/* Read the next packet */ static gboolean _5views_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset) { t_5VW_TimeStamped_Header TimeStamped_Header; int bytes_read; guint packet_size; guint orig_size; do { bytes_read = _5views_read_header(wth, wth->fh, &TimeStamped_Header, err, err_info); if (bytes_read == -1) { /* * We failed to read the header. */ return FALSE; } TimeStamped_Header.Key = pletohl(&TimeStamped_Header.Key); if(TimeStamped_Header.Key != CST_5VW_RECORDS_HEADER_KEY) { *err = WTAP_ERR_BAD_FILE; *err_info = g_strdup_printf("5views: Time-stamped header has bad key value 0x%08X", TimeStamped_Header.Key); return FALSE; } TimeStamped_Header.RecSubType = pletohl(&TimeStamped_Header.RecSubType); TimeStamped_Header.RecSize = pletohl(&TimeStamped_Header.RecSize); if(TimeStamped_Header.RecSubType != CST_5VW_FRAME_RECORD) { if (file_seek(wth->fh, TimeStamped_Header.RecSize, SEEK_CUR, err) == -1) return FALSE; } else break; } while (1); packet_size = TimeStamped_Header.RecSize; orig_size = TimeStamped_Header.RecSize; if (packet_size > WTAP_MAX_PACKET_SIZE) { /* * Probably a corrupt capture file; don't blow up trying * to allocate space for an immensely-large packet. */ *err = WTAP_ERR_BAD_FILE; *err_info = g_strdup_printf("5views: File has %u-byte packet, bigger than maximum of %u", packet_size, WTAP_MAX_PACKET_SIZE); return FALSE; } *data_offset = file_tell(wth->fh); buffer_assure_space(wth->frame_buffer, packet_size); if (!_5views_read_rec_data(wth->fh, buffer_start_ptr(wth->frame_buffer), packet_size, err, err_info)) return FALSE; /* Read error */ TimeStamped_Header.Utc = pletohl(&TimeStamped_Header.Utc); TimeStamped_Header.NanoSecondes = pletohl(&TimeStamped_Header.NanoSecondes); wth->phdr.presence_flags = WTAP_HAS_TS|WTAP_HAS_CAP_LEN; wth->phdr.ts.secs = TimeStamped_Header.Utc; wth->phdr.ts.nsecs = TimeStamped_Header.NanoSecondes; wth->phdr.caplen = packet_size; wth->phdr.len = orig_size; switch (wth->file_encap) { case WTAP_ENCAP_ETHERNET: /* We assume there's no FCS in this frame. */ wth->phdr.pseudo_header.eth.fcs_len = 0; break; } return TRUE; }