X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fparse_bsr.c;h=f4c631b39827bb89693f11c438c6f0bff066f216;hb=2499795e233e43bd4eb4d99e0473b67e6c6b60d8;hp=fd3148a844733e1d4db89c52cef79e3621759c05;hpb=bcca10596275e1a8de318c94cba270fd2eb5b35c;p=bacula%2Fbacula diff --git a/bacula/src/stored/parse_bsr.c b/bacula/src/stored/parse_bsr.c index fd3148a844..f4c631b398 100644 --- a/bacula/src/stored/parse_bsr.c +++ b/bacula/src/stored/parse_bsr.c @@ -1,14 +1,7 @@ -/* - * Parse a Bootstrap Records (used for restores) - * - * Kern Sibbald, June MMII - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2002-2006 Free Software Foundation Europe e.V. + Copyright (C) 2002-2009 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -32,6 +25,13 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * Parse a Bootstrap Records (used for restores) + * + * Kern Sibbald, June MMII + * + * Version $Id$ + */ #include "bacula.h" @@ -52,12 +52,14 @@ static BSR *store_findex(LEX *lc, BSR *bsr); static BSR *store_sessid(LEX *lc, BSR *bsr); static BSR *store_volfile(LEX *lc, BSR *bsr); static BSR *store_volblock(LEX *lc, BSR *bsr); +static BSR *store_voladdr(LEX *lc, BSR *bsr); static BSR *store_sesstime(LEX *lc, BSR *bsr); static BSR *store_include(LEX *lc, BSR *bsr); static BSR *store_exclude(LEX *lc, BSR *bsr); static BSR *store_stream(LEX *lc, BSR *bsr); static BSR *store_slot(LEX *lc, BSR *bsr); static BSR *store_fileregex(LEX *lc, BSR *bsr); +static BSR *store_nothing(LEX *lc, BSR *bsr); static bool is_fast_rejection_ok(BSR *bsr); static bool is_positioning_ok(BSR *bsr); @@ -85,10 +87,12 @@ struct kw_items items[] = { {"exclude", store_exclude}, {"volfile", store_volfile}, {"volblock", store_volblock}, + {"voladdr", store_voladdr}, {"stream", store_stream}, {"slot", store_slot}, {"device", store_device}, {"fileregex", store_fileregex}, + {"storage", store_nothing}, {NULL, NULL} }; @@ -212,17 +216,17 @@ static bool is_positioning_ok(BSR *bsr) { /* * Every bsr should have a volfile entry and a volblock entry + * or a VolAddr * if we are going to use positioning */ for ( ; bsr; bsr=bsr->next) { - if (!bsr->volfile || !bsr->volblock) { + if (!((bsr->volfile && bsr->volblock) || bsr->voladdr)) { return false; } } return true; } - static BSR *store_vol(LEX *lc, BSR *bsr) { int token; @@ -235,6 +239,7 @@ static BSR *store_vol(LEX *lc, BSR *bsr) } if (bsr->volume) { bsr->next = new_bsr(); + bsr->next->prev = bsr; bsr = bsr->next; } /* This may actually be more than one volume separated by a | @@ -283,6 +288,17 @@ static BSR *store_mediatype(LEX *lc, BSR *bsr) return bsr; } +static BSR *store_nothing(LEX *lc, BSR *bsr) +{ + int token; + + token = lex_get_token(lc, T_STRING); + if (token == T_ERROR) { + return NULL; + } + return bsr; +} + /* Shove the Device name in each Volume in the current bsr */ static BSR *store_device(LEX *lc, BSR *bsr) { @@ -562,6 +578,40 @@ static BSR *store_volblock(LEX *lc, BSR *bsr) return bsr; } +/* + * Routine to handle Volume start/end address + */ +static BSR *store_voladdr(LEX *lc, BSR *bsr) +{ + int token; + BSR_VOLADDR *voladdr; + + for (;;) { + token = lex_get_token(lc, T_PINT64_RANGE); + if (token == T_ERROR) { + return NULL; + } + voladdr = (BSR_VOLADDR *)malloc(sizeof(BSR_VOLADDR)); + memset(voladdr, 0, sizeof(BSR_VOLADDR)); + voladdr->saddr = lc->pint64_val; + voladdr->eaddr = lc->pint64_val2; + /* Add it to the end of the chain */ + if (!bsr->voladdr) { + bsr->voladdr = voladdr; + } else { + /* Add to end of chain */ + BSR_VOLADDR *bs = bsr->voladdr; + for ( ;bs->next; bs=bs->next) + { } + bs->next = voladdr; + } + token = lex_get_token(lc, T_ALL); + if (token != T_COMMA) { + break; + } + } + return bsr; +} static BSR *store_sessid(LEX *lc, BSR *bsr) { @@ -704,6 +754,13 @@ void dump_volblock(BSR_VOLBLOCK *volblock) } } +void dump_voladdr(BSR_VOLADDR *voladdr) +{ + if (voladdr) { + Pmsg2(-1, _("VolAddr : %llu-%llu\n"), voladdr->saddr, voladdr->eaddr); + dump_voladdr(voladdr->next); + } +} void dump_findex(BSR_FINDEX *FileIndex) { @@ -794,6 +851,7 @@ void dump_bsr(BSR *bsr, bool recurse) dump_sesstime(bsr->sesstime); dump_volfile(bsr->volfile); dump_volblock(bsr->volblock); + dump_voladdr(bsr->voladdr); dump_client(bsr->client); dump_jobid(bsr->JobId); dump_job(bsr->job); @@ -828,33 +886,59 @@ static void free_bsr_item(BSR *bsr) } } -void free_bsr(BSR *bsr) +/* + * Remove a single item from the bsr tree + */ +void remove_bsr(BSR *bsr) { - if (!bsr) { - return; - } free_bsr_item((BSR *)bsr->volume); free_bsr_item((BSR *)bsr->client); free_bsr_item((BSR *)bsr->sessid); free_bsr_item((BSR *)bsr->sesstime); free_bsr_item((BSR *)bsr->volfile); free_bsr_item((BSR *)bsr->volblock); + free_bsr_item((BSR *)bsr->voladdr); free_bsr_item((BSR *)bsr->JobId); free_bsr_item((BSR *)bsr->job); free_bsr_item((BSR *)bsr->FileIndex); free_bsr_item((BSR *)bsr->JobType); free_bsr_item((BSR *)bsr->JobLevel); - if (bsr->fileregex) bfree(bsr->fileregex); + if (bsr->fileregex) { + bfree(bsr->fileregex); + } if (bsr->fileregex_re) { regfree(bsr->fileregex_re); free(bsr->fileregex_re); } - if (bsr->attr) free_attr(bsr->attr); - - free_bsr(bsr->next); + if (bsr->attr) { + free_attr(bsr->attr); + } + if (bsr->next) { + bsr->next->prev = bsr->prev; + } + if (bsr->prev) { + bsr->prev->next = bsr->next; + } free(bsr); } +/* + * Free all bsrs in chain + */ +void free_bsr(BSR *bsr) +{ + BSR *next_bsr; + + if (!bsr) { + return; + } + next_bsr = bsr->next; + /* Remove (free) current bsr */ + remove_bsr(bsr); + /* Now get the next one */ + free_bsr(next_bsr); +} + /***************************************************************** * Routines for handling volumes */ @@ -877,6 +961,9 @@ static bool add_restore_volume(JCR *jcr, VOL_LIST *vol) { VOL_LIST *next = jcr->VolList; + /* Add volume to volume manager's read list */ + add_read_volume(jcr, vol->VolumeName); + if (!next) { /* list empty ? */ jcr->VolList = vol; /* yes, add volume */ } else { @@ -904,13 +991,14 @@ static bool add_restore_volume(JCR *jcr, VOL_LIST *vol) void free_restore_volume_list(JCR *jcr) { - VOL_LIST *next = jcr->VolList; + VOL_LIST *vol = jcr->VolList; VOL_LIST *tmp; - for ( ; next; ) { - tmp = next->next; - free(next); - next = tmp; + for ( ; vol; ) { + tmp = vol->next; + remove_read_volume(jcr, vol->VolumeName); + free(vol); + vol = tmp; } jcr->VolList = NULL; }