Only set err_info on an error, and use g_strdup_printf().

If the goal is to look like a libwiretap routine, we only need to set
*err_info on an error, and we should set it to a g_mallocated string (or
NULL).

Handle WTAP_ERR_UNSUPPORTED while we're at it - we never return it, but
we never return WTAP_ERR_UNSUPPORTED_ENCAP, either, but we handle it.

Change-Id: I9d93c43278d22f0fa77ec1cf7f29b476c8dd0dd0
Reviewed-on: https://code.wireshark.org/review/4565
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2014-10-08 14:12:54 -07:00
parent dbf8024eeb
commit c83169f343
1 changed files with 16 additions and 6 deletions

View File

@ -903,13 +903,12 @@ main(int argc, char *argv[])
* @return TRUE on success, FALSE on failure.
*/
static gboolean
raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, const gchar **err_info, gint64 *data_offset) {
raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, gchar **err_info, gint64 *data_offset) {
struct pcap_pkthdr mem_hdr;
struct pcaprec_hdr disk_hdr;
ssize_t bytes_read = 0;
size_t bytes_needed = sizeof(disk_hdr);
guchar *ptr = (guchar*) &disk_hdr;
static gchar err_str[100];
if (want_pcap_pkthdr) {
bytes_needed = sizeof(mem_hdr);
@ -921,9 +920,11 @@ raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, const gchar **err
bytes_read = read(fd, ptr, (int)bytes_needed);
if (bytes_read == 0) {
*err = 0;
*err_info = NULL;
return FALSE;
} else if (bytes_read < 0) {
*err = errno;
*err_info = NULL;
return FALSE;
}
bytes_needed -= bytes_read;
@ -955,9 +956,8 @@ raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, const gchar **err
#endif
if (bytes_needed > WTAP_MAX_PACKET_SIZE) {
*err = WTAP_ERR_BAD_FILE;
g_snprintf(err_str, 100, "Bad packet length: %lu\n",
*err_info = g_strdup_printf("Bad packet length: %lu\n",
(unsigned long) bytes_needed);
*err_info = err_str;
return FALSE;
}
@ -966,12 +966,13 @@ raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, const gchar **err
bytes_read = read(fd, ptr, (int)bytes_needed);
if (bytes_read == 0) {
*err = WTAP_ERR_SHORT_READ;
*err_info = NULL;
return FALSE;
} else if (bytes_read < 0) {
*err = errno;
*err_info = NULL;
return FALSE;
}
*err_info = NULL;
bytes_needed -= bytes_read;
*data_offset += bytes_read;
ptr += bytes_read;
@ -983,7 +984,7 @@ static gboolean
load_cap_file(capture_file *cf)
{
int err;
const gchar *err_info;
gchar *err_info;
gint64 data_offset = 0;
guchar pd[WTAP_MAX_PACKET_SIZE];
@ -1004,9 +1005,16 @@ load_cap_file(capture_file *cf)
/* Print a message noting that the read failed somewhere along the line. */
switch (err) {
case WTAP_ERR_UNSUPPORTED:
cmdarg_err("The file \"%s\" contains record data that Rawshark doesn't support.\n(%s)",
cf->filename, err_info);
g_free(err_info);
break;
case WTAP_ERR_UNSUPPORTED_ENCAP:
cmdarg_err("The file \"%s\" has a packet with a network type that Rawshark doesn't support.\n(%s)",
cf->filename, err_info);
g_free(err_info);
break;
case WTAP_ERR_SHORT_READ:
@ -1017,11 +1025,13 @@ load_cap_file(capture_file *cf)
case WTAP_ERR_BAD_FILE:
cmdarg_err("The file \"%s\" appears to be damaged or corrupt.\n(%s)",
cf->filename, err_info);
g_free(err_info);
break;
case WTAP_ERR_DECOMPRESS:
cmdarg_err("The compressed file \"%s\" appears to be damaged or corrupt.\n(%s)",
cf->filename, err_info);
g_free(err_info);
break;
default: