+ 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) {
+ /* wait to read more data */
+ return;
+ } else if (header_size > 32768) {
+ error("header_size is %d\n", header_size);
+ }
+ assert (to_move == size);
+ security_stream_read_cancel(amidxtaped_streams[DATAFD].fd);
+ /* 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);
+ }