/*
*
* Utility routines for "tool" programs such as bscan, bls,
- * bextract, ...
+ * bextract, ... Some routines also used by Bacula.
*
* Normally nothing in this file is called by the Storage
* daemon because we interact more directly with the user
DEVICE *setup_to_access_device(JCR *jcr, int read_access)
{
DEVICE *dev;
- DEV_BLOCK *block;
char *p;
DEVRES *device;
while (p >= jcr->dev_name && *p != '/')
p--;
if (*p == '/') {
- strcpy(jcr->VolumeName, p+1);
+ pm_strcpy(&jcr->VolumeName, p+1);
*p = 0;
}
}
jcr->dev_name, configfile);
return NULL;
}
+ jcr->device = device;
dev = init_dev(NULL, device);
- if (!dev || !open_device(dev)) {
+ jcr->device->dev = dev;
+ if (!dev || !first_open_device(dev)) {
Jmsg1(jcr, M_FATAL, 0, _("Cannot open %s\n"), jcr->dev_name);
return NULL;
}
Dmsg0(90, "Device opened for read.\n");
- block = new_block(dev);
-
create_vol_list(jcr);
if (read_access) {
- if (!acquire_device_for_read(jcr, dev, block)) {
- free_block(block);
+ if (!acquire_device_for_read(jcr)) {
return NULL;
}
}
- free_block(block);
return dev;
}
if (jcr->VolList) {
free_vol_list(jcr);
}
+ if (jcr->dcr) {
+ free_dcr(jcr->dcr);
+ jcr->dcr = NULL;
+ }
return;
}
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");
+ pm_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);
+ pm_strcpy(&jcr->client_name, "Dummy.Client.Name");
+ bstrncpy(jcr->Job, name, sizeof(jcr->Job));
jcr->fileset_name = get_pool_memory(PM_FNAME);
- strcpy(jcr->fileset_name, "Dummy.fileset.name");
+ pm_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;
+ pm_strcpy(&jcr->fileset_md5, "Dummy.fileset.md5");
+ jcr->JobId = 0;
+ jcr->JobType = JT_CONSOLE;
jcr->JobLevel = L_FULL;
jcr->JobStatus = JS_Terminated;
jcr->dev_name = get_pool_memory(PM_FNAME);
if (!bsr && VolumeName) {
pm_strcpy(&jcr->VolumeName, VolumeName);
}
+ jcr->where = bstrdup("");
return jcr;
}
/*
* Device got an error, attempt to analyse it
*/
-void display_error_status(DEVICE *dev)
+void display_tape_error_status(JCR *jcr, DEVICE *dev)
{
uint32_t status;
- Emsg0(M_ERROR, 0, dev->errmsg);
- status_dev(dev, &status);
+ status = status_dev(dev);
Dmsg1(20, "Device status: %x\n", status);
- if (status & MT_EOD)
- 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"));
- else if (status & MT_EOF)
- 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"));
- else if (!(status & MT_ONLINE))
- 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));
-}
-
-
-extern char *getuser(uid_t uid);
-extern char *getgroup(gid_t gid);
-
-void print_ls_output(char *fname, char *link, int type, struct stat *statp)
-{
- char buf[1000];
- char ec1[30];
- char *p, *f;
- int n;
-
- p = encode_mode(statp->st_mode, buf);
- n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
- p += n;
- n = sprintf(p, "%-8.8s %-8.8s", getuser(statp->st_uid), getgroup(statp->st_gid));
- p += n;
- n = sprintf(p, "%8.8s ", edit_uint64(statp->st_size, ec1));
- p += n;
- p = encode_time(statp->st_ctime, p);
- *p++ = ' ';
- *p++ = ' ';
- /* Copy file name */
- for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
- *p++ = *f++;
- if (type == FT_LNK) {
- *p++ = ' ';
- *p++ = '-';
- *p++ = '>';
- *p++ = ' ';
- /* Copy link name */
- for (f=link; *f && (p-buf) < (int)sizeof(buf); )
- *p++ = *f++;
- }
- *p++ = '\n';
- *p = 0;
- fputs(buf, stdout);
+ if (status & BMT_EOD)
+ Jmsg(jcr, M_ERROR, 0, _("Unexpected End of Data\n"));
+ else if (status & BMT_EOT)
+ Jmsg(jcr, M_ERROR, 0, _("Unexpected End of Tape\n"));
+ else if (status & BMT_EOF)
+ Jmsg(jcr, M_ERROR, 0, _("Unexpected End of File\n"));
+ else if (status & BMT_DR_OPEN)
+ Jmsg(jcr, M_ERROR, 0, _("Tape Door is Open\n"));
+ else if (!(status & BMT_ONLINE))
+ Jmsg(jcr, M_ERROR, 0, _("Unexpected Tape is Off-line\n"));
}