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;
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 */
};
/*
bool found, quit;
int bnet_stat = 0;
char name[500];
+ char tbuf[100];
if (bs->recv() <= 0) {
Emsg0(M_ERROR, 0, _("Connection request failed.\n"));
Dmsg1(000, "<filed: %s", bs->msg);
}
if (sscanf(bs->msg, "Hello Start Job %127s", name) == 1) {
- Dmsg0(110, "Got a FD connection\n");
+ Dmsg1(110, "Got a FD connection at %s\n", bstrftimes(tbuf, sizeof(tbuf),
+ (utime_t)time(NULL)));
handle_filed_connection(bs, name);
return NULL;
}
/*
* This is a connection from the Director, so setup a JCR
*/
- Dmsg0(110, "Got a DIR connection\n");
+ Dmsg1(110, "Got a DIR connection at %s\n", bstrftimes(tbuf, sizeof(tbuf),
+ (utime_t)time(NULL)));
jcr = new_jcr(sizeof(JCR), stored_free_jcr); /* create Job Control Record */
jcr->dir_bsock = bs; /* save Director bsock */
jcr->dir_bsock->set_jcr(jcr);
if (dcr) {
dev = dcr->dev;
dev->dlock(); /* Use P to avoid indefinite block */
- if (!dev->is_open()) {
+ if (!dev->is_open() && !dev->is_busy()) {
Dmsg1(400, "Can %slabel. Device is not open\n", relabel?"re":"");
label_volume_if_ok(dcr, oldname, newname, poolname, slot, relabel);
dev->close();
ok = false;
break;
}
+ volume_unused(dcr);
give_back_device_lock(dev, &hold);
return ok;
}
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 */
}
/* We freed the device, so reopen it and wake any waiting threads */
if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
- dir->fsend(_("3901 open device failed: ERR=%s\n"),
- dev->bstrerror());
+ dir->fsend(_("3901 Unable to open device %s: ERR=%s\n"),
+ dev->print_name(), dev->bstrerror());
if (dev->blocked() == BST_UNMOUNTED) {
/* We blocked the device, so unblock it */
Dmsg0(100, "Unmounted. Unblocking device\n");
}
} else if (dev->is_tape()) {
if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
- dir->fsend(_("3901 open device failed: ERR=%s\n"),
- dev->bstrerror());
+ dir->fsend(_("3901 Unable to open device %s: ERR=%s\n"),
+ dev->print_name(), dev->bstrerror());
break;
}
read_label(dcr);
*/
/* 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();
}
} else if (dev->is_busy()) {
send_dir_busy_message(dir, dev);
} else { /* device not being used */
- Dmsg0(90, "Device not in use, releaseing\n");
- unload_autochanger(dcr, -1);
- release_volume(dcr);
+ Dmsg0(90, "Device not in use, releasing\n");
+ dcr->release_volume();
dir->fsend(_("3022 Device %s released.\n"),
dev->print_name());
}
static bool bootstrap_cmd(JCR *jcr)
{
+ /* If getting the bootstrap file succeeds, we do not need
+ * the FD because we will be reading.
+ */
+ jcr->need_fd = false;
return get_bootstrap_file(jcr, jcr->dir_bsock);
}