summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e26fde5)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@2253
91ce42f0-d328-0410-95d8-
f526ca767f89
*
* Bacula Director -- Bootstrap Record routines.
*
*
* Bacula Director -- Bootstrap Record routines.
*
- * BSR (bootstrap record) handling routines split from
- * ua_restore.c July MMIII
+ * BSR (bootstrap record) handling routines split from
+ * ua_restore.c July MMIII
*
* Kern Sibbald, July MMII
*
*
* Kern Sibbald, July MMII
*
* for each Volume.
*/
static uint32_t write_findex(UAContext *ua, RBSR_FINDEX *fi,
* for each Volume.
*/
static uint32_t write_findex(UAContext *ua, RBSR_FINDEX *fi,
- int32_t FirstIndex, int32_t LastIndex, FILE *fd)
+ int32_t FirstIndex, int32_t LastIndex, FILE *fd)
{
uint32_t count = 0;
for ( ; fi; fi=fi->next) {
int32_t findex, findex2;
if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
{
uint32_t count = 0;
for ( ; fi; fi=fi->next) {
int32_t findex, findex2;
if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
- (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
- (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
- findex = fi->findex < FirstIndex ? FirstIndex : fi->findex;
- findex2 = fi->findex2 > LastIndex ? LastIndex : fi->findex2;
- if (findex == findex2) {
+ (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
+ (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
+ findex = fi->findex < FirstIndex ? FirstIndex : fi->findex;
+ findex2 = fi->findex2 > LastIndex ? LastIndex : fi->findex2;
+ if (findex == findex2) {
fprintf(fd, "FileIndex=%d\n", findex);
fprintf(fd, "FileIndex=%d\n", findex);
fprintf(fd, "FileIndex=%d-%d\n", findex, findex2);
fprintf(fd, "FileIndex=%d-%d\n", findex, findex2);
- count += findex2 - findex + 1;
- }
+ count += findex2 - findex + 1;
+ }
* falls within the range of selected files in the bsr.
*/
static bool is_volume_selected(RBSR_FINDEX *fi,
* falls within the range of selected files in the bsr.
*/
static bool is_volume_selected(RBSR_FINDEX *fi,
- int32_t FirstIndex, int32_t LastIndex)
+ int32_t FirstIndex, int32_t LastIndex)
{
for ( ; fi; fi=fi->next) {
if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
{
for ( ; fi; fi=fi->next) {
if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
- (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
- (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
- return true;
+ (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
+ (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
+ return true;
for ( ; bsr; bsr=next) {
free_findex(bsr->fi);
if (bsr->VolParams) {
for ( ; bsr; bsr=next) {
free_findex(bsr->fi);
if (bsr->VolParams) {
}
next = bsr->next;
free(bsr);
}
next = bsr->next;
free(bsr);
jr.JobId = bsr->JobId;
if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
bsendmsg(ua, _("Unable to get Job record. ERR=%s\n"), db_strerror(ua->db));
jr.JobId = bsr->JobId;
if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
bsendmsg(ua, _("Unable to get Job record. ERR=%s\n"), db_strerror(ua->db));
}
bsr->VolSessionId = jr.VolSessionId;
bsr->VolSessionTime = jr.VolSessionTime;
if ((bsr->VolCount=db_get_job_volume_parameters(ua->jcr, ua->db, bsr->JobId,
}
bsr->VolSessionId = jr.VolSessionId;
bsr->VolSessionTime = jr.VolSessionTime;
if ((bsr->VolCount=db_get_job_volume_parameters(ua->jcr, ua->db, bsr->JobId,
- &(bsr->VolParams))) == 0) {
+ &(bsr->VolParams))) == 0) {
bsendmsg(ua, _("Unable to get Job Volume Parameters. ERR=%s\n"), db_strerror(ua->db));
bsendmsg(ua, _("Unable to get Job Volume Parameters. ERR=%s\n"), db_strerror(ua->db));
- if (bsr->VolParams) {
- free(bsr->VolParams);
- bsr->VolParams = NULL;
- }
- return false;
+ if (bsr->VolParams) {
+ free(bsr->VolParams);
+ bsr->VolParams = NULL;
+ }
+ return false;
jcr->unlink_bsr = false;
} else {
Mmsg(fname, "%s/%s.restore.%s.bsr", working_directory, my_name,
jcr->unlink_bsr = false;
} else {
Mmsg(fname, "%s/%s.restore.%s.bsr", working_directory, my_name,
jcr->unlink_bsr = true;
}
}
jcr->unlink_bsr = true;
}
}
if (!fd) {
berrno be;
bsendmsg(ua, _("Unable to create bootstrap file %s. ERR=%s\n"),
if (!fd) {
berrno be;
bsendmsg(ua, _("Unable to create bootstrap file %s. ERR=%s\n"),
goto bail_out;
}
/* Write them to file */
goto bail_out;
}
/* Write them to file */
start_prompt(ua, "");
for (RBSR *nbsr=bsr; nbsr; nbsr=nbsr->next) {
for (int i=0; i < nbsr->VolCount; i++) {
start_prompt(ua, "");
for (RBSR *nbsr=bsr; nbsr; nbsr=nbsr->next) {
for (int i=0; i < nbsr->VolCount; i++) {
- if (nbsr->VolParams[i].VolumeName[0]) {
- add_prompt(ua, nbsr->VolParams[i].VolumeName);
- }
+ if (nbsr->VolParams[i].VolumeName[0]) {
+ add_prompt(ua, nbsr->VolParams[i].VolumeName);
+ }
}
}
for (int i=0; i < ua->num_prompts; i++) {
}
}
for (int i=0; i < ua->num_prompts; i++) {
* VolCount is the number of JobMedia records.
*/
for (int i=0; i < bsr->VolCount; i++) {
* VolCount is the number of JobMedia records.
*/
for (int i=0; i < bsr->VolCount; i++) {
- if (!is_volume_selected(bsr->fi, bsr->VolParams[i].FirstIndex,
- bsr->VolParams[i].LastIndex)) {
- bsr->VolParams[i].VolumeName[0] = 0; /* zap VolumeName */
- continue;
- }
+ if (!is_volume_selected(bsr->fi, bsr->VolParams[i].FirstIndex,
+ bsr->VolParams[i].LastIndex)) {
+ bsr->VolParams[i].VolumeName[0] = 0; /* zap VolumeName */
+ continue;
+ }
fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType);
fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType);
fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
- if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
+ if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartFile);
fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartFile);
fprintf(fd, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
fprintf(fd, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
- bsr->VolParams[i].EndFile);
- }
- if (bsr->VolParams[i].StartBlock == bsr->VolParams[i].EndBlock) {
- fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartBlock);
- } else {
+ bsr->VolParams[i].EndFile);
+ }
+ if (bsr->VolParams[i].StartBlock == bsr->VolParams[i].EndBlock) {
+ fprintf(fd, "VolBlock=%u\n", bsr->VolParams[i].StartBlock);
+ } else {
fprintf(fd, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
fprintf(fd, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
- bsr->VolParams[i].EndBlock);
- }
+ bsr->VolParams[i].EndBlock);
+ }
// Dmsg2(100, "bsr VolParam FI=%u LI=%u\n",
// Dmsg2(100, "bsr VolParam FI=%u LI=%u\n",
-// bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex);
+// bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex);
- count = write_findex(ua, bsr->fi, bsr->VolParams[i].FirstIndex,
- bsr->VolParams[i].LastIndex, fd);
- if (count) {
+ count = write_findex(ua, bsr->fi, bsr->VolParams[i].FirstIndex,
+ bsr->VolParams[i].LastIndex, fd);
+ if (count) {
fprintf(fd, "Count=%u\n", count);
fprintf(fd, "Count=%u\n", count);
- }
- total_count += count;
- /* If the same file is present on two tapes or in two files
- * on a tape, it is a continuation, and should not be treated
- * twice in the totals.
- */
- if (!first && LastIndex == bsr->VolParams[i].FirstIndex) {
- total_count--;
- }
- first = false;
- LastIndex = bsr->VolParams[i].LastIndex;
+ }
+ total_count += count;
+ /* If the same file is present on two tapes or in two files
+ * on a tape, it is a continuation, and should not be treated
+ * twice in the totals.
+ */
+ if (!first && LastIndex == bsr->VolParams[i].FirstIndex) {
+ total_count--;
+ }
+ first = false;
+ LastIndex = bsr->VolParams[i].LastIndex;
bsendmsg(ua, "VolSessionId=%u\n", bsr->VolSessionId);
bsendmsg(ua, "VolSessionTime=%u\n", bsr->VolSessionTime);
bsendmsg(ua, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
bsendmsg(ua, "VolSessionId=%u\n", bsr->VolSessionId);
bsendmsg(ua, "VolSessionTime=%u\n", bsr->VolSessionTime);
bsendmsg(ua, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
- bsr->VolParams[i].EndFile);
+ bsr->VolParams[i].EndFile);
bsendmsg(ua, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
bsendmsg(ua, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
- bsr->VolParams[i].EndBlock);
- print_findex(ua, bsr->fi);
+ bsr->VolParams[i].EndBlock);
+ print_findex(ua, bsr->fi);
}
print_bsr(ua, bsr->next);
}
}
print_bsr(ua, bsr->next);
}
RBSR_FINDEX *fi, *lfi;
if (findex == 0) {
RBSR_FINDEX *fi, *lfi;
if (findex == 0) {
- return; /* probably a dummy directory */
+ return; /* probably a dummy directory */
- if (bsr->fi == NULL) { /* if no FI add one */
+ if (bsr->fi == NULL) { /* if no FI add one */
/* This is the first FileIndex item in the chain */
bsr->fi = new_findex();
bsr->JobId = JobId;
/* This is the first FileIndex item in the chain */
bsr->fi = new_findex();
bsr->JobId = JobId;
/* Walk down list of bsrs until we find the JobId */
if (bsr->JobId != JobId) {
for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
/* Walk down list of bsrs until we find the JobId */
if (bsr->JobId != JobId) {
for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
- if (nbsr->JobId == JobId) {
- bsr = nbsr;
- break;
- }
+ if (nbsr->JobId == JobId) {
+ bsr = nbsr;
+ break;
+ }
- if (!nbsr) { /* Must add new JobId */
- /* Add new JobId at end of chain */
- for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
- { }
- nbsr->next = new_bsr();
- nbsr->next->JobId = JobId;
- nbsr->next->fi = new_findex();
- nbsr->next->fi->findex = findex;
- nbsr->next->fi->findex2 = findex;
- return;
+ if (!nbsr) { /* Must add new JobId */
+ /* Add new JobId at end of chain */
+ for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
+ { }
+ nbsr->next = new_bsr();
+ nbsr->next->JobId = JobId;
+ nbsr->next->fi = new_findex();
+ nbsr->next->fi->findex = findex;
+ nbsr->next->fi->findex2 = findex;
+ return;
/* Check if this findex is smaller than first item */
if (findex < fi->findex) {
if ((findex+1) == fi->findex) {
/* Check if this findex is smaller than first item */
if (findex < fi->findex) {
if ((findex+1) == fi->findex) {
- fi->findex = findex; /* extend down */
- return;
+ fi->findex = findex; /* extend down */
+ return;
- fi = new_findex(); /* yes, insert before first item */
+ fi = new_findex(); /* yes, insert before first item */
fi->findex = findex;
fi->findex2 = findex;
fi->next = lfi;
fi->findex = findex;
fi->findex2 = findex;
fi->next = lfi;
/* Walk down fi chain and find where to insert insert new FileIndex */
for ( ; fi; fi=fi->next) {
if (findex == (fi->findex2 + 1)) { /* extend up */
/* Walk down fi chain and find where to insert insert new FileIndex */
for ( ; fi; fi=fi->next) {
if (findex == (fi->findex2 + 1)) { /* extend up */
- RBSR_FINDEX *nfi;
- fi->findex2 = findex;
- /*
- * If the following record contains one higher, merge its
- * file index by extending it up.
- */
- if (fi->next && ((findex+1) == fi->next->findex)) {
- nfi = fi->next;
- fi->findex2 = nfi->findex2;
- fi->next = nfi->next;
- free(nfi);
- }
- return;
+ RBSR_FINDEX *nfi;
+ fi->findex2 = findex;
+ /*
+ * If the following record contains one higher, merge its
+ * file index by extending it up.
+ */
+ if (fi->next && ((findex+1) == fi->next->findex)) {
+ nfi = fi->next;
+ fi->findex2 = nfi->findex2;
+ fi->next = nfi->next;
+ free(nfi);
+ }
+ return;
}
if (findex < fi->findex) { /* add before */
}
if (findex < fi->findex) { /* add before */
- if ((findex+1) == fi->findex) {
- fi->findex = findex;
- return;
- }
- break;
+ if ((findex+1) == fi->findex) {
+ fi->findex = findex;
+ return;
+ }
+ break;
RBSR *nbsr;
RBSR_FINDEX *fi;
RBSR *nbsr;
RBSR_FINDEX *fi;
- if (bsr->fi == NULL) { /* if no FI add one */
+ if (bsr->fi == NULL) { /* if no FI add one */
/* This is the first FileIndex item in the chain */
bsr->fi = new_findex();
bsr->JobId = JobId;
/* This is the first FileIndex item in the chain */
bsr->fi = new_findex();
bsr->JobId = JobId;
/* Walk down list of bsrs until we find the JobId */
if (bsr->JobId != JobId) {
for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
/* Walk down list of bsrs until we find the JobId */
if (bsr->JobId != JobId) {
for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
- if (nbsr->JobId == JobId) {
- bsr = nbsr;
- break;
- }
+ if (nbsr->JobId == JobId) {
+ bsr = nbsr;
+ break;
+ }
- if (!nbsr) { /* Must add new JobId */
- /* Add new JobId at end of chain */
- for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
- { }
- nbsr->next = new_bsr();
- nbsr->next->JobId = JobId;
- nbsr->next->fi = new_findex();
- nbsr->next->fi->findex = 1;
- nbsr->next->fi->findex2 = INT32_MAX;
- return;
+ if (!nbsr) { /* Must add new JobId */
+ /* Add new JobId at end of chain */
+ for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
+ { }
+ nbsr->next = new_bsr();
+ nbsr->next->JobId = JobId;
+ nbsr->next->fi = new_findex();
+ nbsr->next->fi->findex = 1;
+ nbsr->next->fi->findex2 = INT32_MAX;
+ return;