forked from osmocom/wireshark
Add a routine to report write errors to the list of failure-reporting
routines handled by epan/report_err.c. Move copy_binary_file() in file.c to epan/filesystem.c, and rename it to copy_file_binary_mode() (to clarify that it *can* copy text files; arguably, *all* files are "binary" unless you're on, say, an IBM 1401 :-)). Have it use the report_err.c routines, so it works in console-mode programs. Clean up some comments while we're at it. svn path=/trunk/; revision=27456
This commit is contained in:
parent
8f2e6281c1
commit
ace4af44fc
|
@ -306,7 +306,7 @@ main(int argc, char *argv[])
|
||||||
g_warning("capinfos: init_progfile_dir(): %s", init_progfile_dir_error);
|
g_warning("capinfos: init_progfile_dir(): %s", init_progfile_dir_error);
|
||||||
g_free(init_progfile_dir_error);
|
g_free(init_progfile_dir_error);
|
||||||
} else {
|
} else {
|
||||||
init_report_err(failure_message,NULL,NULL);
|
init_report_err(failure_message,NULL,NULL,NULL);
|
||||||
init_plugins();
|
init_plugins();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
19
dftest.c
19
dftest.c
|
@ -1,4 +1,5 @@
|
||||||
/* dftest.c.c
|
/* dftest.c
|
||||||
|
* Shows display filter byte-code, for debugging dfilter routines.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
|
@ -6,8 +7,6 @@
|
||||||
* By Gerald Combs <gerald@wireshark.org>
|
* By Gerald Combs <gerald@wireshark.org>
|
||||||
* Copyright 1998 Gerald Combs
|
* Copyright 1998 Gerald Combs
|
||||||
*
|
*
|
||||||
* Shows display filter byte-code, for debugging dfilter routines.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
@ -55,6 +54,7 @@ static void failure_message(const char *msg_format, va_list ap);
|
||||||
static void open_failure_message(const char *filename, int err,
|
static void open_failure_message(const char *filename, int err,
|
||||||
gboolean for_writing);
|
gboolean for_writing);
|
||||||
static void read_failure_message(const char *filename, int err);
|
static void read_failure_message(const char *filename, int err);
|
||||||
|
static void write_failure_message(const char *filename, int err);
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
|
@ -89,7 +89,8 @@ main(int argc, char **argv)
|
||||||
in case any dissectors register preferences. */
|
in case any dissectors register preferences. */
|
||||||
epan_init(register_all_protocols,
|
epan_init(register_all_protocols,
|
||||||
register_all_protocol_handoffs, NULL, NULL,
|
register_all_protocol_handoffs, NULL, NULL,
|
||||||
failure_message, open_failure_message, read_failure_message);
|
failure_message, open_failure_message, read_failure_message,
|
||||||
|
write_failure_message);
|
||||||
|
|
||||||
/* now register the preferences for any non-dissector modules.
|
/* now register the preferences for any non-dissector modules.
|
||||||
we must do that before we read the preferences as well. */
|
we must do that before we read the preferences as well. */
|
||||||
|
@ -191,3 +192,13 @@ read_failure_message(const char *filename, int err)
|
||||||
fprintf(stderr, "dftest: An error occurred while reading from the file \"%s\": %s.\n",
|
fprintf(stderr, "dftest: An error occurred while reading from the file \"%s\": %s.\n",
|
||||||
filename, strerror(err));
|
filename, strerror(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write errors are reported with an console message in "dftest".
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
write_failure_message(const char *filename, int err)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "dftest: An error occurred while writing to the file \"%s\": %s.\n",
|
||||||
|
filename, strerror(err));
|
||||||
|
}
|
||||||
|
|
|
@ -428,7 +428,7 @@ main(int argc, char *argv[])
|
||||||
g_warning("capinfos: init_progfile_dir(): %s", init_progfile_dir_error);
|
g_warning("capinfos: init_progfile_dir(): %s", init_progfile_dir_error);
|
||||||
g_free(init_progfile_dir_error);
|
g_free(init_progfile_dir_error);
|
||||||
} else {
|
} else {
|
||||||
init_report_err(failure_message,NULL,NULL);
|
init_report_err(failure_message,NULL,NULL,NULL);
|
||||||
init_plugins();
|
init_plugins();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -75,9 +75,11 @@ epan_init(void (*register_all_protocols_func)(register_cb cb, gpointer client_da
|
||||||
gpointer client_data,
|
gpointer client_data,
|
||||||
void (*report_failure)(const char *, va_list),
|
void (*report_failure)(const char *, va_list),
|
||||||
void (*report_open_failure)(const char *, int, gboolean),
|
void (*report_open_failure)(const char *, int, gboolean),
|
||||||
void (*report_read_failure)(const char *, int))
|
void (*report_read_failure)(const char *, int),
|
||||||
|
void (*report_write_failure)(const char *, int))
|
||||||
{
|
{
|
||||||
init_report_err(report_failure, report_open_failure, report_read_failure);
|
init_report_err(report_failure, report_open_failure,
|
||||||
|
report_read_failure, report_write_failure);
|
||||||
|
|
||||||
/* initialize memory allocation subsystem */
|
/* initialize memory allocation subsystem */
|
||||||
ep_init_chunk();
|
ep_init_chunk();
|
||||||
|
|
|
@ -40,11 +40,15 @@ void epan_init(void (*register_all_protocols_func)(register_cb cb, gpointer clie
|
||||||
void *client_data,
|
void *client_data,
|
||||||
void (*report_failure)(const char *, va_list),
|
void (*report_failure)(const char *, va_list),
|
||||||
void (*report_open_failure)(const char *, int, gboolean),
|
void (*report_open_failure)(const char *, int, gboolean),
|
||||||
void (*report_read_failure)(const char *, int));
|
void (*report_read_failure)(const char *, int),
|
||||||
|
void (*report_write_failure)(const char *, int));
|
||||||
|
|
||||||
/* cleanup the whole epan module, this is used to be called only once in a program */
|
/* cleanup the whole epan module, this is used to be called only once in a program */
|
||||||
void epan_cleanup(void);
|
void epan_cleanup(void);
|
||||||
|
|
||||||
/* Initialize the table of conversations. */
|
/* Initialize the table of conversations. */
|
||||||
void epan_conversation_init(void);
|
void epan_conversation_init(void);
|
||||||
|
|
||||||
/* Initialize the table of circuits. */
|
/* Initialize the table of circuits. */
|
||||||
/* XXX - what is a circuit and should this better be combined with epan_conversation_init? */
|
/* XXX - what is a circuit and should this better be combined with epan_conversation_init? */
|
||||||
void epan_circuit_init(void);
|
void epan_circuit_init(void);
|
||||||
|
|
|
@ -42,6 +42,10 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_FCNTL_H
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_STAT_H
|
#ifdef HAVE_SYS_STAT_H
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -56,9 +60,12 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "filesystem.h"
|
#include "filesystem.h"
|
||||||
|
#include "report_err.h"
|
||||||
#include <wsutil/privileges.h>
|
#include <wsutil/privileges.h>
|
||||||
#include <wsutil/file_util.h>
|
#include <wsutil/file_util.h>
|
||||||
|
|
||||||
|
#include <wiretap/wtap.h> /* for WTAP_ERR_SHORT_WRITE */
|
||||||
|
|
||||||
#define PROFILES_DIR "profiles"
|
#define PROFILES_DIR "profiles"
|
||||||
#define U3_MY_CAPTURES "\\My Captures"
|
#define U3_MY_CAPTURES "\\My Captures"
|
||||||
|
|
||||||
|
@ -1552,6 +1559,72 @@ files_identical(const char *fname1, const char *fname2)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy a file in binary mode, for those operating systems that care about
|
||||||
|
* such things. This should be OK for all files, even text files, as
|
||||||
|
* we'll copy the raw bytes, and we don't look at the bytes as we copy
|
||||||
|
* them.
|
||||||
|
*
|
||||||
|
* Returns TRUE on success, FALSE on failure. If a failure, it also
|
||||||
|
* displays a simple dialog window with the error message.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
copy_file_binary_mode(const char *from_filename, const char *to_filename)
|
||||||
|
{
|
||||||
|
int from_fd, to_fd, nread, nwritten, err;
|
||||||
|
guint8 pd[65536];
|
||||||
|
|
||||||
|
/* Copy the raw bytes of the file. */
|
||||||
|
from_fd = ws_open(from_filename, O_RDONLY | O_BINARY, 0000 /* no creation so don't matter */);
|
||||||
|
if (from_fd < 0) {
|
||||||
|
report_open_failure(from_filename, errno, FALSE);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use open() instead of creat() so that we can pass the O_BINARY
|
||||||
|
flag, which is relevant on Win32; it appears that "creat()"
|
||||||
|
may open the file in text mode, not binary mode, but we want
|
||||||
|
to copy the raw bytes of the file, so we need the output file
|
||||||
|
to be open in binary mode. */
|
||||||
|
to_fd = ws_open(to_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
|
||||||
|
if (to_fd < 0) {
|
||||||
|
report_open_failure(to_filename, errno, TRUE);
|
||||||
|
ws_close(from_fd);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((nread = ws_read(from_fd, pd, sizeof pd)) > 0) {
|
||||||
|
nwritten = ws_write(to_fd, pd, nread);
|
||||||
|
if (nwritten < nread) {
|
||||||
|
if (nwritten < 0)
|
||||||
|
err = errno;
|
||||||
|
else
|
||||||
|
err = WTAP_ERR_SHORT_WRITE;
|
||||||
|
report_write_failure(to_filename, err);
|
||||||
|
ws_close(from_fd);
|
||||||
|
ws_close(to_fd);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nread < 0) {
|
||||||
|
err = errno;
|
||||||
|
report_read_failure(from_filename, err);
|
||||||
|
ws_close(from_fd);
|
||||||
|
ws_close(to_fd);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
ws_close(from_fd);
|
||||||
|
if (ws_close(to_fd) < 0) {
|
||||||
|
report_write_failure(to_filename, errno);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
done:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Editor modelines
|
* Editor modelines
|
||||||
*
|
*
|
||||||
|
@ -1564,4 +1637,3 @@ files_identical(const char *fname1, const char *fname2)
|
||||||
* ex: set shiftwidth=4 tabstop=4 noexpandtab
|
* ex: set shiftwidth=4 tabstop=4 noexpandtab
|
||||||
* :indentSize=4:tabSize=4:noTabs=false:
|
* :indentSize=4:tabSize=4:noTabs=false:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -234,10 +234,22 @@ extern gboolean deletefile (const char *path);
|
||||||
extern gboolean file_exists(const char *fname);
|
extern gboolean file_exists(const char *fname);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check, if two filenames are identical (with absolute and relative paths).
|
* Check if two filenames are identical (with absolute and relative paths).
|
||||||
*/
|
*/
|
||||||
extern gboolean files_identical(const char *fname1, const char *fname2);
|
extern gboolean files_identical(const char *fname1, const char *fname2);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy a file in binary mode, for those operating systems that care about
|
||||||
|
* such things. This should be OK for all files, even text files, as
|
||||||
|
* we'll copy the raw bytes, and we don't look at the bytes as we copy
|
||||||
|
* them.
|
||||||
|
*
|
||||||
|
* Returns TRUE on success, FALSE on failure. If a failure, it also
|
||||||
|
* displays a simple dialog window with the error message.
|
||||||
|
*/
|
||||||
|
extern gboolean copy_file_binary_mode(const char *from_filename,
|
||||||
|
const char *to_filename);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/*
|
/*
|
||||||
* utf8 version of getenv, needed to get win32 filename paths
|
* utf8 version of getenv, needed to get win32 filename paths
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
/* report_err.h
|
/* report_err.c
|
||||||
* Declarations of routines for dissectors to use to report errors to
|
* Routines for code that can run in GUI and command-line environments to
|
||||||
* the user (e.g., problems with preference settings)
|
* use to report errors to the user (e.g., I/O errors, or problems with
|
||||||
|
* preference settings).
|
||||||
|
*
|
||||||
|
* The application using libwireshark will register error-reporting
|
||||||
|
* routines, and the routines defined here will call the registered
|
||||||
|
* routines. That way, these routines can be called by code that
|
||||||
|
* doesn't itself know whether to pop up a dialog or print something
|
||||||
|
* to the standard error.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
|
@ -33,13 +40,17 @@
|
||||||
static void (*report_failure_func)(const char *, va_list);
|
static void (*report_failure_func)(const char *, va_list);
|
||||||
static void (*report_open_failure_func)(const char *, int, gboolean);
|
static void (*report_open_failure_func)(const char *, int, gboolean);
|
||||||
static void (*report_read_failure_func)(const char *, int);
|
static void (*report_read_failure_func)(const char *, int);
|
||||||
|
static void (*report_write_failure_func)(const char *, int);
|
||||||
|
|
||||||
void init_report_err(void (*report_failure)(const char *, va_list),
|
void init_report_err(void (*report_failure)(const char *, va_list),
|
||||||
void (*report_open_failure)(const char *, int, gboolean),
|
void (*report_open_failure)(const char *, int, gboolean),
|
||||||
void (*report_read_failure)(const char *, int)) {
|
void (*report_read_failure)(const char *, int),
|
||||||
|
void (*report_write_failure)(const char *, int))
|
||||||
|
{
|
||||||
report_failure_func = report_failure;
|
report_failure_func = report_failure;
|
||||||
report_open_failure_func = report_open_failure;
|
report_open_failure_func = report_open_failure;
|
||||||
report_read_failure_func = report_read_failure;
|
report_read_failure_func = report_read_failure;
|
||||||
|
report_write_failure_func = report_write_failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -78,3 +89,12 @@ report_read_failure(const char *filename, int err)
|
||||||
(*report_read_failure_func)(filename, err);
|
(*report_read_failure_func)(filename, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Report an error when trying to write a file.
|
||||||
|
* "err" is assumed to be a UNIX-style errno.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
report_write_failure(const char *filename, int err)
|
||||||
|
{
|
||||||
|
(*report_write_failure_func)(filename, err);
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
/* report_err.h
|
/* report_err.h
|
||||||
* Declarations of routines for dissectors to use to report errors to
|
* Declarations of routines for code that can run in GUI and command-line
|
||||||
* the user (e.g., problems with preference settings)
|
* environments to use to report errors to the user (e.g., I/O errors, or
|
||||||
|
* problems with preference settings).
|
||||||
|
*
|
||||||
|
* The application using libwireshark will register error-reporting
|
||||||
|
* routines, and the routines declared here will call the registered
|
||||||
|
* routines. That way, these routines can be called by code that
|
||||||
|
* doesn't itself know whether to pop up a dialog or print something
|
||||||
|
* to the standard error.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
|
@ -36,24 +43,35 @@ extern "C" {
|
||||||
extern void init_report_err(
|
extern void init_report_err(
|
||||||
void (*report_failure)(const char *, va_list),
|
void (*report_failure)(const char *, va_list),
|
||||||
void (*report_open_failure)(const char *, int, gboolean),
|
void (*report_open_failure)(const char *, int, gboolean),
|
||||||
void (*report_read_failure)(const char *, int));
|
void (*report_read_failure)(const char *, int),
|
||||||
|
void (*report_write_failure)(const char *, int));
|
||||||
/*
|
|
||||||
* Report an error when trying to open a file.
|
|
||||||
*/
|
|
||||||
extern void report_open_failure(const char *filename, int err,
|
|
||||||
gboolean for_writing);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Report an error when trying to read a file.
|
|
||||||
*/
|
|
||||||
extern void report_read_failure(const char *filename, int err);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Report a general error.
|
* Report a general error.
|
||||||
*/
|
*/
|
||||||
extern void report_failure(const char *msg_format, ...);
|
extern void report_failure(const char *msg_format, ...);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Report an error when trying to open a file.
|
||||||
|
* "err" is assumed to be an error code from Wiretap; positive values are
|
||||||
|
* UNIX-style errnos, so this can be used for open failures not from
|
||||||
|
* Wiretap as long as the failure code is just an errno.
|
||||||
|
*/
|
||||||
|
extern void report_open_failure(const char *filename, int err,
|
||||||
|
gboolean for_writing);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Report an error when trying to read a file.
|
||||||
|
* "err" is assumed to be a UNIX-style errno.
|
||||||
|
*/
|
||||||
|
extern void report_read_failure(const char *filename, int err);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Report an error when trying to write a file.
|
||||||
|
* "err" is assumed to be a UNIX-style errno.
|
||||||
|
*/
|
||||||
|
extern void report_write_failure(const char *filename, int err);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
71
file.c
71
file.c
|
@ -43,10 +43,6 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NEED_STRERROR_H
|
|
||||||
#include "strerror.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <epan/epan.h>
|
#include <epan/epan.h>
|
||||||
#include <epan/filesystem.h>
|
#include <epan/filesystem.h>
|
||||||
|
|
||||||
|
@ -117,7 +113,6 @@ static void cf_open_failure_alert_box(const char *filename, int err,
|
||||||
static const char *file_rename_error_message(int err);
|
static const char *file_rename_error_message(int err);
|
||||||
static void cf_write_failure_alert_box(const char *filename, int err);
|
static void cf_write_failure_alert_box(const char *filename, int err);
|
||||||
static void cf_close_failure_alert_box(const char *filename, int err);
|
static void cf_close_failure_alert_box(const char *filename, int err);
|
||||||
static gboolean copy_binary_file(const char *from_filename, const char *to_filename);
|
|
||||||
|
|
||||||
/* Update the progress bar this many times when reading a file. */
|
/* Update the progress bar this many times when reading a file. */
|
||||||
#define N_PROGBAR_UPDATES 100
|
#define N_PROGBAR_UPDATES 100
|
||||||
|
@ -3575,7 +3570,7 @@ cf_save(capture_file *cf, const char *fname, packet_range_t *range, guint save_f
|
||||||
|
|
||||||
if (do_copy) {
|
if (do_copy) {
|
||||||
/* Copy the file, if we haven't moved it. */
|
/* Copy the file, if we haven't moved it. */
|
||||||
if (!copy_binary_file(from_filename, fname))
|
if (!copy_file_binary_mode(from_filename, fname))
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -3957,67 +3952,3 @@ cf_reload(capture_file *cf) {
|
||||||
we should free up our copy. */
|
we should free up our copy. */
|
||||||
g_free(filename);
|
g_free(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copies a file in binary mode, for those operating systems that care about
|
|
||||||
* such things.
|
|
||||||
* Returns TRUE on success, FALSE on failure. If a failure, it also
|
|
||||||
* displays a simple dialog window with the error message.
|
|
||||||
*/
|
|
||||||
static gboolean
|
|
||||||
copy_binary_file(const char *from_filename, const char *to_filename)
|
|
||||||
{
|
|
||||||
int from_fd, to_fd, nread, nwritten, err;
|
|
||||||
guint8 pd[65536];
|
|
||||||
|
|
||||||
/* Copy the raw bytes of the file. */
|
|
||||||
from_fd = ws_open(from_filename, O_RDONLY | O_BINARY, 0000 /* no creation so don't matter */);
|
|
||||||
if (from_fd < 0) {
|
|
||||||
open_failure_alert_box(from_filename, errno, FALSE);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Use open() instead of creat() so that we can pass the O_BINARY
|
|
||||||
flag, which is relevant on Win32; it appears that "creat()"
|
|
||||||
may open the file in text mode, not binary mode, but we want
|
|
||||||
to copy the raw bytes of the file, so we need the output file
|
|
||||||
to be open in binary mode. */
|
|
||||||
to_fd = ws_open(to_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
|
|
||||||
if (to_fd < 0) {
|
|
||||||
open_failure_alert_box(to_filename, errno, TRUE);
|
|
||||||
ws_close(from_fd);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((nread = ws_read(from_fd, pd, sizeof pd)) > 0) {
|
|
||||||
nwritten = ws_write(to_fd, pd, nread);
|
|
||||||
if (nwritten < nread) {
|
|
||||||
if (nwritten < 0)
|
|
||||||
err = errno;
|
|
||||||
else
|
|
||||||
err = WTAP_ERR_SHORT_WRITE;
|
|
||||||
write_failure_alert_box(to_filename, err);
|
|
||||||
ws_close(from_fd);
|
|
||||||
ws_close(to_fd);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nread < 0) {
|
|
||||||
err = errno;
|
|
||||||
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
|
|
||||||
"An error occurred while reading from the file \"%s\": %s.",
|
|
||||||
from_filename, strerror(err));
|
|
||||||
ws_close(from_fd);
|
|
||||||
ws_close(to_fd);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
ws_close(from_fd);
|
|
||||||
if (ws_close(to_fd) < 0) {
|
|
||||||
write_failure_alert_box(to_filename, errno);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
done:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
|
@ -2016,7 +2016,8 @@ main(int argc, char *argv[])
|
||||||
case any dissectors register preferences. */
|
case any dissectors register preferences. */
|
||||||
epan_init(register_all_protocols,register_all_protocol_handoffs,
|
epan_init(register_all_protocols,register_all_protocol_handoffs,
|
||||||
splash_update, (gpointer) splash_win,
|
splash_update, (gpointer) splash_win,
|
||||||
failure_alert_box,open_failure_alert_box,read_failure_alert_box);
|
failure_alert_box,open_failure_alert_box,read_failure_alert_box,
|
||||||
|
write_failure_alert_box);
|
||||||
|
|
||||||
splash_update(RA_LISTENERS, NULL, (gpointer)splash_win);
|
splash_update(RA_LISTENERS, NULL, (gpointer)splash_win);
|
||||||
|
|
||||||
|
|
14
rawshark.c
14
rawshark.c
|
@ -154,6 +154,7 @@ static void open_failure_message(const char *filename, int err,
|
||||||
gboolean for_writing);
|
gboolean for_writing);
|
||||||
static void failure_message(const char *msg_format, va_list ap);
|
static void failure_message(const char *msg_format, va_list ap);
|
||||||
static void read_failure_message(const char *filename, int err);
|
static void read_failure_message(const char *filename, int err);
|
||||||
|
static void write_failure_message(const char *filename, int err);
|
||||||
static void protocolinfo_init(char *field);
|
static void protocolinfo_init(char *field);
|
||||||
static gboolean parse_field_string_format(char *format);
|
static gboolean parse_field_string_format(char *format);
|
||||||
|
|
||||||
|
@ -492,7 +493,8 @@ main(int argc, char *argv[])
|
||||||
dissectors, and we must do it before we read the preferences, in
|
dissectors, and we must do it before we read the preferences, in
|
||||||
case any dissectors register preferences. */
|
case any dissectors register preferences. */
|
||||||
epan_init(register_all_protocols, register_all_protocol_handoffs, NULL, NULL,
|
epan_init(register_all_protocols, register_all_protocol_handoffs, NULL, NULL,
|
||||||
failure_message, open_failure_message, read_failure_message);
|
failure_message, open_failure_message, read_failure_message,
|
||||||
|
write_failure_message);
|
||||||
|
|
||||||
/* Now register the preferences for any non-dissector modules.
|
/* Now register the preferences for any non-dissector modules.
|
||||||
We must do that before we read the preferences as well. */
|
We must do that before we read the preferences as well. */
|
||||||
|
@ -1625,6 +1627,16 @@ read_failure_message(const char *filename, int err)
|
||||||
filename, strerror(err));
|
filename, strerror(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write errors are reported with an console message in Rawshark.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
write_failure_message(const char *filename, int err)
|
||||||
|
{
|
||||||
|
cmdarg_err("An error occurred while writing to the file \"%s\": %s.",
|
||||||
|
filename, strerror(err));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Report an error in command-line arguments.
|
* Report an error in command-line arguments.
|
||||||
*/
|
*/
|
||||||
|
|
20
tshark.c
20
tshark.c
|
@ -1,4 +1,7 @@
|
||||||
/* tshark.c
|
/* tshark.c
|
||||||
|
*
|
||||||
|
* Text-mode variant of Wireshark, along the lines of tcpdump and snoop,
|
||||||
|
* by Gilbert Ramirez <gram@alumni.rice.edu> and Guy Harris <guy@alum.mit.edu>.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
|
@ -6,9 +9,6 @@
|
||||||
* By Gerald Combs <gerald@wireshark.org>
|
* By Gerald Combs <gerald@wireshark.org>
|
||||||
* Copyright 1998 Gerald Combs
|
* Copyright 1998 Gerald Combs
|
||||||
*
|
*
|
||||||
* Text-mode variant, by Gilbert Ramirez <gram@alumni.rice.edu>
|
|
||||||
* and Guy Harris <guy@alum.mit.edu>.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
@ -179,6 +179,7 @@ static void open_failure_message(const char *filename, int err,
|
||||||
gboolean for_writing);
|
gboolean for_writing);
|
||||||
static void failure_message(const char *msg_format, va_list ap);
|
static void failure_message(const char *msg_format, va_list ap);
|
||||||
static void read_failure_message(const char *filename, int err);
|
static void read_failure_message(const char *filename, int err);
|
||||||
|
static void write_failure_message(const char *filename, int err);
|
||||||
|
|
||||||
capture_file cfile;
|
capture_file cfile;
|
||||||
|
|
||||||
|
@ -834,7 +835,8 @@ main(int argc, char *argv[])
|
||||||
dissectors, and we must do it before we read the preferences, in
|
dissectors, and we must do it before we read the preferences, in
|
||||||
case any dissectors register preferences. */
|
case any dissectors register preferences. */
|
||||||
epan_init(register_all_protocols, register_all_protocol_handoffs, NULL, NULL,
|
epan_init(register_all_protocols, register_all_protocol_handoffs, NULL, NULL,
|
||||||
failure_message, open_failure_message, read_failure_message);
|
failure_message, open_failure_message, read_failure_message,
|
||||||
|
write_failure_message);
|
||||||
|
|
||||||
/* Register all tap listeners; we do this before we parse the arguments,
|
/* Register all tap listeners; we do this before we parse the arguments,
|
||||||
as the "-z" argument can specify a registered tap. */
|
as the "-z" argument can specify a registered tap. */
|
||||||
|
@ -3132,6 +3134,16 @@ read_failure_message(const char *filename, int err)
|
||||||
filename, strerror(err));
|
filename, strerror(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write errors are reported with an console message in TShark.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
write_failure_message(const char *filename, int err)
|
||||||
|
{
|
||||||
|
cmdarg_err("An error occurred while writing to the file \"%s\": %s.",
|
||||||
|
filename, strerror(err));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Report an error in command-line arguments.
|
* Report an error in command-line arguments.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue