}
cf_status_t
-cf_merge_files(const char *out_filename, int out_fd, int in_file_count,
+cf_merge_files(char **out_filenamep, int in_file_count,
char *const *in_filenames, int file_type, gboolean do_append)
{
merge_in_file_t *in_files;
wtap *wth;
+ char *out_filename;
+ char tmpname[128+1];
+ int out_fd;
wtap_dumper *pdh;
int open_err, read_err, write_err, close_err;
gchar *err_info;
return CF_ERROR;
}
+ if (*out_filenamep != NULL) {
+ out_filename = *out_filenamep;
+ out_fd = open(out_filename, O_CREAT|O_TRUNC|O_BINARY, 0600);
+ if (out_fd == -1)
+ open_err = errno;
+ } else {
+ out_fd = create_tempfile(tmpname, sizeof tmpname, "ether");
+ if (out_fd == -1)
+ open_err = errno;
+ out_filename = g_strdup(tmpname);
+ *out_filenamep = out_filename;
+ }
+ if (out_fd == -1) {
+ err_info = NULL;
+ merge_close_in_files(in_file_count, in_files);
+ free(in_files);
+ cf_open_failure_alert_box(out_filename, open_err, NULL, TRUE, file_type);
+ return CF_ERROR;
+ }
+
pdh = wtap_dump_fdopen(out_fd, file_type,
merge_select_frame_type(in_file_count, in_files),
merge_max_snapshot_length(in_file_count, in_files), &open_err);
* Merge two (or more) capture files into one.
* @todo is this the right place for this function? It doesn't have to do a lot with capture_file.
*
- * @param out_filename output filename
- * @param out_fd output file descriptor
+ * @param out_filename pointer to output filename; if output filename is
+ * NULL, a temporary file name is generated and *out_filename is set
+ * to point to the generated file name
* @param in_file_count the number of input files to merge
* @param in_filnames array of input filenames
* @param file_type the output filetype
* @return one of cf_status_t
*/
cf_status_t
-cf_merge_files(const char *out_filename, int out_fd, int in_file_count,
+cf_merge_files(char **out_filename, int in_file_count,
char *const *in_filenames, int file_type, gboolean do_append);
-
#endif /* file.h */
static void
dnd_merge_files(int in_file_count, char **in_filenames)
{
- int out_fd;
+ char *tmpname;
gboolean merge_ok;
int err;
- char tmpname[128+1];
-
-
- out_fd = create_tempfile(tmpname, sizeof tmpname, "ether");
/* merge the files in chonological order */
- merge_ok = cf_merge_files(tmpname, out_fd, in_file_count, in_filenames,
+ tmpname = NULL;
+ merge_ok = cf_merge_files(&tmpname, in_file_count, in_filenames,
WTAP_FILE_PCAP, FALSE);
if (!merge_ok) {
/* merge failed */
+ g_free(tmpname);
return;
}
just leave it around so that the user can, after they
dismiss the alert box popped up for the open error,
try again. */
+ g_free(tmpname);
return;
}
+ g_free(tmpname);
switch (cf_read(&cfile)) {
int err;
cf_status_t merge_status;
char *in_filenames[2];
- int out_fd;
- char tmpname[128+1];
+ char *tmpname;
#if (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 4) || GTK_MAJOR_VERSION > 2
cf_name = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs)));
return;
}
- out_fd = create_tempfile(tmpname, sizeof tmpname, "ether");
-
/* merge or append the two files */
rb = OBJECT_GET_DATA(w, E_MERGE_CHRONO_KEY);
+ tmpname = NULL;
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rb))) {
/* chronological order */
in_filenames[0] = cfile.filename;
in_filenames[1] = cf_name;
- merge_status = cf_merge_files(tmpname, out_fd, 2, in_filenames,
- filetype, FALSE);
+ merge_status = cf_merge_files(&tmpname, 2, in_filenames, filetype, FALSE);
} else {
rb = OBJECT_GET_DATA(w, E_MERGE_PREPEND_KEY);
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (rb))) {
/* prepend file */
in_filenames[0] = cfile.filename;
in_filenames[1] = cf_name;
- merge_status = cf_merge_files(tmpname, out_fd, 2, in_filenames,
- filetype, TRUE);
+ merge_status = cf_merge_files(&tmpname, 2, in_filenames, filetype,
+ TRUE);
} else {
/* append file */
in_filenames[0] = cf_name;
in_filenames[1] = cfile.filename;
- merge_status = cf_merge_files(tmpname, out_fd, 2, in_filenames,
- filetype, TRUE);
+ merge_status = cf_merge_files(&tmpname, 2, in_filenames, filetype,
+ TRUE);
}
}
if (merge_status != CF_OK) {
if (rfcode != NULL)
dfilter_free(rfcode);
+ g_free(tmpname);
return;
}
try again. */
if (rfcode != NULL)
dfilter_free(rfcode);
+ g_free(tmpname);
return;
}
+ g_free(tmpname);
/* Attach the new read filter to "cf" ("cf_open()" succeeded, so
it closed the previous capture file, and thus destroyed any