]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/btape.c
Backport more master code
[bacula/bacula] / bacula / src / stored / btape.c
index ace8d8ffd0cbbc62c703cafe1ef168a2d01516f1..967887290d4de97d85527c210001ec3654b60246 100644 (file)
@@ -1,12 +1,12 @@
 /*
    Bacula® - The Network Backup Solution
 
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2012 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    This program is Free Software; you can redistribute it and/or
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
+   modify it under the terms of version three of the GNU Affero General Public
    License as published by the Free Software Foundation and included
    in the file LICENSE.
 
    License as published by the Free Software Foundation and included
    in the file LICENSE.
 
@@ -15,7 +15,7 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Affero General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
@@ -171,6 +171,7 @@ int main(int margc, char *margv[])
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
    init_stack_dump();
    bindtextdomain("bacula", LOCALEDIR);
    textdomain("bacula");
    init_stack_dump();
+   lmgr_init_thread();
 
    /* Sanity checks */
    if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
 
    /* Sanity checks */
    if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
@@ -316,7 +317,10 @@ int main(int margc, char *margv[])
 static void terminate_btape(int stat)
 {
 
 static void terminate_btape(int stat)
 {
 
-   sm_check(__FILE__, __LINE__, false);
+   Dsm_check(200);
+   free_jcr(jcr);
+   jcr = NULL;
+
    if (configfile) {
       free(configfile);
    }
    if (configfile) {
       free(configfile);
    }
@@ -338,8 +342,6 @@ static void terminate_btape(int stat)
       free_bsr(bsr);
    }
 
       free_bsr(bsr);
    }
 
-   free_jcr(jcr);
-   jcr = NULL;
 
    free_volume_lists();
 
 
    free_volume_lists();
 
@@ -467,7 +469,7 @@ static bool open_the_device()
    block = new_block(dev);
    dev->r_dlock();
    Dmsg1(200, "Opening device %s\n", dcr->VolumeName);
    block = new_block(dev);
    dev->r_dlock();
    Dmsg1(200, "Opening device %s\n", dcr->VolumeName);
-   if (dev->open(dcr, OPEN_READ_WRITE) < 0) {
+   if (!dev->open(dcr, OPEN_READ_WRITE)) {
       Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), dev->errmsg);
       ok = false;
       goto bail_out;
       Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), dev->errmsg);
       ok = false;
       goto bail_out;
@@ -731,7 +733,7 @@ static void capcmd()
  */
 static void rectestcmd()
 {
  */
 static void rectestcmd()
 {
-   DEV_BLOCK *block;
+   DEV_BLOCK *save_block;
    DEV_RECORD *rec;
    int i, blkno = 0;
 
    DEV_RECORD *rec;
    int i, blkno = 0;
 
@@ -747,27 +749,29 @@ static void rectestcmd()
       return;
    }
 
       return;
    }
 
-   sm_check(__FILE__, __LINE__, false);
-   block = new_block(dev);
+   Dsm_check(200);
+   save_block = dcr->block;
+   dcr->block = new_block(dev);
    rec = new_record();
 
    for (i=1; i<500000; i++) {
       rec->data = check_pool_memory_size(rec->data, i);
       memset(rec->data, i & 0xFF, i);
       rec->data_len = i;
    rec = new_record();
 
    for (i=1; i<500000; i++) {
       rec->data = check_pool_memory_size(rec->data, i);
       memset(rec->data, i & 0xFF, i);
       rec->data_len = i;
-      sm_check(__FILE__, __LINE__, false);
-      if (write_record_to_block(block, rec)) {
-         empty_block(block);
+      Dsm_check(200);
+      if (write_record_to_block(dcr, rec)) {
+         empty_block(dcr->block);
          blkno++;
          Pmsg2(0, _("Block %d i=%d\n"), blkno, i);
       } else {
          break;
       }
          blkno++;
          Pmsg2(0, _("Block %d i=%d\n"), blkno, i);
       } else {
          break;
       }
-      sm_check(__FILE__, __LINE__, false);
+      Dsm_check(200);
    }
    free_record(rec);
    }
    free_record(rec);
-   free_block(block);
-   sm_check(__FILE__, __LINE__, false);
+   free_block(dcr->block);
+   dcr->block = save_block;     /* restore block to dcr */
+   Dsm_check(200);
 }
 
 /*
 }
 
 /*
@@ -801,33 +805,33 @@ static bool re_read_block_test()
    rec->data = check_pool_memory_size(rec->data, block->buf_len);
    len = rec->data_len = block->buf_len-100;
    memset(rec->data, 1, rec->data_len);
    rec->data = check_pool_memory_size(rec->data, block->buf_len);
    len = rec->data_len = block->buf_len-100;
    memset(rec->data, 1, rec->data_len);
-   if (!write_record_to_block(block, rec)) {
+   if (!write_record_to_block(dcr, rec)) {
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
-   if (!write_block_to_dev(dcr)) {
+   if (!dcr->write_block_to_dev()) {
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
       Pmsg1(0, _("Wrote first record of %d bytes.\n"), rec->data_len);
    }
    memset(rec->data, 2, rec->data_len);
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
       Pmsg1(0, _("Wrote first record of %d bytes.\n"), rec->data_len);
    }
    memset(rec->data, 2, rec->data_len);
-   if (!write_record_to_block(block, rec)) {
+   if (!write_record_to_block(dcr, rec)) {
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
-   if (!write_block_to_dev(dcr)) {
+   if (!dcr->write_block_to_dev()) {
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
       Pmsg1(0, _("Wrote second record of %d bytes.\n"), rec->data_len);
    }
    memset(rec->data, 3, rec->data_len);
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
       Pmsg1(0, _("Wrote second record of %d bytes.\n"), rec->data_len);
    }
    memset(rec->data, 3, rec->data_len);
-   if (!write_record_to_block(block, rec)) {
+   if (!write_record_to_block(dcr, rec)) {
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
-   if (!write_block_to_dev(dcr)) {
+   if (!dcr->write_block_to_dev()) {
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
@@ -853,13 +857,13 @@ static bool re_read_block_test()
       goto bail_out;
    }
    Pmsg0(0, _("Backspace record OK.\n"));
       goto bail_out;
    }
    Pmsg0(0, _("Backspace record OK.\n"));
-   if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
+   if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) {
       berrno be;
       Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
       goto bail_out;
    }
    memset(rec->data, 0, rec->data_len);
       berrno be;
       Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
       goto bail_out;
    }
    memset(rec->data, 0, rec->data_len);
-   if (!read_record_from_block(dcr, block, rec)) {
+   if (!read_record_from_block(dcr, rec)) {
       berrno be;
       Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
       goto bail_out;
       berrno be;
       Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
       goto bail_out;
@@ -963,11 +967,11 @@ static bool speed_test_bacula(fill_mode_t mode, uint64_t nb_gb, uint32_t nb)
       init_speed();
       for ( ; written < nb_gb; ) {
 
       init_speed();
       for ( ; written < nb_gb; ) {
 
-         if (!write_record_to_block(block, rec)) {
+         if (!write_record_to_block(dcr, rec)) {
             Pmsg0(0, _("\nError writing record to block.\n"));
             goto bail_out;
          }
             Pmsg0(0, _("\nError writing record to block.\n"));
             goto bail_out;
          }
-         if (!write_block_to_dev(dcr)) {
+         if (!dcr->write_block_to_dev()) {
             Pmsg0(0, _("\nError writing block to device.\n"));
             goto bail_out;
          }
             Pmsg0(0, _("\nError writing block to device.\n"));
             goto bail_out;
          }
@@ -1111,7 +1115,13 @@ static bool write_two_files()
    int len, i, j;
    int *p;
    bool rc = false;       /* bad return code */
    int len, i, j;
    int *p;
    bool rc = false;       /* bad return code */
+   DEVICE *dev = dcr->dev;
 
 
+   /*
+    * Set big max_file_size so that write_record_to_block
+    * doesn't insert any additional EOF marks
+    */
+   dev->max_file_size = 2 * num_recs * dev->max_block_size;
    Pmsg2(-1, _("\n=== Write, rewind, and re-read test ===\n\n"
       "I'm going to write %d records and an EOF\n"
       "then write %d records and an EOF, then rewind,\n"
    Pmsg2(-1, _("\n=== Write, rewind, and re-read test ===\n\n"
       "I'm going to write %d records and an EOF\n"
       "then write %d records and an EOF, then rewind,\n"
@@ -1135,11 +1145,11 @@ static bool write_two_files()
       for (j=0; j<len; j++) {
          *p++ = i;
       }
       for (j=0; j<len; j++) {
          *p++ = i;
       }
-      if (!write_record_to_block(block, rec)) {
+      if (!write_record_to_block(dcr, rec)) {
          Pmsg0(0, _("Error writing record to block.\n"));
          goto bail_out;
       }
          Pmsg0(0, _("Error writing record to block.\n"));
          goto bail_out;
       }
-      if (!write_block_to_dev(dcr)) {
+      if (!dcr->write_block_to_dev()) {
          Pmsg0(0, _("Error writing block to device.\n"));
          goto bail_out;
       }
          Pmsg0(0, _("Error writing block to device.\n"));
          goto bail_out;
       }
@@ -1151,11 +1161,11 @@ static bool write_two_files()
       for (j=0; j<len; j++) {
          *p++ = i;
       }
       for (j=0; j<len; j++) {
          *p++ = i;
       }
-      if (!write_record_to_block(block, rec)) {
+      if (!write_record_to_block(dcr, rec)) {
          Pmsg0(0, _("Error writing record to block.\n"));
          goto bail_out;
       }
          Pmsg0(0, _("Error writing record to block.\n"));
          goto bail_out;
       }
-      if (!write_block_to_dev(dcr)) {
+      if (!dcr->write_block_to_dev()) {
          Pmsg0(0, _("Error writing block to device.\n"));
          goto bail_out;
       }
          Pmsg0(0, _("Error writing block to device.\n"));
          goto bail_out;
       }
@@ -1212,7 +1222,7 @@ static bool write_read_test()
    /* Now read it back */
    for (i=1; i<=2*num_recs; i++) {
 read_again:
    /* Now read it back */
    for (i=1; i<=2*num_recs; i++) {
 read_again:
-      if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
+      if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) {
          berrno be;
          if (dev_state(dev, ST_EOF)) {
             Pmsg0(-1, _("Got EOF on tape.\n"));
          berrno be;
          if (dev_state(dev, ST_EOF)) {
             Pmsg0(-1, _("Got EOF on tape.\n"));
@@ -1224,7 +1234,7 @@ read_again:
          goto bail_out;
       }
       memset(rec->data, 0, rec->data_len);
          goto bail_out;
       }
       memset(rec->data, 0, rec->data_len);
-      if (!read_record_from_block(dcr, block, rec)) {
+      if (!read_record_from_block(dcr, rec)) {
          berrno be;
          Pmsg2(0, _("Read record failed. Block %d! ERR=%s\n"), i, be.bstrerror(dev->dev_errno));
          goto bail_out;
          berrno be;
          Pmsg2(0, _("Read record failed. Block %d! ERR=%s\n"), i, be.bstrerror(dev->dev_errno));
          goto bail_out;
@@ -1331,7 +1341,7 @@ static bool position_test()
          goto bail_out;
       }
 read_again:
          goto bail_out;
       }
 read_again:
-      if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
+      if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) {
          berrno be;
          if (dev_state(dev, ST_EOF)) {
             Pmsg0(-1, _("Got EOF on tape.\n"));
          berrno be;
          if (dev_state(dev, ST_EOF)) {
             Pmsg0(-1, _("Got EOF on tape.\n"));
@@ -1356,7 +1366,7 @@ read_again:
          goto bail_out;
       }
       memset(rec->data, 0, rec->data_len);
          goto bail_out;
       }
       memset(rec->data, 0, rec->data_len);
-      if (!read_record_from_block(dcr, block, rec)) {
+      if (!read_record_from_block(dcr, rec)) {
          berrno be;
          Pmsg1(0, _("Read record failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
          goto bail_out;
          berrno be;
          Pmsg1(0, _("Read record failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
          goto bail_out;
@@ -1866,7 +1876,7 @@ static void fsrcmd()
 static void rbcmd()
 {
    dev->open(dcr, OPEN_READ_ONLY);
 static void rbcmd()
 {
    dev->open(dcr, OPEN_READ_ONLY);
-   read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK);  
+   dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK);
 }
 
 /*
 }
 
 /*
@@ -1881,7 +1891,7 @@ static void wrcmd()
    if (!dev->is_open()) {
       open_the_device();
    }
    if (!dev->is_open()) {
       open_the_device();
    }
-   sm_check(__FILE__, __LINE__, false);
+   Dsm_check(200);
    empty_block(block);
    if (verbose > 1) {
       dump_block(block, "test");
    empty_block(block);
    if (verbose > 1) {
       dump_block(block, "test");
@@ -1892,12 +1902,12 @@ static void wrcmd()
    rec->data = check_pool_memory_size(rec->data, i);
    memset(rec->data, i & 0xFF, i);
    rec->data_len = i;
    rec->data = check_pool_memory_size(rec->data, i);
    memset(rec->data, i & 0xFF, i);
    rec->data_len = i;
-   sm_check(__FILE__, __LINE__, false);
-   if (!write_record_to_block(block, rec)) {
+   Dsm_check(200);
+   if (!write_record_to_block(dcr, rec)) {
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
       Pmsg0(0, _("Error writing record to block.\n"));
       goto bail_out;
    }
-   if (!write_block_to_dev(dcr)) {
+   if (!dcr->write_block_to_dev()) {
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
       Pmsg0(0, _("Error writing block to device.\n"));
       goto bail_out;
    } else {
@@ -1906,8 +1916,7 @@ static void wrcmd()
    Pmsg0(0, _("Wrote block to device.\n"));
 
 bail_out:
    Pmsg0(0, _("Wrote block to device.\n"));
 
 bail_out:
-   sm_check(__FILE__, __LINE__, false);
-   sm_check(__FILE__, __LINE__, false);
+   Dsm_check(200);
 }
 
 /*
 }
 
 /*
@@ -2043,7 +2052,7 @@ static void scan_blocks()
    dev->update_pos(dcr);
    tot_files = dev->file;
    for (;;) {
    dev->update_pos(dcr);
    tot_files = dev->file;
    for (;;) {
-      if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
+      if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) {
          Dmsg1(100, "!read_block(): ERR=%s\n", dev->bstrerror());
          if (dev->state & ST_EOT) {
             if (blocks > 0) {
          Dmsg1(100, "!read_block(): ERR=%s\n", dev->bstrerror());
          if (dev->state & ST_EOT) {
             if (blocks > 0) {
@@ -2106,7 +2115,7 @@ static void scan_blocks()
          block->VolSessionId, block->VolSessionTime);
       if (verbose == 1) {
          DEV_RECORD *rec = new_record();
          block->VolSessionId, block->VolSessionTime);
       if (verbose == 1) {
          DEV_RECORD *rec = new_record();
-         read_record_from_block(dcr, block, rec);
+         read_record_from_block(dcr, rec);
          Pmsg9(-1, _("Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n"),
               block->BlockNumber, dev->file, dev->block_num, block->block_len,
               FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, rec->VolSessionTime,
          Pmsg9(-1, _("Block=%u file,blk=%u,%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n"),
               block->BlockNumber, dev->file, dev->block_num, block->block_len,
               FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, rec->VolSessionTime,
@@ -2211,7 +2220,7 @@ static void fillcmd()
     */
    Dmsg0(100, "just before acquire_device\n");
    if (!acquire_device_for_append(dcr)) {
     */
    Dmsg0(100, "just before acquire_device\n");
    if (!acquire_device_for_append(dcr)) {
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
+      jcr->setJobStatus(JS_ErrorTerminated);
       exit_code = 1;
       return;
    }
       exit_code = 1;
       return;
    }
@@ -2222,7 +2231,7 @@ static void fillcmd()
     * Write Begin Session Record
     */
    if (!write_session_label(dcr, SOS_LABEL)) {
     * Write Begin Session Record
     */
    if (!write_session_label(dcr, SOS_LABEL)) {
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
+      jcr->setJobStatus(JS_ErrorTerminated);
       Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"),
          dev->bstrerror());
       ok = false;
       Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"),
          dev->bstrerror());
       ok = false;
@@ -2255,6 +2264,7 @@ static void fillcmd()
       rec.VolSessionTime = jcr->VolSessionTime;
       rec.FileIndex = ++file_index;
       rec.Stream = STREAM_FILE_DATA;
       rec.VolSessionTime = jcr->VolSessionTime;
       rec.FileIndex = ++file_index;
       rec.Stream = STREAM_FILE_DATA;
+      rec.maskedStream = STREAM_FILE_DATA;
 
       /* Mix up the data just a bit */
       mix_buffer(FILL_RANDOM, rec.data, rec.data_len);
 
       /* Mix up the data just a bit */
       mix_buffer(FILL_RANDOM, rec.data, rec.data_len);
@@ -2264,7 +2274,7 @@ static void fillcmd()
          stream_to_ascii(buf1, rec.Stream, rec.FileIndex),
          rec.data_len);
 
          stream_to_ascii(buf1, rec.Stream, rec.FileIndex),
          rec.data_len);
 
-      while (!write_record_to_block(block, &rec)) {
+      while (!write_record_to_block(dcr, &rec)) {
          /*
           * When we get here we have just filled a block
           */
          /*
           * When we get here we have just filled a block
           */
@@ -2334,10 +2344,10 @@ static void fillcmd()
       Dmsg0(100, "Write_end_session_label()\n");
       /* Create Job status for end of session label */
       if (!job_canceled(jcr) && ok) {
       Dmsg0(100, "Write_end_session_label()\n");
       /* Create Job status for end of session label */
       if (!job_canceled(jcr) && ok) {
-         set_jcr_job_status(jcr, JS_Terminated);
+         jcr->setJobStatus(JS_Terminated);
       } else if (!ok) {
          Pmsg0(000, _("Job canceled.\n"));
       } else if (!ok) {
          Pmsg0(000, _("Job canceled.\n"));
-         set_jcr_job_status(jcr, JS_ErrorTerminated);
+         jcr->setJobStatus(JS_ErrorTerminated);
          exit_code = 1;
       }
       if (!write_session_label(dcr, EOS_LABEL)) {
          exit_code = 1;
       }
       if (!write_session_label(dcr, EOS_LABEL)) {
@@ -2346,7 +2356,7 @@ static void fillcmd()
          exit_code = 1;
       }
       /* Write out final block of this session */
          exit_code = 1;
       }
       /* Write out final block of this session */
-      if (!write_block_to_device(dcr)) {
+      if (!dcr->write_block_to_device()) {
          Pmsg0(-1, _("Set ok=false after write_block_to_device.\n"));
          ok = false;
          exit_code = 1;
          Pmsg0(-1, _("Set ok=false after write_block_to_device.\n"));
          ok = false;
          exit_code = 1;
@@ -2544,13 +2554,14 @@ static bool do_unfill()
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %u.\n"), last_block_num);
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %u.\n"), last_block_num);
-   if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
+   if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) {
       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
       goto bail_out;
    }
    if (compare_blocks(last_block, block)) {
       if (simple) {
          Pmsg0(-1, _("\nThe last block on the tape matches. Test succeeded.\n\n"));
       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
       goto bail_out;
    }
    if (compare_blocks(last_block, block)) {
       if (simple) {
          Pmsg0(-1, _("\nThe last block on the tape matches. Test succeeded.\n\n"));
+         rc = true;
       } else {
          Pmsg0(-1, _("\nThe last block of the first tape matches.\n\n"));
       }
       } else {
          Pmsg0(-1, _("\nThe last block of the first tape matches.\n\n"));
       }
@@ -2595,7 +2606,7 @@ static bool do_unfill()
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
-   if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
+   if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) {
       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
       goto bail_out;
    }
       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
       goto bail_out;
    }
@@ -2611,7 +2622,7 @@ static bool do_unfill()
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
       goto bail_out;
    }
    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
-   if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
+   if (!dcr->read_block_from_device(NO_BLOCK_NUMBER_CHECK)) {
       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
       goto bail_out;
    }
       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
       goto bail_out;
    }
@@ -2641,7 +2652,10 @@ static bool quickie_cb(DCR *dcr, DEV_RECORD *rec)
 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block)
 {
    char *p, *q;
 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block)
 {
    char *p, *q;
-   uint32_t CheckSum, block_len;
+   union {
+      uint32_t CheckSum;
+      uint32_t block_len;
+   };
    ser_declare;
 
    p = last_block->buf;
    ser_declare;
 
    p = last_block->buf;
@@ -2695,7 +2709,7 @@ static int flush_block(DEV_BLOCK *block, int dump)
    /* Copy block */
    this_file = dev->file;
    this_block_num = dev->block_num;
    /* Copy block */
    this_file = dev->file;
    this_block_num = dev->block_num;
-   if (!write_block_to_dev(dcr)) {
+   if (!dcr->write_block_to_dev()) {
       Pmsg3(000, _("Last block at: %u:%u this_dev_block_num=%d\n"),
                   last_file, last_block_num, this_block_num);
       if (vol_num == 1) {
       Pmsg3(000, _("Last block at: %u:%u this_dev_block_num=%d\n"),
                   last_file, last_block_num, this_block_num);
       if (vol_num == 1) {
@@ -2789,7 +2803,7 @@ static void qfillcmd()
       count = 1000;
    }
 
       count = 1000;
    }
 
-   sm_check(__FILE__, __LINE__, false);
+   Dsm_check(200);
 
    i = block->buf_len - 100;
    ASSERT (i > 0);
 
    i = block->buf_len - 100;
    ASSERT (i > 0);
@@ -2805,11 +2819,11 @@ static void qfillcmd()
          printf("+");
          fflush(stdout);
       }
          printf("+");
          fflush(stdout);
       }
-      if (!write_record_to_block(block, rec)) {
+      if (!write_record_to_block(dcr, rec)) {
          Pmsg0(0, _("Error writing record to block.\n"));
          goto bail_out;
       }
          Pmsg0(0, _("Error writing record to block.\n"));
          goto bail_out;
       }
-      if (!write_block_to_dev(dcr)) {
+      if (!dcr->write_block_to_dev()) {
          Pmsg0(0, _("Error writing block to device.\n"));
          goto bail_out;
       }
          Pmsg0(0, _("Error writing block to device.\n"));
          goto bail_out;
       }
@@ -2824,7 +2838,7 @@ static void qfillcmd()
    scan_blocks();
 
 bail_out:
    scan_blocks();
 
 bail_out:
-   sm_check(__FILE__, __LINE__, false);
+   Dsm_check(200);
 }
 
 /*
 }
 
 /*
@@ -2912,7 +2926,7 @@ do_tape_cmds()
    bool found;
 
    while (!quit && get_cmd("*")) {
    bool found;
 
    while (!quit && get_cmd("*")) {
-      sm_check(__FILE__, __LINE__, false);
+      Dsm_check(200);
       found = false;
       parse_args(cmd, &args, &argc, argk, argv, MAX_CMD_ARGS);
       for (i=0; i<comsize; i++)       /* search for command */
       found = false;
       parse_args(cmd, &args, &argc, argk, argv, MAX_CMD_ARGS);
       for (i=0; i<comsize; i++)       /* search for command */
@@ -3004,7 +3018,7 @@ bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten)
 bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw  writing)
 {
    Dmsg0(20, "Enter dir_get_volume_info\n");
 bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw  writing)
 {
    Dmsg0(20, "Enter dir_get_volume_info\n");
-   bstrncpy(dcr->VolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
+   dcr->setVolCatName(dcr->VolumeName);
    return 1;
 }
 
    return 1;
 }
 
@@ -3116,8 +3130,8 @@ static void set_volume_name(const char *VolName, int volnum)
    DCR *dcr = jcr->dcr;
    VolumeName = VolName;
    vol_num = volnum;
    DCR *dcr = jcr->dcr;
    VolumeName = VolName;
    vol_num = volnum;
-   bstrncpy(dev->VolCatInfo.VolCatName, VolName, sizeof(dev->VolCatInfo.VolCatName));
-   bstrncpy(dcr->VolCatInfo.VolCatName, VolName, sizeof(dcr->VolCatInfo.VolCatName));
+   dev->setVolCatName(VolName);
+   dcr->setVolCatName(VolName);
    bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
    dcr->VolCatInfo.Slot = volnum;
    dcr->VolCatInfo.InChanger = true;
    bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
    dcr->VolCatInfo.Slot = volnum;
    dcr->VolCatInfo.InChanger = true;