+ if (ctl_data->header_done == 0) {
+ GPtrArray *errarray;
+ g_option_t g_options;
+ data_path_t data_path_set = DATA_PATH_AMANDA;
+ int to_move;
+
+ to_move = MIN(32768-header_size, size);
+ memcpy(header_buf+header_size, buf, to_move);
+ header_size += to_move;
+
+ g_debug("read header %zd => %d", size, header_size);
+ if (header_size < 32768) {
+ security_stream_read(amidxtaped_streams[DATAFD].fd,
+ read_amidxtaped_data, cookie);
+ return;
+ } else if (header_size > 32768) {
+ error("header_size is %d\n", header_size);
+ }
+ assert (to_move == size);
+ /* parse the file header */
+ fh_init(&ctl_data->file);
+ parse_file_header(header_buf, &ctl_data->file, (size_t)header_size);
+
+ /* call backup_support_option */
+ g_options.config = get_config_name();
+ g_options.hostname = dump_hostname;
+ if (strcmp(ctl_data->file.program, "APPLICATION") == 0) {
+ if (dump_dle) {
+ ctl_data->bsu = backup_support_option(ctl_data->file.application,
+ &g_options,
+ ctl_data->file.disk,
+ dump_dle->device,
+ &errarray);
+ } else {
+ ctl_data->bsu = backup_support_option(ctl_data->file.application,
+ &g_options,
+ ctl_data->file.disk, NULL,
+ &errarray);
+ }
+ if (!ctl_data->bsu) {
+ guint i;
+ for (i=0; i < errarray->len; i++) {
+ char *line;
+ line = g_ptr_array_index(errarray, i);
+ g_fprintf(stderr, "%s\n", line);
+ }
+ g_ptr_array_free_full(errarray);
+ exit(1);
+ }
+ data_path_set = ctl_data->bsu->data_path_set;
+ }
+ /* handle backup_support_option failure */
+
+ ctl_data->header_done = 1;
+ if (!ask_file_overwrite(ctl_data)) {
+ if (am_has_feature(tapesrv_features, fe_amidxtaped_abort)) {
+ send_to_tape_server(amidxtaped_streams[CTLFD].fd, "ABORT");
+ }
+ stop_amidxtaped();
+ return;
+ }
+
+ if (am_has_feature(tapesrv_features, fe_amidxtaped_datapath)) {
+ char *msg;
+ /* send DATA-PATH request */
+ msg = stralloc("AVAIL-DATAPATH");
+ if (data_path_set & DATA_PATH_AMANDA)
+ vstrextend(&msg, " AMANDA", NULL);
+ if (data_path_set & DATA_PATH_DIRECTTCP)
+ vstrextend(&msg, " DIRECT-TCP", NULL);
+ send_to_tape_server(amidxtaped_streams[CTLFD].fd, msg);
+ amfree(msg);
+ } else {
+ start_processing_data(ctl_data);
+ }
+ } else {
+ ctl_data->bytes_read += size;
+ /* Only the data is sent to the child */
+ /*
+ * We ignore errors while writing to the index file.
+ */
+ (void)full_write(ctl_data->child_pipe[1], buf, (size_t)size);
+ security_stream_read(amidxtaped_streams[DATAFD].fd,
+ read_amidxtaped_data, cookie);
+ }
+}
+
+static gboolean
+ask_file_overwrite(
+ ctl_data_t *ctl_data)
+{
+ char *restore_dir = NULL;
+
+ if (ctl_data->file.dumplevel == 0) {
+ property_t *property = g_hash_table_lookup(proplist, "directory");
+ if (property && property->values && property->values->data) {
+ /* take first property value */
+ restore_dir = strdup(property->values->data);
+ }
+ if (samba_extract_method == SAMBA_SMBCLIENT ||
+ (ctl_data->bsu &&
+ ctl_data->bsu->recover_path == RECOVER_PATH_REMOTE)) {
+ if (!restore_dir) {
+ restore_dir = g_strdup(ctl_data->file.disk);
+ }
+ g_printf(_("Restoring files into target host %s\n"), restore_dir);
+ } else {
+ if (!restore_dir) {
+ restore_dir = g_get_current_dir();
+ }
+ g_printf(_("Restoring files into directory %s\n"), restore_dir);
+ }
+
+ /* Collect files to delete befause of a bug in gnutar */
+ if (strcmp(ctl_data->file.program, "GNUTAR") == 0 ||
+ (strcmp(ctl_data->file.program, "APPLICATION") == 0 &&
+ strcmp(ctl_data->file.application, "amgtar") == 0)) {
+ check_file_overwrite(restore_dir);
+ } else {
+ g_printf(_("All existing files in %s can be deleted\n"),
+ restore_dir);
+ }
+
+ if (!okay_to_continue(0,0,0)) {
+ free_unlink_list();
+ amfree(restore_dir);
+ return FALSE;
+ }
+ g_printf("\n");
+
+ /* delete the files for gnutar */
+ if (unlink_list) {
+ if (!do_unlink_list()) {
+ g_fprintf(stderr, _("Can't recover because I can't cleanup the restore directory (%s)\n"),
+ restore_dir);
+ free_unlink_list();
+ amfree(restore_dir);
+ return FALSE;
+ }
+ free_unlink_list();
+ }
+ amfree(restore_dir);
+ }
+ return TRUE;