+static bool bootstrap_cmd(JCR *jcr)
+{
+ return get_bootstrap_file(jcr, jcr->file_bsock);
+}
+
+static pthread_mutex_t bsr_mutex = PTHREAD_MUTEX_INITIALIZER;
+static uint32_t bsr_uniq = 0;
+
+bool get_bootstrap_file(JCR *jcr, BSOCK *sock)
+{
+ POOLMEM *fname = get_pool_memory(PM_FNAME);
+ FILE *bs;
+ bool ok = false;
+
+ if (jcr->RestoreBootstrap) {
+ unlink(jcr->RestoreBootstrap);
+ free_pool_memory(jcr->RestoreBootstrap);
+ }
+ P(bsr_mutex);
+ bsr_uniq++;
+ Mmsg(fname, "%s/%s.%s.%d.bootstrap", me->working_directory, me->hdr.name,
+ jcr->Job, bsr_uniq);
+ V(bsr_mutex);
+ Dmsg1(400, "bootstrap=%s\n", fname);
+ jcr->RestoreBootstrap = fname;
+ bs = fopen(fname, "a+b"); /* create file */
+ if (!bs) {
+ Jmsg(jcr, M_FATAL, 0, _("Could not create bootstrap file %s: ERR=%s\n"),
+ jcr->RestoreBootstrap, strerror(errno));
+ goto bail_out;
+ }
+ while (bnet_recv(sock) >= 0) {
+ Dmsg1(400, "stored<filed: bootstrap file %s", sock->msg);
+ fputs(sock->msg, bs);
+ }
+ fclose(bs);
+ jcr->bsr = parse_bsr(jcr, jcr->RestoreBootstrap);
+ if (!jcr->bsr) {
+ Jmsg(jcr, M_FATAL, 0, _("Error parsing bootstrap file.\n"));
+ goto bail_out;
+ }
+ if (debug_level > 20) {
+ dump_bsr(jcr->bsr, true);
+ }
+ ok = true;
+
+bail_out:
+ unlink(jcr->RestoreBootstrap);
+ free_pool_memory(jcr->RestoreBootstrap);
+ jcr->RestoreBootstrap = NULL;
+ if (!ok) {
+ bnet_fsend(sock, ERROR_bootstrap);
+ return false;
+ }
+ return bnet_fsend(sock, OK_bootstrap);
+}
+
+