X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Fdisk_history.c;h=6c04a6fd7454e633d4c4468658b73c5986b51467;hb=b6ea83cedbf3e034fa91d66a7f180f788f34f907;hp=21b2c1066228b6dd4fcac347e594d091a9920267;hpb=3ab887b9bc819a846c75dd7f2ee5d41fac22b19f;p=debian%2Famanda diff --git a/server-src/disk_history.c b/server-src/disk_history.c index 21b2c10..6c04a6f 100644 --- a/server-src/disk_history.c +++ b/server-src/disk_history.c @@ -23,7 +23,7 @@ * Authors: the Amanda Development Team. Its members are listed in a * file named AUTHORS, in the root directory of this distribution. */ -/* $Id: disk_history.c,v 1.8.10.1 2002/03/24 19:23:23 jrjackson Exp $ +/* $Id: disk_history.c,v 1.13 2006/05/25 01:47:19 johnfranks Exp $ * * functions for obtaining backup history */ @@ -33,7 +33,8 @@ static DUMP_ITEM *disk_hist = NULL; -void clear_list P((void)) +void +clear_list(void) { DUMP_ITEM *item, *this; @@ -42,27 +43,91 @@ void clear_list P((void)) { this = item; item = item->next; + amfree(this->hostname); + while(this->tapes != NULL) { + tapelist_t *tapes = this->tapes; + this->tapes = tapes->next; + amfree(tapes->label); + amfree(tapes->files); + amfree(tapes); + } amfree(this); } disk_hist = NULL; } /* add item, maintain list ordered by oldest date last */ -void add_dump(date, level, tape, file) -char *date; -int level; -char *tape; -int file; + +void +add_dump( + char * hostname, + char * date, + int level, + char * tape, + off_t file, + int partnum, + int maxpart) { DUMP_ITEM *new, *item, *before; + int isafile = 0; + + if(tape[0] == '/') + isafile = 1; /* XXX kludgey, like this whole thing */ - new = (DUMP_ITEM *)alloc(sizeof(DUMP_ITEM)); - strncpy(new->date, date, sizeof(new->date)-1); - new->date[sizeof(new->date)-1] = '\0'; + /* See if we already have partnum=partnum-1 */ + if (partnum > 1) { + int partnum_minus_1 = 0; + for(item = disk_hist, before = NULL; item; + before = item, item = item->next) { + if (!strcmp(item->date, date) && + item->level == level && item->is_split) { + tapelist_t *cur_tape; + for (cur_tape = item->tapes; cur_tape; + cur_tape = cur_tape->next) { + int files; + for(files=0; filesnumfiles; files++) { + if (cur_tape->partnum[files] == partnum - 1) + partnum_minus_1 = 1; + } + } + if (partnum_minus_1 == 1) { + item->tapes = append_to_tapelist(item->tapes, tape, file, + partnum, isafile); + if (maxpart > item->maxpart) + item->maxpart = maxpart; + } else { + /* some part are missing, remove the item from disk_hist */ + if (before) + before->next = item->next; + else + disk_hist = item->next; + /* free item */ + free_tapelist(item->tapes); + amfree(item->hostname); + amfree(item); + } + return; + } + } + return; + } + + new = (DUMP_ITEM *)alloc(SIZEOF(DUMP_ITEM)); + strncpy(new->date, date, SIZEOF(new->date)-1); + new->date[SIZEOF(new->date)-1] = '\0'; new->level = level; - strncpy(new->tape, tape, sizeof(new->tape)-1); - new->tape[sizeof(new->tape)-1] = '\0'; + strncpy(new->tape, tape, SIZEOF(new->tape)-1); + new->tape[SIZEOF(new->tape)-1] = '\0'; new->file = file; + new->maxpart = maxpart; + if(partnum == -1) + new->is_split = 0; + else + new->is_split = 1; + new->tapes = NULL; + new->hostname = stralloc(hostname); + + new->tapes = append_to_tapelist(new->tapes, tape, file, partnum, isafile); if (disk_hist == NULL) { @@ -71,6 +136,9 @@ int file; return; } + /* prepend this item to the history list, if it's newer */ + /* XXX this should probably handle them being on the same date with + datestamp_uax or something */ if (strcmp(disk_hist->date, new->date) <= 0) { new->next = disk_hist; @@ -78,6 +146,7 @@ int file; return; } + /* append this item to the history list, if it's older */ before = disk_hist; item = disk_hist->next; while ((item != NULL) && (strcmp(item->date, new->date) > 0)) @@ -89,14 +158,47 @@ int file; before->next = new; } - -DUMP_ITEM *first_dump P((void)) +void +clean_dump(void) { - return disk_hist; + DUMP_ITEM *item, *before; + + /* check if the maxpart part is avaliable */ + for(item = disk_hist, before = NULL; item; + before = item, item = item->next) { + int found_maxpart = 0; + tapelist_t *cur_tape; + + if (item->maxpart > 1) { + for (cur_tape = item->tapes; cur_tape; cur_tape = cur_tape->next) { + int files; + for(files=0; filesnumfiles; files++) { + if (cur_tape->partnum[files] == item->maxpart) { + found_maxpart = 1; + } + } + } + if (found_maxpart == 0) { + DUMP_ITEM *myitem = item; + + if (before) + before->next = item->next; + else + disk_hist = item->next; + item = item->next; + /* free myitem */ + free_tapelist(myitem->tapes); + amfree(myitem->hostname); + amfree(myitem); + if (item == NULL) + break; + } + } + } } -DUMP_ITEM *next_dump(item) -DUMP_ITEM *item; +DUMP_ITEM * +first_dump(void) { - return item->next; + return disk_hist; }