diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-10-17 20:28:22 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-10-17 20:28:22 +0000 |
commit | 6b5045dd7b15c2b405e125bba24afae1410dcde2 (patch) | |
tree | 1abfe076c33148ad44fab0144357c8b36969d583 /wiretap/commview.c | |
parent | 016a518728a09941d15b3cc930ea7a0cff969881 (diff) | |
download | wireshark-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.c | 86 |
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) { |