#include "stored.h" /* pull in Storage Deamon headers */
/* Forward referenced functions */
-static void create_volume_label_record(JCR *jcr, DEVICE *dev, DEV_RECORD *rec);
+static void create_volume_label_record(DCR *dcr, DEV_RECORD *rec);
extern char my_name[];
extern int debug_level;
* VOL_LABEL_ERROR
* VOL_NO_MEDIA
*/
-int read_dev_volume_label(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
+int read_dev_volume_label(DCR *dcr, DEV_BLOCK *block)
{
+ JCR *jcr = dcr->jcr;
+ DEVICE *dev = dcr->dev;
char *VolName = jcr->VolumeName;
DEV_RECORD *record;
- int ok = 0;
+ bool ok = false;
Dmsg3(100, "Enter read_volume_label device=%s vol=%s dev_Vol=%s\n",
dev_name(dev), VolName, dev->VolHdr.VolName);
if (dev_state(dev, ST_LABEL)) { /* did we already read label? */
/* Compare Volume Names allow special wild card */
if (VolName && *VolName && *VolName != '*' && strcmp(dev->VolHdr.VolName, VolName) != 0) {
- Mmsg(&jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"),
+ Mmsg(jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"),
dev_name(dev), VolName, dev->VolHdr.VolName);
/*
* Cancel Job if too many label errors
dev->state &= ~(ST_LABEL|ST_APPEND|ST_READ); /* set no label, no append */
if (!rewind_dev(dev)) {
- Mmsg(&jcr->errmsg, _("Couldn't rewind device %s ERR=%s\n"), dev_name(dev),
+ Mmsg(jcr->errmsg, _("Couldn't rewind device %s ERR=%s\n"), dev_name(dev),
strerror_dev(dev));
return jcr->label_status = VOL_NO_MEDIA;
}
/* Read the Volume label block */
record = new_record();
Dmsg0(90, "Big if statement in read_volume_label\n");
- if (!read_block_from_dev(jcr, dev, block, NO_BLOCK_NUMBER_CHECK)) {
- Mmsg(&jcr->errmsg, _("Requested Volume \"%s\" on %s is not a Bacula "
+ if (!read_block_from_dev(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
+ Mmsg(jcr->errmsg, _("Requested Volume \"%s\" on %s is not a Bacula "
"labeled Volume, because: ERR=%s"), NPRT(VolName), dev_name(dev),
strerror_dev(dev));
} else if (!read_record_from_block(block, record)) {
- Mmsg(&jcr->errmsg, _("Could not read Volume label from block.\n"));
+ Mmsg(jcr->errmsg, _("Could not read Volume label from block.\n"));
} else if (!unser_volume_label(dev, record)) {
- Mmsg(&jcr->errmsg, _("Could not unserialize Volume label: ERR=%s\n"),
+ Mmsg(jcr->errmsg, _("Could not unserialize Volume label: ERR=%s\n"),
strerror_dev(dev));
} else if (strcmp(dev->VolHdr.Id, BaculaId) != 0 &&
strcmp(dev->VolHdr.Id, OldBaculaId) != 0) {
- Mmsg(&jcr->errmsg, _("Volume Header Id bad: %s\n"), dev->VolHdr.Id);
+ Mmsg(jcr->errmsg, _("Volume Header Id bad: %s\n"), dev->VolHdr.Id);
} else {
- ok = 1;
+ ok = true;
}
if (!ok) {
free_record(record);
if (dev->VolHdr.VerNum != BaculaTapeVersion &&
dev->VolHdr.VerNum != OldCompatibleBaculaTapeVersion1 &&
dev->VolHdr.VerNum != OldCompatibleBaculaTapeVersion2) {
- Mmsg(&jcr->errmsg, _("Volume on %s has wrong Bacula version. Wanted %d got %d\n"),
+ Mmsg(jcr->errmsg, _("Volume on %s has wrong Bacula version. Wanted %d got %d\n"),
dev_name(dev), BaculaTapeVersion, dev->VolHdr.VerNum);
return jcr->label_status = VOL_VERSION_ERROR;
}
* a Bacula volume label (VOL_LABEL)
*/
if (dev->VolHdr.LabelType != PRE_LABEL && dev->VolHdr.LabelType != VOL_LABEL) {
- Mmsg(&jcr->errmsg, _("Volume on %s has bad Bacula label type: %x\n"),
+ Mmsg(jcr->errmsg, _("Volume on %s has bad Bacula label type: %x\n"),
dev_name(dev), dev->VolHdr.LabelType);
return jcr->label_status = VOL_LABEL_ERROR;
}
/* Compare Volume Names */
Dmsg2(30, "Compare Vol names: VolName=%s hdr=%s\n", VolName?VolName:"*", dev->VolHdr.VolName);
if (VolName && *VolName && *VolName != '*' && strcmp(dev->VolHdr.VolName, VolName) != 0) {
- Mmsg(&jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"),
+ Mmsg(jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"),
dev_name(dev), VolName, dev->VolHdr.VolName);
/*
* Cancel Job if too many label errors
*
* Assumes that the record is already read.
*
- * Returns: 0 on error
- * 1 on success
+ * Returns: false on error
+ * true on success
*/
-int unser_volume_label(DEVICE *dev, DEV_RECORD *rec)
+bool unser_volume_label(DEVICE *dev, DEV_RECORD *rec)
{
ser_declare;
if (rec->FileIndex != VOL_LABEL && rec->FileIndex != PRE_LABEL) {
- Mmsg3(&dev->errmsg, _("Expecting Volume Label, got FI=%s Stream=%s len=%d\n"),
+ Mmsg3(dev->errmsg, _("Expecting Volume Label, got FI=%s Stream=%s len=%d\n"),
FI_to_ascii(rec->FileIndex),
stream_to_ascii(rec->Stream, rec->FileIndex),
rec->data_len);
if (!forge_on) {
- return 0;
+ return false;
}
}
if (debug_level >= 90) {
dump_volume_label(dev);
}
- return 1;
+ return true;
}
/*
* Returns: false on failure
* true on success
*/
-bool write_volume_label_to_block(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
+bool write_volume_label_to_block(DCR *dcr, DEV_BLOCK *block)
{
DEV_RECORD rec;
+ DEVICE *dev = dcr->dev;
+ JCR *jcr = dcr->jcr;
Dmsg0(20, "write Label in write_volume_label_to_block()\n");
memset(&rec, 0, sizeof(rec));
rec.data = get_memory(SER_LENGTH_Volume_Label);
- create_volume_label_record(jcr, dev, &rec);
+ create_volume_label_record(dcr, &rec);
empty_block(block); /* Volume label always at beginning */
block->BlockNumber = 0;
* Assumes that the dev->VolHdr structure is properly
* initialized.
*/
-static void create_volume_label_record(JCR *jcr, DEVICE *dev, DEV_RECORD *rec)
+static void create_volume_label_record(DCR *dcr, DEV_RECORD *rec)
{
ser_declare;
struct date_time dt;
+ DEVICE *dev = dcr->dev;
+ JCR *jcr = dcr->jcr;
/* Serialize the label into the device record. */
/*
* Create a volume label in memory
- * Returns: 0 on error
- * 1 on success
*/
void create_volume_label(DEVICE *dev, const char *VolName, const char *PoolName)
{
*
* This routine should be used only when labeling a blank tape.
*/
-bool write_new_volume_label_to_dev(JCR *jcr, DEVICE *dev, const char *VolName, const char *PoolName)
+bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *PoolName)
{
DEV_RECORD rec;
DEV_BLOCK *block;
- bool stat = true;
+ bool ok = false;
+ DEVICE *dev = dcr->dev;
Dmsg0(99, "write_volume_label()\n");
block = new_block(dev);
memset(&rec, 0, sizeof(rec));
rec.data = get_memory(SER_LENGTH_Volume_Label);
- create_volume_label_record(jcr, dev, &rec);
+ create_volume_label_record(dcr, &rec);
rec.Stream = 0;
if (!write_record_to_block(block, &rec)) {
Dmsg2(30, "Bad Label write on %s. ERR=%s\n", dev_name(dev), strerror_dev(dev));
memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
- free_block(block);
- free_pool_memory(rec.data);
- return false;
+ goto bail_out;
} else {
Dmsg2(30, "Wrote label of %d bytes to %s\n", rec.data_len, dev_name(dev));
}
- free_pool_memory(rec.data);
Dmsg0(99, "Call write_block_to_dev()\n");
- if (!write_block_to_dev(jcr->dcr, block)) {
+ if (!write_block_to_dev(dcr, block)) {
memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
Dmsg2(30, "Bad Label write on %s. ERR=%s\n", dev_name(dev), strerror_dev(dev));
- stat = false;
+ goto bail_out;
}
Dmsg0(99, " Wrote block to device\n");
- flush_dev(dev);
weof_dev(dev, 1);
dev->state |= ST_LABEL;
+ ok = true;
if (debug_level >= 20) {
dump_volume_label(dev);
}
+
+bail_out:
free_block(block);
- return stat;
+ free_pool_memory(rec.data);
+ return ok;
}
* Create session label
* The pool memory must be released by the calling program
*/
-void create_session_label(JCR *jcr, DEV_RECORD *rec, int label)
+void create_session_label(DCR *dcr, DEV_RECORD *rec, int label)
{
- DCR *dcr = jcr->dcr;
+ JCR *jcr = dcr->jcr;
ser_declare;
rec->VolSessionId = jcr->VolSessionId;
* Returns: false on failure
* true on success
*/
-bool write_session_label(JCR *jcr, DEV_BLOCK *block, int label)
+bool write_session_label(DCR *dcr, DEV_BLOCK *block, int label)
{
- DCR *dcr = jcr->dcr;
+ JCR *jcr = dcr->jcr;
DEVICE *dev = dcr->dev;
DEV_RECORD *rec;
Jmsg1(jcr, M_ABORT, 0, _("Bad session label = %d\n"), label);
break;
}
- create_session_label(jcr, rec, label);
+ create_session_label(dcr, rec, label);
rec->FileIndex = label;
/*
debug_level = dbl;
}
-int unser_session_label(SESSION_LABEL *label, DEV_RECORD *rec)
+bool unser_session_label(SESSION_LABEL *label, DEV_RECORD *rec)
{
ser_declare;
label->JobStatus = JS_Terminated; /* kludge */
}
}
- return 1;
+ return true;
}