* 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
*/
static DUMP_ITEM *disk_hist = NULL;
-void clear_list P((void))
+void
+clear_list(void)
{
DUMP_ITEM *item, *this;
{
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; files<cur_tape->numfiles; 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)
{
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;
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))
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; files<cur_tape->numfiles; 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;
}