data_path_t data_path;
char *addrs;
backup_support_option_t *bsu;
+ gint64 bytes_read;
} ctl_data_t;
#define SKIP_TAPE 2
static char *errstr;
static char *amidxtaped_line = NULL;
extern char *localhost;
+static char header_buf[32768];
+static int header_size = 0;
+
/* global pid storage for interrupt handler */
pid_t extract_restore_child_pid = -1;
continue;
}
fp = s-1;
- skip_non_whitespace(s, ch);
+ skip_quoted_string(s, ch);
s[-1] = '\0';
- lditem.tape = newstralloc(lditem.tape, fp);
+ amfree(lditem.tape);
+ lditem.tape = unquote_string(fp);
s[-1] = (char)ch;
if(am_has_feature(indexsrv_features, fe_amindexd_fileno_in_ORLD)) {
case IS_TAR:
case IS_GNUTAR:
g_ptr_array_add(argv_ptr, stralloc("tar"));
+ /* ignore trailing zero blocks on input (this was the default until tar-1.21) */
+ g_ptr_array_add(argv_ptr, stralloc("--ignore-zeros"));
g_ptr_array_add(argv_ptr, stralloc("--numeric-owner"));
g_ptr_array_add(argv_ptr, stralloc("-xpGvf"));
g_ptr_array_add(argv_ptr, stralloc("-")); /* data on stdin */
}
} else if (proplist) {
- g_hash_table_foreach(proplist, &proplist_add_to_argv, argv_ptr);
+ property_add_to_argv(argv_ptr, proplist);
}
break;
}
ctl_data.data_path = DATA_PATH_AMANDA;
ctl_data.addrs = NULL;
ctl_data.bsu = NULL;
+ ctl_data.bytes_read = 0;
+ header_size = 0;
security_stream_read(amidxtaped_streams[DATAFD].fd,
read_amidxtaped_data, &ctl_data);
return -1;
}
}
+ g_debug("bytes read: %jd", (intmax_t)ctl_data.bytes_read);
return(0);
}
all_level = g_slist_append(all_level, level);
}
if (dump_dle) {
- g_slist_free_full(dump_dle->levellist);
+ slist_free_full(dump_dle->levellist, g_free);
dump_dle->levellist = all_level;
run_client_scripts(EXECUTE_ON_PRE_RECOVER, &g_options, dump_dle,
stderr);
dump_dle->levellist = g_slist_append(dump_dle->levellist, level);
run_client_scripts(EXECUTE_ON_INTER_LEVEL_RECOVER, &g_options,
dump_dle, stderr);
- g_slist_free_full(dump_dle->levellist);
+ slist_free_full(dump_dle->levellist, g_free);
dump_dle->levellist = NULL;
}
if (dump_dle) {
run_client_scripts(EXECUTE_ON_POST_LEVEL_RECOVER, &g_options,
dump_dle, stderr);
- g_slist_free_full(dump_dle->levellist);
+ slist_free_full(dump_dle->levellist, g_free);
dump_dle->levellist = NULL;
}
}
dump_dle->levellist = all_level;
run_client_scripts(EXECUTE_ON_POST_RECOVER, &g_options, dump_dle,
stderr);
- g_slist_free_full(dump_dle->levellist);
+ slist_free_full(dump_dle->levellist, g_free);
all_level = NULL;
dump_dle->levellist = NULL;
}
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(buf, &ctl_data->file, (size_t)size);
+ parse_file_header(header_buf, &ctl_data->file, (size_t)header_size);
/* call backup_support_option */
g_options.config = get_config_name();
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.