aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/network_instruments.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2014-10-06 18:00:57 -0700
committerGuy Harris <guy@alum.mit.edu>2014-10-07 01:01:59 +0000
commit670ebda4a6af0d30e033b0af48cfd15ce52c10eb (patch)
treeb092e44c944c4eb7566964da4cfb914e6002bd6d /wiretap/network_instruments.c
parent6397ad43c2374ebde388041f2bd7ac925606a51e (diff)
Add some higher-level file-read APIs and use them.
Add wtap_read_bytes(), which takes a FILE_T, a pointer, a byte count, an error number pointer, and an error string pointer as arguments, and that treats a short read of any sort, including a read that returns 0 bytes, as a WTAP_ERR_SHORT_READ error, and that returns the error number and string through its last two arguments. Add wtap_read_bytes_or_eof(), which is similar, but that treats a read that returns 0 bytes as an EOF, supplying an error number of 0 as an EOF indication. Use those in file readers; that simplifies the code and makes it less likely that somebody will fail to supply the error number and error string on a file read error. Change-Id: Ia5dba2a6f81151e87b614461349d611cffc16210 Reviewed-on: https://code.wireshark.org/review/4512 Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'wiretap/network_instruments.c')
-rw-r--r--wiretap/network_instruments.c85
1 files changed, 31 insertions, 54 deletions
diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c
index d803c76e77..1ecd43fb10 100644
--- a/wiretap/network_instruments.c
+++ b/wiretap/network_instruments.c
@@ -103,8 +103,9 @@ static int read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header
static gboolean process_packet_header(wtap *wth,
packet_entry_header *packet_header, struct wtap_pkthdr *phdr, int *err,
gchar **err_info);
-static int read_packet_data(FILE_T fh, int offset_to_frame, int current_offset_from_packet_header,
- Buffer *buf, int length, int *err, char **err_info);
+static int read_packet_data(FILE_T fh, int offset_to_frame,
+ int current_offset_from_packet_header, Buffer *buf, int length,
+ int *err, char **err_info);
static gboolean skip_to_next_packet(wtap *wth, int offset_to_next_packet,
int current_offset_from_packet_header, int *err, char **err_info);
static gboolean observer_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
@@ -114,7 +115,6 @@ static gint wtap_to_observer_encap(int wtap_encap);
int network_instruments_open(wtap *wth, int *err, gchar **err_info)
{
- int bytes_read;
int offset;
capture_file_header file_header;
guint i;
@@ -128,14 +128,13 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info)
offset = 0;
/* read in the buffer file header */
- bytes_read = file_read(&file_header, sizeof file_header, wth->fh);
- if (bytes_read != sizeof file_header) {
- *err = file_error(wth->fh, err_info);
- if (*err != 0 && *err != WTAP_ERR_SHORT_READ)
+ if (!wtap_read_bytes(wth->fh, &file_header, sizeof file_header,
+ err, err_info)) {
+ if (*err != WTAP_ERR_SHORT_READ)
return -1;
return 0;
}
- offset += bytes_read;
+ offset += (int)sizeof file_header;
CAPTURE_FILE_HEADER_FROM_LE_IN_PLACE(file_header);
/* check if version info is present */
@@ -159,14 +158,9 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info)
break;
/* read the TLV header */
- bytes_read = file_read(&tlvh, sizeof tlvh, wth->fh);
- if (bytes_read != sizeof tlvh) {
- *err = file_error(wth->fh, err_info);
- if (*err == 0)
- *err = WTAP_ERR_SHORT_READ;
+ if (!wtap_read_bytes(wth->fh, &tlvh, sizeof tlvh, err, err_info))
return -1;
- }
- offset += bytes_read;
+ offset += (int)sizeof tlvh;
TLV_HEADER_FROM_LE_IN_PLACE(tlvh);
if (tlvh.length < sizeof tlvh) {
@@ -179,15 +173,12 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info)
/* process (or skip over) the current TLV */
switch (tlvh.type) {
case INFORMATION_TYPE_TIME_INFO:
- bytes_read = file_read(&private_state->time_format, sizeof private_state->time_format, wth->fh);
- if (bytes_read != sizeof private_state->time_format) {
- *err = file_error(wth->fh, err_info);
- if (*err == 0)
- *err = WTAP_ERR_SHORT_READ;
+ if (!wtap_read_bytes(wth->fh, &private_state->time_format,
+ sizeof private_state->time_format,
+ err, err_info))
return -1;
- }
private_state->time_format = GUINT32_FROM_LE(private_state->time_format);
- offset += bytes_read;
+ offset += (int)sizeof private_state->time_format;
break;
default:
seek_increment = tlvh.length - (int)sizeof tlvh;
@@ -213,13 +204,9 @@ int network_instruments_open(wtap *wth, int *err, gchar **err_info)
}
/* pull off the packet header */
- bytes_read = file_read(&packet_header, sizeof packet_header, wth->fh);
- if (bytes_read != sizeof packet_header) {
- *err = file_error(wth->fh, err_info);
- if (*err == 0)
- *err = WTAP_ERR_SHORT_READ;
+ if (!wtap_read_bytes(wth->fh, &packet_header, sizeof packet_header,
+ err, err_info))
return -1;
- }
PACKET_ENTRY_HEADER_FROM_LE_IN_PLACE(packet_header);
/* check the packet's magic number */
@@ -341,7 +328,6 @@ read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header,
packet_entry_header *packet_header, int *err, gchar **err_info)
{
int offset;
- int bytes_read;
guint i;
tlv_header tlvh;
int seek_increment;
@@ -350,14 +336,13 @@ read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header,
offset = 0;
/* pull off the packet header */
- bytes_read = file_read(packet_header, sizeof *packet_header, fh);
- if (bytes_read != sizeof *packet_header) {
- *err = file_error(fh, err_info);
- if (*err != 0)
- return -1;
- return 0; /* EOF */
+ if (!wtap_read_bytes_or_eof(fh, packet_header, sizeof *packet_header,
+ err, err_info)) {
+ if (*err == 0)
+ return 0; /* EOF */
+ return -1;
}
- offset += bytes_read;
+ offset += (int)sizeof *packet_header;
PACKET_ENTRY_HEADER_FROM_LE_IN_PLACE(*packet_header);
/* check the packet's magic number */
@@ -388,14 +373,9 @@ read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header,
/* process extra information */
for (i = 0; i < packet_header->number_of_information_elements; i++) {
/* read the TLV header */
- bytes_read = file_read(&tlvh, sizeof tlvh, fh);
- if (bytes_read != sizeof tlvh) {
- *err = file_error(fh, err_info);
- if (*err == 0)
- *err = WTAP_ERR_SHORT_READ;
+ if (!wtap_read_bytes(fh, &tlvh, sizeof tlvh, err, err_info))
return -1;
- }
- offset += bytes_read;
+ offset += (int)sizeof tlvh;
TLV_HEADER_FROM_LE_IN_PLACE(tlvh);
if (tlvh.length < sizeof tlvh) {
@@ -408,13 +388,9 @@ read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header,
/* process (or skip over) the current TLV */
switch (tlvh.type) {
case INFORMATION_TYPE_WIRELESS:
- bytes_read = file_read(&wireless_header, sizeof wireless_header, fh);
- if (bytes_read != sizeof wireless_header) {
- *err = file_error(fh, err_info);
- if(*err == 0)
- *err = WTAP_ERR_SHORT_READ;
+ if (!wtap_read_bytes(fh, &wireless_header, sizeof wireless_header,
+ err, err_info))
return -1;
- }
/* update the pseudo header */
pseudo_header->ieee_802_11.fcs_len = 0;
/* set decryption status */
@@ -422,7 +398,7 @@ read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header,
pseudo_header->ieee_802_11.channel = wireless_header.frequency;
pseudo_header->ieee_802_11.data_rate = wireless_header.rate;
pseudo_header->ieee_802_11.signal_level = wireless_header.strengthPercent;
- offset += bytes_read;
+ offset += (int)sizeof wireless_header;
break;
default:
/* skip the TLV data */
@@ -522,8 +498,9 @@ process_packet_header(wtap *wth, packet_entry_header *packet_header,
}
static int
-read_packet_data(FILE_T fh, int offset_to_frame, int current_offset_from_packet_header, Buffer *buf,
- int length, int *err, char **err_info)
+read_packet_data(FILE_T fh, int offset_to_frame,
+ int current_offset_from_packet_header, Buffer *buf, int length,
+ int *err, char **err_info)
{
int seek_increment;
int bytes_consumed = 0;
@@ -557,8 +534,8 @@ read_packet_data(FILE_T fh, int offset_to_frame, int current_offset_from_packet_
}
static gboolean
-skip_to_next_packet(wtap *wth, int offset_to_next_packet, int current_offset_from_packet_header, int *err,
- char **err_info)
+skip_to_next_packet(wtap *wth, int offset_to_next_packet,
+ int current_offset_from_packet_header, int *err, char **err_info)
{
int seek_increment;