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 Copyright (C) 2000-2004 Kern Sibbald and John Walker
19 This program is free software; you can redistribute it and/or
20 modify it under the terms of the GNU General Public License as
21 published by the Free Software Foundation; either version 2 of
22 the License, or (at your option) any later version.
24 This program is distributed in the hope that it will be useful,
25 but WITHOUT ANY WARRANTY; without even the implied warranty of
26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27 General Public License for more details.
29 You should have received a copy of the GNU General Public
30 License along with this program; if not, write to the Free
31 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
40 /* External subroutines */
41 extern void free_config_resources();
42 extern char *edit_device_codes(JCR *jcr, char *omsg, const char *imsg, const char *cmd);
44 /* Exported variables */
47 int bsize = TAPE_BSIZE;
48 char VolName[MAX_NAME_LENGTH];
49 bool forge_on = false;
52 * If you change the format of the state file,
53 * increment this value
55 static uint32_t btape_state_level = 2;
59 DEVRES *device = NULL;
62 /* Forward referenced subroutines */
63 static void do_tape_cmds();
64 static void helpcmd();
65 static void scancmd();
66 static void rewindcmd();
67 static void clearcmd();
71 static void fillcmd();
72 static void qfillcmd();
73 static void statcmd();
74 static void unfillcmd();
75 static int flush_block(DEV_BLOCK *block, int dump);
76 static bool quickie_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec);
77 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block);
78 static bool my_mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block);
79 static void scan_blocks();
80 static void set_volume_name(const char *VolName, int volnum);
81 static void rawfill_cmd();
82 static void bfill_cmd();
83 static bool open_the_device();
84 static void autochangercmd();
85 static void do_unfill();
88 /* Static variables */
89 #define CONFIG_FILE "bacula-sd.conf"
92 #define MAX_CMD_ARGS 30
95 static char *argk[MAX_CMD_ARGS];
96 static char *argv[MAX_CMD_ARGS];
99 static int quickie_count = 0;
100 static BSR *bsr = NULL;
101 static int signals = TRUE;
104 static uint64_t vol_size;
105 static uint64_t VolBytes;
108 static int32_t file_index;
109 static int end_of_tape = 0;
110 static uint32_t LastBlock = 0;
111 static uint32_t eot_block;
112 static uint32_t eot_block_len;
113 static uint32_t eot_FileIndex;
114 static int dumped = 0;
115 static DEV_BLOCK *last_block1 = NULL;
116 static DEV_BLOCK *last_block2 = NULL;
117 static DEV_BLOCK *last_block = NULL;
118 static DEV_BLOCK *this_block = NULL;
119 static DEV_BLOCK *first_block = NULL;
120 static uint32_t last_file1 = 0;
121 static uint32_t last_file2 = 0;
122 static uint32_t last_file = 0;
123 static uint32_t last_block_num1 = 0;
124 static uint32_t last_block_num2 = 0;
125 static uint32_t last_block_num = 0;
126 static uint32_t BlockNumber = 0;
127 static bool simple = true;
129 static const char *VolumeName = NULL;
130 static int vol_num = 0;
132 static JCR *jcr = NULL;
136 static void terminate_btape(int sig);
137 int get_cmd(const char *prompt);
140 /*********************************************************************
142 * Main Bacula Pool Creation Program
145 int main(int margc, char *margv[])
150 if (TAPE_BSIZE % DEV_BSIZE != 0 || TAPE_BSIZE / DEV_BSIZE == 0) {
151 Emsg2(M_ABORT, 0, "Tape block size (%d) not multiple of system size (%d)\n",
152 TAPE_BSIZE, DEV_BSIZE);
154 if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) {
155 Emsg1(M_ABORT, 0, "Tape block size (%d) is not a power of 2\n", TAPE_BSIZE);
158 printf("Tape block granularity is %d bytes.\n", TAPE_BSIZE);
160 working_directory = "/tmp";
161 my_name_is(margc, margv, "btape");
162 init_msg(NULL, NULL);
164 while ((ch = getopt(margc, margv, "b:c:d:psv?")) != -1) {
166 case 'b': /* bootstrap file */
167 bsr = parse_bsr(NULL, optarg);
168 // dump_bsr(bsr, true);
171 case 'c': /* specify config file */
172 if (configfile != NULL) {
175 configfile = bstrdup(optarg);
178 case 'd': /* set debug level */
179 debug_level = atoi(optarg);
180 if (debug_level <= 0) {
207 cmd = get_pool_memory(PM_FNAME);
208 args = get_pool_memory(PM_FNAME);
211 init_signals(terminate_btape);
214 if (configfile == NULL) {
215 configfile = bstrdup(CONFIG_FILE);
218 daemon_start_time = time(NULL);
220 parse_config(configfile);
223 /* See if we can open a device */
225 Pmsg0(000, "No archive name specified.\n");
228 } else if (margc != 1) {
229 Pmsg0(000, "Improper number of arguments specified.\n");
234 jcr = setup_jcr("btape", margv[0], bsr, NULL);
235 dev = setup_to_access_device(jcr, 0); /* acquire for write */
240 if (!open_the_device()) {
244 Dmsg0(200, "Do tape commands\n");
252 static void terminate_btape(int stat)
255 sm_check(__FILE__, __LINE__, false);
259 free_config_resources();
261 free_pool_memory(args);
265 free_pool_memory(cmd);
280 if (debug_level > 10)
281 print_memory_pool_stats();
284 free_block(this_block);
288 close_memory_pool(); /* free memory in pool */
294 static bool open_the_device()
298 block = new_block(dev);
300 if (!(dev->state & ST_OPENED)) {
301 Dmsg1(200, "Opening device %s\n", jcr->VolumeName);
302 if (open_dev(dev, jcr->VolumeName, OPEN_READ_WRITE) < 0) {
303 Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), dev->errmsg);
309 Pmsg1(000, "open_dev %s OK\n", dev_name(dev));
322 * Write a label to the tape
324 static void labelcmd()
327 pm_strcpy(&cmd, VolumeName);
329 if (!get_cmd("Enter Volume Name: ")) {
334 if (!(dev->state & ST_OPENED)) {
335 if (!first_open_device(dev)) {
336 Pmsg1(0, "Device open failed. ERR=%s\n", strerror_dev(dev));
340 write_new_volume_label_to_dev(dcr, cmd, "Default");
341 Pmsg1(-1, "Wrote Volume label for volume \"%s\".\n", cmd);
345 * Read the tape label
347 static void readlabelcmd()
349 int save_debug_level = debug_level;
353 block = new_block(dev);
354 stat = read_dev_volume_label(dcr, block);
357 Pmsg0(0, "Volume has no label.\n");
360 Pmsg0(0, "Volume label read correctly.\n");
363 Pmsg1(0, "I/O error on device: ERR=%s", strerror_dev(dev));
366 Pmsg0(0, "Volume name error\n");
368 case VOL_CREATE_ERROR:
369 Pmsg1(0, "Error creating label. ERR=%s", strerror_dev(dev));
371 case VOL_VERSION_ERROR:
372 Pmsg0(0, "Volume version error.\n");
374 case VOL_LABEL_ERROR:
375 Pmsg0(0, "Bad Volume label type.\n");
378 Pmsg0(0, "Unknown error.\n");
383 dump_volume_label(dev);
384 debug_level = save_debug_level;
390 * Load the tape should have prevously been taken
391 * off line, otherwise this command is not necessary.
393 static void loadcmd()
396 if (!load_dev(dev)) {
397 Pmsg1(0, "Bad status from load. ERR=%s\n", strerror_dev(dev));
399 Pmsg1(0, "Loaded %s\n", dev_name(dev));
405 static void rewindcmd()
407 if (!rewind_dev(dev)) {
408 Pmsg1(0, "Bad status from rewind. ERR=%s\n", strerror_dev(dev));
409 clrerror_dev(dev, -1);
411 Pmsg1(0, "Rewound %s\n", dev_name(dev));
416 * Clear any tape error
418 static void clearcmd()
420 clrerror_dev(dev, -1);
424 * Write and end of file on the tape
426 static void weofcmd()
437 if ((stat = weof_dev(dev, num)) < 0) {
438 Pmsg2(0, "Bad status from weof %d. ERR=%s\n", stat, strerror_dev(dev));
441 Pmsg3(0, "Wrote %d EOF%s to %s\n", num, num==1?"":"s", dev_name(dev));
446 /* Go to the end of the medium -- raw command
447 * The idea was orginally that the end of the Bacula
448 * medium would be flagged differently. This is not
449 * currently the case. So, this is identical to the
455 Pmsg1(0, "%s", strerror_dev(dev));
458 Pmsg0(0, _("Moved to end of medium.\n"));
463 * Go to the end of the medium (either hardware determined
464 * or defined by two eofs.
484 if (!bsf_dev(dev, num)) {
485 Pmsg1(0, _("Bad status from bsf. ERR=%s\n"), strerror_dev(dev));
487 Pmsg2(0, _("Backspaced %d file%s.\n"), num, num==1?"":"s");
503 if (!bsr_dev(dev, num)) {
504 Pmsg1(0, _("Bad status from bsr. ERR=%s\n"), strerror_dev(dev));
506 Pmsg2(0, _("Backspaced %d record%s.\n"), num, num==1?"":"s");
511 * List device capabilities as defined in the
516 printf(_("Configured device capabilities:\n"));
517 printf("%sEOF ", dev->capabilities & CAP_EOF ? "" : "!");
518 printf("%sBSR ", dev->capabilities & CAP_BSR ? "" : "!");
519 printf("%sBSF ", dev->capabilities & CAP_BSF ? "" : "!");
520 printf("%sFSR ", dev->capabilities & CAP_FSR ? "" : "!");
521 printf("%sFSF ", dev->capabilities & CAP_FSF ? "" : "!");
522 printf("%sFASTFSF ", dev->capabilities & CAP_FASTFSF ? "" : "!");
523 printf("%sEOM ", dev->capabilities & CAP_EOM ? "" : "!");
524 printf("%sREM ", dev->capabilities & CAP_REM ? "" : "!");
525 printf("%sRACCESS ", dev->capabilities & CAP_RACCESS ? "" : "!");
526 printf("%sAUTOMOUNT ", dev->capabilities & CAP_AUTOMOUNT ? "" : "!");
527 printf("%sLABEL ", dev->capabilities & CAP_LABEL ? "" : "!");
528 printf("%sANONVOLS ", dev->capabilities & CAP_ANONVOLS ? "" : "!");
529 printf("%sALWAYSOPEN ", dev->capabilities & CAP_ALWAYSOPEN ? "" : "!");
532 printf(_("Device status:\n"));
533 printf("%sOPENED ", dev->state & ST_OPENED ? "" : "!");
534 printf("%sTAPE ", dev->state & ST_TAPE ? "" : "!");
535 printf("%sLABEL ", dev->state & ST_LABEL ? "" : "!");
536 printf("%sMALLOC ", dev->state & ST_MALLOC ? "" : "!");
537 printf("%sAPPEND ", dev->state & ST_APPEND ? "" : "!");
538 printf("%sREAD ", dev->state & ST_READ ? "" : "!");
539 printf("%sEOT ", dev->state & ST_EOT ? "" : "!");
540 printf("%sWEOT ", dev->state & ST_WEOT ? "" : "!");
541 printf("%sEOF ", dev->state & ST_EOF ? "" : "!");
542 printf("%sNEXTVOL ", dev->state & ST_NEXTVOL ? "" : "!");
543 printf("%sSHORT ", dev->state & ST_SHORT ? "" : "!");
546 printf(_("Device parameters:\n"));
547 printf("Device name: %s\n", dev->dev_name);
548 printf("File=%u block=%u\n", dev->file, dev->block_num);
549 printf("Min block=%u Max block=%u\n", dev->min_block_size, dev->max_block_size);
557 * Test writting larger and larger records.
558 * This is a torture test for records.
560 static void rectestcmd()
566 Pmsg0(0, "Test writting larger and larger records.\n"
567 "This is a torture test for records.\nI am going to write\n"
568 "larger and larger records. It will stop when the record size\n"
569 "plus the header exceeds the block size (by default about 64K)\n");
572 get_cmd("Do you want to continue? (y/n): ");
574 Pmsg0(000, "Command aborted.\n");
578 sm_check(__FILE__, __LINE__, false);
579 block = new_block(dev);
582 for (i=1; i<500000; i++) {
583 rec->data = check_pool_memory_size(rec->data, i);
584 memset(rec->data, i & 0xFF, i);
586 sm_check(__FILE__, __LINE__, false);
587 if (write_record_to_block(block, rec)) {
590 Pmsg2(0, "Block %d i=%d\n", blkno, i);
594 sm_check(__FILE__, __LINE__, false);
598 sm_check(__FILE__, __LINE__, false);
602 * This test attempts to re-read a block written by Bacula
603 * normally at the end of the tape. Bacula will then back up
604 * over the two eof marks, backup over the record and reread
605 * it to make sure it is valid. Bacula can skip this validation
606 * if you set "Backward space record = no"
608 static int re_read_block_test()
615 if (!(dev->capabilities & CAP_BSR)) {
616 Pmsg0(-1, _("Skipping read backwards test because BSR turned off.\n"));
620 Pmsg0(-1, _("\n=== Write, backup, and re-read test ===\n\n"
621 "I'm going to write three records and an EOF\n"
622 "then backup over the EOF and re-read the last record.\n"
623 "Bacula does this after writing the last block on the\n"
624 "tape to verify that the block was written correctly.\n\n"
625 "This is not an *essential* feature ...\n\n"));
627 block = new_block(dev);
629 rec->data = check_pool_memory_size(rec->data, block->buf_len);
630 len = rec->data_len = block->buf_len-100;
631 memset(rec->data, 1, rec->data_len);
632 if (!write_record_to_block(block, rec)) {
633 Pmsg0(0, _("Error writing record to block.\n"));
636 if (!write_block_to_dev(dcr, block)) {
637 Pmsg0(0, _("Error writing block to device.\n"));
640 Pmsg1(0, _("Wrote first record of %d bytes.\n"), rec->data_len);
642 memset(rec->data, 2, rec->data_len);
643 if (!write_record_to_block(block, rec)) {
644 Pmsg0(0, _("Error writing record to block.\n"));
647 if (!write_block_to_dev(dcr, block)) {
648 Pmsg0(0, _("Error writing block to device.\n"));
651 Pmsg1(0, _("Wrote second record of %d bytes.\n"), rec->data_len);
653 memset(rec->data, 3, rec->data_len);
654 if (!write_record_to_block(block, rec)) {
655 Pmsg0(0, _("Error writing record to block.\n"));
658 if (!write_block_to_dev(dcr, block)) {
659 Pmsg0(0, _("Error writing block to device.\n"));
662 Pmsg1(0, _("Wrote third record of %d bytes.\n"), rec->data_len);
665 if (dev_cap(dev, CAP_TWOEOF)) {
668 if (!bsf_dev(dev, 1)) {
669 Pmsg1(0, _("Backspace file failed! ERR=%s\n"), strerror_dev(dev));
672 if (dev_cap(dev, CAP_TWOEOF)) {
673 if (!bsf_dev(dev, 1)) {
674 Pmsg1(0, _("Backspace file failed! ERR=%s\n"), strerror_dev(dev));
678 Pmsg0(0, "Backspaced over EOF OK.\n");
679 if (!bsr_dev(dev, 1)) {
680 Pmsg1(0, _("Backspace record failed! ERR=%s\n"), strerror_dev(dev));
683 Pmsg0(0, "Backspace record OK.\n");
684 if (!read_block_from_dev(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
685 Pmsg1(0, _("Read block failed! ERR=%s\n"), strerror(dev->dev_errno));
688 memset(rec->data, 0, rec->data_len);
689 if (!read_record_from_block(block, rec)) {
690 Pmsg1(0, _("Read block failed! ERR=%s\n"), strerror(dev->dev_errno));
693 for (int i=0; i<len; i++) {
694 if (rec->data[i] != 3) {
695 Pmsg0(0, _("Bad data in record. Test failed!\n"));
699 Pmsg0(0, _("\nBlock re-read correct. Test succeeded!\n"));
700 Pmsg0(-1, _("=== End Write, backup, and re-read test ===\n\n"));
708 Pmsg0(0, _("This is not terribly serious since Bacula only uses\n"
709 "this function to verify the last block written to the\n"
710 "tape. Bacula will skip the last block verification\n"
712 "Backward Space Record = No\n\n"
713 "to your Storage daemon's Device resource definition.\n"));
720 * This test writes Bacula blocks to the tape in
721 * several files. It then rewinds the tape and attepts
722 * to read these blocks back checking the data.
724 static int write_read_test()
732 Pmsg0(-1, _("\n=== Write, rewind, and re-read test ===\n\n"
733 "I'm going to write 1000 records and an EOF\n"
734 "then write 1000 records and an EOF, then rewind,\n"
735 "and re-read the data to verify that it is correct.\n\n"
736 "This is an *essential* feature ...\n\n"));
737 block = new_block(dev);
739 if (!rewind_dev(dev)) {
740 Pmsg1(0, "Bad status from rewind. ERR=%s\n", strerror_dev(dev));
743 rec->data = check_pool_memory_size(rec->data, block->buf_len);
744 rec->data_len = block->buf_len-100;
745 len = rec->data_len/sizeof(i);
746 for (i=1; i<=1000; i++) {
747 p = (int *)rec->data;
748 for (j=0; j<len; j++) {
751 if (!write_record_to_block(block, rec)) {
752 Pmsg0(0, _("Error writing record to block.\n"));
755 if (!write_block_to_dev(dcr, block)) {
756 Pmsg0(0, _("Error writing block to device.\n"));
760 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
762 for (i=1001; i<=2000; i++) {
763 p = (int *)rec->data;
764 for (j=0; j<len; j++) {
767 if (!write_record_to_block(block, rec)) {
768 Pmsg0(0, _("Error writing record to block.\n"));
771 if (!write_block_to_dev(dcr, block)) {
772 Pmsg0(0, _("Error writing block to device.\n"));
776 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
778 if (dev_cap(dev, CAP_TWOEOF)) {
781 if (!rewind_dev(dev)) {
782 Pmsg1(0, "Bad status from rewind. ERR=%s\n", strerror_dev(dev));
785 Pmsg0(0, "Rewind OK.\n");
787 for (i=1; i<=2000; i++) {
789 if (!read_block_from_dev(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
790 if (dev_state(dev, ST_EOF)) {
791 Pmsg0(-1, _("Got EOF on tape.\n"));
794 Pmsg1(0, _("Read block failed! ERR=%s\n"), strerror(dev->dev_errno));
797 memset(rec->data, 0, rec->data_len);
798 if (!read_record_from_block(block, rec)) {
799 Pmsg1(0, _("Read record failed! ERR=%s\n"), strerror(dev->dev_errno));
802 p = (int *)rec->data;
803 for (j=0; j<len; j++) {
805 Pmsg3(0, _("Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"),
811 if (i == 1000 || i == 2000) {
812 Pmsg0(-1, _("1000 blocks re-read correctly.\n"));
815 Pmsg0(-1, _("=== Test Succeeded. End Write, rewind, and re-read test ===\n\n"));
825 * This test writes Bacula blocks to the tape in
826 * several files. It then rewinds the tape and attepts
827 * to read these blocks back checking the data.
829 static int position_test()
837 int file = 0, blk = 0;
840 Pmsg0(-1, _("\n=== Write, rewind, and position test ===\n\n"
841 "I'm going to write 1000 records and an EOF\n"
842 "then write 1000 records and an EOF, then rewind,\n"
843 "and position to a few blocks and verify that it is correct.\n\n"
844 "This is an *essential* feature ...\n\n"));
845 block = new_block(dev);
847 if (!rewind_dev(dev)) {
848 Pmsg1(0, "Bad status from rewind. ERR=%s\n", strerror_dev(dev));
851 rec->data = check_pool_memory_size(rec->data, block->buf_len);
852 rec->data_len = block->buf_len-100;
853 len = rec->data_len/sizeof(i);
854 for (i=1; i<=1000; i++) {
855 p = (int *)rec->data;
856 for (j=0; j<len; j++) {
859 if (!write_record_to_block(block, rec)) {
860 Pmsg0(0, _("Error writing record to block.\n"));
863 if (!write_block_to_dev(dcr, block)) {
864 Pmsg0(0, _("Error writing block to device.\n"));
868 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
870 for (i=1001; i<=2000; i++) {
871 p = (int *)rec->data;
872 for (j=0; j<len; j++) {
875 if (!write_record_to_block(block, rec)) {
876 Pmsg0(0, _("Error writing record to block.\n"));
879 if (!write_block_to_dev(dcr, block)) {
880 Pmsg0(0, _("Error writing block to device.\n"));
884 Pmsg1(0, _("Wrote 1000 blocks of %d bytes.\n"), rec->data_len);
886 if (dev_cap(dev, CAP_TWOEOF)) {
889 if (!rewind_dev(dev)) {
890 Pmsg1(0, "Bad status from rewind. ERR=%s\n", strerror_dev(dev));
893 Pmsg0(0, "Rewind OK.\n");
897 /* Set up next item to read based on where we are */
933 Pmsg2(-1, "Reposition to file:block %d:%d\n", file, blk);
934 if (!reposition_dev(dev, file, blk)) {
935 Pmsg0(0, "Reposition error.\n");
939 if (!read_block_from_dev(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
940 if (dev_state(dev, ST_EOF)) {
941 Pmsg0(-1, _("Got EOF on tape.\n"));
944 Pmsg1(0, _("Read block failed! ERR=%s\n\n"), strerror(dev->dev_errno));
945 Pmsg0(0, _("This may be because the tape drive block size is not\n"
946 " set to variable blocking as normally used by Bacula.\n"
947 " Please see the Tape Testing chapter in the manual and \n"
948 " look for using mt with defblksize and setoptions\n"));
951 memset(rec->data, 0, rec->data_len);
952 if (!read_record_from_block(block, rec)) {
953 Pmsg1(0, _("Read record failed! ERR=%s\n"), strerror(dev->dev_errno));
956 p = (int *)rec->data;
957 for (j=0; j<len; j++) {
959 Pmsg3(0, _("Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"),
964 Pmsg0(-1, _("Block re-read correctly.\n"));
966 Pmsg0(-1, _("=== Test Succeeded. End Write, rewind, and re-read test ===\n\n"));
979 * This test writes some records, then writes an end of file,
980 * rewinds the tape, moves to the end of the data and attepts
981 * to append to the tape. This function is essential for
982 * Bacula to be able to write multiple jobs to the tape.
984 static int append_test()
986 Pmsg0(-1, _("\n\n=== Append files test ===\n\n"
987 "This test is essential to Bacula.\n\n"
988 "I'm going to write one record in file 0,\n"
989 " two records in file 1,\n"
990 " and three records in file 2\n\n"));
994 weofcmd(); /* end file 0 */
997 weofcmd(); /* end file 1 */
1001 weofcmd(); /* end file 2 */
1002 if (dev_cap(dev, CAP_TWOEOF)) {
1005 force_close_dev(dev); /* release device */
1006 if (!open_the_device()) {
1010 Pmsg0(0, _("Now moving to end of medium.\n"));
1012 Pmsg2(-1, _("We should be in file 3. I am at file %d. This is %s\n"),
1013 dev->file, dev->file == 3 ? "correct!" : "NOT correct!!!!");
1015 if (dev->file != 3) {
1019 Pmsg0(-1, _("\nNow the important part, I am going to attempt to append to the tape.\n\n"));
1022 if (dev_cap(dev, CAP_TWOEOF)) {
1026 Pmsg0(-1, _("Done appending, there should be no I/O errors\n\n"));
1027 Pmsg0(-1, "Doing Bacula scan of blocks:\n");
1029 Pmsg0(-1, _("End scanning the tape.\n"));
1030 Pmsg2(-1, _("We should be in file 4. I am at file %d. This is %s\n"),
1031 dev->file, dev->file == 4 ? "correct!" : "NOT correct!!!!");
1033 if (dev->file != 4) {
1041 * This test exercises the autochanger
1043 static int autochanger_test()
1045 POOLMEM *results, *changer;
1046 int slot, status, loaded;
1047 int timeout = jcr->device->max_changer_wait;
1050 Dmsg1(100, "Max changer wait = %d sec\n", timeout);
1051 if (!dev_cap(dev, CAP_AUTOCHANGER)) {
1054 if (!(jcr->device && jcr->device->changer_name && jcr->device->changer_command)) {
1055 Pmsg0(-1, "\nAutochanger enabled, but no name or no command device specified.\n");
1059 Pmsg0(-1, "\nAh, I see you have an autochanger configured.\n"
1060 "To test the autochanger you must have a blank tape\n"
1061 " that I can write on in Slot 1.\n");
1062 if (!get_cmd("\nDo you wish to continue with the Autochanger test? (y/n): ")) {
1065 if (cmd[0] != 'y' && cmd[0] != 'Y') {
1069 Pmsg0(-1, _("\n\n=== Autochanger test ===\n\n"));
1071 results = get_pool_memory(PM_MESSAGE);
1072 changer = get_pool_memory(PM_FNAME);
1076 jcr->VolCatInfo.Slot = slot;
1077 /* Find out what is loaded, zero means device is unloaded */
1078 Pmsg0(-1, _("3301 Issuing autochanger \"loaded\" command.\n"));
1079 changer = edit_device_codes(jcr, changer, jcr->device->changer_command,
1081 status = run_program(changer, timeout, results);
1082 Dmsg3(100, "run_prog: %s stat=%d result=%s\n", changer, status, results);
1084 loaded = atoi(results);
1086 Pmsg1(-1, _("3991 Bad autochanger command: %s\n"), changer);
1087 Pmsg2(-1, _("3991 status=%d result=%s\n"), status, results);
1091 Pmsg1(-1, "Slot %d loaded. I am going to unload it.\n", loaded);
1093 Pmsg0(-1, "Nothing loaded in the drive. OK.\n");
1095 Dmsg1(100, "Results from loaded query=%s\n", results);
1097 jcr->VolCatInfo.Slot = loaded;
1098 offline_or_rewind_dev(dev);
1099 /* We are going to load a new tape, so close the device */
1100 force_close_dev(dev);
1101 Pmsg2(-1, _("3302 Issuing autochanger \"unload %d %d\" command.\n"),
1102 loaded, dev->drive_index);
1103 changer = edit_device_codes(jcr, changer,
1104 jcr->device->changer_command, "unload");
1105 status = run_program(changer, timeout, results);
1106 Pmsg2(-1, "unload status=%s %d\n", status==0?"OK":"Bad", status);
1108 Pmsg1(-1, _("3992 Bad autochanger command: %s\n"), changer);
1109 Pmsg2(-1, _("3992 status=%d result=%s\n"), status, results);
1118 jcr->VolCatInfo.Slot = slot;
1119 Pmsg2(-1, _("3303 Issuing autochanger \"load slot %d %d\" command.\n"),
1120 slot, dev->drive_index);
1121 changer = edit_device_codes(jcr, changer, jcr->device->changer_command, "load");
1122 Dmsg1(100, "Changer=%s\n", changer);
1123 force_close_dev(dev);
1124 status = run_program(changer, timeout, results);
1126 Pmsg2(-1, _("3303 Autochanger \"load slot %d %d\" status is OK.\n"),
1127 slot, dev->drive_index);
1129 Pmsg1(-1, _("3993 Bad autochanger command: %s\n"), changer);
1130 Pmsg2(-1, _("3993 status=%d result=%s\n"), status, results);
1134 if (!open_the_device()) {
1137 bmicrosleep(sleep_time, 0);
1138 if (!rewind_dev(dev)) {
1139 Pmsg1(0, "Bad status from rewind. ERR=%s\n", strerror_dev(dev));
1140 clrerror_dev(dev, -1);
1141 Pmsg0(-1, "\nThe test failed, probably because you need to put\n"
1142 "a longer sleep time in the mtx-script in the load) case.\n"
1143 "Adding a 30 second sleep and trying again ...\n");
1147 Pmsg1(0, "Rewound %s\n", dev_name(dev));
1150 if ((status = weof_dev(dev, 1)) < 0) {
1151 Pmsg2(0, "Bad status from weof %d. ERR=%s\n", status, strerror_dev(dev));
1154 Pmsg1(0, "Wrote EOF to %s\n", dev_name(dev));
1158 Pmsg1(-1, "\nThe test worked this time. Please add:\n\n"
1160 "to your mtx-changer script in the load) case.\n\n",
1163 Pmsg0(-1, "\nThe test autochanger worked!!\n\n");
1166 free_pool_memory(changer);
1167 free_pool_memory(results);
1172 free_pool_memory(changer);
1173 free_pool_memory(results);
1174 Pmsg0(-1, "You must correct this error or the Autochanger will not work.\n");
1178 static void autochangercmd()
1185 * This test assumes that the append test has been done,
1186 * then it tests the fsf function.
1188 static int fsf_test()
1190 bool set_off = false;
1192 Pmsg0(-1, _("\n\n=== Forward space files test ===\n\n"
1193 "This test is essential to Bacula.\n\n"
1194 "I'm going to write five files then test forward spacing\n\n"));
1198 weofcmd(); /* end file 0 */
1201 weofcmd(); /* end file 1 */
1205 weofcmd(); /* end file 2 */
1208 weofcmd(); /* end file 3 */
1210 weofcmd(); /* end file 4 */
1211 if (dev_cap(dev, CAP_TWOEOF)) {
1217 Pmsg0(0, _("Now forward spacing 1 file.\n"));
1218 if (!fsf_dev(dev, 1)) {
1219 Pmsg1(0, "Bad status from fsr. ERR=%s\n", strerror_dev(dev));
1222 Pmsg2(-1, _("We should be in file 1. I am at file %d. This is %s\n"),
1223 dev->file, dev->file == 1 ? "correct!" : "NOT correct!!!!");
1225 if (dev->file != 1) {
1229 Pmsg0(0, _("Now forward spacing 2 files.\n"));
1230 if (!fsf_dev(dev, 2)) {
1231 Pmsg1(0, "Bad status from fsr. ERR=%s\n", strerror_dev(dev));
1234 Pmsg2(-1, _("We should be in file 3. I am at file %d. This is %s\n"),
1235 dev->file, dev->file == 3 ? "correct!" : "NOT correct!!!!");
1237 if (dev->file != 3) {
1242 Pmsg0(0, _("Now forward spacing 4 files.\n"));
1243 if (!fsf_dev(dev, 4)) {
1244 Pmsg1(0, "Bad status from fsr. ERR=%s\n", strerror_dev(dev));
1247 Pmsg2(-1, _("We should be in file 4. I am at file %d. This is %s\n"),
1248 dev->file, dev->file == 4 ? "correct!" : "NOT correct!!!!");
1250 if (dev->file != 4) {
1254 Pmsg0(-1, "The test worked this time. Please add:\n\n"
1255 " Fast Forward Space File = no\n\n"
1256 "to your Device resource for this drive.\n");
1260 Pmsg0(0, _("Now forward spacing 1 more file.\n"));
1261 if (!fsf_dev(dev, 1)) {
1262 Pmsg1(0, "Bad status from fsr. ERR=%s\n", strerror_dev(dev));
1264 Pmsg2(-1, _("We should be in file 5. I am at file %d. This is %s\n"),
1265 dev->file, dev->file == 5 ? "correct!" : "NOT correct!!!!");
1266 if (dev->file != 5) {
1269 Pmsg0(-1, _("\n=== End Forward space files test ===\n\n"));
1273 Pmsg0(-1, _("\nThe forward space file test failed.\n"));
1274 if (dev_cap(dev, CAP_FASTFSF)) {
1275 Pmsg0(-1, "You have Fast Forward Space File enabled.\n"
1276 "I am turning it off then retrying the test.\n");
1277 dev->capabilities &= ~CAP_FASTFSF;
1281 Pmsg0(-1, "You must correct this error or Bacula will not work.\n");
1290 * This is a general test of Bacula's functions
1291 * needed to read and write the tape.
1293 static void testcmd()
1297 if (!write_read_test()) {
1300 if (!position_test()) {
1304 stat = append_test();
1305 if (stat == 1) { /* OK get out */
1308 if (stat == -1) { /* first test failed */
1309 if (dev_cap(dev, CAP_EOM) || dev_cap(dev, CAP_FASTFSF)) {
1310 Pmsg0(-1, "\nAppend test failed. Attempting again.\n"
1311 "Setting \"Hardware End of Medium = no\n"
1312 " and \"Fast Forward Space File = no\n"
1313 "and retrying append test.\n\n");
1314 dev->capabilities &= ~CAP_EOM; /* turn off eom */
1315 dev->capabilities &= ~CAP_FASTFSF; /* turn off fast fsf */
1316 stat = append_test();
1318 Pmsg0(-1, "\n\nIt looks like the test worked this time, please add:\n\n"
1319 " Hardware End of Medium = No\n\n"
1320 " Fast Forward Space File = No\n"
1321 "to your Device resource in the Storage conf file.\n");
1325 Pmsg0(-1, "\n\nThat appears *NOT* to have corrected the problem.\n");
1328 /* Wrong count after append */
1330 Pmsg0(-1, "\n\nIt looks like the append failed. Attempting again.\n"
1331 "Setting \"BSF at EOM = yes\" and retrying append test.\n");
1332 dev->capabilities |= CAP_BSFATEOM; /* backspace on eom */
1333 stat = append_test();
1335 Pmsg0(-1, "\n\nIt looks like the test worked this time, please add:\n\n"
1336 " Hardware End of Medium = No\n"
1337 " Fast Forward Space File = No\n"
1338 " BSF at EOM = yes\n\n"
1339 "to your Device resource in the Storage conf file.\n");
1346 Pmsg0(-1, "\nAppend test failed.\n\n");
1347 Pmsg0(-1, "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
1348 "Unable to correct the problem. You MUST fix this\n"
1349 "problem before Bacula can use your tape drive correctly\n");
1350 Pmsg0(-1, "\nPerhaps running Bacula in fixed block mode will work.\n"
1351 "Do so by setting:\n\n"
1352 "Minimum Block Size = nnn\n"
1353 "Maximum Block Size = nnn\n\n"
1354 "in your Storage daemon's Device definition.\n"
1355 "nnn must match your tape driver's block size, which\n"
1356 "can be determined by reading your tape manufacturers\n"
1357 "information, and the information on your kernel dirver.\n"
1358 "Fixed block sizes, however, are not normally an ideal solution.\n");
1363 Pmsg0(-1, _("\nThe above Bacula scan should have output identical to what follows.\n"
1364 "Please double check it ...\n"
1365 "=== Sample correct output ===\n"
1366 "1 block of 64448 bytes in file 1\n"
1367 "End of File mark.\n"
1368 "2 blocks of 64448 bytes in file 2\n"
1369 "End of File mark.\n"
1370 "3 blocks of 64448 bytes in file 3\n"
1371 "End of File mark.\n"
1372 "1 block of 64448 bytes in file 4\n"
1373 "End of File mark.\n"
1374 "Total files=4, blocks=7, bytes = 451,136\n"
1375 "=== End sample correct output ===\n\n"));
1377 Pmsg0(-1, _("If the above scan output is not identical to the\n"
1378 "sample output, you MUST correct the problem\n"
1379 "or Bacula will not be able to write multiple Jobs to \n"
1383 re_read_block_test();
1386 fsf_test(); /* do fast forward space file test */
1388 autochanger_test(); /* do autochanger test */
1392 /* Forward space a file */
1393 static void fsfcmd()
1397 num = atoi(argk[1]);
1402 if (!fsf_dev(dev, num)) {
1403 Pmsg1(0, "Bad status from fsf. ERR=%s\n", strerror_dev(dev));
1406 Pmsg2(0, "Forward spaced %d file%s.\n", num, num==1?"":"s");
1409 /* Forward space a record */
1410 static void fsrcmd()
1414 num = atoi(argk[1]);
1419 if (!fsr_dev(dev, num)) {
1420 Pmsg1(0, "Bad status from fsr. ERR=%s\n", strerror_dev(dev));
1423 Pmsg2(0, "Forward spaced %d record%s.\n", num, num==1?"":"s");
1428 * Write a Bacula block to the tape
1436 sm_check(__FILE__, __LINE__, false);
1437 block = new_block(dev);
1439 dump_block(block, "test");
1441 i = block->buf_len - 100;
1443 rec->data = check_pool_memory_size(rec->data, i);
1444 memset(rec->data, i & 0xFF, i);
1446 sm_check(__FILE__, __LINE__, false);
1447 if (!write_record_to_block(block, rec)) {
1448 Pmsg0(0, _("Error writing record to block.\n"));
1451 if (!write_block_to_dev(dcr, block)) {
1452 Pmsg0(0, _("Error writing block to device.\n"));
1455 Pmsg1(0, _("Wrote one record of %d bytes.\n"), i);
1457 Pmsg0(0, _("Wrote block to device.\n"));
1460 sm_check(__FILE__, __LINE__, false);
1463 sm_check(__FILE__, __LINE__, false);
1467 * Read a record from the tape
1474 if (!get_cmd("Enter length to read: ")) {
1478 if (len < 0 || len > 1000000) {
1479 Pmsg0(0, _("Bad length entered, using default of 1024 bytes.\n"));
1482 buf = (char *)malloc(len);
1483 stat = read(dev->fd, buf, len);
1484 if (stat > 0 && stat <= len) {
1487 Pmsg3(0, _("Read of %d bytes gives stat=%d. ERR=%s\n"),
1488 len, stat, strerror(errno));
1494 * Scan tape by reading block by block. Report what is
1495 * on the tape. Note, this command does raw reads, and as such
1496 * will not work with fixed block size devices.
1498 static void scancmd()
1501 int blocks, tot_blocks, tot_files;
1507 blocks = block_size = tot_blocks = 0;
1509 if (dev->state & ST_EOT) {
1510 Pmsg0(0, "End of tape\n");
1513 update_pos_dev(dev);
1514 tot_files = dev->file;
1515 Pmsg1(0, _("Starting scan at file %u\n"), dev->file);
1517 if ((stat = read(dev->fd, buf, sizeof(buf))) < 0) {
1518 clrerror_dev(dev, -1);
1519 Mmsg2(&dev->errmsg, "read error on %s. ERR=%s.\n",
1520 dev->dev_name, strerror(dev->dev_errno));
1521 Pmsg2(0, "Bad status from read %d. ERR=%s\n", stat, strerror_dev(dev));
1523 printf("%d block%s of %d bytes in file %d\n",
1524 blocks, blocks>1?"s":"", block_size, dev->file);
1527 Dmsg1(200, "read status = %d\n", stat);
1529 if (stat != block_size) {
1530 update_pos_dev(dev);
1532 printf("%d block%s of %d bytes in file %d\n",
1533 blocks, blocks>1?"s":"", block_size, dev->file);
1538 if (stat == 0) { /* EOF */
1539 update_pos_dev(dev);
1540 printf("End of File mark.\n");
1541 /* Two reads of zero means end of tape */
1542 if (dev->state & ST_EOF)
1543 dev->state |= ST_EOT;
1545 dev->state |= ST_EOF;
1548 if (dev->state & ST_EOT) {
1549 printf("End of tape\n");
1552 } else { /* Got data */
1553 dev->state &= ~ST_EOF;
1559 update_pos_dev(dev);
1560 tot_files = dev->file - tot_files;
1561 printf("Total files=%d, blocks=%d, bytes = %s\n", tot_files, tot_blocks,
1562 edit_uint64_with_commas(bytes, ec1));
1567 * Scan tape by reading Bacula block by block. Report what is
1568 * on the tape. This function reads Bacula blocks, so if your
1569 * Device resource is correctly defined, it should work with
1570 * either variable or fixed block sizes.
1572 static void scan_blocks()
1574 int blocks, tot_blocks, tot_files;
1575 uint32_t block_size;
1580 block = new_block(dev);
1581 blocks = block_size = tot_blocks = 0;
1584 update_pos_dev(dev);
1585 tot_files = dev->file;
1587 if (!read_block_from_device(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
1588 Dmsg1(100, "!read_block(): ERR=%s\n", strerror_dev(dev));
1589 if (dev->state & ST_EOT) {
1591 printf("%d block%s of %d bytes in file %d\n",
1592 blocks, blocks>1?"s":"", block_size, dev->file);
1597 if (dev->state & ST_EOF) {
1599 printf("%d block%s of %d bytes in file %d\n",
1600 blocks, blocks>1?"s":"", block_size, dev->file);
1603 printf(_("End of File mark.\n"));
1606 if (dev->state & ST_SHORT) {
1608 printf("%d block%s of %d bytes in file %d\n",
1609 blocks, blocks>1?"s":"", block_size, dev->file);
1612 printf(_("Short block read.\n"));
1615 printf(_("Error reading block. ERR=%s\n"), strerror_dev(dev));
1618 if (block->block_len != block_size) {
1620 printf("%d block%s of %d bytes in file %d\n",
1621 blocks, blocks>1?"s":"", block_size, dev->file);
1624 block_size = block->block_len;
1628 bytes += block->block_len;
1629 Dmsg6(100, "Blk_blk=%u dev_blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
1630 block->BlockNumber, dev->block_num, block->block_len, block->BlockVer,
1631 block->VolSessionId, block->VolSessionTime);
1633 DEV_RECORD *rec = new_record();
1634 read_record_from_block(block, rec);
1635 Pmsg8(-1, "Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n",
1636 block->BlockNumber, dev->block_num, block->block_len,
1637 FI_to_ascii(rec->FileIndex), rec->VolSessionId, rec->VolSessionTime,
1638 stream_to_ascii(rec->Stream, rec->FileIndex), rec->data_len);
1641 } else if (verbose > 1) {
1642 dump_block(block, "");
1648 tot_files = dev->file - tot_files;
1649 printf("Total files=%d, blocks=%d, bytes = %s\n", tot_files, tot_blocks,
1650 edit_uint64_with_commas(bytes, ec1));
1654 static void statcmd()
1656 int debug = debug_level;
1658 Pmsg2(0, "Device status: %u. ERR=%s\n", status_dev(dev), strerror_dev(dev));
1660 dump_volume_label(dev);
1662 debug_level = debug;
1667 * First we label the tape, then we fill
1668 * it with data get a new tape and write a few blocks.
1670 static void fillcmd()
1677 uint32_t min_block_size;
1687 This command simulates Bacula writing to a tape.\n\
1688 It requires either one or two blank tapes, which it\n\
1689 will label and write.\n\n\
1690 If you have an autochanger configured, it will use\n\
1691 the tapes that are in slots 1 and 2, otherwise, you will\n\
1692 be prompted to insert the tapes when necessary.\n\n\
1693 It will print a status approximately\n\
1694 every 322 MB, and write an EOF every 3.2 GB. If you have\n\
1695 selected the simple test option, after writing the first tape\n\
1696 it will rewind it and re-read the last block written.\n\n\
1697 If you have selected the multiple tape test, when the first tape\n\
1698 fills, it will ask for a second, and after writing a few more \n\
1699 blocks, it will stop. Then it will begin re-reading the\n\
1701 This may take a long time -- hours! ...\n\n");
1703 get_cmd("Do you want to run the simplified test (s) with one tape\n"
1704 "or the complete multiple tape (m) test: (s/m) ");
1705 if (cmd[0] == 's') {
1706 Pmsg0(-1, "Simple test (single tape) selected.\n");
1708 } else if (cmd[0] == 'm') {
1709 Pmsg0(-1, "Multiple tape test selected.\n");
1712 Pmsg0(000, "Command aborted.\n");
1716 Dmsg1(20, "Begin append device=%s\n", dev_name(dev));
1717 Dmsg1(20, "MaxVolSize=%s\n", edit_uint64(dev->max_volume_size, ec1));
1719 /* Use fixed block size to simplify read back */
1720 min_block_size = dev->min_block_size;
1721 dev->min_block_size = dev->max_block_size;
1724 * Acquire output device for writing. Note, after acquiring a
1725 * device, we MUST release it, which is done at the end of this
1728 Dmsg0(100, "just before acquire_device\n");
1729 if (!acquire_device_for_append(jcr)) {
1730 set_jcr_job_status(jcr, JS_ErrorTerminated);
1733 block = jcr->dcr->block;
1735 Dmsg0(100, "Just after acquire_device_for_append\n");
1737 * Write Begin Session Record
1739 if (!write_session_label(dcr, block, SOS_LABEL)) {
1740 set_jcr_job_status(jcr, JS_ErrorTerminated);
1741 Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"),
1745 Pmsg0(-1, "Wrote Start Of Session label.\n");
1747 memset(&rec, 0, sizeof(rec));
1748 rec.data = get_memory(100000); /* max record size */
1750 #define REC_SIZE 32768
1751 rec.data_len = REC_SIZE;
1754 * Put some random data in the record
1756 fd = open("/dev/urandom", O_RDONLY);
1758 read(fd, rec.data, rec.data_len);
1761 uint32_t *p = (uint32_t *)rec.data;
1762 srandom(time(NULL));
1763 for (i=0; i<rec.data_len/sizeof(uint32_t); i++) {
1769 * Generate data as if from File daemon, write to device
1771 jcr->dcr->VolFirstIndex = 0;
1772 time(&jcr->run_time); /* start counting time for rates */
1774 Pmsg0(-1, "Begin writing Bacula records to tape ...\n");
1776 Pmsg0(-1, "Begin writing Bacula records to first tape ...\n");
1778 for (file_index = 0; ok && !job_canceled(jcr); ) {
1779 rec.VolSessionId = jcr->VolSessionId;
1780 rec.VolSessionTime = jcr->VolSessionTime;
1781 rec.FileIndex = ++file_index;
1782 rec.Stream = STREAM_FILE_DATA;
1784 /* Mix up the data just a bit */
1785 uint32_t *lp = (uint32_t *)rec.data;
1787 for (i=1; i < (rec.data_len-sizeof(uint32_t))/sizeof(uint32_t)-1; i++) {
1791 Dmsg4(250, "before write_rec FI=%d SessId=%d Strm=%s len=%d\n",
1792 rec.FileIndex, rec.VolSessionId, stream_to_ascii(rec.Stream, rec.FileIndex),
1795 while (!write_record_to_block(block, &rec)) {
1797 * When we get here we have just filled a block
1799 Dmsg2(150, "!write_record_to_block data_len=%d rem=%d\n", rec.data_len,
1802 /* Write block to tape */
1803 if (!flush_block(block, 1)) {
1807 /* Every 5000 blocks (approx 322MB) report where we are.
1809 if ((block->BlockNumber % 5000) == 0) {
1811 now -= jcr->run_time;
1813 now = 1; /* prevent divide error */
1815 kbs = (double)dev->VolCatInfo.VolCatBytes / (1000.0 * (double)now);
1816 Pmsg4(-1, "Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n",
1817 block->BlockNumber, dev->block_num,
1818 edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, ec1), (float)kbs);
1820 /* Every 15000 blocks (approx 1GB) write an EOF.
1822 if ((block->BlockNumber % 15000) == 0) {
1823 Pmsg0(-1, "Flush block, write EOF\n");
1824 flush_block(block, 0);
1828 /* Get out after writing 10 blocks to the second tape */
1829 if (++BlockNumber > 10 && stop != 0) { /* get out */
1834 Pmsg0(000, _("Not OK\n"));
1837 jcr->JobBytes += rec.data_len; /* increment bytes this job */
1838 Dmsg4(190, "write_record FI=%s SessId=%d Strm=%s len=%d\n",
1839 FI_to_ascii(rec.FileIndex), rec.VolSessionId,
1840 stream_to_ascii(rec.Stream, rec.FileIndex), rec.data_len);
1842 /* Get out after writing 10 blocks to the second tape */
1843 if (BlockNumber > 10 && stop != 0) { /* get out */
1844 Pmsg0(-1, "Done writing ...\n");
1849 Dmsg0(100, "Write_end_session_label()\n");
1850 /* Create Job status for end of session label */
1851 if (!job_canceled(jcr) && ok) {
1852 set_jcr_job_status(jcr, JS_Terminated);
1854 set_jcr_job_status(jcr, JS_ErrorTerminated);
1856 if (!write_session_label(dcr, block, EOS_LABEL)) {
1857 Pmsg1(000, _("Error writting end session label. ERR=%s\n"), strerror_dev(dev));
1860 /* Write out final block of this session */
1861 if (!write_block_to_device(dcr, block)) {
1862 Pmsg0(-1, _("Set ok=false after write_block_to_device.\n"));
1865 Pmsg0(-1, _("Wrote End Of Session label.\n"));
1867 /* Save last block info for second tape */
1868 last_block_num2 = last_block_num;
1869 last_file2 = last_file;
1871 free_block(last_block2);
1873 last_block2 = dup_block(last_block);
1876 sprintf(buf, "%s/btape.state", working_directory);
1877 fd = open(buf, O_CREAT|O_TRUNC|O_WRONLY, 0640);
1879 write(fd, &btape_state_level, sizeof(btape_state_level));
1880 write(fd, &simple, sizeof(simple));
1881 write(fd, &last_block_num1, sizeof(last_block_num1));
1882 write(fd, &last_block_num2, sizeof(last_block_num2));
1883 write(fd, &last_file1, sizeof(last_file1));
1884 write(fd, &last_file2, sizeof(last_file2));
1885 write(fd, last_block1->buf, last_block1->buf_len);
1886 write(fd, last_block2->buf, last_block2->buf_len);
1887 write(fd, first_block->buf, first_block->buf_len);
1889 Pmsg2(-1, "Wrote state file last_block_num1=%d last_block_num2=%d\n",
1890 last_block_num1, last_block_num2);
1892 Pmsg2(-1, _("Could not create state file: %s ERR=%s\n"), buf,
1896 /* Release the device if multiple tapes being used */
1897 if (!simple && !release_device(jcr)) {
1898 Pmsg0(-1, _("Error in release_device\n"));
1902 Pmsg2(-1, _("\n\nDone filling tape%s. Now beginning re-read of %stape ...\n"),
1903 simple?"":"s", simple?"":"first ");
1907 dev->min_block_size = min_block_size;
1908 free_memory(rec.data);
1912 * Read two tapes written by the "fill" command and ensure
1913 * that the data is valid. If stop==1 we simulate full read back
1914 * of two tapes. If stop==-1 we simply read the last block and
1915 * verify that it is correct.
1917 static void unfillcmd()
1921 last_block1 = new_block(dev);
1922 last_block2 = new_block(dev);
1923 first_block = new_block(dev);
1924 sprintf(buf, "%s/btape.state", working_directory);
1925 fd = open(buf, O_RDONLY);
1927 uint32_t state_level;
1928 read(fd, &state_level, sizeof(btape_state_level));
1929 read(fd, &simple, sizeof(simple));
1930 read(fd, &last_block_num1, sizeof(last_block_num1));
1931 read(fd, &last_block_num2, sizeof(last_block_num2));
1932 read(fd, &last_file1, sizeof(last_file1));
1933 read(fd, &last_file2, sizeof(last_file2));
1934 read(fd, last_block1->buf, last_block1->buf_len);
1935 read(fd, last_block2->buf, last_block2->buf_len);
1936 read(fd, first_block->buf, first_block->buf_len);
1938 if (state_level != btape_state_level) {
1939 Pmsg0(-1, "\nThe state file level has changed. You must redo\n"
1940 "the fill command.\n");
1944 Pmsg2(-1, "\nCould not find the state file: %s ERR=%s\n"
1945 "You must redo the fill command.\n", buf, strerror(errno));
1952 static void do_unfill()
1960 block = new_block(dev);
1962 Dmsg0(20, "Enter do_unfill\n");
1963 dev->capabilities |= CAP_ANONVOLS; /* allow reading any volume */
1964 dev->capabilities &= ~CAP_LABEL; /* don't label anything here */
1968 time(&jcr->run_time); /* start counting time for rates */
1972 free_block(last_block);
1974 last_block_num = last_block_num1;
1975 last_file = last_file1;
1976 last_block = last_block1;
1979 /* Multiple Volume tape */
1980 /* Close device so user can use autochanger if desired */
1981 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1984 autochanger = autoload_device(dcr, 1, NULL);
1986 force_close_dev(dev);
1987 get_cmd(_("Mount first tape. Press enter when ready: "));
1990 jcr->dcr = new_dcr(jcr, dev);
1991 set_volume_name("TestVolume1", 1);
1993 create_vol_list(jcr);
1995 dev->state &= ~ST_READ;
1996 if (!acquire_device_for_read(jcr)) {
1997 Pmsg1(-1, "%s", dev->errmsg);
2002 * We now have the first tape mounted.
2003 * Note, re-reading last block may have caused us to
2004 * loose track of where we are (block number unknown).
2006 rewind_dev(dev); /* get to a known place on tape */
2007 /* Read the first 1000 records */
2008 Pmsg0(-1, _("Reading the first 1000 records.\n"));
2009 read_records(dcr, quickie_cb, my_mount_next_read_volume);
2010 Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
2011 last_file, last_block_num);
2012 if (!reposition_dev(dev, last_file, last_block_num)) {
2013 Pmsg1(-1, "Reposition error. ERR=%s\n", strerror_dev(dev));
2015 Pmsg1(-1, _("Reading block %u.\n"), last_block_num);
2016 if (!read_block_from_device(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
2017 Pmsg1(-1, _("Error reading block: ERR=%s\n"), strerror_dev(dev));
2020 if (compare_blocks(last_block, block)) {
2022 Pmsg0(-1, _("\nThe last block on the tape matches. Test succeeded.\n\n"));
2024 Pmsg0(-1, _("\nThe last block of the first tape matches.\n\n"));
2031 /* restore info for last block on second Volume */
2032 last_block_num = last_block_num2;
2033 last_file = last_file2;
2034 last_block = last_block2;
2036 /* Multiple Volume tape */
2037 /* Close device so user can use autochanger if desired */
2038 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
2043 set_volume_name("TestVolume2", 2);
2045 create_vol_list(jcr);
2046 autochanger = autoload_device(dcr, 1, NULL);
2048 force_close_dev(dev);
2049 get_cmd(_("Mount second tape. Press enter when ready: "));
2052 dev->state &= ~ST_READ;
2053 if (!acquire_device_for_read(jcr)) {
2054 Pmsg1(-1, "%s", dev->errmsg);
2058 /* Space to "first" block which is last block not written
2059 * on the previous tape.
2061 Pmsg2(-1, _("Reposition from %u:%u to 0:1\n"), dev->file, dev->block_num);
2062 if (!reposition_dev(dev, 0, 1)) {
2063 Pmsg1(-1, "Reposition error. ERR=%s\n", strerror_dev(dev));
2066 Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
2067 if (!read_block_from_device(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
2068 Pmsg1(-1, _("Error reading block: ERR=%s\n"), strerror_dev(dev));
2071 if (compare_blocks(first_block, block)) {
2072 Pmsg0(-1, _("\nThe first block on the second tape matches.\n\n"));
2075 /* Now find and compare the last block */
2076 Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
2077 last_file, last_block_num);
2078 if (!reposition_dev(dev, last_file, last_block_num)) {
2079 Pmsg1(-1, "Reposition error. ERR=%s\n", strerror_dev(dev));
2082 Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
2083 if (!read_block_from_device(dcr, block, NO_BLOCK_NUMBER_CHECK)) {
2084 Pmsg1(-1, _("Error reading block: ERR=%s\n"), strerror_dev(dev));
2087 if (compare_blocks(last_block, block)) {
2088 Pmsg0(-1, _("\nThe last block on the second tape matches. Test succeeded.\n\n"));
2093 free_block(last_block1);
2094 free_block(last_block2);
2095 free_block(first_block);
2098 /* Read 1000 records then stop */
2099 static bool quickie_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
2102 return quickie_count <= 1000;
2105 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block)
2108 uint32_t CheckSum, block_len;
2111 p = last_block->buf;
2113 unser_begin(q, BLKHDR2_LENGTH);
2114 unser_uint32(CheckSum);
2115 unser_uint32(block_len);
2116 while (q < (block->buf+block_len)) {
2123 dump_block(last_block, _("Last block written"));
2125 dump_block(block, _("Block read back"));
2126 Pmsg1(-1, "\n\nThe blocks differ at byte %u\n", p - last_block->buf);
2127 Pmsg0(-1, "\n\n!!!! The last block written and the block\n"
2128 "that was read back differ. The test FAILED !!!!\n"
2129 "This must be corrected before you use Bacula\n"
2130 "to write multi-tape Volumes.!!!!\n");
2134 dump_block(last_block, _("Last block written"));
2135 dump_block(block, _("Block read back"));
2145 * Write current block to tape regardless of whether or
2146 * not it is full. If the tape fills, attempt to
2147 * acquire another tape.
2149 static int flush_block(DEV_BLOCK *block, int dump)
2154 uint32_t this_file, this_block_num;
2157 this_block = new_block(dev);
2160 last_block = new_block(dev);
2163 this_file = dev->file;
2164 this_block_num = dev->block_num;
2165 if (!write_block_to_dev(dcr, block)) {
2166 Pmsg3(000, "Last block at: %u:%u this_dev_block_num=%d\n",
2167 last_file, last_block_num, this_block_num);
2170 * This is 1st tape, so save first tape info separate
2171 * from second tape info
2173 last_block_num1 = last_block_num;
2174 last_file1 = last_file;
2175 last_block1 = dup_block(last_block);
2176 last_block2 = dup_block(last_block);
2177 first_block = dup_block(block); /* first block second tape */
2180 Pmsg3(000, "Block not written: FileIndex=%u blk_block=%u Size=%u\n",
2181 (unsigned)file_index, block->BlockNumber, block->block_len);
2182 dump_block(last_block, "Last block written");
2184 dump_block(block, "Block not written");
2187 eot_block = block->BlockNumber;
2188 eot_block_len = block->block_len;
2189 eot_FileIndex = file_index;
2193 now -= jcr->run_time;
2195 now = 1; /* don't divide by zero */
2197 kbs = (double)dev->VolCatInfo.VolCatBytes / (1000 * now);
2198 vol_size = dev->VolCatInfo.VolCatBytes;
2199 Pmsg2(000, "End of tape. VolumeCapacity=%s. Write rate = %.1f KB/s\n",
2200 edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, ec1), kbs);
2203 stop = -1; /* stop, but do simplified test */
2205 /* Full test in progress */
2206 if (!fixup_device_block_write_error(jcr->dcr, block)) {
2207 Pmsg1(000, _("Cannot fixup device error. %s\n"), strerror_dev(dev));
2212 BlockNumber = 0; /* start counting for second tape */
2215 return 1; /* end of tape reached */
2218 /* Save contents after write so that the header is serialized */
2219 memcpy(this_block->buf, block->buf, this_block->buf_len);
2222 * Toggle between two allocated blocks for efficiency.
2223 * Switch blocks so that the block just successfully written is
2224 * always in last_block.
2226 tblock = last_block;
2227 last_block = this_block;
2228 this_block = tblock;
2229 last_file = this_file;
2230 last_block_num = this_block_num;
2238 * First we label the tape, then we fill
2239 * it with data get a new tape and write a few blocks.
2241 static void qfillcmd()
2247 Pmsg0(0, "Test writing blocks of 64512 bytes to tape.\n");
2249 get_cmd("How many blocks do you want to write? (1000): ");
2256 sm_check(__FILE__, __LINE__, false);
2257 block = new_block(dev);
2260 i = block->buf_len - 100;
2262 rec->data = check_pool_memory_size(rec->data, i);
2263 memset(rec->data, i & 0xFF, i);
2266 Pmsg1(0, "Begin writing %d Bacula blocks to tape ...\n", count);
2267 for (i=0; i < count; i++) {
2272 if (!write_record_to_block(block, rec)) {
2273 Pmsg0(0, _("Error writing record to block.\n"));
2276 if (!write_block_to_dev(dcr, block)) {
2277 Pmsg0(0, _("Error writing block to device.\n"));
2283 if (dev_cap(dev, CAP_TWOEOF)) {
2290 sm_check(__FILE__, __LINE__, false);
2293 sm_check(__FILE__, __LINE__, false);
2298 * Fill a tape using raw write() command
2300 static void rawfill_cmd()
2305 uint32_t block_num = 0;
2310 block = new_block(dev);
2311 fd = open("/dev/urandom", O_RDONLY);
2313 read(fd, block->buf, block->buf_len);
2316 uint32_t *p = (uint32_t *)block->buf;
2317 srandom(time(NULL));
2318 for (i=0; i<block->buf_len/sizeof(uint32_t); i++) {
2322 p = (uint32_t *)block->buf;
2323 Pmsg1(0, "Begin writing raw blocks of %u bytes.\n", block->buf_len);
2326 stat = write(dev->fd, block->buf, block->buf_len);
2327 if (stat == (int)block->buf_len) {
2328 if ((block_num++ % 100) == 0) {
2333 for (i=1; i<(block->buf_len-sizeof(uint32_t))/sizeof(uint32_t)-1; i++) {
2342 printf("Write failed at block %u. stat=%d ERR=%s\n", block_num, stat,
2343 strerror(my_errno));
2350 * Fill a tape using raw write() command
2352 static void bfill_cmd()
2355 uint32_t block_num = 0;
2361 block = new_block(dev);
2362 fd = open("/dev/urandom", O_RDONLY);
2364 read(fd, block->buf, block->buf_len);
2367 uint32_t *p = (uint32_t *)block->buf;
2368 srandom(time(NULL));
2369 for (i=0; i<block->buf_len/sizeof(uint32_t); i++) {
2373 p = (uint32_t *)block->buf;
2374 Pmsg1(0, "Begin writing Bacula blocks of %u bytes.\n", block->buf_len);
2377 block->binbuf = block->buf_len;
2378 block->bufp = block->buf + block->binbuf;
2379 if (!write_block_to_dev(dcr, block)) {
2382 if ((block_num++ % 100) == 0) {
2387 for (i=1; i<(block->buf_len/sizeof(uint32_t)-1); i++) {
2393 printf("Write failed at block %u.\n", block_num);
2399 struct cmdstruct { const char *key; void (*func)(); const char *help; };
2400 static struct cmdstruct commands[] = {
2401 {"autochanger", autochangercmd, "test autochanger"},
2402 {"bsf", bsfcmd, "backspace file"},
2403 {"bsr", bsrcmd, "backspace record"},
2404 {"bfill", bfill_cmd, "fill tape using Bacula writes"},
2405 {"cap", capcmd, "list device capabilities"},
2406 {"clear", clearcmd, "clear tape errors"},
2407 {"eod", eodcmd, "go to end of Bacula data for append"},
2408 {"eom", eomcmd, "go to the physical end of medium"},
2409 {"fill", fillcmd, "fill tape, write onto second volume"},
2410 {"unfill", unfillcmd, "read filled tape"},
2411 {"fsf", fsfcmd, "forward space a file"},
2412 {"fsr", fsrcmd, "forward space a record"},
2413 {"help", helpcmd, "print this command"},
2414 {"label", labelcmd, "write a Bacula label to the tape"},
2415 {"load", loadcmd, "load a tape"},
2416 {"quit", quitcmd, "quit btape"},
2417 {"rawfill", rawfill_cmd, "use write() to fill tape"},
2418 {"readlabel", readlabelcmd, "read and print the Bacula tape label"},
2419 {"rectest", rectestcmd, "test record handling functions"},
2420 {"rewind", rewindcmd, "rewind the tape"},
2421 {"scan", scancmd, "read() tape block by block to EOT and report"},
2422 {"scanblocks", scan_blocks, "Bacula read block by block to EOT and report"},
2423 {"status", statcmd, "print tape status"},
2424 {"test", testcmd, "General test Bacula tape functions"},
2425 {"weof", weofcmd, "write an EOF on the tape"},
2426 {"wr", wrcmd, "write a single Bacula block"},
2427 {"rr", rrcmd, "read a single record"},
2428 {"qfill", qfillcmd, "quick fill command"},
2430 #define comsize (sizeof(commands)/sizeof(struct cmdstruct))
2438 while (get_cmd("*")) {
2439 sm_check(__FILE__, __LINE__, false);
2441 parse_args(cmd, &args, &argc, argk, argv, MAX_CMD_ARGS);
2442 for (i=0; i<comsize; i++) /* search for command */
2443 if (argc > 0 && fstrsch(argk[0], commands[i].key)) {
2444 (*commands[i].func)(); /* go execute command */
2449 Pmsg1(0, _("%s is an illegal command\n"), cmd);
2455 static void helpcmd()
2459 printf(_("Interactive commands:\n"));
2460 printf(_(" Command Description\n ======= ===========\n"));
2461 for (i=0; i<comsize; i++)
2462 printf(" %-10s %s\n", commands[i].key, commands[i].help);
2469 "\nVersion: " VERSION " (" BDATE ")\n\n"
2470 "Usage: btape <options> <device_name>\n"
2471 " -b <file> specify bootstrap file\n"
2472 " -c <file> set configuration file to file\n"
2473 " -d <nn> set debug level to nn\n"
2474 " -p proceed inspite of I/O errors\n"
2475 " -s turn off signals\n"
2477 " -? print this message.\n"
2483 * Get next input command from terminal. This
2484 * routine is REALLY primitive, and should be enhanced
2485 * to have correct backspacing, etc.
2488 get_cmd(const char *prompt)
2492 fprintf(stdout, prompt);
2494 /* We really should turn off echoing and pretty this
2498 while ((ch = fgetc(stdin)) != EOF) {
2500 strip_trailing_junk(cmd);
2502 } else if (ch == 4 || ch == 0xd3 || ch == 0x8) {
2515 /* Dummies to replace askdir.c */
2516 bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;}
2517 bool dir_send_job_status(JCR *jcr) {return 1;}
2519 bool dir_update_volume_info(DCR *dcr, bool relabel)
2525 bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing)
2527 JCR *jcr = dcr->jcr;
2528 Dmsg0(20, "Enter dir_get_volume_info\n");
2529 bstrncpy(jcr->VolCatInfo.VolCatName, jcr->VolumeName, sizeof(jcr->VolCatInfo.VolCatName));
2533 bool dir_create_jobmedia_record(DCR *dcr)
2535 dcr->WroteVol = false;
2540 bool dir_find_next_appendable_volume(DCR *dcr)
2542 JCR *jcr = dcr->jcr;
2543 Dmsg1(20, "Enter dir_find_next_appendable_volume. stop=%d\n", stop);
2544 return jcr->VolumeName[0] != 0;
2547 bool dir_ask_sysop_to_mount_volume(DCR *dcr)
2549 DEVICE *dev = dcr->dev;
2550 JCR *jcr = dcr->jcr;
2551 Dmsg0(20, "Enter dir_ask_sysop_to_mount_volume\n");
2552 if (jcr->VolumeName[0] == 0) {
2553 return dir_ask_sysop_to_create_appendable_volume(dcr);
2555 /* Close device so user can use autochanger if desired */
2556 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
2559 force_close_dev(dev);
2560 Pmsg1(-1, "%s", dev->errmsg); /* print reason */
2561 if (jcr->VolumeName[0] == 0 || strcmp(jcr->VolumeName, "TestVolume2") == 0) {
2562 fprintf(stderr, "Mount second Volume on device %s and press return when ready: ",
2565 fprintf(stderr, "Mount Volume \"%s\" on device %s and press return when ready: ",
2566 jcr->VolumeName, dev_name(dev));
2572 bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr)
2575 DEVICE *dev = dcr->dev;
2576 JCR *jcr = dcr->jcr;
2577 Dmsg0(20, "Enter dir_ask_sysop_to_create_appendable_volume\n");
2579 set_volume_name("TestVolume1", 1);
2581 set_volume_name("TestVolume2", 2);
2583 /* Close device so user can use autochanger if desired */
2584 if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
2587 autochanger = autoload_device(dcr, 1, NULL);
2589 force_close_dev(dev);
2590 fprintf(stderr, "Mount blank Volume on device %s and press return when ready: ",
2594 open_device(jcr, dev);
2601 static bool my_mount_next_read_volume(JCR *jcr, DEVICE *dev, DEV_BLOCK *block)
2605 Dmsg0(20, "Enter my_mount_next_read_volume\n");
2606 Pmsg1(000, "End of Volume \"%s\"\n", jcr->VolumeName);
2608 if (LastBlock != block->BlockNumber) {
2609 VolBytes += block->block_len;
2611 LastBlock = block->BlockNumber;
2613 now -= jcr->run_time;
2617 kbs = (double)VolBytes / (1000.0 * (double)now);
2618 Pmsg3(-1, "Read block=%u, VolBytes=%s rate=%.1f KB/s\n", block->BlockNumber,
2619 edit_uint64_with_commas(VolBytes, ec1), (float)kbs);
2621 if (strcmp(jcr->VolumeName, "TestVolume2") == 0) {
2627 set_volume_name("TestVolume2", 2);
2629 create_vol_list(jcr);
2631 dev->state &= ~ST_READ;
2632 if (!acquire_device_for_read(jcr)) {
2633 Pmsg2(0, "Cannot open Dev=%s, Vol=%s\n", dev_name(dev), jcr->VolumeName);
2636 return true; /* next volume mounted */
2639 static void set_volume_name(const char *VolName, int volnum)
2641 DCR *dcr = jcr->dcr;
2642 VolumeName = VolName;
2644 pm_strcpy(&jcr->VolumeName, VolName);
2645 bstrncpy(dev->VolCatInfo.VolCatName, VolName, sizeof(dev->VolCatInfo.VolCatName));
2646 bstrncpy(jcr->VolCatInfo.VolCatName, VolName, sizeof(jcr->VolCatInfo.VolCatName));
2647 bstrncpy(dcr->VolCatInfo.VolCatName, VolName, sizeof(dcr->VolCatInfo.VolCatName));
2648 bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
2649 jcr->VolCatInfo.Slot = volnum;
2650 dcr->VolCatInfo.Slot = volnum;