diff options
Diffstat (limited to 'wiretap/commview.c')
-rw-r--r-- | wiretap/commview.c | 114 |
1 files changed, 52 insertions, 62 deletions
diff --git a/wiretap/commview.c b/wiretap/commview.c index 935d15f01b..5d5dbeca71 100644 --- a/wiretap/commview.c +++ b/wiretap/commview.c @@ -131,76 +131,76 @@ int commview_open(wtap *wth, int *err, gchar **err_info) return 1; /* Our kind of file */ } -static gboolean -commview_set_packet_header(const commview_header_t *cv_hdrp, struct wtap_pkthdr *phdr) +static int +commview_read_and_process_header(FILE_T fh, struct wtap_pkthdr *phdr, + int *err, gchar **err_info) { - union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header; + commview_header_t cv_hdr; 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; + if(!commview_read_header(&cv_hdr, fh, err, err_info)) + return FALSE; - switch(cv_hdrp->flags & FLAGS_MEDIUM) { + switch(cv_hdr.flags & FLAGS_MEDIUM) { case MEDIUM_ETHERNET : phdr->pkt_encap = WTAP_ENCAP_ETHERNET; - pseudo_header->eth.fcs_len = -1; /* Unknown */ - return TRUE; + phdr->pseudo_header.eth.fcs_len = -1; /* Unknown */ + break; 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; - return TRUE; + phdr->pseudo_header.ieee_802_11.fcs_len = -1; /* Unknown */ + phdr->pseudo_header.ieee_802_11.channel = cv_hdr.channel; + phdr->pseudo_header.ieee_802_11.data_rate = cv_hdr.rate; + phdr->pseudo_header.ieee_802_11.signal_level = cv_hdr.signal_level_percent; + break; case MEDIUM_TOKEN_RING : phdr->pkt_encap = WTAP_ENCAP_TOKEN_RING; - /* Token Ring - no pseudo-header for that */ - return TRUE; + break; + + default : + *err = WTAP_ERR_BAD_FILE; + *err_info = g_strdup_printf("commview: unsupported encap: %u", + cv_hdr.flags & FLAGS_MEDIUM); + return FALSE; } - /* unknown - not handled */ - 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; + + phdr->presence_flags = WTAP_HAS_TS; + + phdr->len = cv_hdr.data_len; + phdr->caplen = cv_hdr.data_len; + + phdr->ts.secs = mktime(&tm); + phdr->ts.nsecs = cv_hdr.usecs * 1000; + + return TRUE; } static gboolean commview_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset) { - commview_header_t cv_hdr; int bytes_read; *data_offset = file_tell(wth->fh); - if(!commview_read_header(&cv_hdr, wth->fh, err, err_info)) - return FALSE; - - 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); + if(!commview_read_and_process_header(wth->fh, &wth->phdr, err, + err_info)) return FALSE; - } - buffer_assure_space(wth->frame_buffer, cv_hdr.data_len); + buffer_assure_space(wth->frame_buffer, wth->phdr.caplen); bytes_read = file_read(buffer_start_ptr(wth->frame_buffer), - cv_hdr.data_len, wth->fh); - if(bytes_read != cv_hdr.data_len) { + wth->phdr.caplen, wth->fh); + if(bytes_read != (int)wth->phdr.caplen) { *err = file_error(wth->fh, err_info); if(*err == 0) *err = WTAP_ERR_SHORT_READ; @@ -212,26 +212,17 @@ commview_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset) static gboolean commview_seek_read(wtap *wth, gint64 seek_off, struct wtap_pkthdr *phdr, - guint8 *pd, int length, int *err, - gchar **err_info) + guint8 *pd, int length, int *err, gchar **err_info) { - commview_header_t cv_hdr; int bytes_read; if(file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1) return FALSE; - if(!commview_read_header(&cv_hdr, wth->random_fh, err, err_info)) { + if(!commview_read_and_process_header(wth->random_fh, phdr, err, + err_info)) { if(*err == 0) *err = WTAP_ERR_SHORT_READ; - - return FALSE; - } - - if(!commview_set_packet_header(&cv_hdr, phdr)) { - *err = WTAP_ERR_BAD_FILE; - *err_info = g_strdup_printf("commview: unsupported encap: %u", - cv_hdr.flags & FLAGS_MEDIUM); return FALSE; } @@ -241,8 +232,8 @@ commview_seek_read(wtap *wth, gint64 seek_off, struct wtap_pkthdr *phdr, return FALSE; } - bytes_read = file_read(pd, cv_hdr.data_len, wth->random_fh); - if(bytes_read != cv_hdr.data_len) { + bytes_read = file_read(pd, phdr->caplen, wth->random_fh); + if(bytes_read != (int)phdr->caplen) { *err = file_error(wth->random_fh, err_info); if(*err == 0) *err = WTAP_ERR_SHORT_READ; @@ -322,7 +313,6 @@ static gboolean commview_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, const guint8 *pd, int *err) { - const union wtap_pseudo_header *pseudo_header = &phdr->pseudo_header; commview_header_t cv_hdr; struct tm *tm; @@ -354,10 +344,10 @@ static gboolean commview_dump(wtap_dumper *wdh, case WTAP_ENCAP_IEEE_802_11_WITH_RADIO : cv_hdr.flags |= MEDIUM_WIFI; - cv_hdr.channel = pseudo_header->ieee_802_11.channel; - cv_hdr.rate = (guint8)(pseudo_header->ieee_802_11.data_rate & 0xFF); - cv_hdr.direction = (guint8)((pseudo_header->ieee_802_11.data_rate >> 8) & 0xFF); - cv_hdr.signal_level_percent = pseudo_header->ieee_802_11.signal_level; + cv_hdr.channel = phdr->pseudo_header.ieee_802_11.channel; + cv_hdr.rate = (guint8)(phdr->pseudo_header.ieee_802_11.data_rate & 0xFF); + cv_hdr.direction = (guint8)((phdr->pseudo_header.ieee_802_11.data_rate >> 8) & 0xFF); + cv_hdr.signal_level_percent = phdr->pseudo_header.ieee_802_11.signal_level; break; case WTAP_ENCAP_TOKEN_RING : |