aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/radcom.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2013-06-14 23:59:04 +0000
committerGuy Harris <guy@alum.mit.edu>2013-06-14 23:59:04 +0000
commit25d9d55cefdad3e99e860b818e0886da8bc952e1 (patch)
treec51c11095c70d16141837dba045b123a27034037 /wiretap/radcom.c
parentf42e5bc9c0eb6c0e228018711694c80cdc5bc5c1 (diff)
Rename radcom_process_rec_header() to radcom_process_rec_header() and
move the code to file in a struct wtap_pkthdr there. svn path=/trunk/; revision=49942
Diffstat (limited to 'wiretap/radcom.c')
-rw-r--r--wiretap/radcom.c179
1 files changed, 77 insertions, 102 deletions
diff --git a/wiretap/radcom.c b/wiretap/radcom.c
index 83d5f38a83..c76a1dd8d2 100644
--- a/wiretap/radcom.c
+++ b/wiretap/radcom.c
@@ -89,10 +89,10 @@ struct radcomrec_hdr {
static gboolean radcom_read(wtap *wth, int *err, gchar **err_info,
gint64 *data_offset);
static gboolean radcom_seek_read(wtap *wth, gint64 seek_off,
- struct wtap_pkthdr *pkhdr, guint8 *pd, int length,
- int *err, gchar **err_info);
-static int radcom_read_rec_header(FILE_T fh, struct radcomrec_hdr *hdr,
+ struct wtap_pkthdr *phdr, guint8 *pd, int length,
int *err, gchar **err_info);
+static int radcom_process_rec_header(wtap *wth, FILE_T fh,
+ struct wtap_pkthdr *phdr, int *err, gchar **err_info);
static gboolean radcom_read_rec_data(FILE_T fh, guint8 *pd, int length,
int *err, gchar **err_info);
@@ -259,87 +259,24 @@ static gboolean radcom_read(wtap *wth, int *err, gchar **err_info,
gint64 *data_offset)
{
int ret;
- struct radcomrec_hdr hdr;
- guint16 data_length, real_length, length;
- guint32 sec;
int bytes_read;
- struct tm tm;
- guint8 phdr[8];
char fcs[2];
/* Read record header. */
*data_offset = file_tell(wth->fh);
- ret = radcom_read_rec_header(wth->fh, &hdr, err, err_info);
+ ret = radcom_process_rec_header(wth, wth->fh, &wth->phdr, err,
+ err_info);
if (ret <= 0) {
/* Read error or EOF */
return FALSE;
}
- data_length = pletohs(&hdr.data_length);
- if (data_length == 0) {
- /*
- * The last record appears to have 0 in its "data_length"
- * field, but non-zero values in other fields, so we
- * check for that and treat it as an EOF indication.
- */
- *err = 0;
- return FALSE;
- }
- length = pletohs(&hdr.length);
- real_length = pletohs(&hdr.real_length);
-
- if (wth->file_encap == WTAP_ENCAP_LAPB) {
- length -= 2; /* FCS */
- real_length -= 2;
- }
-
- wth->phdr.presence_flags = WTAP_HAS_TS|WTAP_HAS_CAP_LEN;
-
- wth->phdr.len = real_length;
- wth->phdr.caplen = length;
-
- tm.tm_year = pletohs(&hdr.date.year)-1900;
- tm.tm_mon = (hdr.date.month&0x0f)-1;
- tm.tm_mday = hdr.date.day;
- sec = pletohl(&hdr.date.sec);
- tm.tm_hour = sec/3600;
- tm.tm_min = (sec%3600)/60;
- tm.tm_sec = sec%60;
- tm.tm_isdst = -1;
- wth->phdr.ts.secs = mktime(&tm);
- wth->phdr.ts.nsecs = pletohl(&hdr.date.usec) * 1000;
-
- switch (wth->file_encap) {
-
- case WTAP_ENCAP_ETHERNET:
- /* XXX - is there an FCS? */
- wth->phdr.pseudo_header.eth.fcs_len = -1;
- break;
-
- case WTAP_ENCAP_LAPB:
- wth->phdr.pseudo_header.x25.flags = (hdr.dce & 0x1) ?
- 0x00 : FROM_DCE;
- break;
-
- case WTAP_ENCAP_ATM_RFC1483:
- /*
- * XXX - is this stuff a pseudo-header?
- * The direction appears to be in the "hdr.dce" field.
- */
- if (!radcom_read_rec_data(wth->fh, phdr, sizeof phdr, err,
- err_info))
- return FALSE; /* Read error */
- length -= 8;
- wth->phdr.len -= 8;
- wth->phdr.caplen -= 8;
- break;
- }
/*
* Read the packet data.
*/
- buffer_assure_space(wth->frame_buffer, length);
- if (!radcom_read_rec_data(wth->fh,
- buffer_start_ptr(wth->frame_buffer), length, err, err_info))
+ buffer_assure_space(wth->frame_buffer, wth->phdr.caplen);
+ if (!radcom_read_rec_data(wth->fh, buffer_start_ptr(wth->frame_buffer),
+ wth->phdr.caplen, err, err_info))
return FALSE; /* Read error */
if (wth->file_encap == WTAP_ENCAP_LAPB) {
@@ -362,19 +299,17 @@ static gboolean radcom_read(wtap *wth, int *err, gchar **err_info,
static gboolean
radcom_seek_read(wtap *wth, gint64 seek_off,
- struct wtap_pkthdr *pkhdr, guint8 *pd, int length,
+ struct wtap_pkthdr *phdr, guint8 *pd, int length,
int *err, gchar **err_info)
{
- union wtap_pseudo_header *pseudo_header = &pkhdr->pseudo_header;
int ret;
- struct radcomrec_hdr hdr;
- guint8 phdr[8];
if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1)
return FALSE;
/* Read record header. */
- ret = radcom_read_rec_header(wth->random_fh, &hdr, err, err_info);
+ ret = radcom_process_rec_header(wth, wth->random_fh, phdr, err,
+ err_info);
if (ret <= 0) {
/* Read error or EOF */
if (ret == 0) {
@@ -384,28 +319,6 @@ radcom_seek_read(wtap *wth, gint64 seek_off,
return FALSE;
}
- switch (wth->file_encap) {
-
- case WTAP_ENCAP_ETHERNET:
- /* XXX - is there an FCS? */
- pseudo_header->eth.fcs_len = -1;
- break;
-
- case WTAP_ENCAP_LAPB:
- pseudo_header->x25.flags = (hdr.dce & 0x1) ? 0x00 : FROM_DCE;
- break;
-
- case WTAP_ENCAP_ATM_RFC1483:
- /*
- * XXX - is this stuff a pseudo-header?
- * The direction appears to be in the "hdr.dce" field.
- */
- if (!radcom_read_rec_data(wth->random_fh, phdr, sizeof phdr,
- err, err_info))
- return FALSE; /* Read error */
- break;
- }
-
/*
* Read the packet data.
*/
@@ -413,14 +326,19 @@ radcom_seek_read(wtap *wth, gint64 seek_off,
}
static int
-radcom_read_rec_header(FILE_T fh, struct radcomrec_hdr *hdr, int *err,
- gchar **err_info)
+radcom_process_rec_header(wtap *wth, FILE_T fh, struct wtap_pkthdr *phdr,
+ int *err, gchar **err_info)
{
+ struct radcomrec_hdr hdr;
int bytes_read;
+ guint16 data_length, real_length, length;
+ guint32 sec;
+ struct tm tm;
+ guint8 atmhdr[8];
errno = WTAP_ERR_CANT_READ;
- bytes_read = file_read(hdr, sizeof *hdr, fh);
- if (bytes_read != sizeof *hdr) {
+ bytes_read = file_read(&hdr, sizeof hdr, fh);
+ if (bytes_read != sizeof hdr) {
*err = file_error(fh, err_info);
if (*err != 0)
return -1;
@@ -430,6 +348,63 @@ radcom_read_rec_header(FILE_T fh, struct radcomrec_hdr *hdr, int *err,
}
return 0;
}
+
+ data_length = pletohs(&hdr.data_length);
+ if (data_length == 0) {
+ /*
+ * The last record appears to have 0 in its "data_length"
+ * field, but non-zero values in other fields, so we
+ * check for that and treat it as an EOF indication.
+ */
+ *err = 0;
+ return 0;
+ }
+ length = pletohs(&hdr.length);
+ real_length = pletohs(&hdr.real_length);
+
+ phdr->presence_flags = WTAP_HAS_TS|WTAP_HAS_CAP_LEN;
+
+ tm.tm_year = pletohs(&hdr.date.year)-1900;
+ tm.tm_mon = (hdr.date.month&0x0f)-1;
+ tm.tm_mday = hdr.date.day;
+ sec = pletohl(&hdr.date.sec);
+ tm.tm_hour = sec/3600;
+ tm.tm_min = (sec%3600)/60;
+ tm.tm_sec = sec%60;
+ tm.tm_isdst = -1;
+ phdr->ts.secs = mktime(&tm);
+ phdr->ts.nsecs = pletohl(&hdr.date.usec) * 1000;
+
+ switch (wth->file_encap) {
+
+ case WTAP_ENCAP_ETHERNET:
+ /* XXX - is there an FCS? */
+ phdr->pseudo_header.eth.fcs_len = -1;
+ break;
+
+ case WTAP_ENCAP_LAPB:
+ phdr->pseudo_header.x25.flags = (hdr.dce & 0x1) ?
+ 0x00 : FROM_DCE;
+ length -= 2; /* FCS */
+ real_length -= 2;
+ break;
+
+ case WTAP_ENCAP_ATM_RFC1483:
+ /*
+ * XXX - is this stuff a pseudo-header?
+ * The direction appears to be in the "hdr.dce" field.
+ */
+ if (!radcom_read_rec_data(wth->fh, atmhdr, sizeof atmhdr, err,
+ err_info))
+ return -1; /* Read error */
+ length -= 8;
+ real_length -= 8;
+ break;
+ }
+
+ phdr->len = real_length;
+ phdr->caplen = length;
+
return 1;
}