aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <gharris@sonic.net>2020-10-13 18:48:46 -0700
committerGuy Harris <gharris@sonic.net>2020-10-14 04:51:45 +0000
commit6e6233521aa4f0e82b79219cb7e32912012d9ccf (patch)
tree1836305bf265c1aff78d61677343f3fa23bc2aac
parent92e1b110f3f70d295adb10ce0dc5fad9a7189912 (diff)
downloadwireshark-6e6233521aa4f0e82b79219cb7e32912012d9ccf.tar.gz
wireshark-6e6233521aa4f0e82b79219cb7e32912012d9ccf.tar.bz2
wireshark-6e6233521aa4f0e82b79219cb7e32912012d9ccf.zip
Have WTAP_ERR_INTERNAL include an err_info string giving details.
That way, users won't just see "You got an internal error", the details will be given, so they can report them in a bug.
-rw-r--r--editcap.c38
-rw-r--r--epan/dissectors/packet-snort.c15
-rw-r--r--epan/wslua/wslua_dumper.c48
-rw-r--r--epan/wslua/wslua_file.c2
-rw-r--r--epan/wslua/wslua_file_handler.c108
-rw-r--r--extcap/androiddump.c7
-rw-r--r--file.c36
-rw-r--r--mergecap.c5
-rw-r--r--randpkt_core/randpkt_core.c12
-rw-r--r--reordercap.c12
-rw-r--r--tshark.c29
-rw-r--r--ui/alert_box.c85
-rw-r--r--ui/alert_box.h15
-rw-r--r--ui/capture.c14
-rw-r--r--ui/export_pdu_ui_utils.c15
-rw-r--r--ui/failure_message.c53
-rw-r--r--ui/failure_message.h15
-rw-r--r--ui/qt/import_text_dialog.cpp9
-rw-r--r--ui/tap_export_pdu.c32
-rw-r--r--ui/tap_export_pdu.h10
-rw-r--r--wiretap/5views.c6
-rw-r--r--wiretap/5views.h2
-rw-r--r--wiretap/btsnoop.c4
-rw-r--r--wiretap/btsnoop.h4
-rw-r--r--wiretap/camins.c14
-rw-r--r--wiretap/capsa.c1
-rw-r--r--wiretap/catapult_dct2000.c2
-rw-r--r--wiretap/catapult_dct2000.h2
-rw-r--r--wiretap/commview.c2
-rw-r--r--wiretap/commview.h4
-rw-r--r--wiretap/erf.c4
-rw-r--r--wiretap/erf.h2
-rw-r--r--wiretap/eyesdn.c2
-rw-r--r--wiretap/eyesdn.h2
-rw-r--r--wiretap/file_access.c39
-rw-r--r--wiretap/file_wrappers.c16
-rw-r--r--wiretap/k12.c4
-rw-r--r--wiretap/k12.h6
-rw-r--r--wiretap/k12text.l2
-rw-r--r--wiretap/lanalyzer.c8
-rw-r--r--wiretap/lanalyzer.h2
-rw-r--r--wiretap/libpcap.c6
-rw-r--r--wiretap/libpcap.h2
-rw-r--r--wiretap/logcat.c3
-rw-r--r--wiretap/logcat.h2
-rw-r--r--wiretap/logcat_text.c30
-rw-r--r--wiretap/logcat_text.h14
-rw-r--r--wiretap/merge.c15
-rw-r--r--wiretap/netmon.c8
-rw-r--r--wiretap/netmon.h2
-rw-r--r--wiretap/netscaler.c2
-rw-r--r--wiretap/netscaler.h2
-rw-r--r--wiretap/nettl.c2
-rw-r--r--wiretap/nettl.h2
-rw-r--r--wiretap/nettrace_3gpp_32_423.c24
-rw-r--r--wiretap/network_instruments.c23
-rw-r--r--wiretap/network_instruments.h2
-rw-r--r--wiretap/netxray.c14
-rw-r--r--wiretap/netxray.h4
-rw-r--r--wiretap/ngsniffer.c7
-rw-r--r--wiretap/ngsniffer.h2
-rw-r--r--wiretap/pcapng.c15
-rw-r--r--wiretap/pcapng.h2
-rw-r--r--wiretap/snoop.c2
-rw-r--r--wiretap/snoop.h2
-rw-r--r--wiretap/visual.c8
-rw-r--r--wiretap/visual.h2
-rw-r--r--wiretap/wtap-int.h2
-rw-r--r--wiretap/wtap.h24
69 files changed, 551 insertions, 360 deletions
diff --git a/editcap.c b/editcap.c
index e3ea6f7462..c7823d9d6b 100644
--- a/editcap.c
+++ b/editcap.c
@@ -997,17 +997,17 @@ failure_message_cont(const char *msg_format, va_list ap)
static wtap_dumper *
editcap_dump_open(const char *filename, const wtap_dump_params *params,
- int *write_err)
+ int *write_err, gchar **write_err_info)
{
wtap_dumper *pdh;
if (strcmp(filename, "-") == 0) {
/* Write to the standard output. */
pdh = wtap_dump_open_stdout(out_file_type_subtype, WTAP_UNCOMPRESSED,
- params, write_err);
+ params, write_err, write_err_info);
} else {
pdh = wtap_dump_open(filename, out_file_type_subtype, WTAP_UNCOMPRESSED,
- params, write_err);
+ params, write_err, write_err_info);
}
return pdh;
}
@@ -1688,11 +1688,12 @@ invalid_time:
wtap_block_add_string_option_format(g_array_index(params.shb_hdrs, wtap_block_t, 0), OPT_SHB_USERAPPL, "%s", get_appname_and_version());
}
- pdh = editcap_dump_open(filename, &params, &write_err);
+ pdh = editcap_dump_open(filename, &params, &write_err,
+ &write_err_info);
if (pdh == NULL) {
cfile_dump_open_failure_message("editcap", filename,
- write_err,
+ write_err, write_err_info,
out_file_type_subtype);
ret = INVALID_FILE;
goto clean_exit;
@@ -1714,8 +1715,9 @@ invalid_time:
}
while (nstime_cmp(&rec->ts, &block_next) > 0) { /* time for the next file */
- if (!wtap_dump_close(pdh, &write_err)) {
- cfile_close_failure_message(filename, write_err);
+ if (!wtap_dump_close(pdh, &write_err, &write_err_info)) {
+ cfile_close_failure_message(filename, write_err,
+ write_err_info);
ret = WRITE_ERROR;
goto clean_exit;
}
@@ -1727,11 +1729,13 @@ invalid_time:
if (verbose)
fprintf(stderr, "Continuing writing in file %s\n", filename);
- pdh = editcap_dump_open(filename, &params, &write_err);
+ pdh = editcap_dump_open(filename, &params, &write_err,
+ &write_err_info);
if (pdh == NULL) {
cfile_dump_open_failure_message("editcap", filename,
write_err,
+ write_err_info,
out_file_type_subtype);
ret = INVALID_FILE;
goto clean_exit;
@@ -1743,8 +1747,9 @@ invalid_time:
if (split_packet_count != 0) {
/* time for the next file? */
if (written_count > 0 && (written_count % split_packet_count) == 0) {
- if (!wtap_dump_close(pdh, &write_err)) {
- cfile_close_failure_message(filename, write_err);
+ if (!wtap_dump_close(pdh, &write_err, &write_err_info)) {
+ cfile_close_failure_message(filename, write_err,
+ write_err_info);
ret = WRITE_ERROR;
goto clean_exit;
}
@@ -1756,10 +1761,11 @@ invalid_time:
if (verbose)
fprintf(stderr, "Continuing writing in file %s\n", filename);
- pdh = editcap_dump_open(filename, &params, &write_err);
+ pdh = editcap_dump_open(filename, &params, &write_err,
+ &write_err_info);
if (pdh == NULL) {
cfile_dump_open_failure_message("editcap", filename,
- write_err,
+ write_err, write_err_info,
out_file_type_subtype);
ret = INVALID_FILE;
goto clean_exit;
@@ -2155,18 +2161,18 @@ invalid_time:
g_free (filename);
filename = g_strdup(argv[optind+1]);
- pdh = editcap_dump_open(filename, &params, &write_err);
+ pdh = editcap_dump_open(filename, &params, &write_err, &write_err_info);
if (pdh == NULL) {
cfile_dump_open_failure_message("editcap", filename,
- write_err,
+ write_err, write_err_info,
out_file_type_subtype);
ret = INVALID_FILE;
goto clean_exit;
}
}
- if (!wtap_dump_close(pdh, &write_err)) {
- cfile_close_failure_message(filename, write_err);
+ if (!wtap_dump_close(pdh, &write_err, &write_err_info)) {
+ cfile_close_failure_message(filename, write_err, write_err_info);
ret = WRITE_ERROR;
goto clean_exit;
}
diff --git a/epan/dissectors/packet-snort.c b/epan/dissectors/packet-snort.c
index 1cacd62911..bc3db1746d 100644
--- a/epan/dissectors/packet-snort.c
+++ b/epan/dissectors/packet-snort.c
@@ -1145,6 +1145,7 @@ snort_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data
if (!current_session.pdh) {
wtap_dump_params params = WTAP_DUMP_PARAMS_INIT;
int open_err;
+ gchar *open_err_info;
/* Older versions of Snort don't support capture file with several encapsulations (like pcapng),
* so write in pcap format and hope we have just one encap.
@@ -1163,8 +1164,11 @@ snort_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data
WTAP_FILE_TYPE_SUBTYPE_PCAP,
WTAP_UNCOMPRESSED,
&params,
- &open_err);
+ &open_err,
+ &open_err_info);
if (!current_session.pdh) {
+ /* XXX - report the error somehow? */
+ g_free(open_err_info);
current_session.working = FALSE;
return 0;
}
@@ -1189,10 +1193,13 @@ snort_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data
/* Dump frame into snort's stdin */
if (!wtap_dump(current_session.pdh, &rec, tvb_get_ptr(tvb, 0, tvb_reported_length(tvb)), &write_err, &err_info)) {
+ /* XXX - report the error somehow? */
+ g_free(err_info);
current_session.working = FALSE;
return 0;
}
if (!wtap_dump_flush(current_session.pdh, &write_err)) {
+ /* XXX - report the error somehow? */
current_session.working = FALSE;
return 0;
}
@@ -1375,8 +1382,10 @@ static void snort_cleanup(void)
/* Close dumper writing into snort's stdin. This will cause snort to exit! */
if (current_session.pdh) {
int write_err;
- if (!wtap_dump_close(current_session.pdh, &write_err)) {
-
+ gchar *write_err_info;
+ if (!wtap_dump_close(current_session.pdh, &write_err, &write_err_info)) {
+ /* XXX - somehow report the error? */
+ g_free(write_err_info);
}
current_session.pdh = NULL;
}
diff --git a/epan/wslua/wslua_dumper.c b/epan/wslua/wslua_dumper.c
index 65329f66cd..9a7112c90e 100644
--- a/epan/wslua/wslua_dumper.c
+++ b/epan/wslua/wslua_dumper.c
@@ -204,11 +204,13 @@ WSLUA_CONSTRUCTOR Dumper_new(lua_State* L) {
int filetype = (int)luaL_optinteger(L,WSLUA_OPTARG_Dumper_new_FILETYPE,WTAP_FILE_TYPE_SUBTYPE_PCAP);
int encap = (int)luaL_optinteger(L,WSLUA_OPTARG_Dumper_new_ENCAP,WTAP_ENCAP_ETHERNET);
int err = 0;
+ gchar *err_info = NULL;
const char* filename = cross_plat_fname(fname);
wtap_dump_params params = WTAP_DUMP_PARAMS_INIT;
params.encap = encap;
- d = wtap_dump_open(filename, filetype, WTAP_UNCOMPRESSED, &params, &err);
+ d = wtap_dump_open(filename, filetype, WTAP_UNCOMPRESSED, &params, &err,
+ &err_info);
if (! d ) {
/* WSLUA_ERROR("Error while opening file for writing"); */
@@ -254,6 +256,13 @@ WSLUA_CONSTRUCTOR Dumper_new(lua_State* L) {
wtap_file_type_subtype_string(filetype));
break;
+ case WTAP_ERR_INTERNAL:
+ luaL_error(L,"An internal error occurred creating the file \"%s\" (%s)",
+ filename,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
default:
luaL_error(L,"error while opening \"%s\": %s",
filename,
@@ -274,6 +283,7 @@ WSLUA_METHOD Dumper_close(lua_State* L) {
/* Closes a dumper. */
Dumper* dp = (Dumper*)luaL_checkudata(L, 1, "Dumper");
int err;
+ gchar *err_info;
if (! *dp) {
WSLUA_ERROR(Dumper_close,"Cannot operate on a closed dumper");
@@ -282,9 +292,15 @@ WSLUA_METHOD Dumper_close(lua_State* L) {
g_hash_table_remove(dumper_encaps,*dp);
- if (!wtap_dump_close(*dp, &err)) {
- luaL_error(L,"error closing: %s",
- wtap_strerror(err));
+ if (!wtap_dump_close(*dp, &err, &err_info)) {
+ if (err_info != NULL) {
+ luaL_error(L,"error closing: %s (%s)",
+ wtap_strerror(err), err_info);
+ g_free(err_info);
+ } else {
+ luaL_error(L,"error closing: %s",
+ wtap_strerror(err));
+ }
}
/* this way if we close a dumper any attempt to use it (for everything but GC) will yield an error */
@@ -392,6 +408,7 @@ WSLUA_METHOD Dumper_new_for_current(lua_State* L) {
int filetype = (int)luaL_optinteger(L,WSLUA_OPTARG_Dumper_new_for_current_FILETYPE,WTAP_FILE_TYPE_SUBTYPE_PCAP);
int encap;
int err = 0;
+ gchar *err_info = NULL;
const char* filename = cross_plat_fname(fname);
wtap_dump_params params = WTAP_DUMP_PARAMS_INIT;
@@ -406,7 +423,8 @@ WSLUA_METHOD Dumper_new_for_current(lua_State* L) {
encap = lua_pinfo->rec->rec_header.packet_header.pkt_encap;
params.encap = encap;
- d = wtap_dump_open(filename, filetype, WTAP_UNCOMPRESSED, &params, &err);
+ d = wtap_dump_open(filename, filetype, WTAP_UNCOMPRESSED, &params, &err,
+ &err_info);
if (! d ) {
switch (err) {
@@ -451,6 +469,13 @@ WSLUA_METHOD Dumper_new_for_current(lua_State* L) {
wtap_file_type_subtype_string(filetype));
break;
+ case WTAP_ERR_INTERNAL:
+ luaL_error(L,"An internal error occurred creating the file \"%s\" (%s)",
+ filename,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
default:
luaL_error(L,"error while opening \"%s\": %s",
filename,
@@ -541,6 +566,7 @@ WSLUA_METHOD Dumper_dump_current(lua_State* L) {
static int Dumper__gc(lua_State* L) {
Dumper* dp = (Dumper*)luaL_checkudata(L, 1, "Dumper");
int err;
+ gchar *err_info;
/* If we are Garbage Collected it means the Dumper is no longer usable. Close it */
@@ -549,9 +575,15 @@ static int Dumper__gc(lua_State* L) {
g_hash_table_remove(dumper_encaps,*dp);
- if (!wtap_dump_close(*dp, &err)) {
- luaL_error(L,"error closing: %s",
- wtap_strerror(err));
+ if (!wtap_dump_close(*dp, &err, &err_info)) {
+ if (err_info != NULL) {
+ luaL_error(L,"error closing: %s (%s)",
+ wtap_strerror(err), err_info);
+ g_free(err_info);
+ } else {
+ luaL_error(L,"error closing: %s",
+ wtap_strerror(err));
+ }
}
return 0;
diff --git a/epan/wslua/wslua_file.c b/epan/wslua/wslua_file.c
index ae6ffcaecd..3a1d472197 100644
--- a/epan/wslua/wslua_file.c
+++ b/epan/wslua/wslua_file.c
@@ -338,7 +338,7 @@ WSLUA_METHOD File_seek(lua_State* L) {
File f = checkFile(L,1);
int op = luaL_checkoption(L, 2, "cur", modenames);
gint64 offset = (gint64) luaL_optlong(L, 3, 0);
- int err = WTAP_ERR_INTERNAL;
+ int err;
if (file_is_reader(f)) {
diff --git a/epan/wslua/wslua_file_handler.c b/epan/wslua/wslua_file_handler.c
index 5634f3d286..004f8725a6 100644
--- a/epan/wslua/wslua_file_handler.c
+++ b/epan/wslua/wslua_file_handler.c
@@ -50,22 +50,40 @@ static GSList *registered_file_handlers;
set this to true right before pcall(), and back to false afterwards */
static gboolean in_routine = FALSE;
+static void
+report_error(int *err, gchar **err_info, const char *fmt, ...)
+{
+ va_list ap;
+ gchar *msg;
+
+ va_start(ap, fmt);
+ msg = g_strdup_vprintf(fmt, ap);
+ va_end(ap);
+ if (err != NULL) {
+ *err = WTAP_ERR_INTERNAL;
+ *err_info = msg;
+ } else {
+ g_warning("%s", msg);
+ g_free(msg);
+ }
+}
+
/* This does the verification and setup common to all open/read/seek_read/close routines */
-#define INIT_FILEHANDLER_ROUTINE(name,retval) \
+#define INIT_FILEHANDLER_ROUTINE(name,retval,err,err_info) \
if (!fh) { \
- g_warning("Error in file %s: no Lua FileHandler object", #name); \
+ report_error(err, err_info, "Error in file %s: no Lua FileHandler object", #name); \
return retval; \
} \
if (!fh->registered) { \
- g_warning("Error in file %s: Lua FileHandler is not registered", #name); \
+ report_error(err, err_info, "Error in file %s: Lua FileHandler is not registered", #name); \
return retval; \
} \
if (!fh->L) { \
- g_warning("Error in file %s: no FileHandler Lua state", #name); \
+ report_error(err, err_info, "Error in file %s: no FileHandler Lua state", #name); \
return retval; \
} \
if (fh->name##_ref == LUA_NOREF) { \
- g_warning("Error in file %s: no FileHandler %s routine reference", #name, #name); \
+ report_error(err, err_info, "Error in file %s: no FileHandler %s routine reference", #name, #name); \
return retval; \
} \
L = fh->L; \
@@ -73,7 +91,7 @@ static gboolean in_routine = FALSE;
push_error_handler(L, #name " routine"); \
lua_rawgeti(L, LUA_REGISTRYINDEX, fh->name##_ref); \
if (!lua_isfunction(L, -1)) { \
- g_warning("Error in file %s: no FileHandler %s routine function in Lua", #name, #name); \
+ report_error(err, err_info, "Error in file %s: no FileHandler %s routine function in Lua", #name, #name); \
return retval; \
} \
/* now guard against deregistering during pcall() */ \
@@ -89,45 +107,23 @@ static gboolean in_routine = FALSE;
#define LUA_ERRGCMM 9
#endif
-#define CASE_ERROR(name) \
+#define CASE_ERROR(name,err,err_info) \
case LUA_ERRRUN: \
- g_warning("Run-time error while calling FileHandler %s routine", name); \
+ report_error(err, err_info, "Run-time error while calling FileHandler %s routine", name); \
break; \
case LUA_ERRMEM: \
- g_warning("Memory alloc error while calling FileHandler %s routine", name); \
+ report_error(err, err_info, "Memory alloc error while calling FileHandler %s routine", name); \
break; \
case LUA_ERRERR: \
- g_warning("Error in error handling while calling FileHandler %s routine", name); \
+ report_error(err, err_info, "Error in error handling while calling FileHandler %s routine", name); \
break; \
case LUA_ERRGCMM: \
- g_warning("Error in garbage collector while calling FileHandler %s routine", name); \
+ report_error(err, err_info, "Error in garbage collector while calling FileHandler %s routine", name); \
break; \
default: \
g_assert_not_reached(); \
break;
-#define CASE_ERROR_ERRINFO(name) \
- case LUA_ERRRUN: \
- g_warning("Run-time error while calling FileHandler %s routine", name); \
- *err_info = g_strdup_printf("Run-time error while calling FileHandler %s routine", name); \
- break; \
- case LUA_ERRMEM: \
- g_warning("Memory alloc error while calling FileHandler %s routine", name); \
- *err_info = g_strdup_printf("Memory alloc error while calling FileHandler %s routine", name); \
- break; \
- case LUA_ERRERR: \
- g_warning("Error in error handling while calling FileHandler %s routine", name); \
- *err_info = g_strdup_printf("Error in error handling while calling FileHandler %s routine", name); \
- break; \
- case LUA_ERRGCMM: \
- g_warning("Error in garbage collector while calling FileHandler %s routine", name); \
- *err_info = g_strdup_printf("Error in garbage collector while calling FileHandler %s routine", name); \
- break; \
- default: \
- g_assert_not_reached(); \
- break;
-
-
/* some declarations */
static gboolean
wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
@@ -162,7 +158,7 @@ wslua_filehandler_open(wtap *wth, int *err, gchar **err_info)
File *fp = NULL;
CaptureInfo *fc = NULL;
- INIT_FILEHANDLER_ROUTINE(read_open,WTAP_OPEN_NOT_MINE);
+ INIT_FILEHANDLER_ROUTINE(read_open,WTAP_OPEN_ERROR,err,err_info);
create_wth_priv(L, wth);
@@ -174,7 +170,7 @@ wslua_filehandler_open(wtap *wth, int *err, gchar **err_info)
case 0:
retval = (wtap_open_return_val)wslua_optboolint(L,-1,0);
break;
- CASE_ERROR_ERRINFO("read_open")
+ CASE_ERROR("read_open",err,err_info)
}
END_FILEHANDLER_ROUTINE();
@@ -227,9 +223,9 @@ wslua_filehandler_open(wtap *wth, int *err, gchar **err_info)
}
else {
/* not a valid return type */
- g_warning("FileHandler read_open routine returned %d", retval);
if (err) {
*err = WTAP_ERR_INTERNAL;
+ *err_info = g_strdup_printf("FileHandler read_open routine returned %d", retval);
}
retval = WTAP_OPEN_ERROR;
}
@@ -255,7 +251,7 @@ wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
CaptureInfo *fc = NULL;
FrameInfo *fi = NULL;
- INIT_FILEHANDLER_ROUTINE(read,FALSE);
+ INIT_FILEHANDLER_ROUTINE(read,FALSE,err,err_info);
/* Reset errno */
if (err) {
@@ -285,7 +281,7 @@ wslua_filehandler_read(wtap *wth, wtap_rec *rec, Buffer *buf,
}
retval = wslua_optboolint(L,-1,0);
break;
- CASE_ERROR_ERRINFO("read")
+ CASE_ERROR("read",err,err_info)
}
END_FILEHANDLER_ROUTINE();
@@ -313,7 +309,7 @@ wslua_filehandler_seek_read(wtap *wth, gint64 seek_off,
CaptureInfo *fc = NULL;
FrameInfo *fi = NULL;
- INIT_FILEHANDLER_ROUTINE(seek_read,FALSE);
+ INIT_FILEHANDLER_ROUTINE(seek_read,FALSE,err,err_info);
/* Reset errno */
if (err) {
@@ -340,7 +336,7 @@ wslua_filehandler_seek_read(wtap *wth, gint64 seek_off,
*/
retval = lua_toboolean(L, -1);
break;
- CASE_ERROR_ERRINFO("seek_read")
+ CASE_ERROR("seek_read",err,err_info)
}
END_FILEHANDLER_ROUTINE();
@@ -363,7 +359,7 @@ wslua_filehandler_close(wtap *wth)
File *fp = NULL;
CaptureInfo *fc = NULL;
- INIT_FILEHANDLER_ROUTINE(read_close,);
+ INIT_FILEHANDLER_ROUTINE(read_close,,NULL,NULL);
fp = push_File(L, wth->fh);
fc = push_CaptureInfo(L, wth, FALSE);
@@ -371,7 +367,7 @@ wslua_filehandler_close(wtap *wth)
switch ( lua_pcall(L,2,1,1) ) {
case 0:
break;
- CASE_ERROR("read_close")
+ CASE_ERROR("read_close",NULL,NULL)
}
END_FILEHANDLER_ROUTINE();
@@ -395,7 +391,7 @@ wslua_filehandler_sequential_close(wtap *wth)
File *fp = NULL;
CaptureInfo *fc = NULL;
- INIT_FILEHANDLER_ROUTINE(seq_read_close,);
+ INIT_FILEHANDLER_ROUTINE(seq_read_close,,NULL,NULL);
fp = push_File(L, wth->fh);
fc = push_CaptureInfo(L, wth, FALSE);
@@ -403,7 +399,7 @@ wslua_filehandler_sequential_close(wtap *wth)
switch ( lua_pcall(L,2,1,1) ) {
case 0:
break;
- CASE_ERROR("seq_read_close")
+ CASE_ERROR("seq_read_close",NULL,NULL)
}
END_FILEHANDLER_ROUTINE();
@@ -435,7 +431,7 @@ wslua_filehandler_can_write_encap(int encap, void* data)
int retval = WTAP_ERR_UNWRITABLE_ENCAP;
lua_State* L = NULL;
- INIT_FILEHANDLER_ROUTINE(can_write_encap,WTAP_ERR_INTERNAL);
+ INIT_FILEHANDLER_ROUTINE(can_write_encap,WTAP_ERR_UNWRITABLE_ENCAP,NULL,NULL);
lua_pushnumber(L, encap);
@@ -443,7 +439,7 @@ wslua_filehandler_can_write_encap(int encap, void* data)
case 0:
retval = wslua_optboolint(L,-1,WTAP_ERR_UNWRITABLE_ENCAP);
break;
- CASE_ERROR("can_write_encap")
+ CASE_ERROR("can_write_encap",NULL,NULL)
}
END_FILEHANDLER_ROUTINE();
@@ -464,14 +460,14 @@ static gboolean
wslua_filehandler_dump(wtap_dumper *wdh, const wtap_rec *rec,
const guint8 *pd, int *err, gchar **err_info);
static gboolean
-wslua_filehandler_dump_finish(wtap_dumper *wdh, int *err);
+wslua_filehandler_dump_finish(wtap_dumper *wdh, int *err, gchar **err_info);
/* The classic wtap dump_open function.
* This returns 1 (TRUE) on success.
*/
static int
-wslua_filehandler_dump_open(wtap_dumper *wdh, int *err)
+wslua_filehandler_dump_open(wtap_dumper *wdh, int *err, gchar **err_info)
{
FileHandler fh = (FileHandler)(wdh->wslua_data);
int retval = 0;
@@ -479,7 +475,7 @@ wslua_filehandler_dump_open(wtap_dumper *wdh, int *err)
File *fp = NULL;
CaptureInfoConst *fc = NULL;
- INIT_FILEHANDLER_ROUTINE(write_open,0);
+ INIT_FILEHANDLER_ROUTINE(write_open,0,err,err_info);
create_wdh_priv(L, wdh);
@@ -495,7 +491,7 @@ wslua_filehandler_dump_open(wtap_dumper *wdh, int *err)
case 0:
retval = wslua_optboolint(L,-1,0);
break;
- CASE_ERROR("write_open")
+ CASE_ERROR("write_open",err,err_info)
}
END_FILEHANDLER_ROUTINE();
@@ -533,7 +529,7 @@ wslua_filehandler_dump_open(wtap_dumper *wdh, int *err)
*/
static gboolean
wslua_filehandler_dump(wtap_dumper *wdh, const wtap_rec *rec,
- const guint8 *pd, int *err, gchar **err_info _U_)
+ const guint8 *pd, int *err, gchar **err_info)
{
FileHandler fh = (FileHandler)(wdh->wslua_data);
int retval = -1;
@@ -542,7 +538,7 @@ wslua_filehandler_dump(wtap_dumper *wdh, const wtap_rec *rec,
CaptureInfoConst *fc = NULL;
FrameInfoConst *fi = NULL;
- INIT_FILEHANDLER_ROUTINE(write,FALSE);
+ INIT_FILEHANDLER_ROUTINE(write,FALSE,err,err_info);
/* Reset errno */
if (err) {
@@ -558,7 +554,7 @@ wslua_filehandler_dump(wtap_dumper *wdh, const wtap_rec *rec,
case 0:
retval = wslua_optboolint(L,-1,0);
break;
- CASE_ERROR("write")
+ CASE_ERROR("write",err,err_info)
}
END_FILEHANDLER_ROUTINE();
@@ -574,7 +570,7 @@ wslua_filehandler_dump(wtap_dumper *wdh, const wtap_rec *rec,
* writes out the last information cleanly, else FALSE.
*/
static gboolean
-wslua_filehandler_dump_finish(wtap_dumper *wdh, int *err)
+wslua_filehandler_dump_finish(wtap_dumper *wdh, int *err, gchar **err_info)
{
FileHandler fh = (FileHandler)(wdh->wslua_data);
int retval = -1;
@@ -582,7 +578,7 @@ wslua_filehandler_dump_finish(wtap_dumper *wdh, int *err)
File *fp = NULL;
CaptureInfoConst *fc = NULL;
- INIT_FILEHANDLER_ROUTINE(write_close,FALSE);
+ INIT_FILEHANDLER_ROUTINE(write_close,FALSE,err,err_info);
/* Reset errno */
if (err) {
@@ -597,7 +593,7 @@ wslua_filehandler_dump_finish(wtap_dumper *wdh, int *err)
case 0:
retval = wslua_optboolint(L,-1,0);
break;
- CASE_ERROR("write_close")
+ CASE_ERROR("write_close",err,err_info)
}
END_FILEHANDLER_ROUTINE();
diff --git a/extcap/androiddump.c b/extcap/androiddump.c
index a6d838fa41..85eefb87e7 100644
--- a/extcap/androiddump.c
+++ b/extcap/androiddump.c
@@ -449,19 +449,20 @@ static struct extcap_dumper extcap_dumper_open(char *fifo, int encap) {
#else
wtap_dump_params params = WTAP_DUMP_PARAMS_INIT;
int err = 0;
+ gchar *err_info = NULL;
wtap_init(FALSE);
params.encap = encap;
params.snaplen = PACKET_LENGTH;
- extcap_dumper.dumper.wtap = wtap_dump_open(fifo, WTAP_FILE_TYPE_SUBTYPE_PCAP_NSEC, WTAP_UNCOMPRESSED, &params, &err);
+ extcap_dumper.dumper.wtap = wtap_dump_open(fifo, WTAP_FILE_TYPE_SUBTYPE_PCAP_NSEC, WTAP_UNCOMPRESSED, &params, &err, &err_info);
if (!extcap_dumper.dumper.wtap) {
- cfile_dump_open_failure_message("androiddump", fifo, err, WTAP_FILE_TYPE_SUBTYPE_PCAP_NSEC);
+ cfile_dump_open_failure_message("androiddump", fifo, err, err_info, WTAP_FILE_TYPE_SUBTYPE_PCAP_NSEC);
exit(EXIT_CODE_CANNOT_SAVE_WIRETAP_DUMP);
}
extcap_dumper.encap = encap;
if (!wtap_dump_flush(extcap_dumper.dumper.wtap, &err)) {
- cfile_dump_open_failure_message("androiddump", fifo, err, WTAP_FILE_TYPE_SUBTYPE_PCAP_NSEC);
+ cfile_dump_open_failure_message("androiddump", fifo, err, NULL, WTAP_FILE_TYPE_SUBTYPE_PCAP_NSEC);
exit(EXIT_CODE_CANNOT_SAVE_WIRETAP_DUMP);
}
#endif
diff --git a/file.c b/file.c
index 449f336ed1..b43a44183a 100644
--- a/file.c
+++ b/file.c
@@ -1410,7 +1410,8 @@ cf_merge_files_to_tempfile(gpointer pd_window, char **out_filenamep,
break;
case MERGE_ERR_CANT_OPEN_OUTFILE:
- cfile_dump_open_failure_alert_box(*out_filenamep, err, file_type);
+ cfile_dump_open_failure_alert_box(*out_filenamep, err, err_info,
+ file_type);
break;
case MERGE_ERR_CANT_READ_INFILE:
@@ -1429,7 +1430,7 @@ cf_merge_files_to_tempfile(gpointer pd_window, char **out_filenamep,
break;
case MERGE_ERR_CANT_CLOSE_OUTFILE:
- cfile_close_failure_alert_box(*out_filenamep, err);
+ cfile_close_failure_alert_box(*out_filenamep, err, err_info);
break;
default:
@@ -4539,16 +4540,17 @@ cf_save_records(capture_file *cf, const char *fname, guint save_format,
from which we're reading the packets that we're writing!) */
fname_new = g_strdup_printf("%s~", fname);
pdh = wtap_dump_open(fname_new, save_format, compression_type, &params,
- &err);
+ &err, &err_info);
} else {
- pdh = wtap_dump_open(fname, save_format, compression_type, &params, &err);
+ pdh = wtap_dump_open(fname, save_format, compression_type, &params,
+ &err, &err_info);
}
/* XXX idb_inf is documented to be used until wtap_dump_close. */
g_free(params.idb_inf);
params.idb_inf = NULL;
if (pdh == NULL) {
- cfile_dump_open_failure_alert_box(fname, err, save_format);
+ cfile_dump_open_failure_alert_box(fname, err, err_info, save_format);
goto fail;
}
@@ -4571,7 +4573,7 @@ cf_save_records(capture_file *cf, const char *fname, guint save_format,
If we're writing to a temporary file, remove it.
XXX - should we do so even if we're not writing to a
temporary file? */
- wtap_dump_close(pdh, &err);
+ wtap_dump_close(pdh, &err, &err_info);
if (fname_new != NULL)
ws_unlink(fname_new);
cf_callback_invoke(cf_cb_file_save_stopped, NULL);
@@ -4582,14 +4584,14 @@ cf_save_records(capture_file *cf, const char *fname, guint save_format,
If we're writing to a temporary file, remove it. */
if (fname_new != NULL)
ws_unlink(fname_new);
- wtap_dump_close(pdh, &err);
+ wtap_dump_close(pdh, &err, &err_info);
goto fail;
}
needs_reload = wtap_dump_get_needs_reload(pdh);
- if (!wtap_dump_close(pdh, &err)) {
- cfile_close_failure_alert_box(fname, err);
+ if (!wtap_dump_close(pdh, &err, &err_info)) {
+ cfile_close_failure_alert_box(fname, err, err_info);
goto fail;
}
@@ -4764,6 +4766,7 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
{
gchar *fname_new = NULL;
int err;
+ gchar *err_info;
wtap_dumper *pdh;
save_callback_args_t callback_args;
wtap_dump_params params;
@@ -4796,16 +4799,17 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
from which we're reading the packets that we're writing!) */
fname_new = g_strdup_printf("%s~", fname);
pdh = wtap_dump_open(fname_new, save_format, compression_type, &params,
- &err);
+ &err, &err_info);
} else {
- pdh = wtap_dump_open(fname, save_format, compression_type, &params, &err);
+ pdh = wtap_dump_open(fname, save_format, compression_type, &params,
+ &err, &err_info);
}
/* XXX idb_inf is documented to be used until wtap_dump_close. */
g_free(params.idb_inf);
params.idb_inf = NULL;
if (pdh == NULL) {
- cfile_dump_open_failure_alert_box(fname, err, save_format);
+ cfile_dump_open_failure_alert_box(fname, err, err_info, save_format);
goto fail;
}
@@ -4834,7 +4838,7 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
If we're writing to a temporary file, remove it.
XXX - should we do so even if we're not writing to a
temporary file? */
- wtap_dump_close(pdh, &err);
+ wtap_dump_close(pdh, &err, &err_info);
if (fname_new != NULL)
ws_unlink(fname_new);
return CF_WRITE_ABORTED;
@@ -4845,12 +4849,12 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
If we're writing to a temporary file, remove it. */
if (fname_new != NULL)
ws_unlink(fname_new);
- wtap_dump_close(pdh, &err);
+ wtap_dump_close(pdh, &err, &err_info);
goto fail;
}
- if (!wtap_dump_close(pdh, &err)) {
- cfile_close_failure_alert_box(fname, err);
+ if (!wtap_dump_close(pdh, &err, &err_info)) {
+ cfile_close_failure_alert_box(fname, err, err_info);
goto fail;
}
diff --git a/mergecap.c b/mergecap.c
index 6e8414dd20..94563a33a9 100644
--- a/mergecap.c
+++ b/mergecap.c
@@ -410,7 +410,8 @@ main(int argc, char *argv[])
break;
case MERGE_ERR_CANT_OPEN_OUTFILE:
- cfile_dump_open_failure_message("mergecap", out_filename, err, file_type);
+ cfile_dump_open_failure_message("mergecap", out_filename, err, err_info,
+ file_type);
break;
case MERGE_ERR_CANT_READ_INFILE:
@@ -430,7 +431,7 @@ main(int argc, char *argv[])
break;
case MERGE_ERR_CANT_CLOSE_OUTFILE:
- cfile_close_failure_message(out_filename, err);
+ cfile_close_failure_message(out_filename, err, err_info);
break;
default:
diff --git a/randpkt_core/randpkt_core.c b/randpkt_core/randpkt_core.c
index 9fbe22d31e..d43d095bba 100644
--- a/randpkt_core/randpkt_core.c
+++ b/randpkt_core/randpkt_core.c
@@ -641,10 +641,11 @@ void randpkt_loop(randpkt_example* example, guint64 produce_count, guint64 packe
gboolean randpkt_example_close(randpkt_example* example)
{
int err;
+ gchar *err_info;
gboolean ok = TRUE;
- if (!wtap_dump_close(example->dump, &err)) {
- cfile_close_failure_message(example->filename, err);
+ if (!wtap_dump_close(example->dump, &err, &err_info)) {
+ cfile_close_failure_message(example->filename, err, err_info);
ok = FALSE;
}
@@ -659,6 +660,7 @@ gboolean randpkt_example_close(randpkt_example* example)
int randpkt_example_init(randpkt_example* example, char* produce_filename, int produce_max_bytes)
{
int err;
+ gchar *err_info;
if (pkt_rand == NULL) {
pkt_rand = g_rand_new();
@@ -671,16 +673,16 @@ int randpkt_example_init(randpkt_example* example, char* produce_filename, int p
if (strcmp(produce_filename, "-") == 0) {
/* Write to the standard output. */
example->dump = wtap_dump_open_stdout(WTAP_FILE_TYPE_SUBTYPE_PCAP,
- WTAP_UNCOMPRESSED, &params, &err);
+ WTAP_UNCOMPRESSED, &params, &err, &err_info);
example->filename = "the standard output";
} else {
example->dump = wtap_dump_open(produce_filename, WTAP_FILE_TYPE_SUBTYPE_PCAP,
- WTAP_UNCOMPRESSED, &params, &err);
+ WTAP_UNCOMPRESSED, &params, &err, &err_info);
example->filename = produce_filename;
}
if (!example->dump) {
cfile_dump_open_failure_message("randpkt", produce_filename,
- err, WTAP_FILE_TYPE_SUBTYPE_PCAP);
+ err, err_info, WTAP_FILE_TYPE_SUBTYPE_PCAP);
return WRITE_ERROR;
}
diff --git a/reordercap.c b/reordercap.c
index 953bd27e4b..291bcb11be 100644
--- a/reordercap.c
+++ b/reordercap.c
@@ -264,15 +264,17 @@ main(int argc, char *argv[])
/* Open outfile (same filetype/encap as input file) */
if (strcmp(outfile, "-") == 0) {
- pdh = wtap_dump_open_stdout(wtap_file_type_subtype(wth), WTAP_UNCOMPRESSED, &params, &err);
+ pdh = wtap_dump_open_stdout(wtap_file_type_subtype(wth),
+ WTAP_UNCOMPRESSED, &params, &err, &err_info);
} else {
- pdh = wtap_dump_open(outfile, wtap_file_type_subtype(wth), WTAP_UNCOMPRESSED, &params, &err);
+ pdh = wtap_dump_open(outfile, wtap_file_type_subtype(wth),
+ WTAP_UNCOMPRESSED, &params, &err, &err_info);
}
g_free(params.idb_inf);
params.idb_inf = NULL;
if (pdh == NULL) {
- cfile_dump_open_failure_message("reordercap", outfile, err,
+ cfile_dump_open_failure_message("reordercap", outfile, err, err_info,
wtap_file_type_subtype(wth));
wtap_dump_params_cleanup(&params);
ret = OUTPUT_FILE_ERROR;
@@ -341,8 +343,8 @@ main(int argc, char *argv[])
g_ptr_array_free(frames, TRUE);
/* Close outfile */
- if (!wtap_dump_close(pdh, &err)) {
- cfile_close_failure_message(outfile, err);
+ if (!wtap_dump_close(pdh, &err, &err_info)) {
+ cfile_close_failure_message(outfile, err, err_info);
wtap_dump_params_cleanup(&params);
ret = OUTPUT_FILE_ERROR;
goto clean_exit;
diff --git a/tshark.c b/tshark.c
index d3e78fff3a..f2b91b7b44 100644
--- a/tshark.c
+++ b/tshark.c
@@ -712,6 +712,8 @@ main(int argc, char *argv[])
gboolean arg_error = FALSE;
int err;
+ gchar *err_info;
+ gboolean exp_pdu_status;
volatile process_file_status_t status;
volatile gboolean draw_taps = FALSE;
volatile int exit_status = EXIT_SUCCESS;
@@ -2009,10 +2011,12 @@ main(int argc, char *argv[])
/* Activate the export PDU tap */
comment = g_strdup_printf("Dump of PDUs from %s", cf_name);
- err = exp_pdu_open(&exp_pdu_tap_data, exp_fd, comment);
+ exp_pdu_status = exp_pdu_open(&exp_pdu_tap_data, exp_fd, comment,
+ &err, &err_info);
g_free(comment);
- if (err != 0) {
- cfile_dump_open_failure_message("TShark", exp_pdu_filename, err,
+ if (!exp_pdu_status) {
+ cfile_dump_open_failure_message("TShark", exp_pdu_filename,
+ err, err_info,
WTAP_FILE_TYPE_SUBTYPE_PCAPNG);
exit_status = INVALID_EXPORT;
goto clean_exit;
@@ -2098,9 +2102,8 @@ main(int argc, char *argv[])
}
if (pdu_export_arg) {
- err = exp_pdu_close(&exp_pdu_tap_data);
- if (err) {
- cfile_close_failure_message(exp_pdu_filename, err);
+ if (!exp_pdu_close(&exp_pdu_tap_data, &err, &err_info)) {
+ cfile_close_failure_message(exp_pdu_filename, err, err_info);
exit_status = 2;
}
g_free(pdu_export_arg);
@@ -3481,10 +3484,10 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
if (strcmp(save_file, "-") == 0) {
/* Write to the standard output. */
pdh = wtap_dump_open_stdout(out_file_type, WTAP_UNCOMPRESSED, &params,
- &err);
+ &err, &err_info);
} else {
pdh = wtap_dump_open(save_file, out_file_type, WTAP_UNCOMPRESSED, &params,
- &err);
+ &err, &err_info);
}
g_free(params.idb_inf);
@@ -3492,7 +3495,8 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
if (pdh == NULL) {
/* We couldn't set up to write to the capture file. */
- cfile_dump_open_failure_message("TShark", save_file, err, out_file_type);
+ cfile_dump_open_failure_message("TShark", save_file, err, err_info,
+ out_file_type);
status = PROCESS_FILE_NO_FILE_PROCESSED;
goto out;
}
@@ -3667,14 +3671,15 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
}
}
/* Now close the capture file. */
- if (!wtap_dump_close(pdh, &err)) {
- cfile_close_failure_message(save_file, err);
+ if (!wtap_dump_close(pdh, &err, &err_info)) {
+ cfile_close_failure_message(save_file, err, err_info);
status = PROCESS_FILE_ERROR;
}
} else {
/* We got a write error; it was reported, so just close the dump file
without bothering to check for further errors. */
- wtap_dump_close(pdh, &err);
+ wtap_dump_close(pdh, &err, &err_info);
+ g_free(err_info);
status = PROCESS_FILE_ERROR;
}
} else {
diff --git a/ui/alert_box.c b/ui/alert_box.c
index 93c051d74f..1f4a304035 100644
--- a/ui/alert_box.c
+++ b/ui/alert_box.c
@@ -49,7 +49,7 @@ vwarning_alert_box(const char *msg_format, va_list ap)
* Alert box for a failed attempt to open a capture file for reading.
* "filename" is the name of the file being opened; "err" is assumed
* to be a UNIX-style errno or a WTAP_ERR_ value; "err_info" is assumed
- * to be a string giving further information for some WTAP_ERR_ values..
+ * to be a string giving further information for some WTAP_ERR_ values.
*
* XXX - add explanatory secondary text for at least some of the errors;
* various HIGs suggest that you should, for example, suggest that the
@@ -131,6 +131,14 @@ cfile_open_failure_alert_box(const char *filename, int err, gchar *err_info)
g_free(err_info);
break;
+ case WTAP_ERR_INTERNAL:
+ simple_error_message_box(
+ "An internal error occurred opening the file \"%s\".\n"
+ "(%s)", display_basename,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
case WTAP_ERR_DECOMPRESSION_NOT_SUPPORTED:
simple_error_message_box(
"The file \"%s\" cannot be decompressed; it is compressed in a way that we don't support.\n"
@@ -156,9 +164,10 @@ cfile_open_failure_alert_box(const char *filename, int err, gchar *err_info)
/*
* Alert box for a failed attempt to open a capture file for writing.
* "filename" is the name of the file being opened; "err" is assumed
- * to be a UNIX-style errno or a WTAP_ERR_ value; "file_type_subtype"
- * is a WTAP_FILE_TYPE_SUBTYPE_ value for the type and subtype of file
- * being opened.
+ * to be a UNIX-style errno or a WTAP_ERR_ value; "err_info" is assumed
+ * to be a string giving further information for some WTAP_ERR_ values;
+ * "file_type_subtype" is a WTAP_FILE_TYPE_SUBTYPE_ value for the type
+ * and subtype of file being opened.
*
* XXX - add explanatory secondary text for at least some of the errors;
* various HIGs suggest that you should, for example, suggest that the
@@ -168,7 +177,7 @@ cfile_open_failure_alert_box(const char *filename, int err, gchar *err_info)
*/
void
cfile_dump_open_failure_alert_box(const char *filename, int err,
- int file_type_subtype)
+ gchar *err_info, int file_type_subtype)
{
gchar *display_basename;
@@ -221,6 +230,15 @@ cfile_dump_open_failure_alert_box(const char *filename, int err,
"This file type cannot be written as a compressed file.");
break;
+ case WTAP_ERR_INTERNAL:
+ simple_error_message_box(
+ "An internal error occurred creating the file \"%s\".\n"
+ "(%s)",
+ display_basename,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
default:
simple_error_message_box(
"The file \"%s\" could not be created: %s.",
@@ -291,6 +309,14 @@ cfile_read_failure_alert_box(const char *filename, int err, gchar *err_info)
g_free(err_info);
break;
+ case WTAP_ERR_INTERNAL:
+ simple_error_message_box(
+ "An internal error occurred while reading the %s.\n(%s)",
+ display_name,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
case WTAP_ERR_DECOMPRESSION_NOT_SUPPORTED:
simple_error_message_box(
"The %s cannot be decompressed; it is compressed in a way that we don't support.\n"
@@ -362,6 +388,16 @@ cfile_write_failure_alert_box(const char *in_filename, const char *out_filename,
wtap_file_type_subtype_string(file_type_subtype));
break;
+ case WTAP_ERR_INTERNAL:
+ out_display_basename = g_filename_display_basename(out_filename);
+ simple_error_message_box(
+ "An internal error occurred while writing to the file \"%s\".\n(%s)",
+ out_display_basename,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(out_display_basename);
+ g_free(err_info);
+ break;
+
case WTAP_ERR_PACKET_TOO_LARGE:
/*
* This is a problem with the particular frame we're writing and
@@ -426,7 +462,9 @@ cfile_write_failure_alert_box(const char *in_filename, const char *out_filename,
/*
* Alert box for a failed attempt to close a capture file.
- * "err" is assumed to be a UNIX-style errno or a WTAP_ERR_ value.
+ * "err" is assumed to be a UNIX-style errno or a WTAP_ERR_ value;
+ * "err_info" is assumed to be a string giving further information for
+ * some WTAP_ERR_ values.
*
* When closing a capture file:
*
@@ -453,7 +491,7 @@ cfile_write_failure_alert_box(const char *in_filename, const char *out_filename,
* typical Wireshark user is, but....
*/
void
-cfile_close_failure_alert_box(const char *filename, int err)
+cfile_close_failure_alert_box(const char *filename, int err, gchar *err_info)
{
gchar *display_basename;
@@ -474,6 +512,15 @@ cfile_close_failure_alert_box(const char *filename, int err)
display_basename);
break;
+ case WTAP_ERR_INTERNAL:
+ simple_error_message_box(
+ "An internal error occurred closing the file \"%s\".\n"
+ "(%s)",
+ display_basename,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
default:
simple_error_message_box(
"An error occurred while closing the file \"%s\": %s.",
@@ -530,8 +577,7 @@ read_failure_alert_box(const char *filename, int err)
/*
* Alert box for a failed attempt to write to a file.
- * "err" is assumed to be a UNIX-style errno if positive and a
- * Wiretap error if negative.
+ * "err" is assumed to be a UNIX-style errno.
*
* XXX - add explanatory secondary text for at least some of the errors;
* various HIGs suggest that you should, for example, suggest that the
@@ -545,25 +591,8 @@ write_failure_alert_box(const char *filename, int err)
gchar *display_basename;
display_basename = g_filename_display_basename(filename);
- if (err < 0) {
- switch (err) {
-
- case WTAP_ERR_SHORT_WRITE:
- simple_message_box(ESD_TYPE_ERROR, NULL, NULL,
- "A full write couldn't be done to the file \"%s\".",
- display_basename);
- break;
-
- default:
- simple_message_box(ESD_TYPE_ERROR, NULL, NULL,
- "An error occurred while writing to the file \"%s\": %s.",
- display_basename, wtap_strerror(err));
- break;
- }
- } else {
- simple_message_box(ESD_TYPE_ERROR, NULL, NULL,
- file_write_error_message(err), display_basename);
- }
+ simple_message_box(ESD_TYPE_ERROR, NULL, NULL,
+ file_write_error_message(err), display_basename);
g_free(display_basename);
}
diff --git a/ui/alert_box.h b/ui/alert_box.h
index 169f3fb944..23fe1434f4 100644
--- a/ui/alert_box.h
+++ b/ui/alert_box.h
@@ -39,11 +39,13 @@ extern void cfile_open_failure_alert_box(const char *filename, int err,
/*
* Alert box for a failed attempt to open a capture file for writing.
* "filename" is the name of the file being opened; "err" is assumed
- * to be a UNIX-style errno or a WTAP_ERR_ value; "file_type_subtype"
- * is a WTAP_FILE_TYPE_SUBTYPE_ value for the type and subtype of file
- * being opened.
+ * to be a UNIX-style errno or a WTAP_ERR_ value; "err_info" is assumed
+ * to be a string giving further information for some WTAP_ERR_ values;
+ * "file_type_subtype" is a WTAP_FILE_TYPE_SUBTYPE_ value for the type
+ * and subtype of file being opened.
*/
extern void cfile_dump_open_failure_alert_box(const char *filename, int err,
+ gchar *err_info,
int file_type_subtype);
/*
@@ -74,7 +76,9 @@ extern void cfile_write_failure_alert_box(const char *in_filename,
/*
* Alert box for a failed attempt to close a capture file.
- * "err" is assumed to be a UNIX-style errno or a WTAP_ERR_ value.
+ * "err" is assumed to be a UNIX-style errno or a WTAP_ERR_ value;
+ * "err_info" is assumed to be a string giving further information for
+ * some WTAP_ERR_ values.
*
* When closing a capture file:
*
@@ -94,7 +98,8 @@ extern void cfile_write_failure_alert_box(const char *in_filename,
*
* so we have to check for write errors here.
*/
-extern void cfile_close_failure_alert_box(const char *filename, int err);
+extern void cfile_close_failure_alert_box(const char *filename, int err,
+ gchar *err_info);
/*
* Alert box for a failed attempt to open or create a file.
diff --git a/ui/capture.c b/ui/capture.c
index d8bd0723b8..22ebc96984 100644
--- a/ui/capture.c
+++ b/ui/capture.c
@@ -370,6 +370,20 @@ cf_open_error_message(int err, gchar *err_info, gboolean for_writing,
errmsg = errmsg_errno;
break;
+ case WTAP_ERR_INTERNAL:
+ if (for_writing) {
+ g_snprintf(errmsg_errno, sizeof(errmsg_errno),
+ "An internal error occurred creating the file \"%%s\".\n"
+ "(%s)", err_info != NULL ? err_info : "no information supplied");
+ } else {
+ g_snprintf(errmsg_errno, sizeof(errmsg_errno),
+ "An internal error occurred opening the file \"%%s\".\n"
+ "(%s)", err_info != NULL ? err_info : "no information supplied");
+ }
+ g_free(err_info);
+ errmsg = errmsg_errno;
+ break;
+
case WTAP_ERR_DECOMPRESSION_NOT_SUPPORTED:
g_snprintf(errmsg_errno, sizeof(errmsg_errno),
"We don't support the form of compression used by the compressed file \"%%s\".\n"
diff --git a/ui/export_pdu_ui_utils.c b/ui/export_pdu_ui_utils.c
index febf541629..f20170f78b 100644
--- a/ui/export_pdu_ui_utils.c
+++ b/ui/export_pdu_ui_utils.c
@@ -35,7 +35,9 @@ exp_pdu_file_open(exp_pdu_t *exp_pdu_tap_data)
{
int import_file_fd;
char *capfile_name, *comment;
+ gboolean status;
int err;
+ gchar *err_info;
/* Choose a random name for the temporary import buffer */
GError *err_tempfile = NULL;
@@ -47,20 +49,21 @@ exp_pdu_file_open(exp_pdu_t *exp_pdu_tap_data)
}
comment = g_strdup_printf("Dump of PDUs from %s", cfile.filename);
- err = exp_pdu_open(exp_pdu_tap_data, import_file_fd, comment);
+ status = exp_pdu_open(exp_pdu_tap_data, import_file_fd, comment, &err,
+ &err_info);
g_free(comment);
- if (err != 0) {
+ if (!status) {
cfile_dump_open_failure_alert_box(capfile_name ? capfile_name : "temporary file",
- err, WTAP_FILE_TYPE_SUBTYPE_PCAPNG);
+ err, err_info,
+ WTAP_FILE_TYPE_SUBTYPE_PCAPNG);
goto end;
}
/* Run the tap */
cf_retap_packets(&cfile);
- err = exp_pdu_close(exp_pdu_tap_data);
- if (err!= 0) {
- cfile_close_failure_alert_box(capfile_name, err);
+ if (!exp_pdu_close(exp_pdu_tap_data, &err, &err_info)) {
+ cfile_close_failure_alert_box(capfile_name, err, err_info);
}
/* XXX: should this use the open_routine type in the cfile instead of WTAP_TYPE_AUTO? */
diff --git a/ui/failure_message.c b/ui/failure_message.c
index 0d97f6d17d..206f96286d 100644
--- a/ui/failure_message.c
+++ b/ui/failure_message.c
@@ -124,6 +124,14 @@ cfile_open_failure_message(const char *progname, const char *filename,
g_free(err_info);
break;
+ case WTAP_ERR_INTERNAL:
+ cmdarg_err("An internal error occurred opening the %s.\n"
+ "(%s)",
+ file_description,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
case WTAP_ERR_DECOMPRESSION_NOT_SUPPORTED:
cmdarg_err("The %s cannot be decompressed; it is compressed in a way that we don't support."
"(%s)",
@@ -147,13 +155,15 @@ cfile_open_failure_message(const char *progname, const char *filename,
* Error message for a failed attempt to open a capture file for writing.
* "progname" is the name of the program trying to open the file;
* "filename" is the name of the file being opened; "err" is assumed
- * to be a UNIX-style errno or a WTAP_ERR_ value; "file_type_subtype" is
- * a WTAP_FILE_TYPE_SUBTYPE_ value for the type and subtype of file being
- * opened.
+ * to be a UNIX-style errno or a WTAP_ERR_ value; "err_info" is assumed
+ * to be a string giving further information for some WTAP_ERR_ values;
+ * "file_type_subtype" is a WTAP_FILE_TYPE_SUBTYPE_ value for the type
+ * and subtype of file being opened.
*/
void
cfile_dump_open_failure_message(const char *progname, const char *filename,
- int err, int file_type_subtype)
+ int err, gchar *err_info,
+ int file_type_subtype)
{
if (err < 0) {
/*
@@ -204,6 +214,14 @@ cfile_dump_open_failure_message(const char *progname, const char *filename,
cmdarg_err("This file type cannot be written as a compressed file.");
break;
+ case WTAP_ERR_INTERNAL:
+ cmdarg_err("An internal error occurred creating the %s.\n"
+ "(%s)",
+ file_description,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
default:
cmdarg_err("The %s could not be created: %s.",
file_description,
@@ -262,6 +280,13 @@ cfile_read_failure_message(const char *progname, const char *filename,
g_free(err_info);
break;
+ case WTAP_ERR_INTERNAL:
+ cmdarg_err("An internal error occurred while reading the %s.\n(%s)",
+ file_string,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
case WTAP_ERR_DECOMPRESSION_NOT_SUPPORTED:
cmdarg_err("The %s cannot be decompressed; it is compressed in a way that we don't support.\n"
"(%s)",
@@ -372,6 +397,13 @@ cfile_write_failure_message(const char *progname, const char *in_filename,
g_free(err_info);
break;
+ case WTAP_ERR_INTERNAL:
+ cmdarg_err("An internal error occurred while writing the %s.\n(%s)",
+ out_file_string,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
case ENOSPC:
cmdarg_err("Not all the packets could be written to the %s because there is "
"no space left on the file system.",
@@ -403,7 +435,8 @@ cfile_write_failure_message(const char *progname, const char *in_filename,
/*
* Error message for a failed attempt to close a capture file.
* "filename" is the name of the file being closed; "err" is assumed
- * to be a UNIX-style errno or a WTAP_ERR_ value.
+ * to be a UNIX-style errno or a WTAP_ERR_ value; "err_info" is assumed
+ * to be a string giving further information for some WTAP_ERR_ values.
*
* When closing a capture file:
*
@@ -424,7 +457,7 @@ cfile_write_failure_message(const char *progname, const char *in_filename,
* so we have to check for write errors here.
*/
void
-cfile_close_failure_message(const char *filename, int err)
+cfile_close_failure_message(const char *filename, int err, gchar *err_info)
{
char *file_string;
@@ -457,6 +490,14 @@ cfile_close_failure_message(const char *filename, int err)
file_string);
break;
+ case WTAP_ERR_INTERNAL:
+ cmdarg_err("An internal error occurred closing the file \"%s\".\n"
+ "(%s)",
+ file_string,
+ err_info != NULL ? err_info : "no information supplied");
+ g_free(err_info);
+ break;
+
default:
cmdarg_err("An error occurred while closing the file %s: %s.",
file_string, wtap_strerror(err));
diff --git a/ui/failure_message.h b/ui/failure_message.h
index d865d44335..d0a7bee14e 100644
--- a/ui/failure_message.h
+++ b/ui/failure_message.h
@@ -28,15 +28,16 @@ extern void cfile_open_failure_message(const char *progname,
gchar *err_info);
/*
- * Error message for a failed attempt to open a capture file for writing.
* "progname" is the name of the program trying to open the file;
* "filename" is the name of the file being opened; "err" is assumed
- * to be a UNIX-style errno or a WTAP_ERR_ value; "file_type_subtype" is
- * a WTAP_FILE_TYPE_SUBTYPE_ value for the type and subtype of file being
- * opened.
+ * to be a UNIX-style errno or a WTAP_ERR_ value; "err_info" is assumed
+ * to be a string giving further information for some WTAP_ERR_ values;
+ * "file_type_subtype" is a WTAP_FILE_TYPE_SUBTYPE_ value for the type
+ * and subtype of file being opened.
*/
extern void cfile_dump_open_failure_message(const char *progname,
const char *filename, int err,
+ gchar *err_info,
int file_type_subtype);
/*
@@ -72,7 +73,8 @@ extern void cfile_write_failure_message(const char *progname,
/*
* Error message for a failed attempt to close a capture file.
* "filename" is the name of the file being closed; "err" is assumed
- * to be a UNIX-style errno or a WTAP_ERR_ value.
+ * to be a UNIX-style errno or a WTAP_ERR_ value; "err_info" is assumed
+ * to be a string giving further information for some WTAP_ERR_ values.
*
* When closing a capture file:
*
@@ -92,7 +94,8 @@ extern void cfile_write_failure_message(const char *progname,
*
* so we have to check for write errors here.
*/
-extern void cfile_close_failure_message(const char *filename, int err);
+extern void cfile_close_failure_message(const char *filename, int err,
+ gchar *err_info);
#ifdef __cplusplus
}
diff --git a/ui/qt/import_text_dialog.cpp b/ui/qt/import_text_dialog.cpp
index 579d8aedb4..886574b782 100644
--- a/ui/qt/import_text_dialog.cpp
+++ b/ui/qt/import_text_dialog.cpp
@@ -118,6 +118,7 @@ QString &ImportTextDialog::capfileName() {
void ImportTextDialog::convertTextFile() {
char *tmpname;
int err;
+ gchar *err_info;
wtap_dump_params params;
capfile_name_.clear();
@@ -126,12 +127,12 @@ void ImportTextDialog::convertTextFile() {
params.snaplen = import_info_.max_frame_length;
params.tsprec = WTAP_TSPREC_USEC; /* XXX - support other precisions? */
/* Use a random name for the temporary import buffer */
- import_info_.wdh = wtap_dump_open_tempfile(&tmpname, "import", WTAP_FILE_TYPE_SUBTYPE_PCAPNG, WTAP_UNCOMPRESSED, &params, &err);
+ import_info_.wdh = wtap_dump_open_tempfile(&tmpname, "import", WTAP_FILE_TYPE_SUBTYPE_PCAPNG, WTAP_UNCOMPRESSED, &params, &err, &err_info);
capfile_name_.append(tmpname ? tmpname : "temporary file");
g_free(tmpname);
qDebug() << capfile_name_ << ":" << import_info_.wdh << import_info_.encapsulation << import_info_.max_frame_length;
if (import_info_.wdh == NULL) {
- cfile_dump_open_failure_alert_box(capfile_name_.toUtf8().constData(), err, WTAP_FILE_TYPE_SUBTYPE_PCAP);
+ cfile_dump_open_failure_alert_box(capfile_name_.toUtf8().constData(), err, err_info, WTAP_FILE_TYPE_SUBTYPE_PCAP);
fclose(import_info_.import_text_file);
setResult(QDialog::Rejected);
return;
@@ -150,9 +151,9 @@ void ImportTextDialog::convertTextFile() {
read_failure_alert_box(import_info_.import_text_filename, errno);
}
- if (!wtap_dump_close(import_info_.wdh, &err))
+ if (!wtap_dump_close(import_info_.wdh, &err, &err_info))
{
- cfile_close_failure_alert_box(capfile_name_.toUtf8().constData(), err);
+ cfile_close_failure_alert_box(capfile_name_.toUtf8().constData(), err, err_info);
}
}
diff --git a/ui/tap_export_pdu.c b/ui/tap_export_pdu.c
index b2a299b74a..0b54cdff5c 100644
--- a/ui/tap_export_pdu.c
+++ b/ui/tap_export_pdu.c
@@ -84,12 +84,10 @@ export_pdu_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt, const
return TAP_PACKET_DONT_REDRAW; /* Do not redraw */
}
-int
-exp_pdu_open(exp_pdu_t *exp_pdu_tap_data, int fd, const char *comment)
+gboolean
+exp_pdu_open(exp_pdu_t *exp_pdu_tap_data, int fd, const char *comment, int *err,
+ gchar **err_info)
{
-
- int err;
-
/* pcapng defs */
wtap_block_t shb_hdr;
wtap_block_t int_data;
@@ -150,31 +148,29 @@ exp_pdu_open(exp_pdu_t *exp_pdu_tap_data, int fd, const char *comment)
};
if (fd == 1) {
exp_pdu_tap_data->wdh = wtap_dump_open_stdout(WTAP_FILE_TYPE_SUBTYPE_PCAPNG,
- WTAP_UNCOMPRESSED, &params, &err);
+ WTAP_UNCOMPRESSED, &params, err, err_info);
} else {
exp_pdu_tap_data->wdh = wtap_dump_fdopen(fd, WTAP_FILE_TYPE_SUBTYPE_PCAPNG,
- WTAP_UNCOMPRESSED, &params, &err);
- }
- if (exp_pdu_tap_data->wdh == NULL) {
- g_assert(err != 0);
- return err;
+ WTAP_UNCOMPRESSED, &params, err, err_info);
}
+ if (exp_pdu_tap_data->wdh == NULL)
+ return FALSE;
- return 0;
+ return TRUE;
}
-int
-exp_pdu_close(exp_pdu_t *exp_pdu_tap_data)
+gboolean
+exp_pdu_close(exp_pdu_t *exp_pdu_tap_data, int *err, gchar **err_info)
{
- int err = 0;
- if (!wtap_dump_close(exp_pdu_tap_data->wdh, &err))
- g_assert(err != 0);
+ gboolean status;
+
+ status = wtap_dump_close(exp_pdu_tap_data->wdh, err, err_info);
wtap_block_array_free(exp_pdu_tap_data->shb_hdrs);
wtap_free_idb_info(exp_pdu_tap_data->idb_inf);
remove_tap_listener(exp_pdu_tap_data);
- return err;
+ return status;
}
diff --git a/ui/tap_export_pdu.h b/ui/tap_export_pdu.h
index 9ae2dea65f..133abd43ff 100644
--- a/ui/tap_export_pdu.h
+++ b/ui/tap_export_pdu.h
@@ -39,12 +39,16 @@ char *exp_pdu_pre_open(const char *tap_name, const char *filter,
* Use the given file descriptor for writing an output file. Can only be called
* once and exp_pdu_pre_open() must be called before.
*
-* @return 0 on success or a wtap error code.
+* @param[out] err Will be set to an error code on failure.
+* @param[out] err_info for some errors, a string giving more details of
+* the error
+* @return TRUE on success or FALSE on failure.
*/
-int exp_pdu_open(exp_pdu_t *data, int fd, const char *comment);
+gboolean exp_pdu_open(exp_pdu_t *data, int fd, const char *comment, int *err,
+ gchar **err_info);
/* Stops the PDUs export. */
-int exp_pdu_close(exp_pdu_t *exp_pdu_tap_data);
+gboolean exp_pdu_close(exp_pdu_t *exp_pdu_tap_data, int *err, gchar **err_info);
#ifdef __cplusplus
}
diff --git a/wiretap/5views.c b/wiretap/5views.c
index c9486e1efd..b383884a1a 100644
--- a/wiretap/5views.c
+++ b/wiretap/5views.c
@@ -93,7 +93,7 @@ static int _5views_read_header(wtap *wth, FILE_T fh, t_5VW_TimeStamped_Header *h
wtap_rec *rec, int *err, gchar **err_info);
static gboolean _5views_dump(wtap_dumper *wdh, const wtap_rec *rec, const guint8 *pd, int *err, gchar **err_info);
-static gboolean _5views_dump_finish(wtap_dumper *wdh, int *err);
+static gboolean _5views_dump_finish(wtap_dumper *wdh, int *err, gchar **err_info);
wtap_open_return_val
@@ -321,7 +321,7 @@ int _5views_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
-gboolean _5views_dump_open(wtap_dumper *wdh, int *err)
+gboolean _5views_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
_5views_dump_t *_5views;
@@ -401,7 +401,7 @@ static gboolean _5views_dump(wtap_dumper *wdh,
return TRUE;
}
-static gboolean _5views_dump_finish(wtap_dumper *wdh, int *err)
+static gboolean _5views_dump_finish(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
_5views_dump_t *_5views = (_5views_dump_t *)wdh->priv;
t_5VW_Capture_Header file_hdr;
diff --git a/wiretap/5views.h b/wiretap/5views.h
index 395680f4ce..62be2a9a3b 100644
--- a/wiretap/5views.h
+++ b/wiretap/5views.h
@@ -12,7 +12,7 @@
#include "wtap.h"
wtap_open_return_val _5views_open(wtap *wth, int *err, gchar **err_info);
-gboolean _5views_dump_open(wtap_dumper *wdh, int *err);
+gboolean _5views_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int _5views_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/btsnoop.c b/wiretap/btsnoop.c
index bc63f6eb88..fc567e8f22 100644
--- a/wiretap/btsnoop.c
+++ b/wiretap/btsnoop.c
@@ -409,7 +409,7 @@ static gboolean btsnoop_dump_h4(wtap_dumper *wdh,
}
/* FIXME: How do we support multiple backends?*/
-gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, int *err)
+gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
struct btsnoop_hdr file_hdr;
@@ -437,7 +437,7 @@ gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, int *err)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
-gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, int *err)
+gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
struct btsnoop_hdr file_hdr;
diff --git a/wiretap/btsnoop.h b/wiretap/btsnoop.h
index e255d9b823..7d1ac912b8 100644
--- a/wiretap/btsnoop.h
+++ b/wiretap/btsnoop.h
@@ -12,8 +12,8 @@
#include "ws_symbol_export.h"
wtap_open_return_val btsnoop_open(wtap *wth, int *err, gchar **err_info);
-gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, int *err);
-gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, int *err);
+gboolean btsnoop_dump_open_h1(wtap_dumper *wdh, int *err, gchar **err_info);
+gboolean btsnoop_dump_open_h4(wtap_dumper *wdh, int *err, gchar **err_info);
int btsnoop_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/camins.c b/wiretap/camins.c
index 7f0f350701..bc43774934 100644
--- a/wiretap/camins.c
+++ b/wiretap/camins.c
@@ -313,19 +313,19 @@ read_packet_data(FILE_T fh, guint8 dat_trans_type, guint8 *buf, guint16 dat_len,
/* create a DVB-CI pseudo header
return its length or -1 for error */
static gint
-create_pseudo_hdr(guint8 *buf, guint8 dat_trans_type, guint16 dat_len)
+create_pseudo_hdr(guint8 *buf, guint8 dat_trans_type, guint16 dat_len,
+ gchar **err_info)
{
- if (!buf)
- return -1;
-
buf[0] = DVB_CI_PSEUDO_HDR_VER;
if (dat_trans_type==TRANS_CAM_HOST)
buf[1] = DVB_CI_PSEUDO_HDR_CAM_TO_HOST;
else if (dat_trans_type==TRANS_HOST_CAM)
buf[1] = DVB_CI_PSEUDO_HDR_HOST_TO_CAM;
- else
+ else {
+ *err_info = g_strdup_printf("camins: invalid dat_trans_type %u", dat_trans_type);
return -1;
+ }
buf[2] = (dat_len>>8) & 0xFF;
buf[3] = dat_len & 0xFF;
@@ -355,12 +355,12 @@ camins_read_packet(FILE_T fh, wtap_rec *rec, Buffer *buf,
ws_buffer_assure_space(buf, DVB_CI_PSEUDO_HDR_LEN+dat_len);
p = ws_buffer_start_ptr(buf);
- /* NULL check for p is done in create_pseudo_hdr() */
- offset = create_pseudo_hdr(p, dat_trans_type, dat_len);
+ offset = create_pseudo_hdr(p, dat_trans_type, dat_len, err_info);
if (offset<0) {
/* shouldn't happen, all invalid packets must be detected by
find_next_pkt_info() */
*err = WTAP_ERR_INTERNAL;
+ /* create_pseudo_hdr() set err_info appropriately */
return FALSE;
}
diff --git a/wiretap/capsa.c b/wiretap/capsa.c
index 26898b9a55..55b027640c 100644
--- a/wiretap/capsa.c
+++ b/wiretap/capsa.c
@@ -365,6 +365,7 @@ capsa_read_packet(wtap *wth, FILE_T fh, wtap_rec *rec,
default:
g_assert_not_reached();
*err = WTAP_ERR_INTERNAL;
+ *err_info = g_strdup_printf("capsa: format indicator is %u", capsa->format_indicator);
return -1;
}
if (orig_size > WTAP_MAX_PACKET_SIZE_STANDARD) {
diff --git a/wiretap/catapult_dct2000.c b/wiretap/catapult_dct2000.c
index 1a412395fd..8e10caf6ce 100644
--- a/wiretap/catapult_dct2000.c
+++ b/wiretap/catapult_dct2000.c
@@ -542,7 +542,7 @@ typedef struct {
/* Set other dump callbacks. */
/*****************************************************/
gboolean
-catapult_dct2000_dump_open(wtap_dumper *wdh, int *err _U_)
+catapult_dct2000_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_)
{
/* Fill in other dump callbacks */
wdh->subtype_write = catapult_dct2000_dump;
diff --git a/wiretap/catapult_dct2000.h b/wiretap/catapult_dct2000.h
index 3e4628f4ff..27dba694bd 100644
--- a/wiretap/catapult_dct2000.h
+++ b/wiretap/catapult_dct2000.h
@@ -13,7 +13,7 @@
#include "ws_symbol_export.h"
wtap_open_return_val catapult_dct2000_open(wtap *wth, int *err, gchar **err_info);
-gboolean catapult_dct2000_dump_open(wtap_dumper *wdh, int *err);
+gboolean catapult_dct2000_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int catapult_dct2000_dump_can_write_encap(int encap);
#define DCT2000_ENCAP_UNHANDLED 0
diff --git a/wiretap/commview.c b/wiretap/commview.c
index 7b93d2792c..08910dad16 100644
--- a/wiretap/commview.c
+++ b/wiretap/commview.c
@@ -375,7 +375,7 @@ int commview_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure;
sets "*err" to an error code on failure */
-gboolean commview_dump_open(wtap_dumper *wdh, int *err _U_)
+gboolean commview_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_)
{
wdh->subtype_write = commview_dump;
diff --git a/wiretap/commview.h b/wiretap/commview.h
index 1b58bff65b..0abaade078 100644
--- a/wiretap/commview.h
+++ b/wiretap/commview.h
@@ -12,9 +12,9 @@
#include <glib.h>
#include "ws_symbol_export.h"
-wtap_open_return_val commview_open(wtap *wth, int *err, gchar **err_info _U_);
+wtap_open_return_val commview_open(wtap *wth, int *err, gchar **err_info);
int commview_dump_can_write_encap(int encap);
-gboolean commview_dump_open(wtap_dumper *wdh, int *err);
+gboolean commview_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
#endif /* __COMMVIEW_H__ */
diff --git a/wiretap/erf.c b/wiretap/erf.c
index f32e15b320..7633d1e470 100644
--- a/wiretap/erf.c
+++ b/wiretap/erf.c
@@ -319,7 +319,7 @@ static void erf_meta_tag_free(gpointer data) {
}
-static gboolean erf_dump_finish(struct wtap_dumper *wdh, int *err) {
+static gboolean erf_dump_finish(struct wtap_dumper *wdh, int *err, gchar **err_info _U_) {
erf_dump_t *dump_priv = (erf_dump_t*)wdh->priv;
gboolean ret = TRUE;
@@ -2020,7 +2020,7 @@ int erf_dump_can_write_encap(int encap)
return 0;
}
-int erf_dump_open(wtap_dumper *wdh, int *err _U_)
+int erf_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_)
{
erf_dump_t *dump_priv;
gchar *s;
diff --git a/wiretap/erf.h b/wiretap/erf.h
index 30da202904..42956279ba 100644
--- a/wiretap/erf.h
+++ b/wiretap/erf.h
@@ -42,7 +42,7 @@ struct erf_private {
wtap_open_return_val erf_open(wtap *wth, int *err, gchar **err_info);
int erf_dump_can_write_encap(int encap);
-int erf_dump_open(wtap_dumper *wdh, int *err);
+int erf_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
#endif /* __W_ERF_H__ */
diff --git a/wiretap/eyesdn.c b/wiretap/eyesdn.c
index 65803280f0..b5329d3f09 100644
--- a/wiretap/eyesdn.c
+++ b/wiretap/eyesdn.c
@@ -338,7 +338,7 @@ static gboolean eyesdn_dump(wtap_dumper *wdh,
const wtap_rec *rec,
const guint8 *pd, int *err, gchar **err_info);
-gboolean eyesdn_dump_open(wtap_dumper *wdh, int *err)
+gboolean eyesdn_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
wdh->subtype_write=eyesdn_dump;
diff --git a/wiretap/eyesdn.h b/wiretap/eyesdn.h
index 98c6b32a0f..12eade785c 100644
--- a/wiretap/eyesdn.h
+++ b/wiretap/eyesdn.h
@@ -28,7 +28,7 @@ enum EyeSDN_TYPES {
EYESDN_ENCAP_V5_EF
};
-gboolean eyesdn_dump_open(wtap_dumper *wdh, int *err);
+gboolean eyesdn_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int eyesdn_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/file_access.c b/wiretap/file_access.c
index bf7467857f..df0ab6242e 100644
--- a/wiretap/file_access.c
+++ b/wiretap/file_access.c
@@ -2271,7 +2271,7 @@ static wtap_dumper* wtap_dump_alloc_wdh(int file_type_subtype, int encap, int sn
wtap_compression_type compression_type,
int *err);
static gboolean wtap_dump_open_finish(wtap_dumper *wdh, int file_type_subtype,
- int *err);
+ int *err, gchar **err_info);
static WFILE_T wtap_dump_file_open(wtap_dumper *wdh, const char *filename);
static WFILE_T wtap_dump_file_fdopen(wtap_dumper *wdh, int fd);
@@ -2396,11 +2396,14 @@ wtap_dump_init_dumper(int file_type_subtype, wtap_compression_type compression_t
wtap_dumper *
wtap_dump_open(const char *filename, int file_type_subtype,
wtap_compression_type compression_type, const wtap_dump_params *params,
- int *err)
+ int *err, gchar **err_info)
{
wtap_dumper *wdh;
WFILE_T fh;
+ *err = 0;
+ *err_info = NULL;
+
/* Allocate and initialize a data structure for the output stream. */
wdh = wtap_dump_init_dumper(file_type_subtype, compression_type, params,
err);
@@ -2418,7 +2421,7 @@ wtap_dump_open(const char *filename, int file_type_subtype,
}
wdh->fh = fh;
- if (!wtap_dump_open_finish(wdh, file_type_subtype, err)) {
+ if (!wtap_dump_open_finish(wdh, file_type_subtype, err, err_info)) {
/* Get rid of the file we created; we couldn't finish
opening it. */
wtap_dump_file_close(wdh);
@@ -2432,7 +2435,7 @@ wtap_dump_open(const char *filename, int file_type_subtype,
wtap_dumper *
wtap_dump_open_tempfile(char **filenamep, const char *pfx,
int file_type_subtype, wtap_compression_type compression_type,
- const wtap_dump_params *params, int *err)
+ const wtap_dump_params *params, int *err, gchar **err_info)
{
int fd;
const char *ext;
@@ -2443,6 +2446,9 @@ wtap_dump_open_tempfile(char **filenamep, const char *pfx,
/* No path name for the temporary file yet. */
*filenamep = NULL;
+ *err = 0;
+ *err_info = NULL;
+
/* Allocate and initialize a data structure for the output stream. */
wdh = wtap_dump_init_dumper(file_type_subtype, compression_type, params,
err);
@@ -2477,7 +2483,7 @@ wtap_dump_open_tempfile(char **filenamep, const char *pfx,
}
wdh->fh = fh;
- if (!wtap_dump_open_finish(wdh, file_type_subtype, err)) {
+ if (!wtap_dump_open_finish(wdh, file_type_subtype, err, err_info)) {
/* Get rid of the file we created; we couldn't finish
opening it. */
wtap_dump_file_close(wdh);
@@ -2490,11 +2496,14 @@ wtap_dump_open_tempfile(char **filenamep, const char *pfx,
wtap_dumper *
wtap_dump_fdopen(int fd, int file_type_subtype, wtap_compression_type compression_type,
- const wtap_dump_params *params, int *err)
+ const wtap_dump_params *params, int *err, gchar **err_info)
{
wtap_dumper *wdh;
WFILE_T fh;
+ *err = 0;
+ *err_info = NULL;
+
/* Allocate and initialize a data structure for the output stream. */
wdh = wtap_dump_init_dumper(file_type_subtype, compression_type, params,
err);
@@ -2512,7 +2521,7 @@ wtap_dump_fdopen(int fd, int file_type_subtype, wtap_compression_type compressio
}
wdh->fh = fh;
- if (!wtap_dump_open_finish(wdh, file_type_subtype, err)) {
+ if (!wtap_dump_open_finish(wdh, file_type_subtype, err, err_info)) {
wtap_dump_file_close(wdh);
g_free(wdh);
return NULL;
@@ -2522,7 +2531,7 @@ wtap_dump_fdopen(int fd, int file_type_subtype, wtap_compression_type compressio
wtap_dumper *
wtap_dump_open_stdout(int file_type_subtype, wtap_compression_type compression_type,
- const wtap_dump_params *params, int *err)
+ const wtap_dump_params *params, int *err, gchar **err_info)
{
int new_fd;
wtap_dumper *wdh;
@@ -2554,7 +2563,7 @@ wtap_dump_open_stdout(int file_type_subtype, wtap_compression_type compression_t
#endif
wdh = wtap_dump_fdopen(new_fd, file_type_subtype, compression_type,
- params, err);
+ params, err, err_info);
if (wdh == NULL) {
/* Failed; close the new FD */
ws_close(new_fd);
@@ -2619,7 +2628,8 @@ wtap_dump_alloc_wdh(int file_type_subtype, int encap, int snaplen,
}
static gboolean
-wtap_dump_open_finish(wtap_dumper *wdh, int file_type_subtype, int *err)
+wtap_dump_open_finish(wtap_dumper *wdh, int file_type_subtype, int *err,
+ gchar **err_info)
{
int fd;
gboolean cant_seek;
@@ -2652,7 +2662,8 @@ wtap_dump_open_finish(wtap_dumper *wdh, int file_type_subtype, int *err)
wdh->wslua_data = dump_open_table[file_type_subtype].wslua_info->wslua_data;
/* Now try to open the file for writing. */
- if (!(*dump_open_table[file_type_subtype].dump_open)(wdh, err)) {
+ if (!(*dump_open_table[file_type_subtype].dump_open)(wdh, err,
+ err_info)) {
return FALSE;
}
@@ -2689,13 +2700,15 @@ wtap_dump_flush(wtap_dumper *wdh, int *err)
}
gboolean
-wtap_dump_close(wtap_dumper *wdh, int *err)
+wtap_dump_close(wtap_dumper *wdh, int *err, gchar **err_info)
{
gboolean ret = TRUE;
+ *err = 0;
+ *err_info = NULL;
if (wdh->subtype_finish != NULL) {
/* There's a finish routine for this dump stream. */
- if (!(wdh->subtype_finish)(wdh, err))
+ if (!(wdh->subtype_finish)(wdh, err, err_info))
ret = FALSE;
}
errno = WTAP_ERR_CANT_CLOSE;
diff --git a/wiretap/file_wrappers.c b/wiretap/file_wrappers.c
index 748c1db83a..2fa6871c7f 100644
--- a/wiretap/file_wrappers.c
+++ b/wiretap/file_wrappers.c
@@ -1670,14 +1670,15 @@ file_close(FILE_T file)
struct wtap_writer {
int fd; /* file descriptor */
gint64 pos; /* current position in uncompressed data */
- guint size; /* buffer size, zero if not allocated yet */
- guint want; /* requested buffer size, default is GZBUFSIZE */
+ guint size; /* buffer size, zero if not allocated yet */
+ guint want; /* requested buffer size, default is GZBUFSIZE */
unsigned char *in; /* input buffer */
unsigned char *out; /* output buffer (double-sized when reading) */
unsigned char *next; /* next output data to deliver or write */
int level; /* compression level */
int strategy; /* compression strategy */
int err; /* error code */
+ const char *err_info; /* additional error information string for some errors */
/* zlib deflate stream */
z_stream strm; /* stream structure in-place (not a pointer) */
};
@@ -1719,6 +1720,7 @@ gzwfile_fdopen(int fd)
/* initialize stream */
state->err = Z_OK; /* clear error */
+ state->err_info = NULL; /* clear additional error information */
state->pos = 0; /* no uncompressed data yet */
state->strm.avail_in = 0; /* no input data yet */
@@ -1727,8 +1729,8 @@ gzwfile_fdopen(int fd)
}
/* Initialize state for writing a gzip file. Mark initialization by setting
- state->size to non-zero. Return -1, and set state->err, on failure;
- return 0 on success. */
+ state->size to non-zero. Return -1, and set state->err and possibly
+ state->err_info, on failure; return 0 on success. */
static int
gz_init(GZWFILE_T state)
{
@@ -1760,6 +1762,7 @@ gz_init(GZWFILE_T state)
} else {
/* This "shouldn't happen". */
state->err = WTAP_ERR_INTERNAL;
+ state->err_info = "Unknown error from deflateInit2()";
}
return -1;
}
@@ -1775,8 +1778,8 @@ gz_init(GZWFILE_T state)
}
/* Compress whatever is at avail_in and next_in and write to the output file.
- Return -1, and set state->err, if there is an error writing to the output
- file; return 0 on success.
+ Return -1, and set state->err and possibly state->err_info, if there is
+ an error writing to the output file; return 0 on success.
flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH,
then the deflate() state is reset to start a new gzip stream. */
static int
@@ -1823,6 +1826,7 @@ gz_comp(GZWFILE_T state, int flush)
if (ret == Z_STREAM_ERROR) {
/* This "shouldn't happen". */
state->err = WTAP_ERR_INTERNAL;
+ state->err_info = "Z_STREAM_ERROR from deflate()";
return -1;
}
have -= strm->avail_out;
diff --git a/wiretap/k12.c b/wiretap/k12.c
index efac1ffc04..81a1697ab7 100644
--- a/wiretap/k12.c
+++ b/wiretap/k12.c
@@ -1320,7 +1320,7 @@ static gboolean k12_dump(wtap_dumper *wdh, const wtap_rec *rec,
static const guint8 k12_eof[] = {0xff,0xff};
-static gboolean k12_dump_finish(wtap_dumper *wdh, int *err) {
+static gboolean k12_dump_finish(wtap_dumper *wdh, int *err, gchar **err_info _U_) {
k12_dump_t *k12 = (k12_dump_t *)wdh->priv;
union {
guint8 b[sizeof(guint32)];
@@ -1367,7 +1367,7 @@ static gboolean k12_dump_finish(wtap_dumper *wdh, int *err) {
}
-gboolean k12_dump_open(wtap_dumper *wdh, int *err) {
+gboolean k12_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_) {
k12_dump_t *k12;
if ( ! wtap_dump_file_write(wdh, k12_file_magic, 8, err)) {
diff --git a/wiretap/k12.h b/wiretap/k12.h
index 545b2ae18e..8954c67ed1 100644
--- a/wiretap/k12.h
+++ b/wiretap/k12.h
@@ -14,10 +14,10 @@
wtap_open_return_val k12_open(wtap *wth, int *err, gchar **err_info);
int k12_dump_can_write_encap(int encap);
-gboolean k12_dump_open(wtap_dumper *wdh, int *err);
-wtap_open_return_val k12text_open(wtap *wth, int *err, gchar **err_info _U_);
+gboolean k12_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
+wtap_open_return_val k12text_open(wtap *wth, int *err, gchar **err_info);
int k12text_dump_can_write_encap(int encap);
-gboolean k12text_dump_open(wtap_dumper *wdh, int *err);
+gboolean k12text_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
#endif
diff --git a/wiretap/k12text.l b/wiretap/k12text.l
index 23cf390452..163cf9dbf6 100644
--- a/wiretap/k12text.l
+++ b/wiretap/k12text.l
@@ -549,7 +549,7 @@ k12text_dump(wtap_dumper *wdh, const wtap_rec *rec,
gboolean
-k12text_dump_open(wtap_dumper *wdh, int *err _U_)
+k12text_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_)
{
wdh->subtype_write = k12text_dump;
diff --git a/wiretap/lanalyzer.c b/wiretap/lanalyzer.c
index 3cf71481aa..4174aa340b 100644
--- a/wiretap/lanalyzer.c
+++ b/wiretap/lanalyzer.c
@@ -262,7 +262,8 @@ static gboolean lanalyzer_read(wtap *wth, wtap_rec *rec,
Buffer *buf, int *err, gchar **err_info, gint64 *data_offset);
static gboolean lanalyzer_seek_read(wtap *wth, gint64 seek_off,
wtap_rec *rec, Buffer *buf, int *err, gchar **err_info);
-static gboolean lanalyzer_dump_finish(wtap_dumper *wdh, int *err);
+static gboolean lanalyzer_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info);
wtap_open_return_val lanalyzer_open(wtap *wth, int *err, gchar **err_info)
{
@@ -786,7 +787,7 @@ int lanalyzer_dump_can_write_encap(int encap)
* Returns TRUE on success, FALSE on failure; sets "*err" to an
* error code on failure
*---------------------------------------------------*/
-gboolean lanalyzer_dump_open(wtap_dumper *wdh, int *err)
+gboolean lanalyzer_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
int jump;
void *tmp;
@@ -952,7 +953,8 @@ static gboolean lanalyzer_dump_header(wtap_dumper *wdh, int *err)
* Finish writing to a dump file.
* Returns TRUE on success, FALSE on failure.
*---------------------------------------------------*/
-static gboolean lanalyzer_dump_finish(wtap_dumper *wdh, int *err)
+static gboolean lanalyzer_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info _U_)
{
lanalyzer_dump_header(wdh,err);
return *err ? FALSE : TRUE;
diff --git a/wiretap/lanalyzer.h b/wiretap/lanalyzer.h
index 8be6e2b2b5..07e3564226 100644
--- a/wiretap/lanalyzer.h
+++ b/wiretap/lanalyzer.h
@@ -13,7 +13,7 @@
#include "wtap.h"
wtap_open_return_val lanalyzer_open(wtap *wth, int *err, gchar **err_info);
-gboolean lanalyzer_dump_open(wtap_dumper *wdh, int *err);
+gboolean lanalyzer_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int lanalyzer_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/libpcap.c b/wiretap/libpcap.c
index 0b02691e44..a5ce1303ef 100644
--- a/wiretap/libpcap.c
+++ b/wiretap/libpcap.c
@@ -952,7 +952,7 @@ int libpcap_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
-gboolean libpcap_dump_open(wtap_dumper *wdh, int *err)
+gboolean libpcap_dump_open(wtap_dumper *wdh, int *err, gchar **err_info)
{
guint32 magic;
struct pcap_hdr file_hdr;
@@ -981,7 +981,9 @@ gboolean libpcap_dump_open(wtap_dumper *wdh, int *err)
default:
/* We should never get here - our open routine
should only get called for the types above. */
- *err = WTAP_ERR_UNWRITABLE_FILE_TYPE;
+ *err = WTAP_ERR_INTERNAL;
+ *err_info = g_strdup_printf("libpcap: invalid file type/subtype %u",
+ wdh->file_type_subtype);
return FALSE;
}
diff --git a/wiretap/libpcap.h b/wiretap/libpcap.h
index 643e611f73..6bbff94e42 100644
--- a/wiretap/libpcap.h
+++ b/wiretap/libpcap.h
@@ -97,7 +97,7 @@ struct pcaprec_nokia_hdr {
};
wtap_open_return_val libpcap_open(wtap *wth, int *err, gchar **err_info);
-gboolean libpcap_dump_open(wtap_dumper *wdh, int *err);
+gboolean libpcap_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int libpcap_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/logcat.c b/wiretap/logcat.c
index 89882c6aeb..464abc74c5 100644
--- a/wiretap/logcat.c
+++ b/wiretap/logcat.c
@@ -352,7 +352,8 @@ static gboolean logcat_binary_dump(wtap_dumper *wdh,
return TRUE;
}
-gboolean logcat_binary_dump_open(wtap_dumper *wdh, int *err _U_)
+gboolean logcat_binary_dump_open(wtap_dumper *wdh, int *err _U_,
+ gchar **err_info _U_)
{
wdh->subtype_write = logcat_binary_dump;
diff --git a/wiretap/logcat.h b/wiretap/logcat.h
index 9da5caa45f..f760e29d8c 100644
--- a/wiretap/logcat.h
+++ b/wiretap/logcat.h
@@ -47,7 +47,7 @@ struct logger_entry_v2 {
wtap_open_return_val logcat_open(wtap *wth, int *err, gchar **err_info);
-gboolean logcat_binary_dump_open(wtap_dumper *wdh, int *err);
+gboolean logcat_binary_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int logcat_dump_can_write_encap(int encap);
diff --git a/wiretap/logcat_text.c b/wiretap/logcat_text.c
index d10db4d1fb..deba15a7a8 100644
--- a/wiretap/logcat_text.c
+++ b/wiretap/logcat_text.c
@@ -578,7 +578,7 @@ static gboolean logcat_text_dump_text(wtap_dumper *wdh,
return TRUE;
}
-static gboolean logcat_text_dump_open(wtap_dumper *wdh, guint dump_type, int *err _U_) {
+static gboolean logcat_text_dump_open(wtap_dumper *wdh, guint dump_type) {
struct dumper_t *dumper;
dumper = (struct dumper_t *) g_malloc(sizeof(struct dumper_t));
@@ -590,32 +590,32 @@ static gboolean logcat_text_dump_open(wtap_dumper *wdh, guint dump_type, int *er
return TRUE;
}
-gboolean logcat_text_brief_dump_open(wtap_dumper *wdh, int *err) {
- return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_BRIEF, err);
+gboolean logcat_text_brief_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_) {
+ return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_BRIEF);
}
-gboolean logcat_text_process_dump_open(wtap_dumper *wdh, int *err) {
- return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_PROCESS, err);
+gboolean logcat_text_process_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_) {
+ return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_PROCESS);
}
-gboolean logcat_text_tag_dump_open(wtap_dumper *wdh, int *err) {
- return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_TAG, err);
+gboolean logcat_text_tag_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_) {
+ return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_TAG);
}
-gboolean logcat_text_time_dump_open(wtap_dumper *wdh, int *err) {
- return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_TIME, err);
+gboolean logcat_text_time_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_) {
+ return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_TIME);
}
-gboolean logcat_text_thread_dump_open(wtap_dumper *wdh, int *err) {
- return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_THREAD, err);
+gboolean logcat_text_thread_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_) {
+ return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_THREAD);
}
-gboolean logcat_text_threadtime_dump_open(wtap_dumper *wdh, int *err) {
- return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_THREADTIME, err);
+gboolean logcat_text_threadtime_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_) {
+ return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_THREADTIME);
}
-gboolean logcat_text_long_dump_open(wtap_dumper *wdh, int *err) {
- return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_LONG, err);
+gboolean logcat_text_long_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_) {
+ return logcat_text_dump_open(wdh, WTAP_ENCAP_LOGCAT_LONG);
}
/*
diff --git a/wiretap/logcat_text.h b/wiretap/logcat_text.h
index 325933d599..09570b469a 100644
--- a/wiretap/logcat_text.h
+++ b/wiretap/logcat_text.h
@@ -24,13 +24,13 @@
wtap_open_return_val logcat_text_open(wtap *wth, int *err, gchar **err_info);
-gboolean logcat_text_brief_dump_open(wtap_dumper *wdh, int *err);
-gboolean logcat_text_process_dump_open(wtap_dumper *wdh, int *err);
-gboolean logcat_text_tag_dump_open(wtap_dumper *wdh, int *err);
-gboolean logcat_text_time_dump_open(wtap_dumper *wdh, int *err);
-gboolean logcat_text_thread_dump_open(wtap_dumper *wdh, int *err);
-gboolean logcat_text_threadtime_dump_open(wtap_dumper *wdh, int *err);
-gboolean logcat_text_long_dump_open(wtap_dumper *wdh, int *err);
+gboolean logcat_text_brief_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
+gboolean logcat_text_process_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
+gboolean logcat_text_tag_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
+gboolean logcat_text_time_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
+gboolean logcat_text_thread_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
+gboolean logcat_text_threadtime_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
+gboolean logcat_text_long_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int logcat_text_brief_dump_can_write_encap(int encap);
int logcat_text_tag_dump_can_write_encap(int encap);
diff --git a/wiretap/merge.c b/wiretap/merge.c
index 51d15a5bb9..6aae6a6548 100644
--- a/wiretap/merge.c
+++ b/wiretap/merge.c
@@ -946,7 +946,7 @@ merge_process_packets(wtap_dumper *pdh, const int file_type,
cb->callback_func(MERGE_EVENT_DONE, count, in_files, in_file_count, cb->data);
if (status == MERGE_OK || status == MERGE_USER_ABORTED) {
- if (!wtap_dump_close(pdh, err))
+ if (!wtap_dump_close(pdh, err, err_info))
status = MERGE_ERR_CANT_CLOSE_OUTFILE;
} else {
/*
@@ -956,7 +956,9 @@ merge_process_packets(wtap_dumper *pdh, const int file_type,
* Don't overwrite the earlier error.
*/
int close_err = 0;
- (void)wtap_dump_close(pdh, &close_err);
+ gchar *close_err_info = NULL;
+ (void)wtap_dump_close(pdh, &close_err, &close_err_info);
+ g_free(close_err_info);
}
/* Close the input files after the output file in case the latter still
@@ -1050,12 +1052,15 @@ merge_files_common(const gchar* out_filename, /* normal output mode */
params.dsbs_growing = dsb_combined;
}
if (out_filename) {
- pdh = wtap_dump_open(out_filename, file_type, WTAP_UNCOMPRESSED, &params, err);
+ pdh = wtap_dump_open(out_filename, file_type, WTAP_UNCOMPRESSED,
+ &params, err, err_info);
} else if (out_filenamep) {
pdh = wtap_dump_open_tempfile(out_filenamep, pfx, file_type,
- WTAP_UNCOMPRESSED, &params, err);
+ WTAP_UNCOMPRESSED, &params, err,
+ err_info);
} else {
- pdh = wtap_dump_open_stdout(file_type, WTAP_UNCOMPRESSED, &params, err);
+ pdh = wtap_dump_open_stdout(file_type, WTAP_UNCOMPRESSED, &params, err,
+ err_info);
}
if (pdh == NULL) {
merge_close_in_files(in_file_count, in_files);
diff --git a/wiretap/netmon.c b/wiretap/netmon.c
index 1c45864769..d15deaf068 100644
--- a/wiretap/netmon.c
+++ b/wiretap/netmon.c
@@ -224,7 +224,8 @@ static gboolean netmon_read_atm_pseudoheader(FILE_T fh,
static void netmon_close(wtap *wth);
static gboolean netmon_dump(wtap_dumper *wdh, const wtap_rec *rec,
const guint8 *pd, int *err, gchar **err_info);
-static gboolean netmon_dump_finish(wtap_dumper *wdh, int *err);
+static gboolean netmon_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info);
/*
* Convert a counted UTF-16 string, which is probably also null-terminated
@@ -1618,7 +1619,7 @@ int netmon_dump_can_write_encap_2_x(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
-gboolean netmon_dump_open(wtap_dumper *wdh, int *err)
+gboolean netmon_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
netmon_dump_t *netmon;
@@ -1893,7 +1894,8 @@ static gboolean netmon_dump(wtap_dumper *wdh, const wtap_rec *rec,
/* Finish writing to a dump file.
Returns TRUE on success, FALSE on failure. */
-static gboolean netmon_dump_finish(wtap_dumper *wdh, int *err)
+static gboolean netmon_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info _U_)
{
netmon_dump_t *netmon = (netmon_dump_t *)wdh->priv;
size_t n_to_write;
diff --git a/wiretap/netmon.h b/wiretap/netmon.h
index 0f92909866..8eb589895b 100644
--- a/wiretap/netmon.h
+++ b/wiretap/netmon.h
@@ -13,7 +13,7 @@
#include "wtap.h"
wtap_open_return_val netmon_open(wtap *wth, int *err, gchar **err_info);
-gboolean netmon_dump_open(wtap_dumper *wdh, int *err);
+gboolean netmon_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int netmon_dump_can_write_encap_1_x(int encap);
int netmon_dump_can_write_encap_2_x(int encap);
diff --git a/wiretap/netscaler.c b/wiretap/netscaler.c
index dc618b5167..f8df1bb996 100644
--- a/wiretap/netscaler.c
+++ b/wiretap/netscaler.c
@@ -2039,7 +2039,7 @@ int nstrace_35_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
** failure */
-gboolean nstrace_dump_open(wtap_dumper *wdh, int *err _U_)
+gboolean nstrace_dump_open(wtap_dumper *wdh, int *err _U_, gchar **err_info _U_)
{
nstrace_dump_t *nstrace;
diff --git a/wiretap/netscaler.h b/wiretap/netscaler.h
index 112457f19c..b7e91c3219 100644
--- a/wiretap/netscaler.h
+++ b/wiretap/netscaler.h
@@ -113,7 +113,7 @@ int nstrace_20_dump_can_write_encap(int encap);
int nstrace_30_dump_can_write_encap(int encap);
int nstrace_35_dump_can_write_encap(int encap);
-gboolean nstrace_dump_open(wtap_dumper *wdh, int *err);
+gboolean nstrace_dump_open(wtap_dumper *wdh, int *err, char **err_info);
#endif /* _NETSCALER_H */
diff --git a/wiretap/nettl.c b/wiretap/nettl.c
index f3b2699b72..65d654cd5a 100644
--- a/wiretap/nettl.c
+++ b/wiretap/nettl.c
@@ -642,7 +642,7 @@ int nettl_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure;
sets "*err" to an error code on failure */
-gboolean nettl_dump_open(wtap_dumper *wdh, int *err)
+gboolean nettl_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
struct nettl_file_hdr file_hdr;
diff --git a/wiretap/nettl.h b/wiretap/nettl.h
index 7009d88c69..226a303936 100644
--- a/wiretap/nettl.h
+++ b/wiretap/nettl.h
@@ -117,7 +117,7 @@
#define NETTL_HDR_PDU_MASK 0x30000000
wtap_open_return_val nettl_open(wtap *wth, int *err, gchar **err_info);
-gboolean nettl_dump_open(wtap_dumper *wdh, int *err);
+gboolean nettl_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int nettl_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/nettrace_3gpp_32_423.c b/wiretap/nettrace_3gpp_32_423.c
index b6efa44703..211811b875 100644
--- a/wiretap/nettrace_3gpp_32_423.c
+++ b/wiretap/nettrace_3gpp_32_423.c
@@ -819,7 +819,6 @@ create_temp_pcapng_file(wtap *wth, int *err, gchar **err_info, nettrace_3gpp_32_
{
int import_file_fd;
wtap_dumper* wdh_exp_pdu;
- int exp_pdu_file_err;
wtap_open_return_val result = WTAP_OPEN_MINE;
/* pcapng defs */
@@ -832,8 +831,6 @@ create_temp_pcapng_file(wtap *wth, int *err, gchar **err_info, nettrace_3gpp_32_
gint64 file_size;
int packet_size;
char *packet_buf = NULL;
- int wrt_err;
- gchar *wrt_err_info = NULL;
wtap_rec rec;
nstime_t start_time, packet_time;
int scan_found;
@@ -907,7 +904,7 @@ create_temp_pcapng_file(wtap *wth, int *err, gchar **err_info, nettrace_3gpp_32_
};
wdh_exp_pdu = wtap_dump_fdopen(import_file_fd, WTAP_FILE_TYPE_SUBTYPE_PCAPNG,
WTAP_UNCOMPRESSED, &params,
- &exp_pdu_file_err);
+ err, err_info);
if (wdh_exp_pdu == NULL) {
result = WTAP_OPEN_ERROR;
goto end;
@@ -954,7 +951,7 @@ create_temp_pcapng_file(wtap *wth, int *err, gchar **err_info, nettrace_3gpp_32_
packet_buf[10] = 0;
packet_buf[11] = 0;
- if (!wtap_read_bytes(wth->fh, packet_buf + 12, packet_size, &wrt_err, &wrt_err_info)){
+ if (!wtap_read_bytes(wth->fh, packet_buf + 12, packet_size, err, err_info)){
result = WTAP_OPEN_ERROR;
goto end;
}
@@ -1001,15 +998,7 @@ create_temp_pcapng_file(wtap *wth, int *err, gchar **err_info, nettrace_3gpp_32_
rec.rec_header.packet_header.len = packet_size + 12;
/* XXX: report errors! */
- if (!wtap_dump(wdh_exp_pdu, &rec, packet_buf, &wrt_err, &wrt_err_info)) {
- switch (wrt_err) {
-
- case WTAP_ERR_UNWRITABLE_REC_DATA:
- break;
-
- default:
- break;
- }
+ if (!wtap_dump(wdh_exp_pdu, &rec, packet_buf, err, err_info)) {
result = WTAP_OPEN_ERROR;
goto end;
}
@@ -1138,18 +1127,16 @@ create_temp_pcapng_file(wtap *wth, int *err, gchar **err_info, nettrace_3gpp_32_
curr_pos = raw_msg_pos;
curr_pos = curr_pos + 7;
/* Add the raw msg*/
- temp_val = write_packet_data(wdh_exp_pdu, &rec, &wrt_err, &wrt_err_info, curr_pos, packet_time, &exported_pdu_info, name_str);
+ temp_val = write_packet_data(wdh_exp_pdu, &rec, err, err_info, curr_pos, packet_time, &exported_pdu_info, name_str);
if (temp_val != WTAP_OPEN_MINE){
result = temp_val;
- *err = wrt_err;
- *err_info = g_strdup(wrt_err_info);
goto end;
}
curr_pos = next_msg_pos;
}
/* Close the written file*/
- if (!wtap_dump_close(wdh_exp_pdu, err)){
+ if (!wtap_dump_close(wdh_exp_pdu, err, err_info)){
result = WTAP_OPEN_ERROR;
goto end;
}
@@ -1169,7 +1156,6 @@ create_temp_pcapng_file(wtap *wth, int *err, gchar **err_info, nettrace_3gpp_32_
}
end:
- g_free(wrt_err_info);
g_free(packet_buf);
wtap_block_array_free(shb_hdrs);
wtap_free_idb_info(idb_inf);
diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c
index 043b585b5d..de39e5021f 100644
--- a/wiretap/network_instruments.c
+++ b/wiretap/network_instruments.c
@@ -126,6 +126,7 @@ wtap_open_return_val network_instruments_open(wtap *wth, int *err, gchar **err_i
guint seek_increment;
packet_entry_header packet_header;
observer_dump_private_state * private_state = NULL;
+ const char *err_str;
offset = 0;
@@ -299,15 +300,10 @@ wtap_open_return_val network_instruments_open(wtap *wth, int *err, gchar **err_i
if (file_seek(wth->fh, header_offset, SEEK_SET, err) == -1)
return WTAP_OPEN_ERROR;
- if (init_gmt_to_localtime_offset() != NULL) {
+ err_str = init_gmt_to_localtime_offset();
+ if (err_str != NULL) {
*err = WTAP_ERR_INTERNAL;
- /*
- * XXX - we should return the error string, so the caller
- * can report the details of the internal error, but that
- * would require plugin file readers to do so for internal
- * errors as well, which could break binary compatibility;
- * we'll do that in the next release.
- */
+ *err_info = g_strdup_printf("network_instruments: %s", err_str);
return WTAP_OPEN_ERROR;
}
@@ -664,11 +660,13 @@ int network_instruments_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure. */
-gboolean network_instruments_dump_open(wtap_dumper *wdh, int *err)
+gboolean network_instruments_dump_open(wtap_dumper *wdh, int *err,
+ gchar **err_info)
{
observer_dump_private_state * private_state = NULL;
capture_file_header file_header;
guint header_offset;
+ const gchar *err_str;
tlv_header comment_header;
tlv_time_info time_header;
char comment[64];
@@ -755,7 +753,12 @@ gboolean network_instruments_dump_open(wtap_dumper *wdh, int *err)
wdh->bytes_dumped += sizeof(time_header);
}
- init_gmt_to_localtime_offset();
+ err_str = init_gmt_to_localtime_offset();
+ if (err_str != NULL) {
+ *err = WTAP_ERR_INTERNAL;
+ *err_info = g_strdup_printf("network_instruments: %s", err_str);
+ return FALSE;
+ }
return TRUE;
}
diff --git a/wiretap/network_instruments.h b/wiretap/network_instruments.h
index 7754ef8976..799a4594de 100644
--- a/wiretap/network_instruments.h
+++ b/wiretap/network_instruments.h
@@ -20,7 +20,7 @@
wtap_open_return_val network_instruments_open(wtap *wth, int *err, gchar **err_info);
int network_instruments_dump_can_write_encap(int encap);
-gboolean network_instruments_dump_open(wtap_dumper *wdh, int *err);
+gboolean network_instruments_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
/*
* In v15 the high_byte was added to allow a larger offset This was done by
diff --git a/wiretap/netxray.c b/wiretap/netxray.c
index b21d90a5e0..368575a721 100644
--- a/wiretap/netxray.c
+++ b/wiretap/netxray.c
@@ -400,11 +400,13 @@ static void netxray_guess_atm_type(wtap *wth, wtap_rec *rec,
static gboolean netxray_dump_1_1(wtap_dumper *wdh,
const wtap_rec *rec,
const guint8 *pd, int *err, gchar **err_info);
-static gboolean netxray_dump_finish_1_1(wtap_dumper *wdh, int *err);
+static gboolean netxray_dump_finish_1_1(wtap_dumper *wdh, int *err,
+ gchar **err_info);
static gboolean netxray_dump_2_0(wtap_dumper *wdh,
const wtap_rec *rec,
const guint8 *pd, int *err, gchar **err_info);
-static gboolean netxray_dump_finish_2_0(wtap_dumper *wdh, int *err);
+static gboolean netxray_dump_finish_2_0(wtap_dumper *wdh, int *err,
+ gchar **err_info);
wtap_open_return_val
netxray_open(wtap *wth, int *err, gchar **err_info)
@@ -1697,7 +1699,7 @@ netxray_dump_can_write_encap_1_1(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
gboolean
-netxray_dump_open_1_1(wtap_dumper *wdh, int *err)
+netxray_dump_open_1_1(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
netxray_dump_t *netxray;
@@ -1799,7 +1801,7 @@ netxray_dump_1_1(wtap_dumper *wdh,
/* Finish writing to a dump file.
Returns TRUE on success, FALSE on failure. */
static gboolean
-netxray_dump_finish_1_1(wtap_dumper *wdh, int *err)
+netxray_dump_finish_1_1(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
char hdr_buf[CAPTUREFILE_HEADER_SIZE - sizeof(netxray_magic)];
netxray_dump_t *netxray = (netxray_dump_t *)wdh->priv;
@@ -1883,7 +1885,7 @@ netxray_dump_can_write_encap_2_0(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
gboolean
-netxray_dump_open_2_0(wtap_dumper *wdh, int *err)
+netxray_dump_open_2_0(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
netxray_dump_t *netxray;
@@ -2017,7 +2019,7 @@ netxray_dump_2_0(wtap_dumper *wdh,
/* Finish writing to a dump file.
Returns TRUE on success, FALSE on failure. */
static gboolean
-netxray_dump_finish_2_0(wtap_dumper *wdh, int *err)
+netxray_dump_finish_2_0(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
char hdr_buf[CAPTUREFILE_HEADER_SIZE - sizeof(netxray_magic)];
netxray_dump_t *netxray = (netxray_dump_t *)wdh->priv;
diff --git a/wiretap/netxray.h b/wiretap/netxray.h
index 7163a88f0f..c5180cd41f 100644
--- a/wiretap/netxray.h
+++ b/wiretap/netxray.h
@@ -14,8 +14,8 @@
wtap_open_return_val netxray_open(wtap *wth, int *err, gchar **err_info);
int netxray_dump_can_write_encap_1_1(int encap);
-gboolean netxray_dump_open_1_1(wtap_dumper *wdh, int *err);
+gboolean netxray_dump_open_1_1(wtap_dumper *wdh, int *err, gchar **err_info);
int netxray_dump_can_write_encap_2_0(int encap);
-gboolean netxray_dump_open_2_0(wtap_dumper *wdh, int *err);
+gboolean netxray_dump_open_2_0(wtap_dumper *wdh, int *err, gchar **err_info);
#endif
diff --git a/wiretap/ngsniffer.c b/wiretap/ngsniffer.c
index f53815314f..cd291baccd 100644
--- a/wiretap/ngsniffer.c
+++ b/wiretap/ngsniffer.c
@@ -515,7 +515,8 @@ static void ngsniffer_sequential_close(wtap *wth);
static void ngsniffer_close(wtap *wth);
static gboolean ngsniffer_dump(wtap_dumper *wdh, const wtap_rec *rec,
const guint8 *pd, int *err, gchar **err_info);
-static gboolean ngsniffer_dump_finish(wtap_dumper *wdh, int *err);
+static gboolean ngsniffer_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info);
static int SnifferDecompress( unsigned char * inbuf, size_t inlen,
unsigned char * outbuf, size_t outlen, int *err, gchar **err_info );
static gboolean ng_read_bytes_or_eof(wtap *wth, void *buffer,
@@ -2020,7 +2021,7 @@ ngsniffer_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
gboolean
-ngsniffer_dump_open(wtap_dumper *wdh, int *err)
+ngsniffer_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
ngsniffer_dump_t *ngsniffer;
char buf[6] = {REC_VERS, 0x00, 0x12, 0x00, 0x00, 0x00}; /* version record */
@@ -2194,7 +2195,7 @@ ngsniffer_dump(wtap_dumper *wdh, const wtap_rec *rec,
/* Finish writing to a dump file.
Returns TRUE on success, FALSE on failure. */
static gboolean
-ngsniffer_dump_finish(wtap_dumper *wdh, int *err)
+ngsniffer_dump_finish(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
/* EOF record */
char buf[6] = {REC_EOF, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/wiretap/ngsniffer.h b/wiretap/ngsniffer.h
index 9b5ad7dd1f..ca9309850b 100644
--- a/wiretap/ngsniffer.h
+++ b/wiretap/ngsniffer.h
@@ -13,7 +13,7 @@
#include "wtap.h"
wtap_open_return_val ngsniffer_open(wtap *wth, int *err, gchar **err_info);
-gboolean ngsniffer_dump_open(wtap_dumper *wdh, int *err);
+gboolean ngsniffer_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int ngsniffer_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/pcapng.c b/wiretap/pcapng.c
index 75399d09fb..7d4f3bf7d1 100644
--- a/wiretap/pcapng.c
+++ b/wiretap/pcapng.c
@@ -3445,7 +3445,7 @@ pcapng_write_section_header_block(wtap_dumper *wdh, int *err)
static gboolean
pcapng_write_enhanced_packet_block(wtap_dumper *wdh, const wtap_rec *rec,
- const guint8 *pd, int *err)
+ const guint8 *pd, int *err, gchar **err_info)
{
const union wtap_pseudo_header *pseudo_header = &rec->rec_header.packet_header.pseudo_header;
pcapng_block_header_t bh;
@@ -3545,6 +3545,8 @@ pcapng_write_enhanced_packet_block(wtap_dumper *wdh, const wtap_rec *rec,
* Our caller is doing something bad.
*/
*err = WTAP_ERR_INTERNAL;
+ *err_info = g_strdup_printf("pcapng: epb.interface_id (%u) >= wdh->interface_data->len (%u)",
+ epb.interface_id, wdh->interface_data->len);
return FALSE;
}
int_data = g_array_index(wdh->interface_data, wtap_block_t,
@@ -4763,7 +4765,7 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtap_block_t int_data, int *err)
static gboolean pcapng_dump(wtap_dumper *wdh,
const wtap_rec *rec,
- const guint8 *pd, int *err, gchar **err_info _U_)
+ const guint8 *pd, int *err, gchar **err_info)
{
#ifdef HAVE_PLUGINS
block_handler *handler;
@@ -4796,7 +4798,8 @@ static gboolean pcapng_dump(wtap_dumper *wdh,
* stamp or other information that doesn't appear in an
* SPB?
*/
- if (!pcapng_write_enhanced_packet_block(wdh, rec, pd, err)) {
+ if (!pcapng_write_enhanced_packet_block(wdh, rec, pd, err,
+ err_info)) {
return FALSE;
}
break;
@@ -4846,7 +4849,8 @@ static gboolean pcapng_dump(wtap_dumper *wdh,
/* Finish writing to a dump file.
Returns TRUE on success, FALSE on failure. */
-static gboolean pcapng_dump_finish(wtap_dumper *wdh, int *err)
+static gboolean pcapng_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info _U_)
{
guint i, j;
@@ -4881,7 +4885,7 @@ static gboolean pcapng_dump_finish(wtap_dumper *wdh, int *err)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
gboolean
-pcapng_dump_open(wtap_dumper *wdh, int *err)
+pcapng_dump_open(wtap_dumper *wdh, int *err, gchar **err_info)
{
guint i;
@@ -4894,6 +4898,7 @@ pcapng_dump_open(wtap_dumper *wdh, int *err)
if (wdh->interface_data->len == 0) {
pcapng_debug("There are no interfaces. Can't handle that...");
*err = WTAP_ERR_INTERNAL;
+ *err_info = g_strdup("pcapng: there are no interfaces");
return FALSE;
}
diff --git a/wiretap/pcapng.h b/wiretap/pcapng.h
index 8f027da090..c1d4d7b23a 100644
--- a/wiretap/pcapng.h
+++ b/wiretap/pcapng.h
@@ -73,7 +73,7 @@ struct pcapng_option_header {
#define MIN_DSB_SIZE ((guint32)(MIN_BLOCK_SIZE + sizeof(pcapng_decryption_secrets_block_t)))
wtap_open_return_val pcapng_open(wtap *wth, int *err, gchar **err_info);
-gboolean pcapng_dump_open(wtap_dumper *wdh, int *err);
+gboolean pcapng_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int pcapng_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/snoop.c b/wiretap/snoop.c
index 3f5504831b..7c162e0c1f 100644
--- a/wiretap/snoop.c
+++ b/wiretap/snoop.c
@@ -786,7 +786,7 @@ int snoop_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
failure */
-gboolean snoop_dump_open(wtap_dumper *wdh, int *err)
+gboolean snoop_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
struct snoop_hdr file_hdr;
diff --git a/wiretap/snoop.h b/wiretap/snoop.h
index 249257b995..3c0fcd92de 100644
--- a/wiretap/snoop.h
+++ b/wiretap/snoop.h
@@ -14,7 +14,7 @@
#include "ws_symbol_export.h"
wtap_open_return_val snoop_open(wtap *wth, int *err, gchar **err_info);
-gboolean snoop_dump_open(wtap_dumper *wdh, int *err);
+gboolean snoop_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int snoop_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/visual.c b/wiretap/visual.c
index d95e925d7c..98f4e680b3 100644
--- a/wiretap/visual.c
+++ b/wiretap/visual.c
@@ -153,7 +153,8 @@ static gboolean visual_read_packet(wtap *wth, FILE_T fh,
wtap_rec *rec, Buffer *buf, int *err, gchar **err_info);
static gboolean visual_dump(wtap_dumper *wdh, const wtap_rec *rec,
const guint8 *pd, int *err, gchar **err_info);
-static gboolean visual_dump_finish(wtap_dumper *wdh, int *err);
+static gboolean visual_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info);
static void visual_dump_free(wtap_dumper *wdh);
@@ -601,7 +602,7 @@ int visual_dump_can_write_encap(int encap)
/* Open a file for writing.
Returns TRUE on success, FALSE on failure; sets "*err" to an
error code on failure */
-gboolean visual_dump_open(wtap_dumper *wdh, int *err)
+gboolean visual_dump_open(wtap_dumper *wdh, int *err, gchar **err_info _U_)
{
struct visual_write_info *visual;
@@ -761,7 +762,8 @@ static gboolean visual_dump(wtap_dumper *wdh, const wtap_rec *rec,
/* Finish writing to a dump file.
Returns TRUE on success, FALSE on failure. */
-static gboolean visual_dump_finish(wtap_dumper *wdh, int *err)
+static gboolean visual_dump_finish(wtap_dumper *wdh, int *err,
+ gchar **err_info _U_)
{
struct visual_write_info * visual = (struct visual_write_info *)wdh->priv;
size_t n_to_write;
diff --git a/wiretap/visual.h b/wiretap/visual.h
index 1af4c37738..b32b34abab 100644
--- a/wiretap/visual.h
+++ b/wiretap/visual.h
@@ -19,7 +19,7 @@
#include "ws_symbol_export.h"
wtap_open_return_val visual_open(wtap *wth, int *err, gchar **err_info);
-gboolean visual_dump_open(wtap_dumper *wdh, int *err);
+gboolean visual_dump_open(wtap_dumper *wdh, int *err, gchar **err_info);
int visual_dump_can_write_encap(int encap);
#endif
diff --git a/wiretap/wtap-int.h b/wiretap/wtap-int.h
index 898e8b414e..d938e359be 100644
--- a/wiretap/wtap-int.h
+++ b/wiretap/wtap-int.h
@@ -82,7 +82,7 @@ typedef void *WFILE_T;
typedef gboolean (*subtype_write_func)(struct wtap_dumper*,
const wtap_rec *rec,
const guint8*, int*, gchar**);
-typedef gboolean (*subtype_finish_func)(struct wtap_dumper*, int*);
+typedef gboolean (*subtype_finish_func)(struct wtap_dumper*, int*, gchar**);
struct wtap_dumper {
WFILE_T fh;
diff --git a/wiretap/wtap.h b/wiretap/wtap.h
index 0d31cc93f4..d4aa73ad27 100644
--- a/wiretap/wtap.h
+++ b/wiretap/wtap.h
@@ -1748,7 +1748,7 @@ struct file_type_subtype_info {
/* the function to open the capture file for writing */
/* should be NULL is this file type don't have write support */
- int (*dump_open)(wtap_dumper *, int *);
+ int (*dump_open)(wtap_dumper *, int *, gchar **);
/* if can_write_encap returned WTAP_ERR_CHECK_WSLUA, then this is used instead */
/* this should be NULL for everyone except Lua-based file writers */
@@ -1770,9 +1770,9 @@ void wtap_init(gboolean load_wiretap_plugins);
*
* @param filename Name of the file to open
* @param type WTAP_TYPE_AUTO for automatic recognize file format or explicit choose format type
- * @param err a positive "errno" value if the capture file can't be opened;
+ * @param[out] err a positive "errno" value if the capture file can't be opened;
* a negative number, indicating the type of error, on other failures.
- * @param err_info for some errors, a string giving more details of
+ * @param[out] err_info for some errors, a string giving more details of
* the error
* @param do_random TRUE if random access to the file will be done,
* FALSE if not
@@ -2117,12 +2117,14 @@ void wtap_dump_params_cleanup(wtap_dump_params *params);
* @param compression_type Type of compression to use when writing, if any
* @param params The per-file information for this file.
* @param[out] err Will be set to an error code on failure.
+ * @param[out] err_info for some errors, a string giving more details of
+ * the error
* @return The newly created dumper object, or NULL on failure.
*/
WS_DLL_PUBLIC
wtap_dumper* wtap_dump_open(const char *filename, int file_type_subtype,
wtap_compression_type compression_type, const wtap_dump_params *params,
- int *err);
+ int *err, gchar **err_info);
/**
* @brief Creates a dumper for a temporary file.
@@ -2134,12 +2136,14 @@ wtap_dumper* wtap_dump_open(const char *filename, int file_type_subtype,
* @param compression_type Type of compression to use when writing, if any
* @param params The per-file information for this file.
* @param[out] err Will be set to an error code on failure.
+ * @param[out] err_info for some errors, a string giving more details of
+ * the error
* @return The newly created dumper object, or NULL on failure.
*/
WS_DLL_PUBLIC
wtap_dumper* wtap_dump_open_tempfile(char **filenamep, const char *pfx,
int file_type_subtype, wtap_compression_type compression_type,
- const wtap_dump_params *params, int *err);
+ const wtap_dump_params *params, int *err, gchar **err_info);
/**
* @brief Creates a dumper for an existing file descriptor.
@@ -2149,12 +2153,14 @@ wtap_dumper* wtap_dump_open_tempfile(char **filenamep, const char *pfx,
* @param compression_type Type of compression to use when writing, if any
* @param params The per-file information for this file.
* @param[out] err Will be set to an error code on failure.
+ * @param[out] err_info for some errors, a string giving more details of
+ * the error
* @return The newly created dumper object, or NULL on failure.
*/
WS_DLL_PUBLIC
wtap_dumper* wtap_dump_fdopen(int fd, int file_type_subtype,
wtap_compression_type compression_type, const wtap_dump_params *params,
- int *err);
+ int *err, gchar **err_info);
/**
* @brief Creates a dumper for the standard output.
@@ -2163,12 +2169,14 @@ wtap_dumper* wtap_dump_fdopen(int fd, int file_type_subtype,
* @param compression_type Type of compression to use when writing, if any
* @param params The per-file information for this file.
* @param[out] err Will be set to an error code on failure.
+ * @param[out] err_info for some errors, a string giving more details of
+ * the error
* @return The newly created dumper object, or NULL on failure.
*/
WS_DLL_PUBLIC
wtap_dumper* wtap_dump_open_stdout(int file_type_subtype,
wtap_compression_type compression_type, const wtap_dump_params *params,
- int *err);
+ int *err, gchar **err_info);
WS_DLL_PUBLIC
gboolean wtap_dump(wtap_dumper *, const wtap_rec *, const guint8 *,
@@ -2194,7 +2202,7 @@ void wtap_dump_discard_decryption_secrets(wtap_dumper *wdh);
* shb_hdr, idb_inf and nrb_hdr are not freed by this routine.
*/
WS_DLL_PUBLIC
-gboolean wtap_dump_close(wtap_dumper *wdh, int *err);
+gboolean wtap_dump_close(wtap_dumper *wdh, int *err, gchar **err_info);
/**
* Return TRUE if we can write a file out with the given GArray of file