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