summaryrefslogtreecommitdiff
path: root/wiretap/commview.c
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames-ws@darkjames.pl>2012-10-17 20:28:22 +0000
committerJakub Zawadzki <darkjames-ws@darkjames.pl>2012-10-17 20:28:22 +0000
commit6b5045dd7b15c2b405e125bba24afae1410dcde2 (patch)
tree1abfe076c33148ad44fab0144357c8b36969d583 /wiretap/commview.c
parent016a518728a09941d15b3cc930ea7a0cff969881 (diff)
downloadwireshark-6b5045dd7b15c2b405e125bba24afae1410dcde2.tar.gz
Fill some phdr values also when doing random read
svn path=/trunk/; revision=45619
Diffstat (limited to 'wiretap/commview.c')
-rw-r--r--wiretap/commview.c86
1 files changed, 40 insertions, 46 deletions
diff --git a/wiretap/commview.c b/wiretap/commview.c
index 1a95056f08..f84153791b 100644
--- a/wiretap/commview.c
+++ b/wiretap/commview.c
@@ -128,36 +128,58 @@ int commview_open(wtap *wth, int *err, gchar **err_info)
return 1; /* Our kind of file */
}
-static void
-commview_set_pseudo_header(commview_header_t *cv_hdrp, union wtap_pseudo_header
- *pseudo_header)
+static gboolean
+commview_set_packet_header(const commview_header_t *cv_hdrp, struct wtap_pkthdr *phdr)
{
+ union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header;
+ struct tm tm;
+
+ phdr->len = cv_hdrp->data_len;
+ phdr->caplen = cv_hdrp->data_len;
+
+ tm.tm_year = cv_hdrp->year - 1900;
+ tm.tm_mon = cv_hdrp->month - 1;
+ tm.tm_mday = cv_hdrp->day;
+ tm.tm_hour = cv_hdrp->hours;
+ tm.tm_min = cv_hdrp->minutes;
+ tm.tm_sec = cv_hdrp->seconds;
+ tm.tm_isdst = -1;
+
+ phdr->ts.secs = mktime(&tm);
+ phdr->ts.nsecs = cv_hdrp->usecs * 1000;
+ phdr->presence_flags = WTAP_HAS_TS;
+
switch(cv_hdrp->flags & FLAGS_MEDIUM) {
case MEDIUM_ETHERNET :
+ phdr->pkt_encap = WTAP_ENCAP_ETHERNET;
pseudo_header->eth.fcs_len = -1; /* Unknown */
- break;
+ return TRUE;
case MEDIUM_WIFI :
+ phdr->pkt_encap = WTAP_ENCAP_IEEE_802_11_WITH_RADIO;
pseudo_header->ieee_802_11.fcs_len = -1; /* Unknown */
pseudo_header->ieee_802_11.decrypted = FALSE;
pseudo_header->ieee_802_11.channel = cv_hdrp->channel;
pseudo_header->ieee_802_11.data_rate =
cv_hdrp->rate | (cv_hdrp->direction << 8);
pseudo_header->ieee_802_11.signal_level = cv_hdrp->signal_level_percent;
- break;
+ return TRUE;
- default :
- /* Token Ring or unknown - no pseudo-header for that */
- break;
+ case MEDIUM_TOKEN_RING :
+ phdr->pkt_encap = WTAP_ENCAP_TOKEN_RING;
+ /* Token Ring - no pseudo-header for that */
+ return TRUE;
}
+
+ /* unknown - not handled */
+ return FALSE;
}
static gboolean
commview_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
{
commview_header_t cv_hdr;
- struct tm tm;
int bytes_read;
*data_offset = file_tell(wth->fh);
@@ -165,29 +187,13 @@ commview_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
if(!commview_read_header(&cv_hdr, wth->fh, err, err_info))
return FALSE;
- switch(cv_hdr.flags & FLAGS_MEDIUM) {
-
- case MEDIUM_ETHERNET :
- wth->phdr.pkt_encap = WTAP_ENCAP_ETHERNET;
- break;
-
- case MEDIUM_WIFI :
- wth->phdr.pkt_encap = WTAP_ENCAP_IEEE_802_11_WITH_RADIO;
- break;
-
- case MEDIUM_TOKEN_RING :
- wth->phdr.pkt_encap = WTAP_ENCAP_TOKEN_RING;
- break;
-
- default :
+ if(!commview_set_packet_header(&cv_hdr, &wth->phdr)) {
*err = WTAP_ERR_BAD_FILE;
*err_info = g_strdup_printf("commview: unsupported encap: %u",
cv_hdr.flags & FLAGS_MEDIUM);
return FALSE;
}
- commview_set_pseudo_header(&cv_hdr, &wth->phdr.pseudo_header);
-
buffer_assure_space(wth->frame_buffer, cv_hdr.data_len);
bytes_read = file_read(buffer_start_ptr(wth->frame_buffer),
cv_hdr.data_len, wth->fh);
@@ -198,22 +204,6 @@ commview_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
return FALSE;
}
- tm.tm_year = cv_hdr.year - 1900;
- tm.tm_mon = cv_hdr.month - 1;
- tm.tm_mday = cv_hdr.day;
- tm.tm_hour = cv_hdr.hours;
- tm.tm_min = cv_hdr.minutes;
- tm.tm_sec = cv_hdr.seconds;
- tm.tm_isdst = -1;
-
- wth->phdr.presence_flags = WTAP_HAS_TS;
-
- wth->phdr.len = cv_hdr.data_len;
- wth->phdr.caplen = cv_hdr.data_len;
-
- wth->phdr.ts.secs = mktime(&tm);
- wth->phdr.ts.nsecs = cv_hdr.usecs * 1000;
-
return TRUE;
}
@@ -222,7 +212,6 @@ commview_seek_read(wtap *wth, gint64 seek_off, struct wtap_pkthdr *phdr,
guint8 *pd, int length, int *err,
gchar **err_info)
{
- union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header;
commview_header_t cv_hdr;
int bytes_read;
@@ -236,13 +225,18 @@ commview_seek_read(wtap *wth, gint64 seek_off, struct wtap_pkthdr *phdr,
return FALSE;
}
- if(length != cv_hdr.data_len) {
+ if(!commview_set_packet_header(&cv_hdr, phdr)) {
*err = WTAP_ERR_BAD_FILE;
- *err_info = g_strdup_printf("commview: record length %u doesn't match requested length %d", cv_hdr.data_len, length);
+ *err_info = g_strdup_printf("commview: unsupported encap: %u",
+ cv_hdr.flags & FLAGS_MEDIUM);
return FALSE;
}
- commview_set_pseudo_header(&cv_hdr, pseudo_header);
+ if(length != (int)phdr->caplen) {
+ *err = WTAP_ERR_BAD_FILE;
+ *err_info = g_strdup_printf("commview: record length %u doesn't match requested length %d", phdr->caplen, length);
+ return FALSE;
+ }
bytes_read = file_read(pd, cv_hdr.data_len, wth->random_fh);
if(bytes_read != cv_hdr.data_len) {