X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Fholding.c;fp=server-src%2Fholding.c;h=6da3e47fdf940b8c6f5b82107a8813df133f75d3;hb=538ae376635af705ebcd686f3b4b7b72a6652985;hp=c0e1ff8af62455466ff58f9c09a4f0b7a2c5e813;hpb=11425c69eb58b6103beb68adc13912735ba36975;p=debian%2Famanda diff --git a/server-src/holding.c b/server-src/holding.c index c0e1ff8..6da3e47 100644 --- a/server-src/holding.c +++ b/server-src/holding.c @@ -32,6 +32,7 @@ #include "amanda.h" #include "util.h" #include "holding.h" +#include "diskfile.h" #include "fileheader.h" #include "logfile.h" @@ -392,18 +393,17 @@ holding_walk( holding_walk_fn per_file_fn, holding_walk_fn per_chunk_fn) { + identlist_t il; holdingdisk_t *hdisk_conf; char *hdisk; int proceed = 1; - for (hdisk_conf = getconf_holdingdisks(); - hdisk_conf != NULL; - hdisk_conf = holdingdisk_next(hdisk_conf)) { - int is_cruft = 0; + for (il = getconf_identlist(CNF_HOLDINGDISK); + il != NULL; + il = il->next) { + hdisk_conf = lookup_holdingdisk(il->data); hdisk = holdingdisk_get_diskdir(hdisk_conf); - if (!is_dir(hdisk)) - is_cruft = 1; if (per_disk_fn) proceed = per_disk_fn(datap, @@ -514,7 +514,6 @@ holding_get_files_for_flush( GSList *file_list, *file_elt; GSList *date; int date_matches; - disk_t *dp; dumpfile_t file; GSList *result_list = NULL; @@ -549,15 +548,6 @@ holding_get_files_for_flush( continue; } - /* check that the hostname and disk are in the disklist */ - dp = lookup_disk(file.name, file.disk); - if (dp == NULL) { - dbprintf(_("%s: disk %s:%s not in database, skipping it."), - (char *)file_elt->data, file.name, file.disk); - dumpfile_free_data(&file); - continue; - } - /* passed all tests -- we'll flush this file */ result_list = g_slist_insert_sorted(result_list, stralloc(file_elt->data), @@ -565,7 +555,7 @@ holding_get_files_for_flush( dumpfile_free_data(&file); } - if (file_list) g_slist_free_full(file_list); + if (file_list) slist_free_full(file_list, g_free); return result_list; } @@ -591,7 +581,7 @@ holding_get_all_datestamps(void) dumpfile_free_data(&dfile); } - g_slist_free_full(all_files); + slist_free_full(all_files, g_free); return datestamps; } @@ -788,7 +778,7 @@ holding_cleanup_file( return 0; } - if(file.dumplevel < 0 || file.dumplevel > 9) { + if(file.dumplevel < 0 || file.dumplevel > 399) { if (data->verbose_output) g_fprintf(data->verbose_output, _("File '%s' has invalid level %d\n"), element, file.dumplevel); @@ -858,6 +848,38 @@ holding_cleanup( * Application support */ +void +holding_set_origsize( + char *holding_file, + off_t orig_size) +{ + int fd; + size_t buflen; + char buffer[DISK_BLOCK_BYTES]; + char *read_buffer; + dumpfile_t file; + + if((fd = robust_open(holding_file, O_RDWR, 0)) == -1) { + dbprintf(_("holding_set_origsize: open of %s failed: %s\n"), + holding_file, strerror(errno)); + return; + } + + buflen = full_read(fd, buffer, SIZEOF(buffer)); + if (buflen <= 0) { + dbprintf(_("holding_set_origsize: %s: empty file?\n"), holding_file); + return; + } + parse_file_header(buffer, &file, (size_t)buflen); + lseek(fd, (off_t)0, SEEK_SET); + file.orig_size = orig_size; + read_buffer = build_header(&file, NULL, DISK_BLOCK_BYTES); + full_write(fd, read_buffer, DISK_BLOCK_BYTES); + dumpfile_free_data(&file); + amfree(read_buffer); + close(fd); +} + int rename_tmp_holding( char * holding_file, @@ -907,16 +929,22 @@ rename_tmp_holding( } file.is_partial = 1; - header = build_header(&file, DISK_BLOCK_BYTES); + if (debug_holding > 1) + dump_dumpfile_t(&file); + header = build_header(&file, NULL, DISK_BLOCK_BYTES); + if (!header) /* this shouldn't happen */ + error(_("header does not fit in %zd bytes"), (size_t)DISK_BLOCK_BYTES); if (full_write(fd, header, DISK_BLOCK_BYTES) != DISK_BLOCK_BYTES) { dbprintf(_("rename_tmp_holding: writing new header failed: %s"), strerror(errno)); dumpfile_free_data(&file); amfree(filename); amfree(filename_tmp); + free(header); close(fd); return 0; } + free(header); close(fd); } filename = newstralloc(filename, file.cont_filename);