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