3 * Bacula Tape manipulation program
5 * Has various tape manipulation commands -- mostly for
6 * use in determining how tapes really work.
8 * Kern Sibbald, April MM
10 * Note, this program reads stored.conf, and will only
11 * talk to devices that are configured.
17 Bacula® - The Network Backup Solution
19 Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
21 The main author of Bacula is Kern Sibbald, with contributions from
22 many others, a complete list can be found in the file AUTHORS.
23 This program is Free Software; you can redistribute it and/or
24 modify it under the terms of version two of the GNU General Public
25 License as published by the Free Software Foundation plus additions
26 that are listed in the file LICENSE.
28 This program is distributed in the hope that it will be useful, but
29 WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
31 General Public License for more details.
33 You should have received a copy of the GNU General Public License
34 along with this program; if not, write to the Free Software
35 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
38 Bacula® is a registered trademark of John Walker.
39 The licensor of Bacula is the Free Software Foundation Europe
40 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
41 Switzerland, email:ftf@fsfeurope.org.
48 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
50 /* External subroutines */
51 extern void free_config_resources();
53 /* Exported variables */
56 int bsize = TAPE_BSIZE;
57 char VolName[MAX_NAME_LENGTH];
58 STORES *me = NULL; /* our Global resource */
59 bool forge_on = false; /* proceed inspite of I/O errors */
60 pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER;
61 pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER;
64 * If you change the format of the state file,
65 * increment this value
67 static uint32_t btape_state_level = 2;
71 DEVRES *device = NULL;
74 /* Forward referenced subroutines */
75 static void do_tape_cmds();
76 static void helpcmd();
77 static void scancmd();
78 static void rewindcmd();
79 static void clearcmd();
84 static void fillcmd();
85 static void qfillcmd();
86 static void statcmd();
87 static void unfillcmd();
88 static int flush_block(DEV_BLOCK *block, int dump);
89 static bool quickie_cb(DCR *dcr, DEV_RECORD *rec);
90 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block);
91 static bool my_mount_next_read_volume(DCR *dcr);
92 static void scan_blocks();
93 static void set_volume_name(const char *VolName, int volnum);
94 static void rawfill_cmd();
95 static void bfill_cmd();
96 static bool open_the_device();
97 static void autochangercmd();
98 static void do_unfill();
101 /* Static variables */
102 #define CONFIG_FILE "bacula-sd.conf"
103 char *configfile = NULL;
105 #define MAX_CMD_ARGS 30
107 static POOLMEM *args;
108 static char *argk[MAX_CMD_ARGS];
109 static char *argv[MAX_CMD_ARGS];
112 static int quickie_count = 0;
113 static uint64_t write_count = 0;
114 static BSR *bsr = NULL;
115 static int signals = TRUE;
118 static uint64_t vol_size;
119 static uint64_t VolBytes;
122 static int32_t file_index;
123 static int end_of_tape = 0;
124 static uint32_t LastBlock = 0;
125 static uint32_t eot_block;
126 static uint32_t eot_block_len;
127 static uint32_t eot_FileIndex;
128 static int dumped = 0;
129 static DEV_BLOCK *last_block1 = NULL;
130 static DEV_BLOCK *last_block2 = NULL;
131 static DEV_BLOCK *last_block = NULL;
132 static DEV_BLOCK *this_block = NULL;
133 static DEV_BLOCK *first_block = NULL;
134 static uint32_t last_file1 = 0;
135 static uint32_t last_file2 = 0;
136 static uint32_t last_file = 0;
137 static uint32_t last_block_num1 = 0;
138 static uint32_t last_block_num2 = 0;
139 static uint32_t last_block_num = 0;
140 static uint32_t BlockNumber = 0;
141 static bool simple = true;
143 static const char *VolumeName = NULL;
144 static int vol_num = 0;
146 static JCR *jcr = NULL;
150 static void terminate_btape(int sig);
151 int get_cmd(const char *prompt);
154 /*********************************************************************
156 * Bacula tape testing program
159 int main(int margc, char *margv[])
166 setlocale(LC_ALL, "");
167 bindtextdomain("bacula", LOCALEDIR);
168 textdomain("bacula");
172 if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
173 Emsg2(M_ABORT, 0, _("Tape block size (%d) not multiple of system size (%d)\n"),
174 TAPE_BSIZE, B_DEV_BSIZE);
176 if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) {
177 Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE);
179 if (sizeof(boffset_t) < 8) {
180 Pmsg1(-1, _("\n\n!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or more !!!!!\n\n\n"),
184 bsnprintf(buf, sizeof(buf), "%u", x32);
185 i = bsscanf(buf, "%lu", &y32);
186 if (i != 1 || x32 != y32) {
187 Pmsg3(-1, _("32 bit printf/scanf problem. i=%d x32=%u y32=%u\n"), i, x32, y32);
193 bsnprintf(buf, sizeof(buf), "%" llu, x64);
194 i = bsscanf(buf, "%llu", &y64);
195 if (i != 1 || x64 != y64) {
196 Pmsg3(-1, _("64 bit printf/scanf problem. i=%d x64=%" llu " y64=%" llu "\n"),
201 printf(_("Tape block granularity is %d bytes.\n"), TAPE_BSIZE);
203 working_directory = "/tmp";
204 my_name_is(margc, margv, "btape");
205 init_msg(NULL, NULL);
209 while ((ch = getopt(margc, margv, "b:c:d:psv?")) != -1) {
211 case 'b': /* bootstrap file */
212 bsr = parse_bsr(NULL, optarg);
213 // dump_bsr(bsr, true);
216 case 'c': /* specify config file */
217 if (configfile != NULL) {
220 configfile = bstrdup(optarg);
223 case 'd': /* set debug level */
224 debug_level = atoi(optarg);
225 if (debug_level <= 0) {
252 cmd = get_pool_memory(PM_FNAME);
253 args = get_pool_memory(PM_FNAME);
256 init_signals(terminate_btape);
259 if (configfile == NULL) {
260 configfile = bstrdup(CONFIG_FILE);
263 daemon_start_time = time(NULL);
265 parse_config(configfile);
268 /* See if we can open a device */
270 Pmsg0(000, _("No archive name specified.\n"));
273 } else if (margc != 1) {
274 Pmsg0(000, _("Improper number of arguments specified.\n"));
279 jcr = setup_jcr("btape", margv[0], bsr, NULL, 0); /* write */
288 Pmsg0(000, _("btape does not work with DVD storage.\n"));
292 if (!dev->is_tape()) {
293 Pmsg0(000, _("btape only works with tape storage.\n"));
298 if (!open_the_device()) {
302 Dmsg0(200, "Do tape commands\n");
310 static void terminate_btape(int stat)
313 sm_check(__FILE__, __LINE__, false);
317 free_config_resources();
319 free_pool_memory(args);
323 free_pool_memory(cmd);
340 if (debug_level > 10)
341 print_memory_pool_stats();
344 free_block(this_block);
349 close_memory_pool(); /* free memory in pool */
350 term_last_jobs_list();
356 static bool open_the_device()
360 block = new_block(dev);
362 Dmsg1(200, "Opening device %s\n", dcr->VolumeName);
363 if (dev->open(dcr, OPEN_READ_WRITE) < 0) {
364 Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), dev->errmsg);
369 Pmsg1(000, _("open device %s: OK\n"), dev->print_name());
370 dev->set_append(); /* put volume in append mode */
383 * Write a label to the tape
385 static void labelcmd()
388 pm_strcpy(cmd, VolumeName);
390 if (!get_cmd(_("Enter Volume Name: "))) {
395 if (!dev->is_open()) {
396 if (!first_open_device(dcr)) {
397 Pmsg1(0, _("Device open failed. ERR=%s\n"), dev->bstrerror());
402 write_new_volume_label_to_dev(dcr, cmd, "Default", false,/*no relabel*/ true /* label dvd now */);
403 Pmsg1(-1, _("Wrote Volume label for volume \"%s\".\n"), cmd);
407 * Read the tape label
409 static void readlabelcmd()
411 int save_debug_level = debug_level;
414 stat = read_dev_volume_label(dcr);
417 Pmsg0(0, _("Volume has no label.\n"));
420 Pmsg0(0, _("Volume label read correctly.\n"));
423 Pmsg1(0, _("I/O error on device: ERR=%s"), dev->bstrerror());
426 Pmsg0(0, _("Volume name error\n"));
428 case VOL_CREATE_ERROR:
429 Pmsg1(0, _("Error creating label. ERR=%s"), dev->bstrerror());
431 case VOL_VERSION_ERROR:
432 Pmsg0(0, _("Volume version error.\n"));
434 case VOL_LABEL_ERROR:
435 Pmsg0(0, _("Bad Volume label type.\n"));
438 Pmsg0(0, _("Unknown error.\n"));
443 dump_volume_label(dev);
444 debug_level = save_debug_level;
449 * Load the tape should have prevously been taken
450 * off line, otherwise this command is not necessary.
452 static void loadcmd()
455 if (!load_dev(dev)) {
456 Pmsg1(0, _("Bad status from load. ERR=%s\n"), dev->bstrerror());
458 Pmsg1(0, _("Loaded %s\n"), dev->print_name());
464 static void rewindcmd()
466 if (!dev->rewind(dcr)) {
467 Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
470 Pmsg1(0, _("Rewound %s\n"), dev->print_name());
475 * Clear any tape error
477 static void clearcmd()
483 * Write and end of file on the tape
485 static void weofcmd()
495 if (!dev->weof(num)) {
496 Pmsg1(0, _("Bad status from weof. ERR=%s\n"), dev->bstrerror());
500 Pmsg1(0, _("Wrote 1 EOF to %s\n"), dev->print_name());
503 Pmsg2(0, _("Wrote %d EOFs to %s\n"), num, dev->print_name());
509 /* Go to the end of the medium -- raw command
510 * The idea was orginally that the end of the Bacula
511 * medium would be flagged differently. This is not
512 * currently the case. So, this is identical to the
517 if (!dev->eod(dcr)) {
518 Pmsg1(0, "%s", dev->bstrerror());
521 Pmsg0(0, _("Moved to end of medium.\n"));
526 * Go to the end of the medium (either hardware determined
527 * or defined by two eofs.
547 if (!dev->bsf(num)) {
548 Pmsg1(0, _("Bad status from bsf. ERR=%s\n"), dev->bstrerror());
550 Pmsg2(0, _("Backspaced %d file%s.\n"), num, num==1?"":"s");
566 if (!dev->bsr(num)) {
567 Pmsg1(0, _("Bad status from bsr. ERR=%s\n"), dev->bstrerror());
569 Pmsg2(0, _("Backspaced %d record%s.\n"), num, num==1?"":"s");
574 * List device capabilities as defined in the
579 printf(_("Configured device capabilities:\n"));
580 printf("%sEOF ", dev->capabilities & CAP_EOF ? "" : "!");
581 printf("%sBSR ", dev->capabilities & CAP_BSR ? "" : "!");
582 printf("%sBSF ", dev->capabilities & CAP_BSF ? "" : "!");
583 printf("%sFSR ", dev->capabilities & CAP_FSR ? "" : "!");
584 printf("%sFSF ", dev->capabilities & CAP_FSF ? "" : "!");
585 printf("%sFASTFSF ", dev->capabilities & CAP_FASTFSF ? "" : "!");
586 printf("%sBSFATEOM ", dev->capabilities & CAP_BSFATEOM ? "" : "!");
587 printf("%sEOM ", dev->capabilities & CAP_EOM ? "" : "!");
588 printf("%sREM ", dev->capabilities & CAP_REM ? "" : "!");
589 printf("%sRACCESS ", dev->capabilities & CAP_RACCESS ? "" : "!");
590 printf("%sAUTOMOUNT ", dev->capabilities & CAP_AUTOMOUNT ? "" : "!");
591 printf("%sLABEL ", dev->capabilities & CAP_LABEL ? "" : "!");
592 printf("%sANONVOLS ", dev->capabilities & CAP_ANONVOLS ? "" : "!");
593 printf("%sALWAYSOPEN ", dev->capabilities & CAP_ALWAYSOPEN ? "" : "!");
594 printf("%sMTIOCGET ", dev->capabilities & CAP_MTIOCGET ? "" : "!");
597 printf(_("Device status:\n"));
598 printf("%sOPENED ", dev->is_open() ? "" : "!");
599 printf("%sTAPE ", dev->is_tape() ? "" : "!");
600 printf("%sLABEL ", dev->is_labeled() ? "" : "!");
601 printf("%sMALLOC ", dev->state & ST_MALLOC ? "" : "!");
602 printf("%sAPPEND ", dev->can_append() ? "" : "!");
603 printf("%sREAD ", dev->can_read() ? "" : "!");
604 printf("%sEOT ", dev->at_eot() ? "" : "!");
605 printf("%sWEOT ", dev->state & ST_WEOT ? "" : "!");
606 printf("%sEOF ", dev->at_eof() ? "" : "!");
607 printf("%sNEXTVOL ", dev->state & ST_NEXTVOL ? "" : "!");
608 printf("%sSHORT ", dev->state & ST_SHORT ? "" : "!");
611 printf(_("Device parameters:\n"));
612 printf("Device name: %s\n", dev->dev_name);
613 printf("File=%u block=%u\n", dev->file, dev->block_num);
614 printf("Min block=%u Max block=%u\n", dev->min_block_size, dev->max_block_size);
616 printf(_("Status:\n"));
622 * Test writting larger and larger records.
623 * This is a torture test for records.
625 static void rectestcmd()
631 Pmsg0(0, _("Test writting larger and larger records.\n"
632 "This is a torture test for records.\nI am going to write\n"
633 "larger and larger records. It will stop when the record size\n"
634 "plus the header exceeds the block size (by default about 64K)\n"));
637 get_cmd(_("Do you want to continue? (y/n): "));
639 Pmsg0(000, _("Command aborted.\n"));
643 sm_check(__FILE__, __LINE__, false);
644 block = new_block(dev);
647 for (i=1; i<500000; i++) {
648 rec->data = check_pool_memory_size(rec->data, i);
649 memset(rec->data, i & 0xFF, i);
651 sm_check(__FILE__, __LINE__, false);
652 if (write_record_to_block(block, rec)) {
655 Pmsg2(0, _("Block %d i=%d\n"), blkno, i);
659 sm_check(__FILE__, __LINE__, false);
663 sm_check(__FILE__, __LINE__, false);
667 * This test attempts to re-read a block written by Bacula
668 * normally at the end of the tape. Bacula will then back up
669 * over the two eof marks, backup over the record and reread
670 * it to make sure it is valid. Bacula can skip this validation
671 * if you set "Backward space record = no"
673 static int re_read_block_test()
675 DEV_BLOCK *block = dcr->block;
680 if (!(dev->capabilities & CAP_BSR)) {
681 Pmsg0(-1, _("Skipping read backwards test because BSR turned off.\n"));
685 Pmsg0(-1, _("\n=== Write, backup, and re-read test ===\n\n"
686 "I'm going to write three records and an EOF\n"
687 "then backup over the EOF and re-read the last record.\n"
688 "Bacula does this after writing the last block on the\n"
689 "tape to verify that the block was written correctly.\n\n"
690 "This is not an *essential* feature ...\n\n"));
694 rec->data = check_pool_memory_size(rec->data, block->buf_len);
695 len = rec->data_len = block->buf_len-100;
696 memset(rec->data, 1, rec->data_len);
697 if (!write_record_to_block(block, rec)) {
698 Pmsg0(0, _("Error writing record to block.\n"));
701 if (!write_block_to_dev(dcr)) {
702 Pmsg0(0, _("Error writing block to device.\n"));
705 Pmsg1(0, _("Wrote first record of %d bytes.\n"), rec->data_len);
707 memset(rec->data, 2, rec->data_len);
708 if (!write_record_to_block(block, rec)) {
709 Pmsg0(0, _("Error writing record to block.\n"));
712 if (!write_block_to_dev(dcr)) {
713 Pmsg0(0, _("Error writing block to device.\n"));
716 Pmsg1(0, _("Wrote second record of %d bytes.\n"), rec->data_len);
718 memset(rec->data, 3, rec->data_len);
719 if (!write_record_to_block(block, rec)) {
720 Pmsg0(0, _("Error writing record to block.\n"));
723 if (!write_block_to_dev(dcr)) {
724 Pmsg0(0, _("Error writing block to device.\n"));
727 Pmsg1(0, _("Wrote third record of %d bytes.\n"), rec->data_len);
730 if (dev_cap(dev, CAP_TWOEOF)) {
734 Pmsg1(0, _("Backspace file failed! ERR=%s\n"), dev->bstrerror());
737 if (dev_cap(dev, CAP_TWOEOF)) {
739 Pmsg1(0, _("Backspace file failed! ERR=%s\n"), dev->bstrerror());
743 Pmsg0(0, _("Backspaced over EOF OK.\n"));
745 Pmsg1(0, _("Backspace record failed! ERR=%s\n"), dev->bstrerror());
748 Pmsg0(0, _("Backspace record OK.\n"));
749 if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
751 Pmsg1(0, _("Read block failed! ERR=%s\n"), be.strerror(dev->dev_errno));
754 memset(rec->data, 0, rec->data_len);
755 if (!read_record_from_block(block, rec)) {
757 Pmsg1(0, _("Read block failed! ERR=%s\n"), be.strerror(dev->dev_errno));
760 for (int i=0; i<len; i++) {
761 if (rec->data[i] != 3) {
762 Pmsg0(0, _("Bad data in record. Test failed!\n"));
766 Pmsg0(0, _("\nBlock re-read correct. Test succeeded!\n"));
767 Pmsg0(-1, _("=== End Write, backup, and re-read test ===\n\n"));
774 Pmsg0(0, _("This is not terribly serious since Bacula only uses\n"
775 "this function to verify the last block written to the\n"
776 "tape. Bacula will skip the last block verification\n"
778 "Backward Space Record = No\n\n"
779 "to your Storage daemon's Device resource definition.\n"));
786 * This test writes Bacula blocks to the tape in
787 * several files. It then rewinds the tape and attepts
788 * to read these blocks back checking the data.
790 static int write_read_test()
798 Pmsg0(-1, _("\n=== Write, rewind, and re-read test ===\n\n"
799 "I'm going to write 1000 records and an EOF\n"
800 "then write 1000 records and an EOF, then rewind,\n"
801 "and re-read the data to verify that it is correct.\n\n"
802 "This is an *essential* feature ...\n\n"));
805 if (!dev->rewind(dcr)) {
806 Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
809 rec->data = check_pool_memory_size(rec->data, block->buf_len);
810 rec->data_len = block->buf_len-100;
811 len = rec->data_len/sizeof(i);
812 for (i=1; i<=1000; i++) {
813 p = (int *)rec->data;
814 for (j=0; j<len; j++) {
817 if (!write_record_to_block(block, rec)) {
818 Pmsg0(0, _("Error writing record to block.\n"));
821 if (!write_block_to_dev(dcr)) {
822 Pmsg0(0, _("Error writing block to device.\n"));
826 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
828 for (i=1001; i<=2000; i++) {
829 p = (int *)rec->data;
830 for (j=0; j<len; j++) {
833 if (!write_record_to_block(block, rec)) {
834 Pmsg0(0, _("Error writing record to block.\n"));
837 if (!write_block_to_dev(dcr)) {
838 Pmsg0(0, _("Error writing block to device.\n"));
842 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
844 if (dev_cap(dev, CAP_TWOEOF)) {
847 if (!dev->rewind(dcr)) {
848 Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
851 Pmsg0(0, _("Rewind OK.\n"));
853 for (i=1; i<=2000; i++) {
855 if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
857 if (dev_state(dev, ST_EOF)) {
858 Pmsg0(-1, _("Got EOF on tape.\n"));
863 Pmsg2(0, _("Read block %d failed! ERR=%s\n"), i, be.strerror(dev->dev_errno));
866 memset(rec->data, 0, rec->data_len);
867 if (!read_record_from_block(block, rec)) {
869 Pmsg2(0, _("Read record failed. Block %d! ERR=%s\n"), i, be.strerror(dev->dev_errno));
872 p = (int *)rec->data;
873 for (j=0; j<len; j++) {
875 Pmsg3(0, _("Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"),
881 if (i == 1000 || i == 2000) {
882 Pmsg0(-1, _("1000 blocks re-read correctly.\n"));
885 Pmsg0(-1, _("=== Test Succeeded. End Write, rewind, and re-read test ===\n\n"));
894 * This test writes Bacula blocks to the tape in
895 * several files. It then rewinds the tape and attepts
896 * to read these blocks back checking the data.
898 static int position_test()
900 DEV_BLOCK *block = dcr->block;
906 int file = 0, blk = 0;
908 bool got_eof = false;
910 Pmsg0(-1, _("\n=== Write, rewind, and position test ===\n\n"
911 "I'm going to write 1000 records and an EOF\n"
912 "then write 1000 records and an EOF, then rewind,\n"
913 "and position to a few blocks and verify that it is correct.\n\n"
914 "This is an *essential* feature ...\n\n"));
917 if (!dev->rewind(dcr)) {
918 Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
921 rec->data = check_pool_memory_size(rec->data, block->buf_len);
922 rec->data_len = block->buf_len-100;
923 len = rec->data_len/sizeof(i);
924 for (i=1; i<=1000; i++) {
925 p = (int *)rec->data;
926 for (j=0; j<len; j++) {
929 if (!write_record_to_block(block, rec)) {
930 Pmsg0(0, _("Error writing record to block.\n"));
933 if (!write_block_to_dev(dcr)) {
934 Pmsg0(0, _("Error writing block to device.\n"));
938 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
940 for (i=1001; i<=2000; i++) {
941 p = (int *)rec->data;
942 for (j=0; j<len; j++) {
945 if (!write_record_to_block(block, rec)) {
946 Pmsg0(0, _("Error writing record to block.\n"));
949 if (!write_block_to_dev(dcr)) {
950 Pmsg0(0, _("Error writing block to device.\n"));
954 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
956 if (dev_cap(dev, CAP_TWOEOF)) {
959 if (!dev->rewind(dcr)) {
960 Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
963 Pmsg0(0, _("Rewind OK.\n"));
967 /* Set up next item to read based on where we are */
1003 Pmsg2(-1, _("Reposition to file:block %d:%d\n"), file, blk);
1004 if (!dev->reposition(dcr, file, blk)) {
1005 Pmsg0(0, _("Reposition error.\n"));
1009 if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
1011 if (dev_state(dev, ST_EOF)) {
1012 Pmsg0(-1, _("Got EOF on tape.\n"));
1018 Pmsg4(0, _("Read block %d failed! file=%d blk=%d. ERR=%s\n\n"),
1019 recno, file, blk, be.strerror(dev->dev_errno));
1020 Pmsg0(0, _("This may be because the tape drive block size is not\n"
1021 " set to variable blocking as normally used by Bacula.\n"
1022 " Please see the Tape Testing chapter in the manual and \n"
1023 " look for using mt with defblksize and setoptions\n"
1024 "If your tape drive block size is correct, then perhaps\n"
1025 " your SCSI driver is *really* stupid and does not\n"
1026 " correctly report the file:block after a FSF. In this\n"
1027 " case try setting:\n"
1028 " Fast Forward Space File = no\n"
1029 " in your Device resource.\n"));
1033 memset(rec->data, 0, rec->data_len);
1034 if (!read_record_from_block(block, rec)) {
1036 Pmsg1(0, _("Read record failed! ERR=%s\n"), be.strerror(dev->dev_errno));
1039 p = (int *)rec->data;
1040 for (j=0; j<len; j++) {
1041 if (p[j] != recno) {
1042 Pmsg3(0, _("Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"),
1047 Pmsg1(-1, _("Block %d re-read correctly.\n"), recno);
1049 Pmsg0(-1, _("=== Test Succeeded. End Write, rewind, and re-read test ===\n\n"));
1061 * This test writes some records, then writes an end of file,
1062 * rewinds the tape, moves to the end of the data and attepts
1063 * to append to the tape. This function is essential for
1064 * Bacula to be able to write multiple jobs to the tape.
1066 static int append_test()
1068 Pmsg0(-1, _("\n\n=== Append files test ===\n\n"
1069 "This test is essential to Bacula.\n\n"
1070 "I'm going to write one record in file 0,\n"
1071 " two records in file 1,\n"
1072 " and three records in file 2\n\n"));
1076 weofcmd(); /* end file 0 */
1079 weofcmd(); /* end file 1 */
1083 weofcmd(); /* end file 2 */
1084 if (dev_cap(dev, CAP_TWOEOF)) {
1087 dev->close(); /* release device */
1088 if (!open_the_device()) {
1092 Pmsg0(0, _("Now moving to end of medium.\n"));
1094 Pmsg2(-1, _("We should be in file 3. I am at file %d. %s\n"),
1095 dev->file, dev->file == 3 ? _("This is correct!") : _("This is NOT correct!!!!"));
1097 if (dev->file != 3) {
1101 Pmsg0(-1, _("\nNow the important part, I am going to attempt to append to the tape.\n\n"));
1104 if (dev_cap(dev, CAP_TWOEOF)) {
1108 Pmsg0(-1, _("Done appending, there should be no I/O errors\n\n"));
1109 Pmsg0(-1, _("Doing Bacula scan of blocks:\n"));
1111 Pmsg0(-1, _("End scanning the tape.\n"));
1112 Pmsg2(-1, _("We should be in file 4. I am at file %d. %s\n"),
1113 dev->file, dev->file == 4 ? _("This is correct!") : _("This is NOT correct!!!!"));
1115 if (dev->file != 4) {
1123 * This test exercises the autochanger
1125 static int autochanger_test()
1127 POOLMEM *results, *changer;
1128 int slot, status, loaded;
1129 int timeout = dcr->device->max_changer_wait;
1132 Dmsg1(100, "Max changer wait = %d sec\n", timeout);
1133 if (!dev_cap(dev, CAP_AUTOCHANGER)) {
1136 if (!(dcr->device && dcr->device->changer_name && dcr->device->changer_command)) {
1137 Pmsg0(-1, _("\nAutochanger enabled, but no name or no command device specified.\n"));
1141 Pmsg0(-1, _("\nAh, I see you have an autochanger configured.\n"
1142 "To test the autochanger you must have a blank tape\n"
1143 " that I can write on in Slot 1.\n"));
1144 if (!get_cmd(_("\nDo you wish to continue with the Autochanger test? (y/n): "))) {
1147 if (cmd[0] != 'y' && cmd[0] != 'Y') {
1151 Pmsg0(-1, _("\n\n=== Autochanger test ===\n\n"));
1153 results = get_pool_memory(PM_MESSAGE);
1154 changer = get_pool_memory(PM_FNAME);
1158 dcr->VolCatInfo.Slot = slot;
1159 /* Find out what is loaded, zero means device is unloaded */
1160 Pmsg0(-1, _("3301 Issuing autochanger \"loaded\" command.\n"));
1161 changer = edit_device_codes(dcr, changer,
1162 dcr->device->changer_command, "loaded");
1163 status = run_program(changer, timeout, results);
1164 Dmsg3(100, "run_prog: %s stat=%d result=\"%s\"\n", changer, status, results);
1166 loaded = atoi(results);
1169 Pmsg1(-1, _("3991 Bad autochanger command: %s\n"), changer);
1170 Pmsg2(-1, _("3991 result=\"%s\": ERR=%s\n"), results, be.strerror(status));
1174 Pmsg1(-1, _("Slot %d loaded. I am going to unload it.\n"), loaded);
1176 Pmsg0(-1, _("Nothing loaded in the drive. OK.\n"));
1178 Dmsg1(100, "Results from loaded query=%s\n", results);
1180 dcr->VolCatInfo.Slot = loaded;
1181 /* We are going to load a new tape, so close the device */
1183 Pmsg2(-1, _("3302 Issuing autochanger \"unload %d %d\" command.\n"),
1184 loaded, dev->drive_index);
1185 changer = edit_device_codes(dcr, changer,
1186 dcr->device->changer_command, "unload");
1187 status = run_program(changer, timeout, results);
1188 Pmsg2(-1, _("unload status=%s %d\n"), status==0?_("OK"):_("Bad"), status);
1191 Pmsg1(-1, _("3992 Bad autochanger command: %s\n"), changer);
1192 Pmsg2(-1, _("3992 result=\"%s\": ERR=%s\n"), results, be.strerror(status));
1201 dcr->VolCatInfo.Slot = slot;
1202 Pmsg2(-1, _("3303 Issuing autochanger \"load %d %d\" command.\n"),
1203 slot, dev->drive_index);
1204 changer = edit_device_codes(dcr, changer,
1205 dcr->device->changer_command, "load");
1206 Dmsg1(100, "Changer=%s\n", changer);
1208 status = run_program(changer, timeout, results);
1210 Pmsg2(-1, _("3303 Autochanger \"load %d %d\" status is OK.\n"),
1211 slot, dev->drive_index);
1214 Pmsg1(-1, _("3993 Bad autochanger command: %s\n"), changer);
1215 Pmsg2(-1, _("3993 result=\"%s\": ERR=%s\n"), results, be.strerror(status));
1219 if (!open_the_device()) {
1223 * Start with sleep_time 0 then increment by 30 seconds if we get
1226 bmicrosleep(sleep_time, 0);
1227 if (!dev->rewind(dcr) || !dev->weof(1)) {
1228 Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
1230 Pmsg0(-1, _("\nThe test failed, probably because you need to put\n"
1231 "a longer sleep time in the mtx-script in the load) case.\n"
1232 "Adding a 30 second sleep and trying again ...\n"));
1236 Pmsg1(0, _("Rewound %s\n"), dev->print_name());
1239 if (!dev->weof(1)) {
1240 Pmsg1(0, _("Bad status from weof. ERR=%s\n"), dev->bstrerror());
1243 Pmsg1(0, _("Wrote EOF to %s\n"), dev->print_name());
1247 Pmsg1(-1, _("\nThe test worked this time. Please add:\n\n"
1249 "to your mtx-changer script in the load) case.\n\n"),
1252 Pmsg0(-1, _("\nThe test autochanger worked!!\n\n"));
1255 free_pool_memory(changer);
1256 free_pool_memory(results);
1261 free_pool_memory(changer);
1262 free_pool_memory(results);
1263 Pmsg0(-1, _("You must correct this error or the Autochanger will not work.\n"));
1267 static void autochangercmd()
1274 * This test assumes that the append test has been done,
1275 * then it tests the fsf function.
1277 static int fsf_test()
1279 bool set_off = false;
1281 Pmsg0(-1, _("\n\n=== Forward space files test ===\n\n"
1282 "This test is essential to Bacula.\n\n"
1283 "I'm going to write five files then test forward spacing\n\n"));
1287 weofcmd(); /* end file 0 */
1290 weofcmd(); /* end file 1 */
1294 weofcmd(); /* end file 2 */
1297 weofcmd(); /* end file 3 */
1299 weofcmd(); /* end file 4 */
1300 if (dev_cap(dev, CAP_TWOEOF)) {
1306 Pmsg0(0, _("Now forward spacing 1 file.\n"));
1308 Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1311 Pmsg2(-1, _("We should be in file 1. I am at file %d. %s\n"),
1312 dev->file, dev->file == 1 ? _("This is correct!") : _("This is NOT correct!!!!"));
1314 if (dev->file != 1) {
1318 Pmsg0(0, _("Now forward spacing 2 files.\n"));
1320 Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1323 Pmsg2(-1, _("We should be in file 3. I am at file %d. %s\n"),
1324 dev->file, dev->file == 3 ? _("This is correct!") : _("This is NOT correct!!!!"));
1326 if (dev->file != 3) {
1331 Pmsg0(0, _("Now forward spacing 4 files.\n"));
1333 Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1336 Pmsg2(-1, _("We should be in file 4. I am at file %d. %s\n"),
1337 dev->file, dev->file == 4 ? _("This is correct!") : _("This is NOT correct!!!!"));
1339 if (dev->file != 4) {
1343 Pmsg0(-1, _("The test worked this time. Please add:\n\n"
1344 " Fast Forward Space File = no\n\n"
1345 "to your Device resource for this drive.\n"));
1349 Pmsg0(0, _("Now forward spacing 1 more file.\n"));
1351 Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1353 Pmsg2(-1, _("We should be in file 5. I am at file %d. %s\n"),
1354 dev->file, dev->file == 5 ? _("This is correct!") : _("This is NOT correct!!!!"));
1355 if (dev->file != 5) {
1358 Pmsg0(-1, _("\n=== End Forward space files test ===\n\n"));
1362 Pmsg0(-1, _("\nThe forward space file test failed.\n"));
1363 if (dev_cap(dev, CAP_FASTFSF)) {
1364 Pmsg0(-1, _("You have Fast Forward Space File enabled.\n"
1365 "I am turning it off then retrying the test.\n"));
1366 dev->capabilities &= ~CAP_FASTFSF;
1370 Pmsg0(-1, _("You must correct this error or Bacula will not work.\n"
1371 "Some systems, e.g. OpenBSD, require you to set\n"
1372 " Use MTIOCGET= no\n"
1373 "in your device resource. Use with caution.\n"));
1382 * This is a general test of Bacula's functions
1383 * needed to read and write the tape.
1385 static void testcmd()
1389 if (!write_read_test()) {
1392 if (!position_test()) {
1396 stat = append_test();
1397 if (stat == 1) { /* OK get out */
1400 if (stat == -1) { /* first test failed */
1401 if (dev_cap(dev, CAP_EOM) || dev_cap(dev, CAP_FASTFSF)) {
1402 Pmsg0(-1, _("\nAppend test failed. Attempting again.\n"
1403 "Setting \"Hardware End of Medium = no\n"
1404 " and \"Fast Forward Space File = no\n"
1405 "and retrying append test.\n\n"));
1406 dev->capabilities &= ~CAP_EOM; /* turn off eom */
1407 dev->capabilities &= ~CAP_FASTFSF; /* turn off fast fsf */
1408 stat = append_test();
1410 Pmsg0(-1, _("\n\nIt looks like the test worked this time, please add:\n\n"
1411 " Hardware End of Medium = No\n\n"
1412 " Fast Forward Space File = No\n"
1413 "to your Device resource in the Storage conf file.\n"));
1417 Pmsg0(-1, _("\n\nThat appears *NOT* to have corrected the problem.\n"));
1420 /* Wrong count after append */
1422 Pmsg0(-1, _("\n\nIt looks like the append failed. Attempting again.\n"
1423 "Setting \"BSF at EOM = yes\" and retrying append test.\n"));
1424 dev->capabilities |= CAP_BSFATEOM; /* backspace on eom */
1425 stat = append_test();
1427 Pmsg0(-1, _("\n\nIt looks like the test worked this time, please add:\n\n"
1428 " Hardware End of Medium = No\n"
1429 " Fast Forward Space File = No\n"
1430 " BSF at EOM = yes\n\n"
1431 "to your Device resource in the Storage conf file.\n"));
1438 Pmsg0(-1, _("\nAppend test failed.\n\n"
1439 "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
1440 "Unable to correct the problem. You MUST fix this\n"
1441 "problem before Bacula can use your tape drive correctly\n"
1442 "\nPerhaps running Bacula in fixed block mode will work.\n"
1443 "Do so by setting:\n\n"
1444 "Minimum Block Size = nnn\n"
1445 "Maximum Block Size = nnn\n\n"
1446 "in your Storage daemon's Device definition.\n"
1447 "nnn must match your tape driver's block size, which\n"
1448 "can be determined by reading your tape manufacturers\n"
1449 "information, and the information on your kernel dirver.\n"
1450 "Fixed block sizes, however, are not normally an ideal solution.\n"
1452 "Some systems, e.g. OpenBSD, require you to set\n"
1453 " Use MTIOCGET= no\n"
1454 "in your device resource. Use with caution.\n"));
1459 Pmsg0(-1, _("\nThe above Bacula scan should have output identical to what follows.\n"
1460 "Please double check it ...\n"
1461 "=== Sample correct output ===\n"
1462 "1 block of 64448 bytes in file 1\n"
1463 "End of File mark.\n"
1464 "2 blocks of 64448 bytes in file 2\n"
1465 "End of File mark.\n"
1466 "3 blocks of 64448 bytes in file 3\n"
1467 "End of File mark.\n"
1468 "1 block of 64448 bytes in file 4\n"
1469 "End of File mark.\n"
1470 "Total files=4, blocks=7, bytes = 451,136\n"
1471 "=== End sample correct output ===\n\n"
1472 "If the above scan output is not identical to the\n"
1473 "sample output, you MUST correct the problem\n"
1474 "or Bacula will not be able to write multiple Jobs to \n"
1478 re_read_block_test();
1481 fsf_test(); /* do fast forward space file test */
1483 autochanger_test(); /* do autochanger test */
1487 /* Forward space a file */
1488 static void fsfcmd()
1492 num = atoi(argk[1]);
1497 if (!dev->fsf(num)) {
1498 Pmsg1(0, _("Bad status from fsf. ERR=%s\n"), dev->bstrerror());
1502 Pmsg0(0, _("Forward spaced 1 file.\n"));
1505 Pmsg1(0, _("Forward spaced %d files.\n"), num);
1509 /* Forward space a record */
1510 static void fsrcmd()
1514 num = atoi(argk[1]);
1519 if (!dev->fsr(num)) {
1520 Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1524 Pmsg0(0, _("Forward spaced 1 record.\n"));
1527 Pmsg1(0, _("Forward spaced %d records.\n"), num);
1532 * Read a Bacula block from the tape
1536 dev->open(dcr, OPEN_READ_ONLY);
1537 read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK);
1541 * Write a Bacula block to the tape
1545 DEV_BLOCK *block = dcr->block;
1546 DEV_RECORD *rec = dcr->rec;
1549 if (!dev->is_open()) {
1552 sm_check(__FILE__, __LINE__, false);
1555 dump_block(block, "test");
1558 i = block->buf_len - 100;
1560 rec->data = check_pool_memory_size(rec->data, i);
1561 memset(rec->data, i & 0xFF, i);
1563 sm_check(__FILE__, __LINE__, false);
1564 if (!write_record_to_block(block, rec)) {
1565 Pmsg0(0, _("Error writing record to block.\n"));
1568 if (!write_block_to_dev(dcr)) {
1569 Pmsg0(0, _("Error writing block to device.\n"));
1572 Pmsg1(0, _("Wrote one record of %d bytes.\n"), i);
1574 Pmsg0(0, _("Wrote block to device.\n"));
1577 sm_check(__FILE__, __LINE__, false);
1578 sm_check(__FILE__, __LINE__, false);
1582 * Read a record from the tape
1589 if (!get_cmd(_("Enter length to read: "))) {
1593 if (len < 0 || len > 1000000) {
1594 Pmsg0(0, _("Bad length entered, using default of 1024 bytes.\n"));
1597 buf = (char *)malloc(len);
1598 stat = read(dev->fd, buf, len);
1599 if (stat > 0 && stat <= len) {
1603 Pmsg3(0, _("Read of %d bytes gives stat=%d. ERR=%s\n"),
1604 len, stat, be.strerror());
1610 * Scan tape by reading block by block. Report what is
1611 * on the tape. Note, this command does raw reads, and as such
1612 * will not work with fixed block size devices.
1614 static void scancmd()
1617 int blocks, tot_blocks, tot_files;
1623 blocks = block_size = tot_blocks = 0;
1625 if (dev->state & ST_EOT) {
1626 Pmsg0(0, _("End of tape\n"));
1629 dev->update_pos(dcr);
1630 tot_files = dev->file;
1631 Pmsg1(0, _("Starting scan at file %u\n"), dev->file);
1633 if ((stat = read(dev->fd, buf, sizeof(buf))) < 0) {
1636 Mmsg2(dev->errmsg, _("read error on %s. ERR=%s.\n"),
1637 dev->dev_name, be.strerror());
1638 Pmsg2(0, _("Bad status from read %d. ERR=%s\n"), stat, dev->bstrerror());
1641 printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1644 printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1649 Dmsg1(200, "read status = %d\n", stat);
1651 if (stat != block_size) {
1652 dev->update_pos(dcr);
1655 printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1658 printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1664 if (stat == 0) { /* EOF */
1665 dev->update_pos(dcr);
1666 printf(_("End of File mark.\n"));
1667 /* Two reads of zero means end of tape */
1668 if (dev->state & ST_EOF)
1669 dev->state |= ST_EOT;
1671 dev->state |= ST_EOF;
1674 if (dev->state & ST_EOT) {
1675 printf(_("End of tape\n"));
1678 } else { /* Got data */
1679 dev->state &= ~ST_EOF;
1685 dev->update_pos(dcr);
1686 tot_files = dev->file - tot_files;
1687 printf(_("Total files=%d, blocks=%d, bytes = %s\n"), tot_files, tot_blocks,
1688 edit_uint64_with_commas(bytes, ec1));
1693 * Scan tape by reading Bacula block by block. Report what is
1694 * on the tape. This function reads Bacula blocks, so if your
1695 * Device resource is correctly defined, it should work with
1696 * either variable or fixed block sizes.
1698 static void scan_blocks()
1700 int blocks, tot_blocks, tot_files;
1701 uint32_t block_size;
1703 DEV_BLOCK *block = dcr->block;
1705 char buf1[100], buf2[100];
1707 blocks = block_size = tot_blocks = 0;
1711 dev->update_pos(dcr);
1712 tot_files = dev->file;
1714 if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
1715 Dmsg1(100, "!read_block(): ERR=%s\n", dev->bstrerror());
1716 if (dev->state & ST_EOT) {
1719 printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1722 printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1728 if (dev->state & ST_EOF) {
1731 printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1734 printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1738 printf(_("End of File mark.\n"));
1741 if (dev->state & ST_SHORT) {
1744 printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1747 printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1751 printf(_("Short block read.\n"));
1754 printf(_("Error reading block. ERR=%s\n"), dev->bstrerror());
1757 if (block->block_len != block_size) {
1760 printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1763 printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1767 block_size = block->block_len;
1771 bytes += block->block_len;
1772 Dmsg6(100, "Blk_blk=%u dev_blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
1773 block->BlockNumber, dev->block_num, block->block_len, block->BlockVer,
1774 block->VolSessionId, block->VolSessionTime);
1776 DEV_RECORD *rec = new_record();
1777 read_record_from_block(block, rec);
1778 Pmsg8(-1, _("Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n"),
1779 block->BlockNumber, dev->block_num, block->block_len,
1780 FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, rec->VolSessionTime,
1781 stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len);
1784 } else if (verbose > 1) {
1785 dump_block(block, "");
1790 tot_files = dev->file - tot_files;
1791 printf(_("Total files=%d, blocks=%d, bytes = %s\n"), tot_files, tot_blocks,
1792 edit_uint64_with_commas(bytes, ec1));
1796 static void statcmd()
1798 int debug = debug_level;
1800 Pmsg2(0, _("Device status: %u. ERR=%s\n"), status_dev(dev), dev->bstrerror());
1802 dump_volume_label(dev);
1804 debug_level = debug;
1809 * First we label the tape, then we fill
1810 * it with data get a new tape and write a few blocks.
1812 static void fillcmd()
1815 DEV_BLOCK *block = dcr->block;
1817 char buf1[100], buf2[100];
1820 uint32_t min_block_size;
1831 "This command simulates Bacula writing to a tape.\n"
1832 "It requires either one or two blank tapes, which it\n"
1833 "will label and write.\n\n"
1834 "If you have an autochanger configured, it will use\n"
1835 "the tapes that are in slots 1 and 2, otherwise, you will\n"
1836 "be prompted to insert the tapes when necessary.\n\n"
1837 "It will print a status approximately\n"
1838 "every 322 MB, and write an EOF every 3.2 GB. If you have\n"
1839 "selected the simple test option, after writing the first tape\n"
1840 "it will rewind it and re-read the last block written.\n\n"
1841 "If you have selected the multiple tape test, when the first tape\n"
1842 "fills, it will ask for a second, and after writing a few more \n"
1843 "blocks, it will stop. Then it will begin re-reading the\n"
1845 "This may take a long time -- hours! ...\n\n"));
1847 get_cmd(_("Do you want to run the simplified test (s) with one tape\n"
1848 "or the complete multiple tape (m) test: (s/m) "));
1849 if (cmd[0] == 's') {
1850 Pmsg0(-1, _("Simple test (single tape) selected.\n"));
1852 } else if (cmd[0] == 'm') {
1853 Pmsg0(-1, _("Multiple tape test selected.\n"));
1856 Pmsg0(000, _("Command aborted.\n"));
1860 Dmsg1(20, "Begin append device=%s\n", dev->print_name());
1861 Dmsg1(20, "MaxVolSize=%s\n", edit_uint64(dev->max_volume_size, ec1));
1863 /* Use fixed block size to simplify read back */
1864 min_block_size = dev->min_block_size;
1865 dev->min_block_size = dev->max_block_size;
1866 set_volume_name("TestVolume1", 1);
1867 dir_ask_sysop_to_create_appendable_volume(dcr);
1868 dev->set_append(); /* force volume to be relabeled */
1871 * Acquire output device for writing. Note, after acquiring a
1872 * device, we MUST release it, which is done at the end of this
1875 Dmsg0(100, "just before acquire_device\n");
1876 if (!acquire_device_for_append(dcr)) {
1877 set_jcr_job_status(jcr, JS_ErrorTerminated);
1880 block = jcr->dcr->block;
1882 Dmsg0(100, "Just after acquire_device_for_append\n");
1884 * Write Begin Session Record
1886 if (!write_session_label(dcr, SOS_LABEL)) {
1887 set_jcr_job_status(jcr, JS_ErrorTerminated);
1888 Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"),
1892 Pmsg0(-1, _("Wrote Start of Session label.\n"));
1894 memset(&rec, 0, sizeof(rec));
1895 rec.data = get_memory(100000); /* max record size */
1897 #define REC_SIZE 32768
1898 rec.data_len = REC_SIZE;
1901 * Put some random data in the record
1903 fd = open("/dev/urandom", O_RDONLY);
1905 read(fd, rec.data, rec.data_len);
1908 uint32_t *p = (uint32_t *)rec.data;
1909 srandom(time(NULL));
1910 for (i=0; i<rec.data_len/sizeof(uint32_t); i++) {
1916 * Generate data as if from File daemon, write to device
1918 jcr->dcr->VolFirstIndex = 0;
1919 time(&jcr->run_time); /* start counting time for rates */
1920 (void)localtime_r(&jcr->run_time, &tm);
1921 strftime(buf1, sizeof(buf1), "%H:%M:%S", &tm);
1923 Pmsg1(-1, _("%s Begin writing Bacula records to tape ...\n"), buf1);
1925 Pmsg1(-1, _("%s Begin writing Bacula records to first tape ...\n"), buf1);
1927 for (file_index = 0; ok && !job_canceled(jcr); ) {
1928 rec.VolSessionId = jcr->VolSessionId;
1929 rec.VolSessionTime = jcr->VolSessionTime;
1930 rec.FileIndex = ++file_index;
1931 rec.Stream = STREAM_FILE_DATA;
1933 /* Mix up the data just a bit */
1934 uint32_t *lp = (uint32_t *)rec.data;
1936 for (i=1; i < (rec.data_len-sizeof(uint32_t))/sizeof(uint32_t)-1; i++) {
1940 Dmsg4(250, "before write_rec FI=%d SessId=%d Strm=%s len=%d\n",
1941 rec.FileIndex, rec.VolSessionId,
1942 stream_to_ascii(buf1, rec.Stream, rec.FileIndex),
1945 while (!write_record_to_block(block, &rec)) {
1947 * When we get here we have just filled a block
1949 Dmsg2(150, "!write_record_to_block data_len=%d rem=%d\n", rec.data_len,
1952 /* Write block to tape */
1953 if (!flush_block(block, 1)) {
1957 /* Every 5000 blocks (approx 322MB) report where we are.
1959 if ((block->BlockNumber % 5000) == 0) {
1961 now -= jcr->run_time;
1963 now = 1; /* prevent divide error */
1965 kbs = (double)dev->VolCatInfo.VolCatBytes / (1000.0 * (double)now);
1966 Pmsg4(-1, _("Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"),
1967 block->BlockNumber, dev->block_num,
1968 edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, ec1), (float)kbs);
1970 /* Every 32000 blocks (approx 2GB) write an EOF.
1972 if ((block->BlockNumber % 32000) == 0) {
1974 (void)localtime_r(&now, &tm);
1975 strftime(buf1, sizeof(buf1), "%H:%M:%S", &tm);
1976 Pmsg1(-1, _("%s Flush block, write EOF\n"), buf1);
1977 flush_block(block, 0);
1981 /* Get out after writing 10 blocks to the second tape */
1982 if (++BlockNumber > 10 && stop != 0) { /* get out */
1987 Pmsg0(000, _("Not OK\n"));
1990 jcr->JobBytes += rec.data_len; /* increment bytes this job */
1991 Dmsg4(190, "write_record FI=%s SessId=%d Strm=%s len=%d\n",
1992 FI_to_ascii(buf1, rec.FileIndex), rec.VolSessionId,
1993 stream_to_ascii(buf2, rec.Stream, rec.FileIndex), rec.data_len);
1995 /* Get out after writing 10 blocks to the second tape */
1996 if (BlockNumber > 10 && stop != 0) { /* get out */
1998 Pmsg1(-1, "Done writing %s records ...\n",
1999 edit_uint64_with_commas(write_count, ed1));
2004 Dmsg0(100, "Write_end_session_label()\n");
2005 /* Create Job status for end of session label */
2006 if (!job_canceled(jcr) && ok) {
2007 set_jcr_job_status(jcr, JS_Terminated);
2009 set_jcr_job_status(jcr, JS_ErrorTerminated);
2011 if (!write_session_label(dcr, EOS_LABEL)) {
2012 Pmsg1(000, _("Error writting end session label. ERR=%s\n"), dev->bstrerror());
2015 /* Write out final block of this session */
2016 if (!write_block_to_device(dcr)) {
2017 Pmsg0(-1, _("Set ok=false after write_block_to_device.\n"));
2020 Pmsg0(-1, _("Wrote End of Session label.\n"));
2022 /* Save last block info for second tape */
2023 last_block_num2 = last_block_num;
2024 last_file2 = last_file;
2026 free_block(last_block2);
2028 last_block2 = dup_block(last_block);
2031 sprintf(buf, "%s/btape.state", working_directory);
2032 fd = open(buf, O_CREAT|O_TRUNC|O_WRONLY, 0640);
2034 write(fd, &btape_state_level, sizeof(btape_state_level));
2035 write(fd, &simple, sizeof(simple));
2036 write(fd, &last_block_num1, sizeof(last_block_num1));
2037 write(fd, &last_block_num2, sizeof(last_block_num2));
2038 write(fd, &last_file1, sizeof(last_file1));
2039 write(fd, &last_file2, sizeof(last_file2));
2040 write(fd, last_block1->buf, last_block1->buf_len);
2041 write(fd, last_block2->buf, last_block2->buf_len);
2042 write(fd, first_block->buf, first_block->buf_len);
2044 Pmsg2(-1, _("Wrote state file last_block_num1=%d last_block_num2=%d\n"),
2045 last_block_num1, last_block_num2);
2048 Pmsg2(-1, _("Could not create state file: %s ERR=%s\n"), buf,
2053 (void)localtime_r(&now, &tm);
2054 strftime(buf1, sizeof(buf1), "%H:%M:%S", &tm);
2056 Pmsg3(-1, _("\n\n%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"),
2057 buf1, jcr->dcr->dev->file, jcr->dcr->dev->block_num);
2060 Pmsg3(-1, _("\n\n%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"),
2061 buf1, jcr->dcr->dev->file, jcr->dcr->dev->block_num);
2064 jcr->dcr->block = block;
2067 dev->min_block_size = min_block_size;
2068 free_memory(rec.data);
2072 * Read two tapes written by the "fill" command and ensure
2073 * that the data is valid. If stop==1 we simulate full read back
2074 * of two tapes. If stop==-1 we simply read the last block and
2075 * verify that it is correct.
2077 static void unfillcmd()
2081 last_block1 = new_block(dev);
2082 last_block2 = new_block(dev);
2083 first_block = new_block(dev);
2084 sprintf(buf, "%s/btape.state", working_directory);
2085 fd = open(buf, O_RDONLY);
2087 uint32_t state_level;
2088 read(fd, &state_level, sizeof(btape_state_level));
2089 read(fd, &simple, sizeof(simple));
2090 read(fd, &last_block_num1, sizeof(last_block_num1));
2091 read(fd, &last_block_num2, sizeof(last_block_num2));
2092 read(fd, &last_file1, sizeof(last_file1));
2093 read(fd, &last_file2, sizeof(last_file2));
2094 read(fd, last_block1->buf, last_block1->buf_len);
2095 read(fd, last_block2->buf, last_block2->buf_len);
2096 read(fd, first_block->buf, first_block->buf_len);
2098 if (state_level != btape_state_level) {
2099 Pmsg0(-1, _("\nThe state file level has changed. You must redo\n"
2100 "the fill command.\n"));
2105 Pmsg2(-1, _("\nCould not find the state file: %s ERR=%s\n"
2106 "You must redo the fill command.\n"), buf, be.strerror());
2113 static void do_unfill()
2115 DEV_BLOCK *block = dcr->block;
2122 Dmsg0(20, "Enter do_unfill\n");
2123 dev->capabilities |= CAP_ANONVOLS; /* allow reading any volume */
2124 dev->capabilities &= ~CAP_LABEL; /* don't label anything here */
2128 time(&jcr->run_time); /* start counting time for rates */
2132 free_block(last_block);
2135 last_block_num = last_block_num1;
2136 last_file = last_file1;
2137 last_block = last_block1;
2139 free_restore_volume_list(jcr);
2141 bstrncpy(dcr->VolumeName, "TestVolume1|TestVolume2", sizeof(dcr->VolumeName));
2142 create_restore_volume_list(jcr);
2143 if (jcr->VolList != NULL) {
2144 jcr->VolList->Slot = 1;
2145 if (jcr->VolList->next != NULL) {
2146 jcr->VolList->next->Slot = 2;
2150 set_volume_name("TestVolume1", 1);
2153 /* Multiple Volume tape */
2154 /* Close device so user can use autochanger if desired */
2155 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
2158 autochanger = autoload_device(dcr, 1, NULL);
2159 if (autochanger != 1) {
2161 get_cmd(_("Mount first tape. Press enter when ready: "));
2166 dev->num_writers = 0;
2167 if (!acquire_device_for_read(dcr)) {
2168 Pmsg1(-1, "%s", dev->errmsg);
2172 * We now have the first tape mounted.
2173 * Note, re-reading last block may have caused us to
2174 * loose track of where we are (block number unknown).
2176 Pmsg0(-1, _("Rewinding.\n"));
2177 if (!dev->rewind(dcr)) { /* get to a known place on tape */
2180 /* Read the first 10000 records */
2181 Pmsg2(-1, _("Reading the first 10000 records from %u:%u.\n"),
2182 dev->file, dev->block_num);
2184 read_records(dcr, quickie_cb, my_mount_next_read_volume);
2185 Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
2186 last_file, last_block_num);
2187 if (!dev->reposition(dcr, last_file, last_block_num)) {
2188 Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
2191 Pmsg1(-1, _("Reading block %u.\n"), last_block_num);
2192 if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
2193 Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
2196 if (compare_blocks(last_block, block)) {
2198 Pmsg0(-1, _("\nThe last block on the tape matches. Test succeeded.\n\n"));
2200 Pmsg0(-1, _("\nThe last block of the first tape matches.\n\n"));
2207 /* restore info for last block on second Volume */
2208 last_block_num = last_block_num2;
2209 last_file = last_file2;
2210 last_block = last_block2;
2212 /* Multiple Volume tape */
2213 /* Close device so user can use autochanger if desired */
2214 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
2218 set_volume_name("TestVolume2", 2);
2220 autochanger = autoload_device(dcr, 1, NULL);
2221 if (autochanger != 1) {
2223 get_cmd(_("Mount second tape. Press enter when ready: "));
2227 if (!acquire_device_for_read(dcr)) {
2228 Pmsg1(-1, "%s", dev->errmsg);
2232 /* Space to "first" block which is last block not written
2233 * on the previous tape.
2235 Pmsg2(-1, _("Reposition from %u:%u to 0:1\n"), dev->file, dev->block_num);
2236 if (!dev->reposition(dcr, 0, 1)) {
2237 Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
2240 Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
2241 if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
2242 Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
2245 if (compare_blocks(first_block, block)) {
2246 Pmsg0(-1, _("\nThe first block on the second tape matches.\n\n"));
2249 /* Now find and compare the last block */
2250 Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
2251 last_file, last_block_num);
2252 if (!dev->reposition(dcr, last_file, last_block_num)) {
2253 Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
2256 Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
2257 if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
2258 Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
2261 if (compare_blocks(last_block, block)) {
2262 Pmsg0(-1, _("\nThe last block on the second tape matches. Test succeeded.\n\n"));
2266 free_block(last_block1);
2267 free_block(last_block2);
2268 free_block(first_block);
2271 /* Read 10000 records then stop */
2272 static bool quickie_cb(DCR *dcr, DEV_RECORD *rec)
2274 DEVICE *dev = dcr->dev;
2276 if (quickie_count == 10000) {
2277 Pmsg2(-1, _("10000 records read now at %d:%d\n"), dev->file, dev->block_num);
2279 return quickie_count < 10000;
2282 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block)
2285 uint32_t CheckSum, block_len;
2288 p = last_block->buf;
2290 unser_begin(q, BLKHDR2_LENGTH);
2291 unser_uint32(CheckSum);
2292 unser_uint32(block_len);
2293 while (q < (block->buf+block_len)) {
2300 dump_block(last_block, _("Last block written"));
2302 dump_block(block, _("Block read back"));
2303 Pmsg1(-1, _("\n\nThe blocks differ at byte %u\n"), p - last_block->buf);
2304 Pmsg0(-1, _("\n\n!!!! The last block written and the block\n"
2305 "that was read back differ. The test FAILED !!!!\n"
2306 "This must be corrected before you use Bacula\n"
2307 "to write multi-tape Volumes.!!!!\n"));
2311 dump_block(last_block, _("Last block written"));
2312 dump_block(block, _("Block read back"));
2322 * Write current block to tape regardless of whether or
2323 * not it is full. If the tape fills, attempt to
2324 * acquire another tape.
2326 static int flush_block(DEV_BLOCK *block, int dump)
2330 uint32_t this_file, this_block_num;
2334 this_block = new_block(dev);
2337 last_block = new_block(dev);
2340 this_file = dev->file;
2341 this_block_num = dev->block_num;
2342 if (!write_block_to_dev(dcr)) {
2343 Pmsg3(000, _("Last block at: %u:%u this_dev_block_num=%d\n"),
2344 last_file, last_block_num, this_block_num);
2347 * This is 1st tape, so save first tape info separate
2348 * from second tape info
2350 last_block_num1 = last_block_num;
2351 last_file1 = last_file;
2352 last_block1 = dup_block(last_block);
2353 last_block2 = dup_block(last_block);
2354 first_block = dup_block(block); /* first block second tape */
2357 Pmsg3(000, _("Block not written: FileIndex=%u blk_block=%u Size=%u\n"),
2358 (unsigned)file_index, block->BlockNumber, block->block_len);
2359 dump_block(last_block, _("Last block written"));
2361 dump_block(block, _("Block not written"));
2364 eot_block = block->BlockNumber;
2365 eot_block_len = block->block_len;
2366 eot_FileIndex = file_index;
2370 now -= jcr->run_time;
2372 now = 1; /* don't divide by zero */
2374 kbs = (double)dev->VolCatInfo.VolCatBytes / (1000 * now);
2375 vol_size = dev->VolCatInfo.VolCatBytes;
2376 Pmsg4(000, _("End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"),
2377 dev->file, dev->block_num,
2378 edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, ec1), kbs);
2381 stop = -1; /* stop, but do simplified test */
2383 /* Full test in progress */
2384 if (!fixup_device_block_write_error(jcr->dcr)) {
2385 Pmsg1(000, _("Cannot fixup device error. %s\n"), dev->bstrerror());
2390 BlockNumber = 0; /* start counting for second tape */
2393 return 1; /* end of tape reached */
2396 /* Save contents after write so that the header is serialized */
2397 memcpy(this_block->buf, block->buf, this_block->buf_len);
2400 * Note, we always read/write to block, but we toggle
2401 * copying it to one or another of two allocated blocks.
2402 * Switch blocks so that the block just successfully written is
2403 * always in last_block.
2405 tblock = last_block;
2406 last_block = this_block;
2407 this_block = tblock;
2408 last_file = this_file;
2409 last_block_num = this_block_num;
2417 * First we label the tape, then we fill
2418 * it with data get a new tape and write a few blocks.
2420 static void qfillcmd()
2422 DEV_BLOCK *block = dcr->block;
2423 DEV_RECORD *rec = dcr->rec;
2426 Pmsg0(0, _("Test writing blocks of 64512 bytes to tape.\n"));
2428 get_cmd(_("How many blocks do you want to write? (1000): "));
2435 sm_check(__FILE__, __LINE__, false);
2437 i = block->buf_len - 100;
2439 rec->data = check_pool_memory_size(rec->data, i);
2440 memset(rec->data, i & 0xFF, i);
2443 Pmsg1(0, _("Begin writing %d Bacula blocks to tape ...\n"), count);
2444 for (i=0; i < count; i++) {
2449 if (!write_record_to_block(block, rec)) {
2450 Pmsg0(0, _("Error writing record to block.\n"));
2453 if (!write_block_to_dev(dcr)) {
2454 Pmsg0(0, _("Error writing block to device.\n"));
2460 if (dev_cap(dev, CAP_TWOEOF)) {
2467 sm_check(__FILE__, __LINE__, false);
2471 * Fill a tape using raw write() command
2473 static void rawfill_cmd()
2475 DEV_BLOCK *block = dcr->block;
2478 uint32_t block_num = 0;
2483 fd = open("/dev/urandom", O_RDONLY);
2485 read(fd, block->buf, block->buf_len);
2488 uint32_t *p = (uint32_t *)block->buf;
2489 srandom(time(NULL));
2490 for (i=0; i<block->buf_len/sizeof(uint32_t); i++) {
2494 p = (uint32_t *)block->buf;
2495 Pmsg1(0, _("Begin writing raw blocks of %u bytes.\n"), block->buf_len);
2498 if (dev->is_tape()) {
2499 stat = tape_write(dev->fd, block->buf, block->buf_len);
2501 stat = write(dev->fd, block->buf, block->buf_len);
2503 if (stat == (int)block->buf_len) {
2504 if ((block_num++ % 100) == 0) {
2509 for (i=1; i<(block->buf_len-sizeof(uint32_t))/sizeof(uint32_t)-1; i++) {
2519 printf(_("Write failed at block %u. stat=%d ERR=%s\n"), block_num, stat,
2520 be.strerror(my_errno));
2526 * Fill a tape using Bacula block writes
2528 static void bfill_cmd()
2530 DEV_BLOCK *block = dcr->block;
2531 uint32_t block_num = 0;
2537 fd = open("/dev/urandom", O_RDONLY);
2539 read(fd, block->buf, block->buf_len);
2542 uint32_t *p = (uint32_t *)block->buf;
2543 srandom(time(NULL));
2544 for (i=0; i<block->buf_len/sizeof(uint32_t); i++) {
2548 p = (uint32_t *)block->buf;
2549 Pmsg1(0, _("Begin writing Bacula blocks of %u bytes.\n"), block->buf_len);
2552 block->binbuf = block->buf_len;
2553 block->bufp = block->buf + block->binbuf;
2554 if (!write_block_to_dev(dcr)) {
2557 if ((block_num++ % 100) == 0) {
2562 for (i=1; i<(block->buf_len/sizeof(uint32_t)-1); i++) {
2568 printf(_("Write failed at block %u.\n"), block_num);
2573 struct cmdstruct { const char *key; void (*func)(); const char *help; };
2574 static struct cmdstruct commands[] = {
2575 {NT_("autochanger"),autochangercmd, _("test autochanger")},
2576 {NT_("bsf"), bsfcmd, _("backspace file")},
2577 {NT_("bsr"), bsrcmd, _("backspace record")},
2578 {NT_("bfill"), bfill_cmd, _("fill tape using Bacula writes")},
2579 {NT_("cap"), capcmd, _("list device capabilities")},
2580 {NT_("clear"), clearcmd, _("clear tape errors")},
2581 {NT_("eod"), eodcmd, _("go to end of Bacula data for append")},
2582 {NT_("eom"), eomcmd, _("go to the physical end of medium")},
2583 {NT_("fill"), fillcmd, _("fill tape, write onto second volume")},
2584 {NT_("unfill"), unfillcmd, _("read filled tape")},
2585 {NT_("fsf"), fsfcmd, _("forward space a file")},
2586 {NT_("fsr"), fsrcmd, _("forward space a record")},
2587 {NT_("help"), helpcmd, _("print this command")},
2588 {NT_("label"), labelcmd, _("write a Bacula label to the tape")},
2589 {NT_("load"), loadcmd, _("load a tape")},
2590 {NT_("quit"), quitcmd, _("quit btape")},
2591 {NT_("rawfill"), rawfill_cmd, _("use write() to fill tape")},
2592 {NT_("readlabel"), readlabelcmd, _("read and print the Bacula tape label")},
2593 {NT_("rectest"), rectestcmd, _("test record handling functions")},
2594 {NT_("rewind"), rewindcmd, _("rewind the tape")},
2595 {NT_("scan"), scancmd, _("read() tape block by block to EOT and report")},
2596 {NT_("scanblocks"),scan_blocks, _("Bacula read block by block to EOT and report")},
2597 {NT_("status"), statcmd, _("print tape status")},
2598 {NT_("test"), testcmd, _("General test Bacula tape functions")},
2599 {NT_("weof"), weofcmd, _("write an EOF on the tape")},
2600 {NT_("wr"), wrcmd, _("write a single Bacula block")},
2601 {NT_("rr"), rrcmd, _("read a single record")},
2602 {NT_("rb"), rbcmd, _("read a single Bacula block")},
2603 {NT_("qfill"), qfillcmd, _("quick fill command")}
2605 #define comsize (sizeof(commands)/sizeof(struct cmdstruct))
2613 while (!quit && get_cmd("*")) {
2614 sm_check(__FILE__, __LINE__, false);
2616 parse_args(cmd, &args, &argc, argk, argv, MAX_CMD_ARGS);
2617 for (i=0; i<comsize; i++) /* search for command */
2618 if (argc > 0 && fstrsch(argk[0], commands[i].key)) {
2619 (*commands[i].func)(); /* go execute command */
2624 Pmsg1(0, _("\"%s\" is an illegal command\n"), cmd);
2629 static void helpcmd()
2633 printf(_("Interactive commands:\n"));
2634 printf(_(" Command Description\n ======= ===========\n"));
2635 for (i=0; i<comsize; i++)
2636 printf(" %-10s %s\n", commands[i].key, commands[i].help);
2644 "\nVersion: %s (%s)\n\n"
2645 "Usage: btape <options> <device_name>\n"
2646 " -b <file> specify bootstrap file\n"
2647 " -c <file> set configuration file to file\n"
2648 " -d <nn> set debug level to nn\n"
2649 " -p proceed inspite of I/O errors\n"
2650 " -s turn off signals\n"
2652 " -? print this message.\n"
2653 "\n"), BYEAR, VERSION, BDATE);
2658 * Get next input command from terminal. This
2659 * routine is REALLY primitive, and should be enhanced
2660 * to have correct backspacing, etc.
2663 get_cmd(const char *prompt)
2667 fprintf(stdout, prompt);
2669 /* We really should turn off echoing and pretty this
2673 while ((ch = fgetc(stdin)) != EOF) {
2675 strip_trailing_junk(cmd);
2677 } else if (ch == 4 || ch == 0xd3 || ch == 0x8) {
2690 /* Dummies to replace askdir.c */
2691 bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;}
2692 bool dir_send_job_status(JCR *jcr) {return 1;}
2694 bool dir_update_volume_info(DCR *dcr, bool relabel)
2700 bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing)
2702 Dmsg0(20, "Enter dir_get_volume_info\n");
2703 bstrncpy(dcr->VolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
2707 bool dir_create_jobmedia_record(DCR *dcr)
2709 dcr->WroteVol = false;
2714 bool dir_find_next_appendable_volume(DCR *dcr)
2716 Dmsg1(20, "Enter dir_find_next_appendable_volume. stop=%d\n", stop);
2717 return dcr->VolumeName[0] != 0;
2720 bool dir_ask_sysop_to_mount_volume(DCR *dcr)
2722 DEVICE *dev = dcr->dev;
2723 Dmsg0(20, "Enter dir_ask_sysop_to_mount_volume\n");
2724 if (dcr->VolumeName[0] == 0) {
2725 return dir_ask_sysop_to_create_appendable_volume(dcr);
2727 Pmsg1(-1, "%s", dev->errmsg); /* print reason */
2728 if (dcr->VolumeName[0] == 0 || strcmp(dcr->VolumeName, "TestVolume2") == 0) {
2729 fprintf(stderr, _("Mount second Volume on device %s and press return when ready: "),
2732 fprintf(stderr, _("Mount Volume \"%s\" on device %s and press return when ready: "),
2733 dcr->VolumeName, dev->print_name());
2740 bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr)
2743 DEVICE *dev = dcr->dev;
2744 Dmsg0(20, "Enter dir_ask_sysop_to_create_appendable_volume\n");
2746 set_volume_name("TestVolume1", 1);
2748 set_volume_name("TestVolume2", 2);
2750 /* Close device so user can use autochanger if desired */
2751 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
2754 autochanger = autoload_device(dcr, 1, NULL);
2755 if (autochanger != 1) {
2756 fprintf(stderr, _("Mount blank Volume on device %s and press return when ready: "),
2767 static bool my_mount_next_read_volume(DCR *dcr)
2770 JCR *jcr = dcr->jcr;
2771 DEV_BLOCK *block = dcr->block;
2773 Dmsg0(20, "Enter my_mount_next_read_volume\n");
2774 Pmsg2(000, _("End of Volume \"%s\" %d records.\n"), dcr->VolumeName,
2777 if (LastBlock != block->BlockNumber) {
2778 VolBytes += block->block_len;
2780 LastBlock = block->BlockNumber;
2782 now -= jcr->run_time;
2786 kbs = (double)VolBytes / (1000.0 * (double)now);
2787 Pmsg3(-1, _("Read block=%u, VolBytes=%s rate=%.1f KB/s\n"), block->BlockNumber,
2788 edit_uint64_with_commas(VolBytes, ec1), (float)kbs);
2790 if (strcmp(dcr->VolumeName, "TestVolume2") == 0) {
2795 set_volume_name("TestVolume2", 2);
2798 if (!acquire_device_for_read(dcr)) {
2799 Pmsg2(0, _("Cannot open Dev=%s, Vol=%s\n"), dev->print_name(), dcr->VolumeName);
2802 return true; /* next volume mounted */
2805 static void set_volume_name(const char *VolName, int volnum)
2807 DCR *dcr = jcr->dcr;
2808 VolumeName = VolName;
2810 bstrncpy(dev->VolCatInfo.VolCatName, VolName, sizeof(dev->VolCatInfo.VolCatName));
2811 bstrncpy(dcr->VolCatInfo.VolCatName, VolName, sizeof(dcr->VolCatInfo.VolCatName));
2812 bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
2813 dcr->VolCatInfo.Slot = volnum;
2814 dcr->VolCatInfo.InChanger = true;