Add wtap_dump_open_tempfile routines, to write to a temporary file.

It includes the temporary-file generation, so you don't have to do it
yourself.

Change-Id: I0798df95a5c5646224ec49612f50b423ed78547a
Reviewed-on: https://code.wireshark.org/review/11751
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2015-11-11 16:59:10 -08:00
parent af8c70cb7d
commit 75dc2051e8
5 changed files with 106 additions and 25 deletions

View File

@ -452,7 +452,6 @@ header_sctp_data_rb_toggle(GtkWidget *widget, gpointer data)
static void
file_import_open(text_import_info_t *info)
{
int import_file_fd;
char *tmpname, *capfile_name;
int err;
@ -462,10 +461,6 @@ file_import_open(text_import_info_t *info)
wtapng_if_descr_t int_data;
GString *os_info_str;
/* Choose a random name for the temporary import buffer */
import_file_fd = create_tempfile(&tmpname, "import");
capfile_name = g_strdup(tmpname);
/* Create data for SHB */
os_info_str = g_string_new("");
get_os_version_info(os_info_str);
@ -515,11 +510,15 @@ file_import_open(text_import_info_t *info)
g_array_append_val(idb_inf->interface_data, int_data);
info->wdh = wtap_dump_fdopen_ng(import_file_fd, WTAP_FILE_TYPE_SUBTYPE_PCAPNG, info->encapsulation,
info->max_frame_length, FALSE,
shb_hdr, idb_inf, NULL, &err);
/* Use a random name for the temporary import buffer */
info->wdh = wtap_dump_open_tempfile_ng(&tmpname, "import",
WTAP_FILE_TYPE_SUBTYPE_PCAPNG,
info->encapsulation,
info->max_frame_length, FALSE,
shb_hdr, idb_inf, NULL, &err);
capfile_name = g_strdup(tmpname);
if (info->wdh == NULL) {
open_failure_alert_box(capfile_name, err, TRUE);
open_failure_alert_box(tmpname ? tmpname : "temporary file", err, TRUE);
fclose(info->import_text_file);
goto end;
}

View File

@ -115,16 +115,13 @@ QString &ImportTextDialog::capfileName() {
}
void ImportTextDialog::convertTextFile() {
int import_file_fd;
char *tmpname;
int err;
capfile_name_.clear();
/* Choose a random name for the temporary import buffer */
import_file_fd = create_tempfile(&tmpname, "import");
capfile_name_.append(tmpname);
import_info_.wdh = wtap_dump_fdopen(import_file_fd, WTAP_FILE_TYPE_SUBTYPE_PCAP, import_info_.encapsulation, import_info_.max_frame_length, FALSE, &err);
/* Use a random name for the temporary import buffer */
import_info_.wdh = wtap_dump_open_tempfile(&tmpname, "import", WTAP_FILE_TYPE_SUBTYPE_PCAP, import_info_.encapsulation, import_info_.max_frame_length, FALSE, &err);
capfile_name_.append(tmpname ? tmpname : "temporary file");
qDebug() << capfile_name_ << ":" << import_info_.wdh << import_info_.encapsulation << import_info_.max_frame_length;
if (import_info_.wdh == NULL) {
open_failure_alert_box(capfile_name_.toUtf8().constData(), err, TRUE);

View File

@ -98,7 +98,6 @@ export_pdu_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt, const
static void
exp_pdu_file_open(exp_pdu_t *exp_pdu_tap_data)
{
int import_file_fd;
char *tmpname, *capfile_name;
int err;
@ -108,10 +107,6 @@ exp_pdu_file_open(exp_pdu_t *exp_pdu_tap_data)
wtapng_if_descr_t int_data;
GString *os_info_str;
/* Choose a random name for the temporary import buffer */
import_file_fd = create_tempfile(&tmpname, "Wireshark_PDU_");
capfile_name = g_strdup(tmpname);
/* Create data for SHB */
os_info_str = g_string_new("");
get_os_version_info(os_info_str);
@ -160,15 +155,17 @@ exp_pdu_file_open(exp_pdu_t *exp_pdu_tap_data)
g_array_append_val(idb_inf->interface_data, int_data);
exp_pdu_tap_data->wdh = wtap_dump_fdopen_ng(import_file_fd, WTAP_FILE_TYPE_SUBTYPE_PCAPNG,
WTAP_ENCAP_WIRESHARK_UPPER_PDU, WTAP_MAX_PACKET_SIZE,
FALSE, shb_hdr, idb_inf, NULL, &err);
/* Use a random name for the temporary import buffer */
exp_pdu_tap_data->wdh = wtap_dump_open_tempfile_ng(&tmpname, "Wireshark_PDU_",
WTAP_FILE_TYPE_SUBTYPE_PCAPNG,
WTAP_ENCAP_WIRESHARK_UPPER_PDU, WTAP_MAX_PACKET_SIZE,
FALSE, shb_hdr, idb_inf, NULL, &err);
capfile_name = g_strdup(tmpname);
if (exp_pdu_tap_data->wdh == NULL) {
open_failure_alert_box(capfile_name, err, TRUE);
open_failure_alert_box(capfile_name ? capfile_name : "temporary file", err, TRUE);
goto end;
}
/* Run the tap */
cf_retap_packets(&cfile);

View File

@ -26,6 +26,7 @@
#include <errno.h>
#include <wsutil/file_util.h>
#include <wsutil/tempfile.h>
#include "wtap-int.h"
#include "file_wrappers.h"
@ -2239,6 +2240,62 @@ wtap_dump_open_ng(const char *filename, int file_type_subtype, int encap,
return wdh;
}
wtap_dumper *
wtap_dump_open_tempfile(char **filenamep, const char *pfx,
int file_type_subtype, int encap,
int snaplen, gboolean compressed, int *err)
{
return wtap_dump_open_tempfile_ng(filenamep, pfx, file_type_subtype, encap,snaplen, compressed, NULL, NULL, NULL, err);
}
wtap_dumper *
wtap_dump_open_tempfile_ng(char **filenamep, const char *pfx,
int file_type_subtype, int encap,
int snaplen, gboolean compressed,
wtapng_section_t *shb_hdr,
wtapng_iface_descriptions_t *idb_inf,
wtapng_name_res_t *nrb_hdr, int *err)
{
int fd;
char *tmpname;
wtap_dumper *wdh;
WFILE_T fh;
/* No path name for the temporary file yet. */
*filenamep = NULL;
/* Allocate and initialize a data structure for the output stream. */
wdh = wtap_dump_init_dumper(file_type_subtype, encap, snaplen, compressed,
shb_hdr, idb_inf, nrb_hdr, err);
if (wdh == NULL)
return NULL;
/* Choose a random name for the file */
fd = create_tempfile(&tmpname, pfx);
*filenamep = tmpname;
/* In case "fopen()" fails but doesn't set "errno", set "errno"
to a generic "the open failed" error. */
errno = WTAP_ERR_CANT_OPEN;
fh = wtap_dump_file_fdopen(wdh, fd);
if (fh == NULL) {
*err = errno;
g_free(wdh);
return NULL; /* can't create file */
}
wdh->fh = fh;
if (!wtap_dump_open_finish(wdh, file_type_subtype, compressed, err)) {
/* Get rid of the file we created; we couldn't finish
opening it. */
wtap_dump_file_close(wdh);
ws_unlink(tmpname);
g_free(wdh);
return NULL;
}
return wdh;
}
wtap_dumper *
wtap_dump_fdopen(int fd, int file_type_subtype, int encap, int snaplen,
gboolean compressed, int *err)

View File

@ -1940,6 +1940,37 @@ wtap_dumper* wtap_dump_open_ng(const char *filename, int file_type_subtype, int
int snaplen, gboolean compressed, wtapng_section_t *shb_hdr, wtapng_iface_descriptions_t *idb_inf,
wtapng_name_res_t *nrb_hdr, int *err);
WS_DLL_PUBLIC
wtap_dumper* wtap_dump_open_tempfile(char **filenamep, const char *pfx,
int file_type_subtype, int encap, int snaplen, gboolean compressed,
int *err);
/**
* @brief Creates a dumper for a temporary file.
*
* @note The shb_hdr, idb_inf, and nrb_hdr arguments will be used until
* wtap_dump_close() is called, but will not be free'd by the dumper. If
* you created them, you must free them yourself after wtap_dump_close().
*
* @param filenamep Points to a pointer that's set to point to the
* pathname of the temporary file; it's allocated with g_malloc()
* @param pfx A string to be used as the prefix for the temporary file name
* @param file_type_subtype The WTAP_FILE_TYPE_SUBTYPE_XXX file type.
* @param encap The WTAP_ENCAP_XXX encapsulation type (WTAP_ENCAP_PER_PACKET for multi)
* @param snaplen The maximum packet capture length.
* @param compressed True if file should be compressed.
* @param shb_hdr The section header block information, or NULL.
* @param idb_inf The interface description information, or NULL.
* @param nrb_hdr The name resolution comment/custom_opts information, or NULL.
* @param[out] err Will be set to an error code on failure.
* @return The newly created dumper object, or NULL on failure.
*/
WS_DLL_PUBLIC
wtap_dumper* wtap_dump_open_tempfile_ng(char **filenamep, const char *pfx,
int file_type_subtype, int encap, int snaplen, gboolean compressed,
wtapng_section_t *shb_hdr, wtapng_iface_descriptions_t *idb_inf,
wtapng_name_res_t *nrb_hdr, int *err);
WS_DLL_PUBLIC
wtap_dumper* wtap_dump_fdopen(int fd, int file_type_subtype, int encap, int snaplen,
gboolean compressed, int *err);