]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/btape.c
Merge master with SF
[bacula/bacula] / bacula / src / stored / btape.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version two of the GNU General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  *
30  *   Bacula Tape manipulation program
31  *
32  *    Has various tape manipulation commands -- mostly for
33  *    use in determining how tapes really work.
34  *
35  *     Kern Sibbald, April MM
36  *
37  *   Note, this program reads stored.conf, and will only
38  *     talk to devices that are configured.
39  *
40  *   Version $Id$
41  *
42  */
43
44 #include "bacula.h"
45 #include "stored.h"
46
47 #ifdef USE_VTAPE
48 #include "vtape.h"
49 #endif
50
51 /* Dummy functions */
52 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
53 extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
54
55 /* External subroutines */
56 extern void free_config_resources();
57
58 /* Exported variables */
59 int quit = 0;
60 char buf[100000];
61 int bsize = TAPE_BSIZE;
62 char VolName[MAX_NAME_LENGTH];
63 STORES *me = NULL;                    /* our Global resource */
64 bool forge_on = false;                /* proceed inspite of I/O errors */
65 pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER;
66 pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER;
67
68 /*
69  * If you change the format of the state file,
70  *  increment this value
71  */
72 static uint32_t btape_state_level = 2;
73
74 DEVICE *dev = NULL;
75 DCR *dcr;
76 DEVRES *device = NULL;
77
78
79 /* Forward referenced subroutines */
80 static void do_tape_cmds();
81 static void helpcmd();
82 static void scancmd();
83 static void rewindcmd();
84 static void clearcmd();
85 static void wrcmd();
86 static void rrcmd();
87 static void rbcmd();
88 static void eodcmd();
89 static void fillcmd();
90 static void qfillcmd();
91 static void statcmd();
92 static void unfillcmd();
93 static int flush_block(DEV_BLOCK *block, int dump);
94 static bool quickie_cb(DCR *dcr, DEV_RECORD *rec);
95 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block);
96 static bool my_mount_next_read_volume(DCR *dcr);
97 static void scan_blocks();
98 static void set_volume_name(const char *VolName, int volnum);
99 static void rawfill_cmd();
100 static bool open_the_device();
101 static void autochangercmd();
102 static void do_unfill();
103
104
105 /* Static variables */
106 static CONFIG *config;
107 #define CONFIG_FILE "bacula-sd.conf"
108 char *configfile = NULL;
109
110 #define MAX_CMD_ARGS 30
111 static POOLMEM *cmd;
112 static POOLMEM *args;
113 static char *argk[MAX_CMD_ARGS];
114 static char *argv[MAX_CMD_ARGS];
115 static int argc;
116
117 static int quickie_count = 0;
118 static uint64_t write_count = 0;
119 static BSR *bsr = NULL;
120 static int signals = TRUE;
121 static bool ok;
122 static int stop = 0;
123 static uint64_t vol_size;
124 static uint64_t VolBytes;
125 static time_t now;
126 static double kbs;
127 static int32_t file_index;
128 static int end_of_tape = 0;
129 static uint32_t LastBlock = 0;
130 static uint32_t eot_block;
131 static uint32_t eot_block_len;
132 static uint32_t eot_FileIndex;
133 static int dumped = 0;
134 static DEV_BLOCK *last_block1 = NULL;
135 static DEV_BLOCK *last_block2 = NULL;
136 static DEV_BLOCK *last_block = NULL;
137 static DEV_BLOCK *this_block = NULL;
138 static DEV_BLOCK *first_block = NULL;
139 static uint32_t last_file1 = 0;
140 static uint32_t last_file2 = 0;
141 static uint32_t last_file = 0;
142 static uint32_t last_block_num1 = 0;
143 static uint32_t last_block_num2 = 0;
144 static uint32_t last_block_num = 0;
145 static uint32_t BlockNumber = 0;
146 static bool simple = true;
147
148 static const char *VolumeName = NULL;
149 static int vol_num = 0;
150
151 static JCR *jcr = NULL;
152
153
154 static void usage();
155 static void terminate_btape(int sig);
156 int get_cmd(const char *prompt);
157
158
159 /*********************************************************************
160  *
161  *     Bacula tape testing program
162  *
163  */
164 int main(int margc, char *margv[])
165 {
166    int ch, i;
167    uint32_t x32, y32;
168    uint64_t x64, y64;
169    char buf[1000];
170    
171    setlocale(LC_ALL, "");
172    bindtextdomain("bacula", LOCALEDIR);
173    textdomain("bacula");
174    init_stack_dump();
175
176    /* Sanity checks */
177    if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
178       Emsg2(M_ABORT, 0, _("Tape block size (%d) not multiple of system size (%d)\n"),
179          TAPE_BSIZE, B_DEV_BSIZE);
180    }
181    if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) {
182       Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE);
183    }
184    if (sizeof(boffset_t) < 8) {
185       Pmsg1(-1, _("\n\n!!!! Warning large disk addressing disabled. boffset_t=%d should be 8 or more !!!!!\n\n\n"),
186          sizeof(boffset_t));
187    }
188    x32 = 123456789;
189    bsnprintf(buf, sizeof(buf), "%u", x32);
190    i = bsscanf(buf, "%lu", &y32);
191    if (i != 1 || x32 != y32) {
192       Pmsg3(-1, _("32 bit printf/scanf problem. i=%d x32=%u y32=%u\n"), i, x32, y32);
193       exit(1);
194    }
195    x64 = 123456789;
196    x64 = x64 << 32;
197    x64 += 123456789;
198    bsnprintf(buf, sizeof(buf), "%" llu, x64);
199    i = bsscanf(buf, "%llu", &y64);
200    if (i != 1 || x64 != y64) {
201       Pmsg3(-1, _("64 bit printf/scanf problem. i=%d x64=%" llu " y64=%" llu "\n"), 
202             i, x64, y64);
203       exit(1);
204    }
205
206    printf(_("Tape block granularity is %d bytes.\n"), TAPE_BSIZE);
207
208    working_directory = "/tmp";
209    my_name_is(margc, margv, "btape");
210    init_msg(NULL, NULL);
211
212    OSDependentInit();
213
214    while ((ch = getopt(margc, margv, "b:c:d:psv?")) != -1) {
215       switch (ch) {
216       case 'b':                    /* bootstrap file */
217          bsr = parse_bsr(NULL, optarg);
218 //       dump_bsr(bsr, true);
219          break;
220
221       case 'c':                    /* specify config file */
222          if (configfile != NULL) {
223             free(configfile);
224          }
225          configfile = bstrdup(optarg);
226          break;
227
228       case 'd':                    /* set debug level */
229          if (*optarg == 't') {
230             dbg_timestamp = true;
231          } else {
232             debug_level = atoi(optarg);
233             if (debug_level <= 0) {
234                debug_level = 1;
235             }
236          }
237          break;
238
239       case 'p':
240          forge_on = true;
241          break;
242
243       case 's':
244          signals = false;
245          break;
246
247       case 'v':
248          verbose++;
249          break;
250
251       case '?':
252       default:
253          helpcmd();
254          exit(0);
255
256       }
257    }
258    margc -= optind;
259    margv += optind;
260
261    cmd = get_pool_memory(PM_FNAME);
262    args = get_pool_memory(PM_FNAME);
263
264    if (signals) {
265       init_signals(terminate_btape);
266    }
267
268    if (configfile == NULL) {
269       configfile = bstrdup(CONFIG_FILE);
270    }
271
272    daemon_start_time = time(NULL);
273
274    config = new_config_parser();
275    parse_sd_config(config, configfile, M_ERROR_TERM);
276
277    /* See if we can open a device */
278    if (margc == 0) {
279       Pmsg0(000, _("No archive name specified.\n"));
280       usage();
281       exit(1);
282    } else if (margc != 1) {
283       Pmsg0(000, _("Improper number of arguments specified.\n"));
284       usage();
285       exit(1);
286    }
287
288    jcr = setup_jcr("btape", margv[0], bsr, NULL, 0); /* write */
289    if (!jcr) {
290       exit(1);
291    }
292    dev = jcr->dcr->dev;
293    if (!dev) {
294       exit(1);
295    }
296    if (dev->is_dvd()) {
297       Pmsg0(000, _("btape does not work with DVD storage.\n"));
298       usage();
299       exit(1);
300    }
301    if (!dev->is_tape()) {
302       Pmsg0(000, _("btape only works with tape storage.\n"));
303       usage();
304       exit(1);
305    }
306    dcr = jcr->dcr;
307    if (!open_the_device()) {
308       goto terminate;
309    }
310
311    Dmsg0(200, "Do tape commands\n");
312    do_tape_cmds();
313
314 terminate:
315    terminate_btape(0);
316    return 0;
317 }
318
319 static void terminate_btape(int stat)
320 {
321
322    sm_check(__FILE__, __LINE__, false);
323    if (configfile) {
324       free(configfile);
325    }
326    if (config) {
327       config->free_resources();
328       free(config);
329       config = NULL;
330    }
331    if (args) {
332       free_pool_memory(args);
333       args = NULL;
334    }
335    if (cmd) {
336       free_pool_memory(cmd);
337       cmd = NULL;
338    }
339
340    if (bsr) {
341       free_bsr(bsr);
342    }
343
344    free_jcr(jcr);
345    jcr = NULL;
346
347    free_volume_lists();
348
349    if (dev) {
350       dev->term();
351    }
352
353    if (debug_level > 10)
354       print_memory_pool_stats();
355
356    if (this_block) {
357       free_block(this_block);
358    }
359
360    stop_watchdog();
361    term_msg();
362    term_last_jobs_list();
363    close_memory_pool();               /* free memory in pool */
364    lmgr_cleanup_main();
365
366    sm_dump(false);
367    exit(stat);
368 }
369
370 static bool open_the_device()
371 {
372    DEV_BLOCK *block;
373    bool ok = true;
374
375    block = new_block(dev);
376    dev->r_dlock();
377    Dmsg1(200, "Opening device %s\n", dcr->VolumeName);
378    if (dev->open(dcr, OPEN_READ_WRITE) < 0) {
379       Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), dev->errmsg);
380       ok = false;
381       goto bail_out;
382    }
383    Pmsg1(000, _("open device %s: OK\n"), dev->print_name());
384    dev->set_append();                 /* put volume in append mode */
385
386 bail_out:
387    dev->dunlock();
388    free_block(block);
389    return ok;
390 }
391
392
393 void quitcmd()
394 {
395    quit = 1;
396 }
397
398 /*
399  * Write a label to the tape
400  */
401 static void labelcmd()
402 {
403    if (VolumeName) {
404       pm_strcpy(cmd, VolumeName);
405    } else {
406       if (!get_cmd(_("Enter Volume Name: "))) {
407          return;
408       }
409    }
410
411    if (!dev->is_open()) {
412       if (!first_open_device(dcr)) {
413          Pmsg1(0, _("Device open failed. ERR=%s\n"), dev->bstrerror());
414       }
415    }
416    dev->rewind(dcr);
417    write_new_volume_label_to_dev(dcr, cmd, "Default", false,/*no relabel*/ true /* label dvd now */);
418    Pmsg1(-1, _("Wrote Volume label for volume \"%s\".\n"), cmd);
419 }
420
421 /*
422  * Read the tape label
423  */
424 static void readlabelcmd()
425 {
426    int save_debug_level = debug_level;
427    int stat;
428
429    stat = read_dev_volume_label(dcr);
430    switch (stat) {
431    case VOL_NO_LABEL:
432       Pmsg0(0, _("Volume has no label.\n"));
433       break;
434    case VOL_OK:
435       Pmsg0(0, _("Volume label read correctly.\n"));
436       break;
437    case VOL_IO_ERROR:
438       Pmsg1(0, _("I/O error on device: ERR=%s"), dev->bstrerror());
439       break;
440    case VOL_NAME_ERROR:
441       Pmsg0(0, _("Volume name error\n"));
442       break;
443    case VOL_CREATE_ERROR:
444       Pmsg1(0, _("Error creating label. ERR=%s"), dev->bstrerror());
445       break;
446    case VOL_VERSION_ERROR:
447       Pmsg0(0, _("Volume version error.\n"));
448       break;
449    case VOL_LABEL_ERROR:
450       Pmsg0(0, _("Bad Volume label type.\n"));
451       break;
452    default:
453       Pmsg0(0, _("Unknown error.\n"));
454       break;
455    }
456
457    debug_level = 20;
458    dump_volume_label(dev);
459    debug_level = save_debug_level;
460 }
461
462
463 /*
464  * Load the tape should have prevously been taken
465  * off line, otherwise this command is not necessary.
466  */
467 static void loadcmd()
468 {
469
470    if (!load_dev(dev)) {
471       Pmsg1(0, _("Bad status from load. ERR=%s\n"), dev->bstrerror());
472    } else
473       Pmsg1(0, _("Loaded %s\n"), dev->print_name());
474 }
475
476 /*
477  * Rewind the tape.
478  */
479 static void rewindcmd()
480 {
481    if (!dev->rewind(dcr)) {
482       Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
483       dev->clrerror(-1);
484    } else {
485       Pmsg1(0, _("Rewound %s\n"), dev->print_name());
486    }
487 }
488
489 /*
490  * Clear any tape error
491  */
492 static void clearcmd()
493 {
494    dev->clrerror(-1);
495 }
496
497 /*
498  * Write and end of file on the tape
499  */
500 static void weofcmd()
501 {
502    int num = 1;
503    if (argc > 1) {
504       num = atoi(argk[1]);
505    }
506    if (num <= 0) {
507       num = 1;
508    }
509
510    if (!dev->weof(num)) {
511       Pmsg1(0, _("Bad status from weof. ERR=%s\n"), dev->bstrerror());
512       return;
513    } else {
514       if (num==1) {
515          Pmsg1(0, _("Wrote 1 EOF to %s\n"), dev->print_name());
516       }
517       else {
518          Pmsg2(0, _("Wrote %d EOFs to %s\n"), num, dev->print_name());
519       }
520    }
521 }
522
523
524 /* Go to the end of the medium -- raw command
525  * The idea was orginally that the end of the Bacula
526  * medium would be flagged differently. This is not
527  * currently the case. So, this is identical to the
528  * eodcmd().
529  */
530 static void eomcmd()
531 {
532    if (!dev->eod(dcr)) {
533       Pmsg1(0, "%s", dev->bstrerror());
534       return;
535    } else {
536       Pmsg0(0, _("Moved to end of medium.\n"));
537    }
538 }
539
540 /*
541  * Go to the end of the medium (either hardware determined
542  *  or defined by two eofs.
543  */
544 static void eodcmd()
545 {
546    eomcmd();
547 }
548
549 /*
550  * Backspace file
551  */
552 static void bsfcmd()
553 {
554    int num = 1;
555    if (argc > 1) {
556       num = atoi(argk[1]);
557    }
558    if (num <= 0) {
559       num = 1;
560    }
561
562    if (!dev->bsf(num)) {
563       Pmsg1(0, _("Bad status from bsf. ERR=%s\n"), dev->bstrerror());
564    } else {
565       Pmsg2(0, _("Backspaced %d file%s.\n"), num, num==1?"":"s");
566    }
567 }
568
569 /*
570  * Backspace record
571  */
572 static void bsrcmd()
573 {
574    int num = 1;
575    if (argc > 1) {
576       num = atoi(argk[1]);
577    }
578    if (num <= 0) {
579       num = 1;
580    }
581    if (!dev->bsr(num)) {
582       Pmsg1(0, _("Bad status from bsr. ERR=%s\n"), dev->bstrerror());
583    } else {
584       Pmsg2(0, _("Backspaced %d record%s.\n"), num, num==1?"":"s");
585    }
586 }
587
588 /*
589  * List device capabilities as defined in the
590  *  stored.conf file.
591  */
592 static void capcmd()
593 {
594    printf(_("Configured device capabilities:\n"));
595    printf("%sEOF ", dev->capabilities & CAP_EOF ? "" : "!");
596    printf("%sBSR ", dev->capabilities & CAP_BSR ? "" : "!");
597    printf("%sBSF ", dev->capabilities & CAP_BSF ? "" : "!");
598    printf("%sFSR ", dev->capabilities & CAP_FSR ? "" : "!");
599    printf("%sFSF ", dev->capabilities & CAP_FSF ? "" : "!");
600    printf("%sFASTFSF ", dev->capabilities & CAP_FASTFSF ? "" : "!");
601    printf("%sBSFATEOM ", dev->capabilities & CAP_BSFATEOM ? "" : "!");
602    printf("%sEOM ", dev->capabilities & CAP_EOM ? "" : "!");
603    printf("%sREM ", dev->capabilities & CAP_REM ? "" : "!");
604    printf("%sRACCESS ", dev->capabilities & CAP_RACCESS ? "" : "!");
605    printf("%sAUTOMOUNT ", dev->capabilities & CAP_AUTOMOUNT ? "" : "!");
606    printf("%sLABEL ", dev->capabilities & CAP_LABEL ? "" : "!");
607    printf("%sANONVOLS ", dev->capabilities & CAP_ANONVOLS ? "" : "!");
608    printf("%sALWAYSOPEN ", dev->capabilities & CAP_ALWAYSOPEN ? "" : "!");
609    printf("%sMTIOCGET ", dev->capabilities & CAP_MTIOCGET ? "" : "!");
610    printf("\n");
611
612    printf(_("Device status:\n"));
613    printf("%sOPENED ", dev->is_open() ? "" : "!");
614    printf("%sTAPE ", dev->is_tape() ? "" : "!");
615    printf("%sLABEL ", dev->is_labeled() ? "" : "!");
616    printf("%sMALLOC ", dev->state & ST_MALLOC ? "" : "!");
617    printf("%sAPPEND ", dev->can_append() ? "" : "!");
618    printf("%sREAD ", dev->can_read() ? "" : "!");
619    printf("%sEOT ", dev->at_eot() ? "" : "!");
620    printf("%sWEOT ", dev->state & ST_WEOT ? "" : "!");
621    printf("%sEOF ", dev->at_eof() ? "" : "!");
622    printf("%sNEXTVOL ", dev->state & ST_NEXTVOL ? "" : "!");
623    printf("%sSHORT ", dev->state & ST_SHORT ? "" : "!");
624    printf("\n");
625
626    printf(_("Device parameters:\n"));
627    printf("Device name: %s\n", dev->dev_name);
628    printf("File=%u block=%u\n", dev->file, dev->block_num);
629    printf("Min block=%u Max block=%u\n", dev->min_block_size, dev->max_block_size);
630
631    printf(_("Status:\n"));
632    statcmd();
633
634 }
635
636 /*
637  * Test writing larger and larger records.
638  * This is a torture test for records.
639  */
640 static void rectestcmd()
641 {
642    DEV_BLOCK *block;
643    DEV_RECORD *rec;
644    int i, blkno = 0;
645
646    Pmsg0(0, _("Test writing larger and larger records.\n"
647 "This is a torture test for records.\nI am going to write\n"
648 "larger and larger records. It will stop when the record size\n"
649 "plus the header exceeds the block size (by default about 64K)\n"));
650
651
652    get_cmd(_("Do you want to continue? (y/n): "));
653    if (cmd[0] != 'y') {
654       Pmsg0(000, _("Command aborted.\n"));
655       return;
656    }
657
658    sm_check(__FILE__, __LINE__, false);
659    block = new_block(dev);
660    rec = new_record();
661
662    for (i=1; i<500000; i++) {
663       rec->data = check_pool_memory_size(rec->data, i);
664       memset(rec->data, i & 0xFF, i);
665       rec->data_len = i;
666       sm_check(__FILE__, __LINE__, false);
667       if (write_record_to_block(block, rec)) {
668          empty_block(block);
669          blkno++;
670          Pmsg2(0, _("Block %d i=%d\n"), blkno, i);
671       } else {
672          break;
673       }
674       sm_check(__FILE__, __LINE__, false);
675    }
676    free_record(rec);
677    free_block(block);
678    sm_check(__FILE__, __LINE__, false);
679 }
680
681 /*
682  * This test attempts to re-read a block written by Bacula
683  *   normally at the end of the tape. Bacula will then back up
684  *   over the two eof marks, backup over the record and reread
685  *   it to make sure it is valid.  Bacula can skip this validation
686  *   if you set "Backward space record = no"
687  */
688 static int re_read_block_test()
689 {
690    DEV_BLOCK *block = dcr->block;
691    DEV_RECORD *rec;
692    int stat = 0;
693    int len;
694
695    if (!(dev->capabilities & CAP_BSR)) {
696       Pmsg0(-1, _("Skipping read backwards test because BSR turned off.\n"));
697       return 0;
698    }
699
700    Pmsg0(-1, _("\n=== Write, backup, and re-read test ===\n\n"
701       "I'm going to write three records and an EOF\n"
702       "then backup over the EOF and re-read the last record.\n"
703       "Bacula does this after writing the last block on the\n"
704       "tape to verify that the block was written correctly.\n\n"
705       "This is not an *essential* feature ...\n\n"));
706    rewindcmd();
707    empty_block(block);
708    rec = new_record();
709    rec->data = check_pool_memory_size(rec->data, block->buf_len);
710    len = rec->data_len = block->buf_len-100;
711    memset(rec->data, 1, rec->data_len);
712    if (!write_record_to_block(block, rec)) {
713       Pmsg0(0, _("Error writing record to block.\n"));
714       goto bail_out;
715    }
716    if (!write_block_to_dev(dcr)) {
717       Pmsg0(0, _("Error writing block to device.\n"));
718       goto bail_out;
719    } else {
720       Pmsg1(0, _("Wrote first record of %d bytes.\n"), rec->data_len);
721    }
722    memset(rec->data, 2, rec->data_len);
723    if (!write_record_to_block(block, rec)) {
724       Pmsg0(0, _("Error writing record to block.\n"));
725       goto bail_out;
726    }
727    if (!write_block_to_dev(dcr)) {
728       Pmsg0(0, _("Error writing block to device.\n"));
729       goto bail_out;
730    } else {
731       Pmsg1(0, _("Wrote second record of %d bytes.\n"), rec->data_len);
732    }
733    memset(rec->data, 3, rec->data_len);
734    if (!write_record_to_block(block, rec)) {
735       Pmsg0(0, _("Error writing record to block.\n"));
736       goto bail_out;
737    }
738    if (!write_block_to_dev(dcr)) {
739       Pmsg0(0, _("Error writing block to device.\n"));
740       goto bail_out;
741    } else {
742       Pmsg1(0, _("Wrote third record of %d bytes.\n"), rec->data_len);
743    }
744    weofcmd();
745    if (dev->has_cap(CAP_TWOEOF)) {
746       weofcmd();
747    }
748    if (!dev->bsf(1)) {
749       Pmsg1(0, _("Backspace file failed! ERR=%s\n"), dev->bstrerror());
750       goto bail_out;
751    }
752    if (dev->has_cap(CAP_TWOEOF)) {
753       if (!dev->bsf(1)) {
754          Pmsg1(0, _("Backspace file failed! ERR=%s\n"), dev->bstrerror());
755          goto bail_out;
756       }
757    }
758    Pmsg0(0, _("Backspaced over EOF OK.\n"));
759    if (!dev->bsr(1)) {
760       Pmsg1(0, _("Backspace record failed! ERR=%s\n"), dev->bstrerror());
761       goto bail_out;
762    }
763    Pmsg0(0, _("Backspace record OK.\n"));
764    if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
765       berrno be;
766       Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
767       goto bail_out;
768    }
769    memset(rec->data, 0, rec->data_len);
770    if (!read_record_from_block(dcr, block, rec)) {
771       berrno be;
772       Pmsg1(0, _("Read block failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
773       goto bail_out;
774    }
775    for (int i=0; i<len; i++) {
776       if (rec->data[i] != 3) {
777          Pmsg0(0, _("Bad data in record. Test failed!\n"));
778          goto bail_out;
779       }
780    }
781    Pmsg0(0, _("\nBlock re-read correct. Test succeeded!\n"));
782    Pmsg0(-1, _("=== End Write, backup, and re-read test ===\n\n"));
783
784    stat = 1;
785
786 bail_out:
787    free_record(rec);
788    if (stat == 0) {
789       Pmsg0(0, _("This is not terribly serious since Bacula only uses\n"
790                  "this function to verify the last block written to the\n"
791                  "tape. Bacula will skip the last block verification\n"
792                  "if you add:\n\n"
793                   "Backward Space Record = No\n\n"
794                   "to your Storage daemon's Device resource definition.\n"));
795    }
796    return stat;
797 }
798
799 const int num_recs = 10000;
800
801 static bool write_two_files()
802 {
803    DEV_BLOCK *block;
804    DEV_RECORD *rec;
805    int len, i, j;
806    int *p;
807    bool rc = false;       /* bad return code */
808
809    Pmsg2(-1, _("\n=== Write, rewind, and re-read test ===\n\n"
810       "I'm going to write %d records and an EOF\n"
811       "then write %d records and an EOF, then rewind,\n"
812       "and re-read the data to verify that it is correct.\n\n"
813       "This is an *essential* feature ...\n\n"), num_recs, num_recs);
814
815    block = dcr->block;
816    empty_block(block);
817    rec = new_record();
818    rec->data = check_pool_memory_size(rec->data, block->buf_len);
819    rec->data_len = block->buf_len-100;
820    len = rec->data_len/sizeof(i);
821
822    if (!dev->rewind(dcr)) {
823       Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
824       goto bail_out;
825    }
826
827    for (i=1; i<=num_recs; i++) {
828       p = (int *)rec->data;
829       for (j=0; j<len; j++) {
830          *p++ = i;
831       }
832       if (!write_record_to_block(block, rec)) {
833          Pmsg0(0, _("Error writing record to block.\n"));
834          goto bail_out;
835       }
836       if (!write_block_to_dev(dcr)) {
837          Pmsg0(0, _("Error writing block to device.\n"));
838          goto bail_out;
839       }
840    }
841    Pmsg2(0, _("Wrote %d blocks of %d bytes.\n"), num_recs, rec->data_len);
842    weofcmd();
843    for (i=num_recs+1; i<=2*num_recs; i++) {
844       p = (int *)rec->data;
845       for (j=0; j<len; j++) {
846          *p++ = i;
847       }
848       if (!write_record_to_block(block, rec)) {
849          Pmsg0(0, _("Error writing record to block.\n"));
850          goto bail_out;
851       }
852       if (!write_block_to_dev(dcr)) {
853          Pmsg0(0, _("Error writing block to device.\n"));
854          goto bail_out;
855       }
856    }
857    Pmsg2(0, _("Wrote %d blocks of %d bytes.\n"), num_recs, rec->data_len);
858    weofcmd();
859    if (dev->has_cap(CAP_TWOEOF)) {
860       weofcmd();
861    }
862    rc = true;
863
864 bail_out:
865    free_record(rec);
866    return rc;
867
868 }
869
870 /*
871  * This test writes Bacula blocks to the tape in
872  *   several files. It then rewinds the tape and attepts
873  *   to read these blocks back checking the data.
874  */
875 static int write_read_test()
876 {
877    DEV_BLOCK *block;
878    DEV_RECORD *rec;
879    int stat = 0;
880    int len, i, j;
881    int *p;
882
883    rec = new_record();
884
885    if (!write_two_files()) {
886       goto bail_out;
887    }
888
889    block = dcr->block;
890    empty_block(block);
891
892    if (!dev->rewind(dcr)) {
893       Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
894       goto bail_out;
895    } else {
896       Pmsg0(0, _("Rewind OK.\n"));
897    }
898
899    rec->data = check_pool_memory_size(rec->data, block->buf_len);
900    rec->data_len = block->buf_len-100;
901    len = rec->data_len/sizeof(i);
902
903    /* Now read it back */
904    for (i=1; i<=2*num_recs; i++) {
905 read_again:
906       if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
907          berrno be;
908          if (dev_state(dev, ST_EOF)) {
909             Pmsg0(-1, _("Got EOF on tape.\n"));
910             if (i == 1001) {
911                goto read_again;
912             }
913          }
914          Pmsg2(0, _("Read block %d failed! ERR=%s\n"), i, be.bstrerror(dev->dev_errno));
915          goto bail_out;
916       }
917       memset(rec->data, 0, rec->data_len);
918       if (!read_record_from_block(dcr, block, rec)) {
919          berrno be;
920          Pmsg2(0, _("Read record failed. Block %d! ERR=%s\n"), i, be.bstrerror(dev->dev_errno));
921          goto bail_out;
922       }
923       p = (int *)rec->data;
924       for (j=0; j<len; j++) {
925          if (*p != i) {
926             Pmsg3(0, _("Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"),
927                i, *p, j);
928             goto bail_out;
929          }
930          p++;
931       }
932       if (i == num_recs || i == 2*num_recs) {
933          Pmsg1(-1, _("%d blocks re-read correctly.\n"), num_recs);
934       }
935    }
936    Pmsg0(-1, _("=== Test Succeeded. End Write, rewind, and re-read test ===\n\n"));
937    stat = 1;
938
939 bail_out:
940    free_record(rec);
941    return stat;
942 }
943
944 /*
945  * This test writes Bacula blocks to the tape in
946  *   several files. It then rewinds the tape and attepts
947  *   to read these blocks back checking the data.
948  */
949 static int position_test()
950 {
951    DEV_BLOCK *block = dcr->block;
952    DEV_RECORD *rec;
953    int stat = 0;
954    int len, j;
955    bool ok = true;
956    int recno = 0;
957    int file = 0, blk = 0;
958    int *p;
959    bool got_eof = false;
960
961    block = dcr->block;
962    empty_block(block);
963    rec = new_record();
964    rec->data = check_pool_memory_size(rec->data, block->buf_len);
965    rec->data_len = block->buf_len-100;
966    len = rec->data_len/sizeof(j);
967
968    if (!dev->rewind(dcr)) {
969       Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
970       goto bail_out;
971    } else {
972       Pmsg0(0, _("Rewind OK.\n"));
973    }
974
975    while(ok) {
976       /* Set up next item to read based on where we are */
977       switch (recno) {
978       case 0:
979          recno = 5;
980          file = 0;
981          blk = 4;
982          break;
983       case 5:
984          recno = 201;
985          file = 0;
986          blk = 200;
987          break;
988       case 201:
989          recno = 1000;
990          file = 0;
991          blk = 999;
992          break;
993       case 1000:
994          recno = 1001;
995          file = 1;
996          blk = 0;
997          break;
998       case 1001:
999          recno = 1601;
1000          file = 1;
1001          blk = 600;
1002          break;
1003       case 1601:
1004          recno = 2000;
1005          file = 1;
1006          blk = 999;
1007          break;
1008       case 2000:
1009          ok = false;
1010          continue;
1011       }
1012       Pmsg2(-1, _("Reposition to file:block %d:%d\n"), file, blk);
1013       if (!dev->reposition(dcr, file, blk)) {
1014          Pmsg0(0, _("Reposition error.\n"));
1015          goto bail_out;
1016       }
1017 read_again:
1018       if (!read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK)) {
1019          berrno be;
1020          if (dev_state(dev, ST_EOF)) {
1021             Pmsg0(-1, _("Got EOF on tape.\n"));
1022             if (!got_eof) {
1023                got_eof = true;
1024                goto read_again;
1025             }
1026          }
1027          Pmsg4(0, _("Read block %d failed! file=%d blk=%d. ERR=%s\n\n"),
1028             recno, file, blk, be.bstrerror(dev->dev_errno));
1029          Pmsg0(0, _("This may be because the tape drive block size is not\n"
1030                     " set to variable blocking as normally used by Bacula.\n"
1031                     " Please see the Tape Testing chapter in the manual and \n"
1032                     " look for using mt with defblksize and setoptions\n"
1033                     "If your tape drive block size is correct, then perhaps\n"
1034                     " your SCSI driver is *really* stupid and does not\n"
1035                     " correctly report the file:block after a FSF. In this\n"
1036                     " case try setting:\n"
1037                     "    Fast Forward Space File = no\n"
1038                     " in your Device resource.\n"));
1039
1040          goto bail_out;
1041       }
1042       memset(rec->data, 0, rec->data_len);
1043       if (!read_record_from_block(dcr, block, rec)) {
1044          berrno be;
1045          Pmsg1(0, _("Read record failed! ERR=%s\n"), be.bstrerror(dev->dev_errno));
1046          goto bail_out;
1047       }
1048       p = (int *)rec->data;
1049       for (j=0; j<len; j++) {
1050          if (p[j] != recno) {
1051             Pmsg3(0, _("Bad data in record. Expected %d, got %d at byte %d. Test failed!\n"),
1052                recno, p[j], j);
1053             goto bail_out;
1054          }
1055       }
1056       Pmsg1(-1, _("Block %d re-read correctly.\n"), recno);
1057    }
1058    Pmsg0(-1, _("=== Test Succeeded. End Write, rewind, and re-read test ===\n\n"));
1059    stat = 1;
1060
1061 bail_out:
1062    free_record(rec);
1063    return stat;
1064 }
1065
1066
1067
1068
1069 /*
1070  * This test writes some records, then writes an end of file,
1071  *   rewinds the tape, moves to the end of the data and attepts
1072  *   to append to the tape.  This function is essential for
1073  *   Bacula to be able to write multiple jobs to the tape.
1074  */
1075 static int append_test()
1076 {
1077    Pmsg0(-1, _("\n\n=== Append files test ===\n\n"
1078                "This test is essential to Bacula.\n\n"
1079 "I'm going to write one record  in file 0,\n"
1080 "                   two records in file 1,\n"
1081 "             and three records in file 2\n\n"));
1082    argc = 1;
1083    rewindcmd();
1084    wrcmd();
1085    weofcmd();      /* end file 0 */
1086    wrcmd();
1087    wrcmd();
1088    weofcmd();      /* end file 1 */
1089    wrcmd();
1090    wrcmd();
1091    wrcmd();
1092    weofcmd();     /* end file 2 */
1093    if (dev->has_cap(CAP_TWOEOF)) {
1094       weofcmd();
1095    }
1096    dev->close();              /* release device */
1097    if (!open_the_device()) {
1098       return -1;
1099    }
1100    rewindcmd();
1101    Pmsg0(0, _("Now moving to end of medium.\n"));
1102    eodcmd();
1103    Pmsg2(-1, _("We should be in file 3. I am at file %d. %s\n"),
1104       dev->file, dev->file == 3 ? _("This is correct!") : _("This is NOT correct!!!!"));
1105
1106    if (dev->file != 3) {
1107       return -1;
1108    }
1109
1110    Pmsg0(-1, _("\nNow the important part, I am going to attempt to append to the tape.\n\n"));
1111    wrcmd();
1112    weofcmd();
1113    if (dev->has_cap(CAP_TWOEOF)) {
1114       weofcmd();
1115    }
1116    rewindcmd();
1117    Pmsg0(-1, _("Done appending, there should be no I/O errors\n\n"));
1118    Pmsg0(-1, _("Doing Bacula scan of blocks:\n"));
1119    scan_blocks();
1120    Pmsg0(-1, _("End scanning the tape.\n"));
1121    Pmsg2(-1, _("We should be in file 4. I am at file %d. %s\n"),
1122       dev->file, dev->file == 4 ? _("This is correct!") : _("This is NOT correct!!!!"));
1123
1124    if (dev->file != 4) {
1125       return -2;
1126    }
1127    return 1;
1128 }
1129
1130
1131 /*
1132  * This test exercises the autochanger
1133  */
1134 static int autochanger_test()
1135 {
1136    POOLMEM *results, *changer;
1137    int slot, status, loaded;
1138    int timeout = dcr->device->max_changer_wait;
1139    int sleep_time = 0;
1140
1141    Dmsg1(100, "Max changer wait = %d sec\n", timeout);
1142    if (!dev->has_cap(CAP_AUTOCHANGER)) {
1143       return 1;
1144    }
1145    if (!(dcr->device && dcr->device->changer_name && dcr->device->changer_command)) {
1146       Pmsg0(-1, _("\nAutochanger enabled, but no name or no command device specified.\n"));
1147       return 1;
1148    }
1149
1150    Pmsg0(-1, _("\nAh, I see you have an autochanger configured.\n"
1151              "To test the autochanger you must have a blank tape\n"
1152              " that I can write on in Slot 1.\n"));
1153    if (!get_cmd(_("\nDo you wish to continue with the Autochanger test? (y/n): "))) {
1154       return 0;
1155    }
1156    if (cmd[0] != 'y' && cmd[0] != 'Y') {
1157       return 0;
1158    }
1159
1160    Pmsg0(-1, _("\n\n=== Autochanger test ===\n\n"));
1161
1162    results = get_pool_memory(PM_MESSAGE);
1163    changer = get_pool_memory(PM_FNAME);
1164
1165 try_again:
1166    slot = 1;
1167    dcr->VolCatInfo.Slot = slot;
1168    /* Find out what is loaded, zero means device is unloaded */
1169    Pmsg0(-1, _("3301 Issuing autochanger \"loaded\" command.\n"));
1170    changer = edit_device_codes(dcr, changer, 
1171                 dcr->device->changer_command, "loaded");
1172    status = run_program(changer, timeout, results);
1173    Dmsg3(100, "run_prog: %s stat=%d result=\"%s\"\n", changer, status, results);
1174    if (status == 0) {
1175       loaded = atoi(results);
1176    } else {
1177       berrno be;
1178       Pmsg1(-1, _("3991 Bad autochanger command: %s\n"), changer);
1179       Pmsg2(-1, _("3991 result=\"%s\": ERR=%s\n"), results, be.bstrerror(status));
1180       goto bail_out;
1181    }
1182    if (loaded) {
1183       Pmsg1(-1, _("Slot %d loaded. I am going to unload it.\n"), loaded);
1184    } else {
1185       Pmsg0(-1, _("Nothing loaded in the drive. OK.\n"));
1186    }
1187    Dmsg1(100, "Results from loaded query=%s\n", results);
1188    if (loaded) {
1189       dcr->VolCatInfo.Slot = loaded;
1190       /* We are going to load a new tape, so close the device */
1191       dev->close();
1192       Pmsg2(-1, _("3302 Issuing autochanger \"unload %d %d\" command.\n"),
1193          loaded, dev->drive_index);
1194       changer = edit_device_codes(dcr, changer, 
1195                    dcr->device->changer_command, "unload");
1196       status = run_program(changer, timeout, results);
1197       Pmsg2(-1, _("unload status=%s %d\n"), status==0?_("OK"):_("Bad"), status);
1198       if (status != 0) {
1199          berrno be;
1200          Pmsg1(-1, _("3992 Bad autochanger command: %s\n"), changer);
1201          Pmsg2(-1, _("3992 result=\"%s\": ERR=%s\n"), results, be.bstrerror(status));
1202       }
1203    }
1204
1205    /*
1206     * Load the Slot 1
1207     */
1208
1209    slot = 1;
1210    dcr->VolCatInfo.Slot = slot;
1211    Pmsg2(-1, _("3303 Issuing autochanger \"load %d %d\" command.\n"),
1212       slot, dev->drive_index);
1213    changer = edit_device_codes(dcr, changer, 
1214                 dcr->device->changer_command, "load");
1215    Dmsg1(100, "Changer=%s\n", changer);
1216    dev->close();
1217    status = run_program(changer, timeout, results);
1218    if (status == 0) {
1219       Pmsg2(-1,  _("3303 Autochanger \"load %d %d\" status is OK.\n"),
1220          slot, dev->drive_index);
1221    } else {
1222       berrno be;
1223       Pmsg1(-1, _("3993 Bad autochanger command: %s\n"), changer);
1224       Pmsg2(-1, _("3993 result=\"%s\": ERR=%s\n"), results, be.bstrerror(status));
1225       goto bail_out;
1226    }
1227
1228    if (!open_the_device()) {
1229       goto bail_out;
1230    }
1231    /*
1232     * Start with sleep_time 0 then increment by 30 seconds if we get
1233     * a failure.
1234     */
1235    bmicrosleep(sleep_time, 0);
1236    if (!dev->rewind(dcr) || !dev->weof(1)) {
1237       Pmsg1(0, _("Bad status from rewind. ERR=%s\n"), dev->bstrerror());
1238       dev->clrerror(-1);
1239       Pmsg0(-1, _("\nThe test failed, probably because you need to put\n"
1240                 "a longer sleep time in the mtx-script in the load) case.\n"
1241                 "Adding a 30 second sleep and trying again ...\n"));
1242       sleep_time += 30;
1243       goto try_again;
1244    } else {
1245       Pmsg1(0, _("Rewound %s\n"), dev->print_name());
1246    }
1247
1248    if (!dev->weof(1)) {
1249       Pmsg1(0, _("Bad status from weof. ERR=%s\n"), dev->bstrerror());
1250       goto bail_out;
1251    } else {
1252       Pmsg1(0, _("Wrote EOF to %s\n"), dev->print_name());
1253    }
1254
1255    if (sleep_time) {
1256       Pmsg1(-1, _("\nThe test worked this time. Please add:\n\n"
1257                 "   sleep %d\n\n"
1258                 "to your mtx-changer script in the load) case.\n\n"),
1259                 sleep_time);
1260    } else {
1261       Pmsg0(-1, _("\nThe test autochanger worked!!\n\n"));
1262    }
1263
1264    free_pool_memory(changer);
1265    free_pool_memory(results);
1266    return 1;
1267
1268
1269 bail_out:
1270    free_pool_memory(changer);
1271    free_pool_memory(results);
1272    Pmsg0(-1, _("You must correct this error or the Autochanger will not work.\n"));
1273    return -2;
1274 }
1275
1276 static void autochangercmd()
1277 {
1278    autochanger_test();
1279 }
1280
1281
1282 /*
1283  * This test assumes that the append test has been done,
1284  *   then it tests the fsf function.
1285  */
1286 static int fsf_test()
1287 {
1288    bool set_off = false;
1289
1290    Pmsg0(-1, _("\n\n=== Forward space files test ===\n\n"
1291                "This test is essential to Bacula.\n\n"
1292                "I'm going to write five files then test forward spacing\n\n"));
1293    argc = 1;
1294    rewindcmd();
1295    wrcmd();
1296    weofcmd();      /* end file 0 */
1297    wrcmd();
1298    wrcmd();
1299    weofcmd();      /* end file 1 */
1300    wrcmd();
1301    wrcmd();
1302    wrcmd();
1303    weofcmd();     /* end file 2 */
1304    wrcmd();
1305    wrcmd();
1306    weofcmd();     /* end file 3 */
1307    wrcmd();
1308    weofcmd();     /* end file 4 */
1309    if (dev->has_cap(CAP_TWOEOF)) {
1310       weofcmd();
1311    }
1312
1313 test_again:
1314    rewindcmd();
1315    Pmsg0(0, _("Now forward spacing 1 file.\n"));
1316    if (!dev->fsf(1)) {
1317       Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1318       goto bail_out;
1319    }
1320    Pmsg2(-1, _("We should be in file 1. I am at file %d. %s\n"),
1321       dev->file, dev->file == 1 ? _("This is correct!") : _("This is NOT correct!!!!"));
1322
1323    if (dev->file != 1) {
1324       goto bail_out;
1325    }
1326
1327    Pmsg0(0, _("Now forward spacing 2 files.\n"));
1328    if (!dev->fsf(2)) {
1329       Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1330       goto bail_out;
1331    }
1332    Pmsg2(-1, _("We should be in file 3. I am at file %d. %s\n"),
1333       dev->file, dev->file == 3 ? _("This is correct!") : _("This is NOT correct!!!!"));
1334
1335    if (dev->file != 3) {
1336       goto bail_out;
1337    }
1338
1339    rewindcmd();
1340    Pmsg0(0, _("Now forward spacing 4 files.\n"));
1341    if (!dev->fsf(4)) {
1342       Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1343       goto bail_out;
1344    }
1345    Pmsg2(-1, _("We should be in file 4. I am at file %d. %s\n"),
1346       dev->file, dev->file == 4 ? _("This is correct!") : _("This is NOT correct!!!!"));
1347
1348    if (dev->file != 4) {
1349       goto bail_out;
1350    }
1351    if (set_off) {
1352       Pmsg0(-1, _("The test worked this time. Please add:\n\n"
1353                 "   Fast Forward Space File = no\n\n"
1354                 "to your Device resource for this drive.\n"));
1355    }
1356
1357    Pmsg0(-1, "\n");
1358    Pmsg0(0, _("Now forward spacing 1 more file.\n"));
1359    if (!dev->fsf(1)) {
1360       Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1361    }
1362    Pmsg2(-1, _("We should be in file 5. I am at file %d. %s\n"),
1363       dev->file, dev->file == 5 ? _("This is correct!") : _("This is NOT correct!!!!"));
1364    if (dev->file != 5) {
1365       goto bail_out;
1366    }
1367    Pmsg0(-1, _("\n=== End Forward space files test ===\n\n"));
1368    return 1;
1369
1370 bail_out:
1371    Pmsg0(-1, _("\nThe forward space file test failed.\n"));
1372    if (dev->has_cap(CAP_FASTFSF)) {
1373       Pmsg0(-1, _("You have Fast Forward Space File enabled.\n"
1374               "I am turning it off then retrying the test.\n"));
1375       dev->clear_cap(CAP_FASTFSF);
1376       set_off = true;
1377       goto test_again;
1378    }
1379    Pmsg0(-1, _("You must correct this error or Bacula will not work.\n"
1380             "Some systems, e.g. OpenBSD, require you to set\n"
1381             "   Use MTIOCGET= no\n"
1382             "in your device resource. Use with caution.\n"));
1383    return -2;
1384 }
1385
1386
1387
1388
1389
1390 /*
1391  * This is a general test of Bacula's functions
1392  *   needed to read and write the tape.
1393  */
1394 static void testcmd()
1395 {
1396    int stat;
1397
1398    if (!write_read_test()) {
1399       return;
1400    }
1401    if (!position_test()) {
1402       return;
1403    }
1404
1405    stat = append_test();
1406    if (stat == 1) {                   /* OK get out */
1407       goto all_done;
1408    }
1409    if (stat == -1) {                  /* first test failed */
1410       if (dev->has_cap(CAP_EOM) || dev->has_cap(CAP_FASTFSF)) {
1411          Pmsg0(-1, _("\nAppend test failed. Attempting again.\n"
1412                    "Setting \"Hardware End of Medium = no\n"
1413                    "    and \"Fast Forward Space File = no\n"
1414                    "and retrying append test.\n\n"));
1415          dev->clear_cap(CAP_EOM);      /* turn off eom */
1416          dev->clear_cap(CAP_FASTFSF);  /* turn off fast fsf */
1417          stat = append_test();
1418          if (stat == 1) {
1419             Pmsg0(-1, _("\n\nIt looks like the test worked this time, please add:\n\n"
1420                      "    Hardware End of Medium = No\n\n"
1421                      "    Fast Forward Space File = No\n"
1422                      "to your Device resource in the Storage conf file.\n"));
1423             goto all_done;
1424          }
1425          if (stat == -1) {
1426             Pmsg0(-1, _("\n\nThat appears *NOT* to have corrected the problem.\n"));
1427             goto failed;
1428          }
1429          /* Wrong count after append */
1430          if (stat == -2) {
1431             Pmsg0(-1, _("\n\nIt looks like the append failed. Attempting again.\n"
1432                      "Setting \"BSF at EOM = yes\" and retrying append test.\n"));
1433             dev->capabilities |= CAP_BSFATEOM; /* backspace on eom */
1434             stat = append_test();
1435             if (stat == 1) {
1436                Pmsg0(-1, _("\n\nIt looks like the test worked this time, please add:\n\n"
1437                      "    Hardware End of Medium = No\n"
1438                      "    Fast Forward Space File = No\n"
1439                      "    BSF at EOM = yes\n\n"
1440                      "to your Device resource in the Storage conf file.\n"));
1441                goto all_done;
1442             }
1443          }
1444
1445       }
1446 failed:
1447       Pmsg0(-1, _("\nAppend test failed.\n\n"
1448             "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
1449             "Unable to correct the problem. You MUST fix this\n"
1450              "problem before Bacula can use your tape drive correctly\n"
1451             "\nPerhaps running Bacula in fixed block mode will work.\n"
1452             "Do so by setting:\n\n"
1453             "Minimum Block Size = nnn\n"
1454             "Maximum Block Size = nnn\n\n"
1455             "in your Storage daemon's Device definition.\n"
1456             "nnn must match your tape driver's block size, which\n"
1457             "can be determined by reading your tape manufacturers\n"
1458             "information, and the information on your kernel dirver.\n"
1459             "Fixed block sizes, however, are not normally an ideal solution.\n"
1460             "\n"
1461             "Some systems, e.g. OpenBSD, require you to set\n"
1462             "   Use MTIOCGET= no\n"
1463             "in your device resource. Use with caution.\n"));
1464        return;
1465    }
1466
1467 all_done:
1468    Pmsg0(-1, _("\nThe above Bacula scan should have output identical to what follows.\n"
1469         "Please double check it ...\n"
1470         "=== Sample correct output ===\n"
1471         "1 block of 64448 bytes in file 1\n"
1472         "End of File mark.\n"
1473         "2 blocks of 64448 bytes in file 2\n"
1474         "End of File mark.\n"
1475         "3 blocks of 64448 bytes in file 3\n"
1476         "End of File mark.\n"
1477         "1 block of 64448 bytes in file 4\n"
1478         "End of File mark.\n"
1479         "Total files=4, blocks=7, bytes = 451,136\n"
1480         "=== End sample correct output ===\n\n"
1481         "If the above scan output is not identical to the\n"
1482         "sample output, you MUST correct the problem\n"
1483         "or Bacula will not be able to write multiple Jobs to \n"
1484         "the tape.\n\n"));
1485
1486    if (stat == 1) {
1487       re_read_block_test();
1488    }
1489
1490    fsf_test();                        /* do fast forward space file test */
1491
1492    autochanger_test();                /* do autochanger test */
1493
1494 }
1495
1496 /* Forward space a file */
1497 static void fsfcmd()
1498 {
1499    int num = 1;
1500    if (argc > 1) {
1501       num = atoi(argk[1]);
1502    }
1503    if (num <= 0) {
1504       num = 1;
1505    }
1506    if (!dev->fsf(num)) {
1507       Pmsg1(0, _("Bad status from fsf. ERR=%s\n"), dev->bstrerror());
1508       return;
1509    }
1510    if (num == 1) {
1511       Pmsg0(0, _("Forward spaced 1 file.\n"));
1512    }
1513    else {
1514       Pmsg1(0, _("Forward spaced %d files.\n"), num);
1515    }
1516 }
1517
1518 /* Forward space a record */
1519 static void fsrcmd()
1520 {
1521    int num = 1;
1522    if (argc > 1) {
1523       num = atoi(argk[1]);
1524    }
1525    if (num <= 0) {
1526       num = 1;
1527    }
1528    if (!dev->fsr(num)) {
1529       Pmsg1(0, _("Bad status from fsr. ERR=%s\n"), dev->bstrerror());
1530       return;
1531    }
1532    if (num == 1) {
1533       Pmsg0(0, _("Forward spaced 1 record.\n"));
1534    }
1535    else {
1536       Pmsg1(0, _("Forward spaced %d records.\n"), num);
1537    }
1538 }
1539
1540 /*
1541  * Read a Bacula block from the tape
1542  */
1543 static void rbcmd()
1544 {
1545    dev->open(dcr, OPEN_READ_ONLY);
1546    read_block_from_dev(dcr, NO_BLOCK_NUMBER_CHECK);  
1547 }
1548
1549 /*
1550  * Write a Bacula block to the tape
1551  */
1552 static void wrcmd()
1553 {
1554    DEV_BLOCK *block = dcr->block;
1555    DEV_RECORD *rec = dcr->rec;
1556    int i;
1557
1558    if (!dev->is_open()) {
1559       open_the_device();
1560    }
1561    sm_check(__FILE__, __LINE__, false);
1562    empty_block(block);
1563    if (verbose > 1) {
1564       dump_block(block, "test");
1565    }
1566
1567    i = block->buf_len - 100;
1568    ASSERT (i > 0);
1569    rec->data = check_pool_memory_size(rec->data, i);
1570    memset(rec->data, i & 0xFF, i);
1571    rec->data_len = i;
1572    sm_check(__FILE__, __LINE__, false);
1573    if (!write_record_to_block(block, rec)) {
1574       Pmsg0(0, _("Error writing record to block.\n"));
1575       goto bail_out;
1576    }
1577    if (!write_block_to_dev(dcr)) {
1578       Pmsg0(0, _("Error writing block to device.\n"));
1579       goto bail_out;
1580    } else {
1581       Pmsg1(0, _("Wrote one record of %d bytes.\n"), i);
1582    }
1583    Pmsg0(0, _("Wrote block to device.\n"));
1584
1585 bail_out:
1586    sm_check(__FILE__, __LINE__, false);
1587    sm_check(__FILE__, __LINE__, false);
1588 }
1589
1590 /*
1591  * Read a record from the tape
1592  */
1593 static void rrcmd()
1594 {
1595    char *buf;
1596    int stat, len;
1597
1598    if (!get_cmd(_("Enter length to read: "))) {
1599       return;
1600    }
1601    len = atoi(cmd);
1602    if (len < 0 || len > 1000000) {
1603       Pmsg0(0, _("Bad length entered, using default of 1024 bytes.\n"));
1604       len = 1024;
1605    }
1606    buf = (char *)malloc(len);
1607    stat = read(dev->fd(), buf, len);
1608    if (stat > 0 && stat <= len) {
1609       errno = 0;
1610    }
1611    berrno be;
1612    Pmsg3(0, _("Read of %d bytes gives stat=%d. ERR=%s\n"),
1613       len, stat, be.bstrerror());
1614    free(buf);
1615 }
1616
1617
1618 /*
1619  * Scan tape by reading block by block. Report what is
1620  * on the tape.  Note, this command does raw reads, and as such
1621  * will not work with fixed block size devices.
1622  */
1623 static void scancmd()
1624 {
1625    int stat;
1626    int blocks, tot_blocks, tot_files;
1627    int block_size;
1628    uint64_t bytes;
1629    char ec1[50];
1630
1631
1632    blocks = block_size = tot_blocks = 0;
1633    bytes = 0;
1634    if (dev->state & ST_EOT) {
1635       Pmsg0(0, _("End of tape\n"));
1636       return;
1637    }
1638    dev->update_pos(dcr);
1639    tot_files = dev->file;
1640    Pmsg1(0, _("Starting scan at file %u\n"), dev->file);
1641    for (;;) {
1642       if ((stat = read(dev->fd(), buf, sizeof(buf))) < 0) {
1643          berrno be;
1644          dev->clrerror(-1);
1645          Mmsg2(dev->errmsg, _("read error on %s. ERR=%s.\n"),
1646             dev->dev_name, be.bstrerror());
1647          Pmsg2(0, _("Bad status from read %d. ERR=%s\n"), stat, dev->bstrerror());
1648          if (blocks > 0) {
1649             if (blocks==1) {
1650                printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1651             }
1652             else {
1653                printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1654             }
1655          }
1656          return;
1657       }
1658       Dmsg1(200, "read status = %d\n", stat);
1659 /*    sleep(1); */
1660       if (stat != block_size) {
1661          dev->update_pos(dcr);
1662          if (blocks > 0) {
1663             if (blocks==1) {
1664                printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1665             }
1666             else {
1667                printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1668             }
1669             blocks = 0;
1670          }
1671          block_size = stat;
1672       }
1673       if (stat == 0) {                /* EOF */
1674          dev->update_pos(dcr);
1675          printf(_("End of File mark.\n"));
1676          /* Two reads of zero means end of tape */
1677          if (dev->state & ST_EOF)
1678             dev->state |= ST_EOT;
1679          else {
1680             dev->state |= ST_EOF;
1681             dev->file++;
1682          }
1683          if (dev->state & ST_EOT) {
1684             printf(_("End of tape\n"));
1685             break;
1686          }
1687       } else {                        /* Got data */
1688          dev->state &= ~ST_EOF;
1689          blocks++;
1690          tot_blocks++;
1691          bytes += stat;
1692       }
1693    }
1694    dev->update_pos(dcr);
1695    tot_files = dev->file - tot_files;
1696    printf(_("Total files=%d, blocks=%d, bytes = %s\n"), tot_files, tot_blocks,
1697       edit_uint64_with_commas(bytes, ec1));
1698 }
1699
1700
1701 /*
1702  * Scan tape by reading Bacula block by block. Report what is
1703  * on the tape.  This function reads Bacula blocks, so if your
1704  * Device resource is correctly defined, it should work with
1705  * either variable or fixed block sizes.
1706  */
1707 static void scan_blocks()
1708 {
1709    int blocks, tot_blocks, tot_files;
1710    uint32_t block_size;
1711    uint64_t bytes;
1712    DEV_BLOCK *block = dcr->block;
1713    char ec1[50];
1714    char buf1[100], buf2[100];
1715
1716    blocks = block_size = tot_blocks = 0;
1717    bytes = 0;
1718
1719    empty_block(block);
1720    dev->update_pos(dcr);
1721    tot_files = dev->file;
1722    for (;;) {
1723       if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
1724          Dmsg1(100, "!read_block(): ERR=%s\n", dev->bstrerror());
1725          if (dev->state & ST_EOT) {
1726             if (blocks > 0) {
1727                if (blocks==1) {
1728                   printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1729                }
1730                else {
1731                   printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1732                }
1733                blocks = 0;
1734             }
1735             goto bail_out;
1736          }
1737          if (dev->state & ST_EOF) {
1738             if (blocks > 0) {
1739                if (blocks==1) {
1740                   printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1741                }
1742                else {
1743                   printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1744                }
1745                blocks = 0;
1746             }
1747             printf(_("End of File mark.\n"));
1748             continue;
1749          }
1750          if (dev->state & ST_SHORT) {
1751             if (blocks > 0) {
1752                if (blocks==1) {
1753                   printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1754                }
1755                else {
1756                   printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1757                }
1758                blocks = 0;
1759             }
1760             printf(_("Short block read.\n"));
1761             continue;
1762          }
1763          printf(_("Error reading block. ERR=%s\n"), dev->bstrerror());
1764          goto bail_out;
1765       }
1766       if (block->block_len != block_size) {
1767          if (blocks > 0) {
1768             if (blocks==1) {
1769                printf(_("1 block of %d bytes in file %d\n"), block_size, dev->file);
1770             }
1771             else {
1772                printf(_("%d blocks of %d bytes in file %d\n"), blocks, block_size, dev->file);
1773             }
1774             blocks = 0;
1775          }
1776          block_size = block->block_len;
1777       }
1778       blocks++;
1779       tot_blocks++;
1780       bytes += block->block_len;
1781       Dmsg6(100, "Blk_blk=%u dev_blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
1782          block->BlockNumber, dev->block_num, block->block_len, block->BlockVer,
1783          block->VolSessionId, block->VolSessionTime);
1784       if (verbose == 1) {
1785          DEV_RECORD *rec = new_record();
1786          read_record_from_block(dcr, block, rec);
1787          Pmsg8(-1, _("Blk_block: %u dev_blk=%u blen=%u First rec FI=%s SessId=%u SessTim=%u Strm=%s rlen=%d\n"),
1788               block->BlockNumber, dev->block_num, block->block_len,
1789               FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId, rec->VolSessionTime,
1790               stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len);
1791          rec->remainder = 0;
1792          free_record(rec);
1793       } else if (verbose > 1) {
1794          dump_block(block, "");
1795       }
1796
1797    }
1798 bail_out:
1799    tot_files = dev->file - tot_files;
1800    printf(_("Total files=%d, blocks=%d, bytes = %s\n"), tot_files, tot_blocks,
1801       edit_uint64_with_commas(bytes, ec1));
1802 }
1803
1804
1805 static void statcmd()
1806 {
1807    int debug = debug_level;
1808    debug_level = 30;
1809    Pmsg2(0, _("Device status: %u. ERR=%s\n"), status_dev(dev), dev->bstrerror());
1810 #ifdef xxxx
1811    dump_volume_label(dev);
1812 #endif
1813    debug_level = debug;
1814 }
1815
1816
1817 /*
1818  * First we label the tape, then we fill
1819  *  it with data get a new tape and write a few blocks.
1820  */
1821 static void fillcmd()
1822 {
1823    DEV_RECORD rec;
1824    DEV_BLOCK  *block = dcr->block;
1825    char ec1[50];
1826    char buf1[100], buf2[100];
1827    int fd;
1828    uint32_t i;
1829    uint32_t min_block_size;
1830    struct tm tm;
1831
1832    ok = true;
1833    stop = 0;
1834    vol_num = 0;
1835    last_file = 0;
1836    last_block_num = 0;
1837    BlockNumber = 0;
1838
1839    Pmsg0(-1, _("\n"
1840 "This command simulates Bacula writing to a tape.\n"
1841 "It requires either one or two blank tapes, which it\n"
1842 "will label and write.\n\n"
1843 "If you have an autochanger configured, it will use\n"
1844 "the tapes that are in slots 1 and 2, otherwise, you will\n"
1845 "be prompted to insert the tapes when necessary.\n\n"
1846 "It will print a status approximately\n"
1847 "every 322 MB, and write an EOF every 3.2 GB.  If you have\n"
1848 "selected the simple test option, after writing the first tape\n"
1849 "it will rewind it and re-read the last block written.\n\n"
1850 "If you have selected the multiple tape test, when the first tape\n"
1851 "fills, it will ask for a second, and after writing a few more \n"
1852 "blocks, it will stop.  Then it will begin re-reading the\n"
1853 "two tapes.\n\n"
1854 "This may take a long time -- hours! ...\n\n"));
1855
1856    get_cmd(_("Do you want to run the simplified test (s) with one tape\n"
1857            "or the complete multiple tape (m) test: (s/m) "));
1858    if (cmd[0] == 's') {
1859       Pmsg0(-1, _("Simple test (single tape) selected.\n"));
1860       simple = true;
1861    } else if (cmd[0] == 'm') {
1862       Pmsg0(-1, _("Multiple tape test selected.\n"));
1863       simple = false;
1864    } else {
1865       Pmsg0(000, _("Command aborted.\n"));
1866       return;
1867    }
1868
1869    Dmsg1(20, "Begin append device=%s\n", dev->print_name());
1870    Dmsg1(20, "MaxVolSize=%s\n", edit_uint64(dev->max_volume_size, ec1));
1871
1872    /* Use fixed block size to simplify read back */
1873    min_block_size = dev->min_block_size;
1874    dev->min_block_size = dev->max_block_size;
1875    set_volume_name("TestVolume1", 1);
1876    dir_ask_sysop_to_create_appendable_volume(dcr);
1877    dev->set_append();                 /* force volume to be relabeled */
1878
1879    /*
1880     * Acquire output device for writing.  Note, after acquiring a
1881     *   device, we MUST release it, which is done at the end of this
1882     *   subroutine.
1883     */
1884    Dmsg0(100, "just before acquire_device\n");
1885    if (!acquire_device_for_append(dcr)) {
1886       set_jcr_job_status(jcr, JS_ErrorTerminated);
1887       return;
1888    }
1889    block = jcr->dcr->block;
1890
1891    Dmsg0(100, "Just after acquire_device_for_append\n");
1892    /*
1893     * Write Begin Session Record
1894     */
1895    if (!write_session_label(dcr, SOS_LABEL)) {
1896       set_jcr_job_status(jcr, JS_ErrorTerminated);
1897       Jmsg1(jcr, M_FATAL, 0, _("Write session label failed. ERR=%s\n"),
1898          dev->bstrerror());
1899       ok = false;
1900    }
1901    Pmsg0(-1, _("Wrote Start of Session label.\n"));
1902
1903    memset(&rec, 0, sizeof(rec));
1904    rec.data = get_memory(100000);     /* max record size */
1905
1906 #define REC_SIZE 32768
1907    rec.data_len = REC_SIZE;
1908
1909    /*
1910     * Put some random data in the record
1911     */
1912    fd = open("/dev/urandom", O_RDONLY);
1913    if (fd != -1) {
1914       read(fd, rec.data, rec.data_len);
1915       close(fd);
1916    } else {
1917       uint32_t *p = (uint32_t *)rec.data;
1918       srandom(time(NULL));
1919       for (i=0; i<rec.data_len/sizeof(uint32_t); i++) {
1920          p[i] = random();
1921       }
1922    }
1923
1924    /*
1925     * Generate data as if from File daemon, write to device
1926     */
1927    jcr->dcr->VolFirstIndex = 0;
1928    time(&jcr->run_time);              /* start counting time for rates */
1929    (void)localtime_r(&jcr->run_time, &tm);
1930    strftime(buf1, sizeof(buf1), "%H:%M:%S", &tm);
1931    if (simple) {
1932       Pmsg1(-1, _("%s Begin writing Bacula records to tape ...\n"), buf1);
1933    } else {
1934       Pmsg1(-1, _("%s Begin writing Bacula records to first tape ...\n"), buf1);
1935    }
1936    for (file_index = 0; ok && !job_canceled(jcr); ) {
1937       rec.VolSessionId = jcr->VolSessionId;
1938       rec.VolSessionTime = jcr->VolSessionTime;
1939       rec.FileIndex = ++file_index;
1940       rec.Stream = STREAM_FILE_DATA;
1941
1942       /* Mix up the data just a bit */
1943       uint32_t *lp = (uint32_t *)rec.data;
1944       lp[0] += lp[13];
1945       for (i=1; i < (rec.data_len-sizeof(uint32_t))/sizeof(uint32_t)-1; i++) {
1946          lp[i] += lp[i-1];
1947       }
1948
1949       Dmsg4(250, "before write_rec FI=%d SessId=%d Strm=%s len=%d\n",
1950          rec.FileIndex, rec.VolSessionId, 
1951          stream_to_ascii(buf1, rec.Stream, rec.FileIndex),
1952          rec.data_len);
1953
1954       while (!write_record_to_block(block, &rec)) {
1955          /*
1956           * When we get here we have just filled a block
1957           */
1958          Dmsg2(150, "!write_record_to_block data_len=%d rem=%d\n", rec.data_len,
1959                     rec.remainder);
1960
1961          /* Write block to tape */
1962          if (!flush_block(block, 1)) {
1963             break;
1964          }
1965
1966          /* Every 5000 blocks (approx 322MB) report where we are.
1967           */
1968          if ((block->BlockNumber % 5000) == 0) {
1969             now = time(NULL);
1970             now -= jcr->run_time;
1971             if (now <= 0) {
1972                now = 1;          /* prevent divide error */
1973             }
1974             kbs = (double)dev->VolCatInfo.VolCatBytes / (1000.0 * (double)now);
1975             Pmsg4(-1, _("Wrote blk_block=%u, dev_blk_num=%u VolBytes=%s rate=%.1f KB/s\n"),
1976                block->BlockNumber, dev->block_num,
1977                edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, ec1), (float)kbs);
1978          }
1979          /* Every 32000 blocks (approx 2GB) write an EOF.
1980           */
1981          if ((block->BlockNumber % 32000) == 0) {
1982             now = time(NULL);
1983             (void)localtime_r(&now, &tm);
1984             strftime(buf1, sizeof(buf1), "%H:%M:%S", &tm);
1985             Pmsg1(-1, _("%s Flush block, write EOF\n"), buf1);
1986             flush_block(block, 0);
1987             dev->weof(1);
1988          }
1989
1990          /* Get out after writing 10 blocks to the second tape */
1991          if (++BlockNumber > 10 && stop != 0) {      /* get out */
1992             break;
1993          }
1994       }
1995       if (!ok) {
1996          Pmsg0(000, _("Not OK\n"));
1997          break;
1998       }
1999       jcr->JobBytes += rec.data_len;   /* increment bytes this job */
2000       Dmsg4(190, "write_record FI=%s SessId=%d Strm=%s len=%d\n",
2001          FI_to_ascii(buf1, rec.FileIndex), rec.VolSessionId,
2002          stream_to_ascii(buf2, rec.Stream, rec.FileIndex), rec.data_len);
2003
2004       /* Get out after writing 10 blocks to the second tape */
2005       if (BlockNumber > 10 && stop != 0) {      /* get out */
2006          char ed1[50];
2007          Pmsg1(-1, "Done writing %s records ...\n", 
2008              edit_uint64_with_commas(write_count, ed1));
2009          break;
2010       }
2011    }
2012    if (vol_num > 1) {
2013       Dmsg0(100, "Write_end_session_label()\n");
2014       /* Create Job status for end of session label */
2015       if (!job_canceled(jcr) && ok) {
2016          set_jcr_job_status(jcr, JS_Terminated);
2017       } else if (!ok) {
2018          set_jcr_job_status(jcr, JS_ErrorTerminated);
2019       }
2020       if (!write_session_label(dcr, EOS_LABEL)) {
2021          Pmsg1(000, _("Error writing end session label. ERR=%s\n"), dev->bstrerror());
2022          ok = false;
2023       }
2024       /* Write out final block of this session */
2025       if (!write_block_to_device(dcr)) {
2026          Pmsg0(-1, _("Set ok=false after write_block_to_device.\n"));
2027          ok = false;
2028       }
2029       Pmsg0(-1, _("Wrote End of Session label.\n"));
2030
2031       /* Save last block info for second tape */
2032       last_block_num2 = last_block_num;
2033       last_file2 = last_file;
2034       if (last_block2) {
2035          free_block(last_block2);
2036       }
2037       last_block2 = dup_block(last_block);
2038    }
2039
2040    sprintf(buf, "%s/btape.state", working_directory);
2041    fd = open(buf, O_CREAT|O_TRUNC|O_WRONLY, 0640);
2042    if (fd >= 0) {
2043       write(fd, &btape_state_level, sizeof(btape_state_level));
2044       write(fd, &simple, sizeof(simple));
2045       write(fd, &last_block_num1, sizeof(last_block_num1));
2046       write(fd, &last_block_num2, sizeof(last_block_num2));
2047       write(fd, &last_file1, sizeof(last_file1));
2048       write(fd, &last_file2, sizeof(last_file2));
2049       write(fd, last_block1->buf, last_block1->buf_len);
2050       write(fd, last_block2->buf, last_block2->buf_len);
2051       write(fd, first_block->buf, first_block->buf_len);
2052       close(fd);
2053       Pmsg2(-1, _("Wrote state file last_block_num1=%d last_block_num2=%d\n"),
2054          last_block_num1, last_block_num2);
2055    } else {
2056       berrno be;
2057       Pmsg2(-1, _("Could not create state file: %s ERR=%s\n"), buf,
2058                  be.bstrerror());
2059    }
2060
2061    now = time(NULL);
2062    (void)localtime_r(&now, &tm);
2063    strftime(buf1, sizeof(buf1), "%H:%M:%S", &tm);
2064    if (simple) {
2065       Pmsg3(-1, _("\n\n%s Done filling tape at %d:%d. Now beginning re-read of tape ...\n"),
2066          buf1, jcr->dcr->dev->file, jcr->dcr->dev->block_num);
2067    }
2068    else {
2069       Pmsg3(-1, _("\n\n%s Done filling tapes at %d:%d. Now beginning re-read of first tape ...\n"),
2070          buf1, jcr->dcr->dev->file, jcr->dcr->dev->block_num);
2071    }
2072
2073    jcr->dcr->block = block;
2074    do_unfill();
2075
2076    dev->min_block_size = min_block_size;
2077    free_memory(rec.data);
2078 }
2079
2080 /*
2081  * Read two tapes written by the "fill" command and ensure
2082  *  that the data is valid.  If stop==1 we simulate full read back
2083  *  of two tapes.  If stop==-1 we simply read the last block and
2084  *  verify that it is correct.
2085  */
2086 static void unfillcmd()
2087 {
2088    int fd;
2089
2090    last_block1 = new_block(dev);
2091    last_block2 = new_block(dev);
2092    first_block = new_block(dev);
2093    sprintf(buf, "%s/btape.state", working_directory);
2094    fd = open(buf, O_RDONLY);
2095    if (fd >= 0) {
2096       uint32_t state_level;
2097       read(fd, &state_level, sizeof(btape_state_level));
2098       read(fd, &simple, sizeof(simple));
2099       read(fd, &last_block_num1, sizeof(last_block_num1));
2100       read(fd, &last_block_num2, sizeof(last_block_num2));
2101       read(fd, &last_file1, sizeof(last_file1));
2102       read(fd, &last_file2, sizeof(last_file2));
2103       read(fd, last_block1->buf, last_block1->buf_len);
2104       read(fd, last_block2->buf, last_block2->buf_len);
2105       read(fd, first_block->buf, first_block->buf_len);
2106       close(fd);
2107       if (state_level != btape_state_level) {
2108           Pmsg0(-1, _("\nThe state file level has changed. You must redo\n"
2109                   "the fill command.\n"));
2110           return;
2111        }
2112    } else {
2113       berrno be;
2114       Pmsg2(-1, _("\nCould not find the state file: %s ERR=%s\n"
2115              "You must redo the fill command.\n"), buf, be.bstrerror());
2116       return;
2117    }
2118    do_unfill();
2119    this_block = NULL;
2120 }
2121
2122 static void do_unfill()
2123 {
2124    DEV_BLOCK *block = dcr->block;
2125    int autochanger;
2126
2127    dumped = 0;
2128    VolBytes = 0;
2129    LastBlock = 0;
2130
2131    Dmsg0(20, "Enter do_unfill\n");
2132    dev->set_cap(CAP_ANONVOLS);        /* allow reading any volume */
2133    dev->clear_cap(CAP_LABEL);         /* don't label anything here */
2134
2135    end_of_tape = 0;
2136
2137    time(&jcr->run_time);              /* start counting time for rates */
2138    stop = 0;
2139    file_index = 0;
2140    if (last_block) {
2141       free_block(last_block);
2142       last_block = NULL;
2143    }
2144    last_block_num = last_block_num1;
2145    last_file = last_file1;
2146    last_block = last_block1;
2147
2148    free_restore_volume_list(jcr);
2149    jcr->bsr = NULL;
2150    bstrncpy(dcr->VolumeName, "TestVolume1|TestVolume2", sizeof(dcr->VolumeName));
2151    create_restore_volume_list(jcr);
2152    if (jcr->VolList != NULL) {
2153       jcr->VolList->Slot = 1;
2154       if (jcr->VolList->next != NULL) {
2155          jcr->VolList->next->Slot = 2;
2156       }
2157    }
2158
2159    set_volume_name("TestVolume1", 1);
2160
2161    if (!simple) {
2162       /* Multiple Volume tape */
2163       /* Close device so user can use autochanger if desired */
2164       if (dev->has_cap(CAP_OFFLINEUNMOUNT)) {
2165          dev->offline();
2166       }
2167       autochanger = autoload_device(dcr, 1, NULL);
2168       if (autochanger != 1) {
2169          dev->close();
2170          get_cmd(_("Mount first tape. Press enter when ready: "));
2171       }
2172    }
2173
2174    dev->close();
2175    dev->num_writers = 0;
2176    if (!acquire_device_for_read(dcr)) {
2177       Pmsg1(-1, "%s", dev->errmsg);
2178       goto bail_out;
2179    }
2180    /*
2181     * We now have the first tape mounted.
2182     * Note, re-reading last block may have caused us to
2183     *   loose track of where we are (block number unknown).
2184     */
2185    Pmsg0(-1, _("Rewinding.\n"));
2186    if (!dev->rewind(dcr)) {                /* get to a known place on tape */
2187       goto bail_out;
2188    }
2189    /* Read the first 10000 records */
2190    Pmsg2(-1, _("Reading the first 10000 records from %u:%u.\n"),
2191       dev->file, dev->block_num);
2192    quickie_count = 0;
2193    read_records(dcr, quickie_cb, my_mount_next_read_volume);
2194    Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
2195          last_file, last_block_num);
2196    if (!dev->reposition(dcr, last_file, last_block_num)) {
2197       Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
2198       goto bail_out;
2199    }
2200    Pmsg1(-1, _("Reading block %u.\n"), last_block_num);
2201    if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
2202       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
2203       goto bail_out;
2204    }
2205    if (compare_blocks(last_block, block)) {
2206       if (simple) {
2207          Pmsg0(-1, _("\nThe last block on the tape matches. Test succeeded.\n\n"));
2208       } else {
2209          Pmsg0(-1, _("\nThe last block of the first tape matches.\n\n"));
2210       }
2211    }
2212    if (simple) {
2213       goto bail_out;
2214    }
2215
2216    /* restore info for last block on second Volume */
2217    last_block_num = last_block_num2;
2218    last_file = last_file2;
2219    last_block = last_block2;
2220
2221    /* Multiple Volume tape */
2222    /* Close device so user can use autochanger if desired */
2223    if (dev->has_cap(CAP_OFFLINEUNMOUNT)) {
2224       dev->offline();
2225    }
2226
2227    set_volume_name("TestVolume2", 2);
2228
2229    autochanger = autoload_device(dcr, 1, NULL);
2230    if (autochanger != 1) {
2231       dev->close();
2232       get_cmd(_("Mount second tape. Press enter when ready: "));
2233    }
2234
2235    dev->clear_read();
2236    if (!acquire_device_for_read(dcr)) {
2237       Pmsg1(-1, "%s", dev->errmsg);
2238       goto bail_out;
2239    }
2240
2241    /* Space to "first" block which is last block not written
2242     * on the previous tape.
2243     */
2244    Pmsg2(-1, _("Reposition from %u:%u to 0:1\n"), dev->file, dev->block_num);
2245    if (!dev->reposition(dcr, 0, 1)) {
2246       Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
2247       goto bail_out;
2248    }
2249    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
2250    if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
2251       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
2252       goto bail_out;
2253    }
2254    if (compare_blocks(first_block, block)) {
2255       Pmsg0(-1, _("\nThe first block on the second tape matches.\n\n"));
2256    }
2257
2258    /* Now find and compare the last block */
2259    Pmsg4(-1, _("Reposition from %u:%u to %u:%u\n"), dev->file, dev->block_num,
2260          last_file, last_block_num);
2261    if (!dev->reposition(dcr, last_file, last_block_num)) {
2262       Pmsg1(-1, _("Reposition error. ERR=%s\n"), dev->bstrerror());
2263       goto bail_out;
2264    }
2265    Pmsg1(-1, _("Reading block %d.\n"), dev->block_num);
2266    if (!read_block_from_device(dcr, NO_BLOCK_NUMBER_CHECK)) {
2267       Pmsg1(-1, _("Error reading block: ERR=%s\n"), dev->bstrerror());
2268       goto bail_out;
2269    }
2270    if (compare_blocks(last_block, block)) {
2271       Pmsg0(-1, _("\nThe last block on the second tape matches. Test succeeded.\n\n"));
2272    }
2273
2274 bail_out:
2275    free_block(last_block1);
2276    free_block(last_block2);
2277    free_block(first_block);
2278 }
2279
2280 /* Read 10000 records then stop */
2281 static bool quickie_cb(DCR *dcr, DEV_RECORD *rec)
2282 {
2283    DEVICE *dev = dcr->dev;
2284    quickie_count++;
2285    if (quickie_count == 10000) {
2286       Pmsg2(-1, _("10000 records read now at %d:%d\n"), dev->file, dev->block_num);
2287    }
2288    return quickie_count < 10000;
2289 }
2290
2291 static bool compare_blocks(DEV_BLOCK *last_block, DEV_BLOCK *block)
2292 {
2293    char *p, *q;
2294    uint32_t CheckSum, block_len;
2295    ser_declare;
2296
2297    p = last_block->buf;
2298    q = block->buf;
2299    unser_begin(q, BLKHDR2_LENGTH);
2300    unser_uint32(CheckSum);
2301    unser_uint32(block_len);
2302    while (q < (block->buf+block_len)) {
2303       if (*p == *q) {
2304          p++;
2305          q++;
2306          continue;
2307       }
2308       Pmsg0(-1, "\n");
2309       dump_block(last_block, _("Last block written"));
2310       Pmsg0(-1, "\n");
2311       dump_block(block, _("Block read back"));
2312       Pmsg1(-1, _("\n\nThe blocks differ at byte %u\n"), p - last_block->buf);
2313       Pmsg0(-1, _("\n\n!!!! The last block written and the block\n"
2314                 "that was read back differ. The test FAILED !!!!\n"
2315                 "This must be corrected before you use Bacula\n"
2316                 "to write multi-tape Volumes.!!!!\n"));
2317       return false;
2318    }
2319    if (verbose) {
2320       dump_block(last_block, _("Last block written"));
2321       dump_block(block, _("Block read back"));
2322    }
2323    return true;
2324 }
2325
2326
2327
2328
2329
2330 /*
2331  * Write current block to tape regardless of whether or
2332  *   not it is full. If the tape fills, attempt to
2333  *   acquire another tape.
2334  */
2335 static int flush_block(DEV_BLOCK *block, int dump)
2336 {
2337    char ec1[50];
2338    DEV_BLOCK *tblock;
2339    uint32_t this_file, this_block_num;
2340
2341    dev->r_dlock();
2342    if (!this_block) {
2343       this_block = new_block(dev);
2344    }
2345    if (!last_block) {
2346       last_block = new_block(dev);
2347    }
2348    /* Copy block */
2349    this_file = dev->file;
2350    this_block_num = dev->block_num;
2351    if (!write_block_to_dev(dcr)) {
2352       Pmsg3(000, _("Last block at: %u:%u this_dev_block_num=%d\n"),
2353                   last_file, last_block_num, this_block_num);
2354       if (vol_num == 1) {
2355          /*
2356           * This is 1st tape, so save first tape info separate
2357           *  from second tape info
2358           */
2359          last_block_num1 = last_block_num;
2360          last_file1 = last_file;
2361          last_block1 = dup_block(last_block);
2362          last_block2 = dup_block(last_block);
2363          first_block = dup_block(block); /* first block second tape */
2364       }
2365       if (verbose) {
2366          Pmsg3(000, _("Block not written: FileIndex=%u blk_block=%u Size=%u\n"),
2367             (unsigned)file_index, block->BlockNumber, block->block_len);
2368          dump_block(last_block, _("Last block written"));
2369          Pmsg0(-1, "\n");
2370          dump_block(block, _("Block not written"));
2371       }
2372       if (stop == 0) {
2373          eot_block = block->BlockNumber;
2374          eot_block_len = block->block_len;
2375          eot_FileIndex = file_index;
2376          stop = 1;
2377       }
2378       now = time(NULL);
2379       now -= jcr->run_time;
2380       if (now <= 0) {
2381          now = 1;                     /* don't divide by zero */
2382       }
2383       kbs = (double)dev->VolCatInfo.VolCatBytes / (1000 * now);
2384       vol_size = dev->VolCatInfo.VolCatBytes;
2385       Pmsg4(000, _("End of tape %d:%d. VolumeCapacity=%s. Write rate = %.1f KB/s\n"),
2386          dev->file, dev->block_num,
2387          edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, ec1), kbs);
2388
2389       if (simple) {
2390          stop = -1;                   /* stop, but do simplified test */
2391       } else {
2392          /* Full test in progress */
2393          if (!fixup_device_block_write_error(jcr->dcr)) {
2394             Pmsg1(000, _("Cannot fixup device error. %s\n"), dev->bstrerror());
2395             ok = false;
2396             dev->dunlock();
2397             return 0;
2398          }
2399          BlockNumber = 0;             /* start counting for second tape */
2400       }
2401       dev->dunlock();
2402       return 1;                       /* end of tape reached */
2403    }
2404
2405    /* Save contents after write so that the header is serialized */
2406    memcpy(this_block->buf, block->buf, this_block->buf_len);
2407
2408    /*
2409     * Note, we always read/write to block, but we toggle
2410     *  copying it to one or another of two allocated blocks.
2411     * Switch blocks so that the block just successfully written is
2412     *  always in last_block.
2413     */
2414    tblock = last_block;
2415    last_block = this_block;
2416    this_block = tblock;
2417    last_file = this_file;
2418    last_block_num = this_block_num;
2419
2420    dev->dunlock();
2421    return 1;
2422 }
2423
2424
2425 /*
2426  * First we label the tape, then we fill
2427  *  it with data get a new tape and write a few blocks.
2428  */
2429 static void qfillcmd()
2430 {
2431    DEV_BLOCK *block = dcr->block;
2432    DEV_RECORD *rec = dcr->rec;
2433    int i, count;
2434
2435    Pmsg0(0, _("Test writing blocks of 64512 bytes to tape.\n"));
2436
2437    get_cmd(_("How many blocks do you want to write? (1000): "));
2438
2439    count = atoi(cmd);
2440    if (count <= 0) {
2441       count = 1000;
2442    }
2443
2444    sm_check(__FILE__, __LINE__, false);
2445
2446    i = block->buf_len - 100;
2447    ASSERT (i > 0);
2448    rec->data = check_pool_memory_size(rec->data, i);
2449    memset(rec->data, i & 0xFF, i);
2450    rec->data_len = i;
2451    rewindcmd();
2452    Pmsg1(0, _("Begin writing %d Bacula blocks to tape ...\n"), count);
2453    for (i=0; i < count; i++) {
2454       if (i % 100 == 0) {
2455          printf("+");
2456          fflush(stdout);
2457       }
2458       if (!write_record_to_block(block, rec)) {
2459          Pmsg0(0, _("Error writing record to block.\n"));
2460          goto bail_out;
2461       }
2462       if (!write_block_to_dev(dcr)) {
2463          Pmsg0(0, _("Error writing block to device.\n"));
2464          goto bail_out;
2465       }
2466    }
2467    printf("\n");
2468    weofcmd();
2469    if (dev->has_cap(CAP_TWOEOF)) {
2470       weofcmd();
2471    }
2472    rewindcmd();
2473    scan_blocks();
2474
2475 bail_out:
2476    sm_check(__FILE__, __LINE__, false);
2477 }
2478
2479 /*
2480  * Fill a tape using raw write() command
2481  */
2482 static void rawfill_cmd()
2483 {
2484    DEV_BLOCK *block = dcr->block;
2485    int stat;
2486    int fd;
2487    uint32_t block_num = 0;
2488    uint32_t *p;
2489    int my_errno;
2490    uint32_t i;
2491
2492    fd = open("/dev/urandom", O_RDONLY);
2493    if (fd) {
2494       read(fd, block->buf, block->buf_len);
2495       close(fd);
2496    } else {
2497       uint32_t *p = (uint32_t *)block->buf;
2498       srandom(time(NULL));
2499       for (i=0; i<block->buf_len/sizeof(uint32_t); i++) {
2500          p[i] = random();
2501       }
2502    }
2503    p = (uint32_t *)block->buf;
2504    Pmsg1(0, _("Begin writing raw blocks of %u bytes.\n"), block->buf_len);
2505    for ( ;; ) {
2506       *p = block_num;
2507       stat = dev->d_write(dev->fd(), block->buf, block->buf_len);
2508       if (stat == (int)block->buf_len) {
2509          if ((block_num++ % 100) == 0) {
2510             printf("+");
2511             fflush(stdout);
2512          }
2513          p[0] += p[13];
2514          for (i=1; i<(block->buf_len-sizeof(uint32_t))/sizeof(uint32_t)-1; i++) {
2515             p[i] += p[i-1];
2516          }
2517          continue;
2518       }
2519       break;
2520    }
2521    my_errno = errno;
2522    printf("\n");
2523    berrno be;
2524    printf(_("Write failed at block %u. stat=%d ERR=%s\n"), block_num, stat,
2525       be.bstrerror(my_errno));
2526    weofcmd();
2527 }
2528
2529
2530
2531 struct cmdstruct { const char *key; void (*func)(); const char *help; };
2532 static struct cmdstruct commands[] = {
2533  {NT_("autochanger"),autochangercmd, _("test autochanger")},
2534  {NT_("bsf"),       bsfcmd,       _("backspace file")},
2535  {NT_("bsr"),       bsrcmd,       _("backspace record")},
2536  {NT_("cap"),       capcmd,       _("list device capabilities")},
2537  {NT_("clear"),     clearcmd,     _("clear tape errors")},
2538  {NT_("eod"),       eodcmd,       _("go to end of Bacula data for append")},
2539  {NT_("eom"),       eomcmd,       _("go to the physical end of medium")},
2540  {NT_("fill"),      fillcmd,      _("fill tape, write onto second volume")},
2541  {NT_("unfill"),    unfillcmd,    _("read filled tape")},
2542  {NT_("fsf"),       fsfcmd,       _("forward space a file")},
2543  {NT_("fsr"),       fsrcmd,       _("forward space a record")},
2544  {NT_("help"),      helpcmd,      _("print this command")},
2545  {NT_("label"),     labelcmd,     _("write a Bacula label to the tape")},
2546  {NT_("load"),      loadcmd,      _("load a tape")},
2547  {NT_("quit"),      quitcmd,      _("quit btape")},
2548  {NT_("rawfill"),   rawfill_cmd,  _("use write() to fill tape")},
2549  {NT_("readlabel"), readlabelcmd, _("read and print the Bacula tape label")},
2550  {NT_("rectest"),   rectestcmd,   _("test record handling functions")},
2551  {NT_("rewind"),    rewindcmd,    _("rewind the tape")},
2552  {NT_("scan"),      scancmd,      _("read() tape block by block to EOT and report")},
2553  {NT_("scanblocks"),scan_blocks,  _("Bacula read block by block to EOT and report")},
2554  {NT_("status"),    statcmd,      _("print tape status")},
2555  {NT_("test"),      testcmd,      _("General test Bacula tape functions")},
2556  {NT_("weof"),      weofcmd,      _("write an EOF on the tape")},
2557  {NT_("wr"),        wrcmd,        _("write a single Bacula block")},
2558  {NT_("rr"),        rrcmd,        _("read a single record")},
2559  {NT_("rb"),        rbcmd,        _("read a single Bacula block")},
2560  {NT_("qfill"),     qfillcmd,     _("quick fill command")}
2561              };
2562 #define comsize (sizeof(commands)/sizeof(struct cmdstruct))
2563
2564 static void
2565 do_tape_cmds()
2566 {
2567    unsigned int i;
2568    bool found;
2569
2570    while (!quit && get_cmd("*")) {
2571       sm_check(__FILE__, __LINE__, false);
2572       found = false;
2573       parse_args(cmd, &args, &argc, argk, argv, MAX_CMD_ARGS);
2574       for (i=0; i<comsize; i++)       /* search for command */
2575          if (argc > 0 && fstrsch(argk[0],  commands[i].key)) {
2576             (*commands[i].func)();    /* go execute command */
2577             found = true;
2578             break;
2579          }
2580       if (*cmd && !found) {
2581          Pmsg1(0, _("\"%s\" is an invalid command\n"), cmd);
2582       }
2583    }
2584 }
2585
2586 static void helpcmd()
2587 {
2588    unsigned int i;
2589    usage();
2590    printf(_("Interactive commands:\n"));
2591    printf(_("  Command    Description\n  =======    ===========\n"));
2592    for (i=0; i<comsize; i++)
2593       printf("  %-10s %s\n", commands[i].key, commands[i].help);
2594    printf("\n");
2595 }
2596
2597 static void usage()
2598 {
2599    fprintf(stderr, _(
2600 PROG_COPYRIGHT
2601 "\nVersion: %s (%s)\n\n"
2602 "Usage: btape <options> <device_name>\n"
2603 "       -b <file>   specify bootstrap file\n"
2604 "       -c <file>   set configuration file to file\n"
2605 "       -d <nn>     set debug level to <nn>\n"
2606 "       -dt         print timestamp in debug output\n"
2607 "       -p          proceed inspite of I/O errors\n"
2608 "       -s          turn off signals\n"
2609 "       -v          be verbose\n"
2610 "       -?          print this message.\n"
2611 "\n"), 2000, VERSION, BDATE);
2612
2613 }
2614
2615 /*
2616  * Get next input command from terminal.  This
2617  * routine is REALLY primitive, and should be enhanced
2618  * to have correct backspacing, etc.
2619  */
2620 int
2621 get_cmd(const char *prompt)
2622 {
2623    int i = 0;
2624    int ch;
2625
2626    fprintf(stdout, "%s", prompt);
2627
2628    /* We really should turn off echoing and pretty this
2629     * up a bit.
2630     */
2631    cmd[i] = 0;
2632    while ((ch = fgetc(stdin)) != EOF) {
2633       if (ch == '\n') {
2634          strip_trailing_junk(cmd);
2635          return 1;
2636       } else if (ch == 4 || ch == 0xd3 || ch == 0x8) {
2637          if (i > 0) {
2638             cmd[--i] = 0;
2639          }
2640          continue;
2641       }
2642
2643       cmd[i++] = ch;
2644       cmd[i] = 0;
2645    }
2646    quit = 1;
2647    return 0;
2648 }
2649
2650 /* Dummies to replace askdir.c */
2651 bool    dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;}
2652 bool    dir_send_job_status(JCR *jcr) {return 1;}
2653
2654 bool dir_update_volume_info(DCR *dcr, bool relabel, bool update_LastWritten)
2655 {
2656    return 1;
2657 }
2658
2659
2660 bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw  writing)
2661 {
2662    Dmsg0(20, "Enter dir_get_volume_info\n");
2663    bstrncpy(dcr->VolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
2664    return 1;
2665 }
2666
2667 bool dir_create_jobmedia_record(DCR *dcr, bool zero)
2668 {
2669    dcr->WroteVol = false;
2670    return 1;
2671 }
2672
2673
2674 bool dir_find_next_appendable_volume(DCR *dcr)
2675 {
2676    Dmsg1(20, "Enter dir_find_next_appendable_volume. stop=%d\n", stop);
2677    return dcr->VolumeName[0] != 0;
2678 }
2679
2680 bool dir_ask_sysop_to_mount_volume(DCR *dcr, int /* mode */)
2681 {
2682    DEVICE *dev = dcr->dev;
2683    Dmsg0(20, "Enter dir_ask_sysop_to_mount_volume\n");
2684    if (dcr->VolumeName[0] == 0) {
2685       return dir_ask_sysop_to_create_appendable_volume(dcr);
2686    }
2687    Pmsg1(-1, "%s", dev->errmsg);           /* print reason */
2688    if (dcr->VolumeName[0] == 0 || strcmp(dcr->VolumeName, "TestVolume2") == 0) {
2689       fprintf(stderr, _("Mount second Volume on device %s and press return when ready: "),
2690          dev->print_name());
2691    } else {
2692       fprintf(stderr, _("Mount Volume \"%s\" on device %s and press return when ready: "),
2693          dcr->VolumeName, dev->print_name());
2694    }
2695    dev->close();
2696    getchar();
2697    return true;
2698 }
2699
2700 bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr)
2701 {
2702    int autochanger;
2703    DEVICE *dev = dcr->dev;
2704    Dmsg0(20, "Enter dir_ask_sysop_to_create_appendable_volume\n");
2705    if (stop == 0) {
2706       set_volume_name("TestVolume1", 1);
2707    } else {
2708       set_volume_name("TestVolume2", 2);
2709    }
2710    /* Close device so user can use autochanger if desired */
2711    if (dev->has_cap(CAP_OFFLINEUNMOUNT)) {
2712       dev->offline();
2713    }
2714    autochanger = autoload_device(dcr, 1, NULL);
2715    if (autochanger != 1) {
2716       fprintf(stderr, _("Mount blank Volume on device %s and press return when ready: "),
2717          dev->print_name());
2718       dev->close();
2719       getchar();
2720    }
2721    labelcmd();
2722    VolumeName = NULL;
2723    BlockNumber = 0;
2724    return true;
2725 }
2726
2727 static bool my_mount_next_read_volume(DCR *dcr)
2728 {
2729    char ec1[50];
2730    JCR *jcr = dcr->jcr;
2731    DEV_BLOCK *block = dcr->block;
2732
2733    Dmsg0(20, "Enter my_mount_next_read_volume\n");
2734    Pmsg2(000, _("End of Volume \"%s\" %d records.\n"), dcr->VolumeName,
2735       quickie_count);
2736
2737    volume_unused(dcr);             /* release current volume */
2738    if (LastBlock != block->BlockNumber) {
2739       VolBytes += block->block_len;
2740    }
2741    LastBlock = block->BlockNumber;
2742    now = time(NULL);
2743    now -= jcr->run_time;
2744    if (now <= 0) {
2745       now = 1;
2746    }
2747    kbs = (double)VolBytes / (1000.0 * (double)now);
2748    Pmsg3(-1, _("Read block=%u, VolBytes=%s rate=%.1f KB/s\n"), block->BlockNumber,
2749             edit_uint64_with_commas(VolBytes, ec1), (float)kbs);
2750
2751    if (strcmp(dcr->VolumeName, "TestVolume2") == 0) {
2752       end_of_tape = 1;
2753       return false;
2754    }
2755
2756    set_volume_name("TestVolume2", 2);
2757
2758    dev->close();
2759    if (!acquire_device_for_read(dcr)) {
2760       Pmsg2(0, _("Cannot open Dev=%s, Vol=%s\n"), dev->print_name(), dcr->VolumeName);
2761       return false;
2762    }
2763    return true;                    /* next volume mounted */
2764 }
2765
2766 static void set_volume_name(const char *VolName, int volnum)
2767 {
2768    DCR *dcr = jcr->dcr;
2769    VolumeName = VolName;
2770    vol_num = volnum;
2771    bstrncpy(dev->VolCatInfo.VolCatName, VolName, sizeof(dev->VolCatInfo.VolCatName));
2772    bstrncpy(dcr->VolCatInfo.VolCatName, VolName, sizeof(dcr->VolCatInfo.VolCatName));
2773    bstrncpy(dcr->VolumeName, VolName, sizeof(dcr->VolumeName));
2774    dcr->VolCatInfo.Slot = volnum;
2775    dcr->VolCatInfo.InChanger = true;
2776 }