#include "bacula.h"
#include "stored.h"
+/* Imported variables -- eliminate some day */
+extern char *configfile;
#ifdef DEBUG
char *rec_state_to_str(DEV_RECORD *rec)
/*
- * Setup device, jcr, and prepare to read
+ * Setup device, jcr, and prepare to access device.
+ * If the caller wants read access, acquire the device, otherwise,
+ * the caller will do it.
*/
-DEVICE *setup_to_read_device(JCR *jcr)
+DEVICE *setup_to_access_device(JCR *jcr, int read_access)
{
DEVICE *dev;
DEV_BLOCK *block;
char *p;
+ DEVRES *device;
jcr->VolumeName[0] = 0;
if (strncmp(jcr->dev_name, "/dev/", 5) != 0) {
}
}
- dev = init_dev(NULL, jcr->dev_name);
- if (!dev) {
- Emsg1(M_FATAL, 0, "Cannot open %s\n", jcr->dev_name);
+ if ((device=find_device_res(jcr->dev_name, read_access)) == NULL) {
+ Jmsg2(jcr, M_FATAL, 0, _("Cannot find device %s in config file %s.\n"),
+ jcr->dev_name, configfile);
return NULL;
}
- /* ***FIXME**** init capabilities */
- if (!open_device(dev)) {
- Emsg1(M_FATAL, 0, "Cannot open %s\n", jcr->dev_name);
+
+ dev = init_dev(NULL, device);
+ if (!dev || !open_device(dev)) {
+ Jmsg1(jcr, M_FATAL, 0, _("Cannot open %s\n"), jcr->dev_name);
return NULL;
}
Dmsg0(90, "Device opened for read.\n");
create_vol_list(jcr);
- Dmsg1(100, "Volume=%s\n", jcr->VolumeName);
- if (!acquire_device_for_read(jcr, dev, block)) {
- Emsg0(M_ERROR, 0, dev->errmsg);
- return NULL;
+ if (read_access) {
+ if (!acquire_device_for_read(jcr, dev, block)) {
+ free_block(block);
+ return NULL;
+ }
}
free_block(block);
return dev;
}
+/*
+ * Search for device resource that corresponds to
+ * device name on command line (or default).
+ *
+ * Returns: NULL on failure
+ * Device resource pointer on success
+ */
+DEVRES *find_device_res(char *device_name, int read_access)
+{
+ int found = 0;
+ DEVRES *device;
+
+ LockRes();
+ for (device=NULL; (device=(DEVRES *)GetNextRes(R_DEVICE, (RES *)device)); ) {
+ if (strcmp(device->device_name, device_name) == 0) {
+ found = 1;
+ break;
+ }
+ }
+ UnlockRes();
+ if (!found) {
+ Pmsg2(0, _("Could not find device %s in config file %s.\n"), device_name,
+ configfile);
+ return NULL;
+ }
+ Pmsg2(0, _("Using device: %s for %s.\n"), device_name,
+ read_access?"reading":"writing");
+ return device;
+}
+
+
+
+/*
+ * Called here when freeing JCR so that we can get rid
+ * of "daemon" specific memory allocated.
+ */
static void my_free_jcr(JCR *jcr)
{
+ if (jcr->pool_name) {
+ free_pool_memory(jcr->pool_name);
+ jcr->pool_name = NULL;
+ }
+ if (jcr->pool_type) {
+ free_pool_memory(jcr->pool_type);
+ jcr->pool_type = NULL;
+ }
+ if (jcr->job_name) {
+ free_pool_memory(jcr->job_name);
+ jcr->job_name = NULL;
+ }
+ if (jcr->client_name) {
+ free_pool_memory(jcr->client_name);
+ jcr->client_name = NULL;
+ }
+ if (jcr->fileset_name) {
+ free_pool_memory(jcr->fileset_name);
+ jcr->fileset_name = NULL;
+ }
+ if (jcr->fileset_md5) {
+ free_pool_memory(jcr->fileset_md5);
+ jcr->fileset_md5 = NULL;
+ }
+ if (jcr->dev_name) {
+ free_pool_memory(jcr->dev_name);
+ jcr->dev_name = NULL;
+ }
+ if (jcr->VolList) {
+ free_vol_list(jcr);
+ }
+
return;
}
jcr->VolSessionId = 1;
jcr->VolSessionTime = (uint32_t)time(NULL);
jcr->bsr = bsr;
+ jcr->NumVolumes = 1;
+ jcr->pool_name = get_pool_memory(PM_FNAME);
+ strcpy(jcr->pool_name, "Default");
+ jcr->pool_type = get_pool_memory(PM_FNAME);
+ strcpy(jcr->pool_type, "Backup");
+ jcr->job_name = get_pool_memory(PM_FNAME);
+ strcpy(jcr->job_name, "Dummy.Job.Name");
+ jcr->client_name = get_pool_memory(PM_FNAME);
+ strcpy(jcr->client_name, "Dummy.Client.Name");
strcpy(jcr->Job, name);
+ jcr->fileset_name = get_pool_memory(PM_FNAME);
+ strcpy(jcr->fileset_name, "Dummy.fileset.name");
+ jcr->fileset_md5 = get_pool_memory(PM_FNAME);
+ strcpy(jcr->fileset_md5, "Dummy.fileset.md5");
+ jcr->JobId = 1;
+ jcr->JobType = JT_BACKUP;
+ jcr->JobLevel = L_FULL;
+ jcr->JobStatus = JS_Terminated;
jcr->dev_name = get_pool_memory(PM_FNAME);
- strcpy(jcr->dev_name, device);
+ pm_strcpy(&jcr->dev_name, device);
return jcr;
}
status_dev(dev, &status);
Dmsg1(20, "Device status: %x\n", status);
if (status & MT_EOD)
- Emsg0(M_ERROR_TERM, 0, "Unexpected End of Data\n");
+ Emsg0(M_ERROR_TERM, 0, _("Unexpected End of Data\n"));
else if (status & MT_EOT)
- Emsg0(M_ERROR_TERM, 0, "Unexpected End of Tape\n");
+ Emsg0(M_ERROR_TERM, 0, _("Unexpected End of Tape\n"));
else if (status & MT_EOF)
- Emsg0(M_ERROR_TERM, 0, "Unexpected End of File\n");
+ Emsg0(M_ERROR_TERM, 0, _("Unexpected End of File\n"));
else if (status & MT_DR_OPEN)
- Emsg0(M_ERROR_TERM, 0, "Tape Door is Open\n");
+ Emsg0(M_ERROR_TERM, 0, _("Tape Door is Open\n"));
else if (!(status & MT_ONLINE))
- Emsg0(M_ERROR_TERM, 0, "Unexpected Tape is Off-line\n");
+ Emsg0(M_ERROR_TERM, 0, _("Unexpected Tape is Off-line\n"));
else
- Emsg2(M_ERROR_TERM, 0, "Read error on Record Header %s: %s\n", dev_name(dev), strerror(errno));
+ Emsg2(M_ERROR_TERM, 0, _("Read error on Record Header %s: %s\n"), dev_name(dev), strerror(errno));
}