+
+void update_bootstrap_file(JCR *jcr)
+{
+ /* Now update the bootstrap file if any */
+ if (jcr->JobStatus == JS_Terminated && jcr->jr.JobBytes &&
+ jcr->job->WriteBootstrap) {
+ FILE *fd;
+ BPIPE *bpipe = NULL;
+ int got_pipe = 0;
+ POOLMEM *fname = get_pool_memory(PM_FNAME);
+ fname = edit_job_codes(jcr, fname, jcr->job->WriteBootstrap, "");
+
+ VOL_PARAMS *VolParams = NULL;
+ int VolCount;
+ char edt[50];
+
+ if (*fname == '|') {
+ got_pipe = 1;
+ bpipe = open_bpipe(fname+1, 0, "w"); /* skip first char "|" */
+ fd = bpipe ? bpipe->wfd : NULL;
+ } else {
+ /* ***FIXME*** handle BASE */
+ fd = fopen(fname, jcr->JobLevel==L_FULL?"w+b":"a+b");
+ }
+ if (fd) {
+ VolCount = db_get_job_volume_parameters(jcr, jcr->db, jcr->JobId,
+ &VolParams);
+ if (VolCount == 0) {
+ Jmsg(jcr, M_ERROR, 0, _("Could not get Job Volume Parameters to "
+ "update Bootstrap file. ERR=%s\n"), db_strerror(jcr->db));
+ if (jcr->SDJobFiles != 0) {
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+ }
+
+ }
+ /* Start output with when and who wrote it */
+ bstrftimes(edt, sizeof(edt), time(NULL));
+ fprintf(fd, "# %s - %s - %s%s\n", edt, jcr->jr.Job,
+ level_to_str(jcr->JobLevel), jcr->since);
+ for (int i=0; i < VolCount; i++) {
+ /* Write the record */
+ fprintf(fd, "Volume=\"%s\"\n", VolParams[i].VolumeName);
+ fprintf(fd, "MediaType=\"%s\"\n", VolParams[i].MediaType);
+ fprintf(fd, "VolSessionId=%u\n", jcr->VolSessionId);
+ fprintf(fd, "VolSessionTime=%u\n", jcr->VolSessionTime);
+ fprintf(fd, "VolFile=%u-%u\n", VolParams[i].StartFile,
+ VolParams[i].EndFile);
+ fprintf(fd, "VolBlock=%u-%u\n", VolParams[i].StartBlock,
+ VolParams[i].EndBlock);
+ fprintf(fd, "FileIndex=%d-%d\n", VolParams[i].FirstIndex,
+ VolParams[i].LastIndex);
+ }
+ if (VolParams) {
+ free(VolParams);
+ }
+ if (got_pipe) {
+ close_bpipe(bpipe);
+ } else {
+ fclose(fd);
+ }
+ } else {
+ berrno be;
+ Jmsg(jcr, M_ERROR, 0, _("Could not open WriteBootstrap file:\n"
+ "%s: ERR=%s\n"), fname, be.bstrerror());
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+ }
+ free_pool_memory(fname);
+ }
+}