Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ Bacula® is a registered trademark of Kern Sibbald.
The licensor of Bacula is the Free Software Foundation Europe
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
/* Imported variables */
extern BSOCK *filed_chan;
-extern int r_first, r_last;
-extern struct s_res resources[];
extern struct s_last_job last_job;
extern bool init_done;
static char derrmsg[] = "3900 Invalid command\n";
static char OKsetdebug[] = "3000 OK setdebug=%d\n";
static char invalid_cmd[] = "3997 Invalid command for a Director with Monitor directive enabled.\n";
+static char OK_bootstrap[] = "3000 OK bootstrap\n";
+static char ERROR_bootstrap[] = "3904 Error bootstrap\n";
/* Imported functions */
extern void terminate_child();
struct s_cmds {
const char *cmd;
bool (*func)(JCR *jcr);
- int monitoraccess; /* specify if monitors have access to this function */
+ bool monitoraccess; /* set if monitors can access this cmd */
};
/*
if (sscanf(bs->msg, "Hello Start Job %127s", name) == 1) {
Dmsg1(110, "Got a FD connection at %s\n", bstrftimes(tbuf, sizeof(tbuf),
(utime_t)time(NULL)));
+ Dmsg1(50, "%s", bs->msg);
handle_filed_connection(bs, name);
return NULL;
}
if (dcr) {
dev = dcr->dev;
dev->dlock(); /* Use P to avoid indefinite block */
- Dmsg1(100, "mount cmd blocked=%d\n", dev->blocked());
+ Dmsg2(100, "mount cmd blocked=%d must_unload=%d\n", dev->blocked(),
+ dev->must_unload());
switch (dev->blocked()) { /* device blocked? */
case BST_WAITING_FOR_SYSOP:
/* Someone is waiting, wake him */
Dmsg0(100, "Waiting for mount. Attempting to wake thread\n");
dev->set_blocked(BST_MOUNT);
- dir->fsend("3001 OK mount. Device=%s\n",
- dev->print_name());
+ dir->fsend("3001 OK mount requested. %sDevice=%s\n",
+ slot>0?_("Specified slot ignored. "):"",
+ dev->print_name());
pthread_cond_broadcast(&dev->wait_next_vol);
Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
pthread_cond_broadcast(&wait_device_release);
if (!unload_autochanger(dcr, -1)) {
/* ***FIXME**** what is this ???? */
dev->close();
+ free_volume(dev);
}
if (dev->is_unmountable() && !dev->unmount(0)) {
dir->fsend(_("3907 %s"), dev->bstrerror());
*/
/* block_device(dev, BST_UNMOUNTED); replace with 2 lines below */
dev->set_blocked(BST_UNMOUNTED);
- dev->no_wait_id = 0;
+ clear_thread_id(dev->no_wait_id);
if (!unload_autochanger(dcr, -1)) {
dev->close();
+ free_volume(dev);
}
if (dev->is_unmountable() && !dev->unmount(0)) {
dir->fsend(_("3907 %s"), dev->bstrerror());
return true;
}
+static pthread_mutex_t bsr_mutex = PTHREAD_MUTEX_INITIALIZER;
+static uint32_t bsr_uniq = 0;
+
+static 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) {
+ berrno be;
+ Jmsg(jcr, M_FATAL, 0, _("Could not create bootstrap file %s: ERR=%s\n"),
+ jcr->RestoreBootstrap, be.bstrerror());
+ goto bail_out;
+ }
+ Dmsg0(10, "=== Bootstrap file ===\n");
+ while (sock->recv() >= 0) {
+ Dmsg1(10, "%s", sock->msg);
+ fputs(sock->msg, bs);
+ }
+ fclose(bs);
+ Dmsg0(10, "=== end bootstrap file ===\n");
+ 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 >= 10) {
+ dump_bsr(jcr->bsr, true);
+ }
+ /* If we got a bootstrap, we are reading, so create read volume list */
+ create_restore_volume_list(jcr);
+ ok = true;
+
+bail_out:
+ unlink(jcr->RestoreBootstrap);
+ free_pool_memory(jcr->RestoreBootstrap);
+ jcr->RestoreBootstrap = NULL;
+ if (!ok) {
+ sock->fsend(ERROR_bootstrap);
+ return false;
+ }
+ return sock->fsend(OK_bootstrap);
+}
static bool bootstrap_cmd(JCR *jcr)
{