summaryrefslogtreecommitdiff
path: root/wiretap/commview.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2013-05-16 23:14:17 +0000
committerGuy Harris <guy@alum.mit.edu>2013-05-16 23:14:17 +0000
commite53fb07caeb05413897622b77a6f1ab08ec5bbc5 (patch)
tree4a3af16d3594d66183c4d13f084ef52da4ec709d /wiretap/commview.c
parentc3836c576e53df00206e15366c59cedc1cb6625a (diff)
downloadwireshark-e53fb07caeb05413897622b77a6f1ab08ec5bbc5.tar.gz
Move the code to read the CommView record header, check for an unhandled
encapsulation, and to process it into a commview_read_and_process_header() routine. svn path=/trunk/; revision=49350
Diffstat (limited to 'wiretap/commview.c')
-rw-r--r--wiretap/commview.c114
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 :