]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/btape.c
added WSACleanup(), corrected WSA_Init() (removed #ifdef)
[bacula/bacula] / bacula / src / stored / btape.c
index 408d6dd41a7279b3d2bc9c296d5a1bff3a75f02c..dd6546324a32a56be0a7e290fc1e024729aee154 100644 (file)
 
 /* External subroutines */
 extern void free_config_resources();
+extern char *edit_device_codes(JCR *jcr, char *omsg, char *imsg, char *cmd);
 
 /* Exported variables */
 int quit = 0;
 char buf[100000];
 int bsize = TAPE_BSIZE;
 char VolName[MAX_NAME_LENGTH];
+bool forge_on = false;
 
 /*
  * If you change the format of the state file, 
@@ -81,7 +83,6 @@ static void set_volume_name(char *VolName, int volnum);
 static void rawfill_cmd();
 static void bfill_cmd();
 static bool open_the_device();
-static char *edit_device_codes(JCR *jcr, char *omsg, char *imsg, char *cmd);
 static void autochangercmd();
 static void do_unfill();
 
@@ -162,7 +163,7 @@ int main(int margc, char *margv[])
    my_name_is(margc, margv, "btape");
    init_msg(NULL, NULL);
 
-   while ((ch = getopt(margc, margv, "b:c:d:sv?")) != -1) {
+   while ((ch = getopt(margc, margv, "b:c:d:psv?")) != -1) {
       switch (ch) {
       case 'b':                    /* bootstrap file */
         bsr = parse_bsr(NULL, optarg);
@@ -183,8 +184,12 @@ int main(int margc, char *margv[])
         }
         break;
 
+      case 'p':
+        forge_on = true;
+        break;
+
       case 's':
-        signals = FALSE;
+        signals = false;
         break;
 
       case 'v':
@@ -248,7 +253,7 @@ terminate:
 static void terminate_btape(int stat)
 {
 
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
    if (configfile) {
       free(configfile);
    }
@@ -283,7 +288,7 @@ static void terminate_btape(int stat)
    term_msg();
    close_memory_pool();              /* free memory in pool */
 
-   sm_dump(False);
+   sm_dump(false);
    exit(stat);
 }
 
@@ -302,7 +307,7 @@ static bool open_the_device()
         return false;
       }
    }
-   Dmsg1(000, "open_dev %s OK\n", dev_name(dev));
+   Pmsg1(000, "open_dev %s OK\n", dev_name(dev));
    unlock_device(dev);
    free_block(block);
    return true;
@@ -571,7 +576,7 @@ static void rectestcmd()
       return;
    }
 
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
    block = new_block(dev);
    rec = new_record();
 
@@ -579,7 +584,7 @@ static void rectestcmd()
       rec->data = check_pool_memory_size(rec->data, i);
       memset(rec->data, i & 0xFF, i);
       rec->data_len = i;
-      sm_check(__FILE__, __LINE__, False);
+      sm_check(__FILE__, __LINE__, false);
       if (write_record_to_block(block, rec)) {
         empty_block(block);
         blkno++;
@@ -587,11 +592,11 @@ static void rectestcmd()
       } else {
         break;
       }
-      sm_check(__FILE__, __LINE__, False);
+      sm_check(__FILE__, __LINE__, false);
    }
    free_record(rec);
    free_block(block);
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
 }
 
 /*
@@ -1032,9 +1037,10 @@ static int autochanger_test()
 {
    POOLMEM *results, *changer;
    int slot, status, loaded;
-   int timeout = 120;
+   int timeout = jcr->device->max_changer_wait;
    int sleep_time = 0;
 
+   Dmsg1(100, "Max changer wait = %d sec\n", timeout);
    if (!dev_cap(dev, CAP_AUTOCHANGER)) {
       return 1;
    }
@@ -1043,8 +1049,9 @@ static int autochanger_test()
       return 1;
    }
 
-   Pmsg0(-1, "\nTo test the autochanger you must have a blank tape in Slot 1.\n"
-             "I'm going to write on it.\n");
+   Pmsg0(-1, "\nAh, I see you have an autochanger configured.\n"
+             "To test the autochanger you must have a blank tape\n"
+             " that I can write on in Slot 1.\n");
    if (!get_cmd("\nDo you wish to continue with the Autochanger test? (y/n): ")) {
       return 0;
    }
@@ -1069,38 +1076,51 @@ try_again:
    if (status == 0) {
       loaded = atoi(results);
    } else {
-      Pmsg1(-1, _("3991 Bad autochanger \"load slot\" status=%d.\n"), status);
-      loaded = -1;             /* force unload */
+      Pmsg1(-1, _("3991 Bad autochanger command: %s\n"), changer);
+      Pmsg2(-1, _("3991 status=%d result=%s\n"), status, results);
       goto bail_out;
    }
    if (loaded) {
       Pmsg1(-1, "Slot %d loaded. I am going to unload it.\n", loaded);
    } else {
-      Pmsg0(-1, "Nothing loaded into the drive. OK.\n");
+      Pmsg0(-1, "Nothing loaded in the drive. OK.\n");
    }
    Dmsg1(100, "Results from loaded query=%s\n", results);
    if (loaded) {
+      jcr->VolCatInfo.Slot = loaded;
       offline_or_rewind_dev(dev);
       /* We are going to load a new tape, so close the device */
       force_close_dev(dev);
-      Pmsg0(-1, _("3302 Issuing autochanger \"unload\" command.\n"));
+      Pmsg2(-1, _("3302 Issuing autochanger \"unload %d %d\" command.\n"),
+        loaded, dev->drive_index);
       changer = edit_device_codes(jcr, changer, 
                      jcr->device->changer_command, "unload");
-      status = run_program(changer, timeout, NULL);
+      status = run_program(changer, timeout, results);
       Pmsg2(-1, "unload status=%s %d\n", status==0?"OK":"Bad", status);
+      if (status != 0) {
+         Pmsg1(-1, _("3992 Bad autochanger command: %s\n"), changer);
+         Pmsg2(-1, _("3992 status=%d result=%s\n"), status, results);
+      }
    }
 
    /*
     * Load the Slot 1
     */
-   Pmsg1(-1, _("3303 Issuing autochanger \"load slot %d\" command.\n"), slot);
+   
+   slot = 1;
+   jcr->VolCatInfo.Slot = slot;
+   Pmsg2(-1, _("3303 Issuing autochanger \"load slot %d %d\" command.\n"), 
+      slot, dev->drive_index);
    changer = edit_device_codes(jcr, changer, jcr->device->changer_command, "load");
-   Dmsg1(200, "Changer=%s\n", changer);
-   status = run_program(changer, timeout, NULL);
+   Dmsg1(100, "Changer=%s\n", changer);
+   force_close_dev(dev);
+   status = run_program(changer, timeout, results);
    if (status == 0) {
-      Pmsg1(-1,  _("3304 Autochanger \"load slot %d\" status is OK.\n"), slot);
+      Pmsg2(-1,  _("3303 Autochanger \"load slot %d %d\" status is OK.\n"),
+        slot, dev->drive_index);
    } else {
-      Pmsg1(-1,  _("3992 Bad autochanger \"load slot\" status=%d.\n"), status);
+      Pmsg1(-1, _("3993 Bad autochanger command: %s\n"), changer);
+      Pmsg2(-1, _("3993 status=%d result=%s\n"), status, results);
       goto bail_out;
    }
 
@@ -1239,7 +1259,7 @@ test_again:
    if (dev->file != 5) {
       goto bail_out;
    }
-
+   Pmsg0(-1, _("\n=== End Forward space files test ===\n\n"));
    return 1;
 
 bail_out:
@@ -1406,7 +1426,7 @@ static void wrcmd()
    DEV_RECORD *rec;
    int i;
 
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
    block = new_block(dev);
    rec = new_record();
    dump_block(block, "test");
@@ -1416,7 +1436,7 @@ static void wrcmd()
    rec->data = check_pool_memory_size(rec->data, i);
    memset(rec->data, i & 0xFF, i);
    rec->data_len = i;
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
    if (!write_record_to_block(block, rec)) {
       Pmsg0(0, _("Error writing record to block.\n")); 
       goto bail_out;
@@ -1430,10 +1450,10 @@ static void wrcmd()
    Pmsg0(0, _("Wrote block to device.\n"));
 
 bail_out:
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
    free_record(rec);
    free_block(block);
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
 }
 
 /* 
@@ -1828,12 +1848,12 @@ This may take a long time -- hours! ...\n\n");
       }
       if (!write_session_label(jcr, block, EOS_LABEL)) {
          Pmsg1(000, _("Error writting end session label. ERR=%s\n"), strerror_dev(dev));
-        ok = FALSE;
+        ok = false;
       }
       /* Write out final block of this session */
       if (!write_block_to_device(jcr->dcr, block)) {
-         Pmsg0(-1, _("Set ok=FALSE after write_block_to_device.\n"));
-        ok = FALSE;
+         Pmsg0(-1, _("Set ok=false after write_block_to_device.\n"));
+        ok = false;
       }
       Pmsg0(-1, _("Wrote End Of Session label.\n"));
 
@@ -1869,7 +1889,7 @@ This may take a long time -- hours! ...\n\n");
    /* Release the device */
    if (!release_device(jcr)) {
       Pmsg0(-1, _("Error in release_device\n"));
-      ok = FALSE;
+      ok = false;
    }
 
 
@@ -2179,7 +2199,7 @@ static int flush_block(DEV_BLOCK *block, int dump)
         /* Full test in progress */
         if (!fixup_device_block_write_error(jcr, dev, block)) {
             Pmsg1(000, _("Cannot fixup device error. %s\n"), strerror_dev(dev));
-           ok = FALSE;
+           ok = false;
            unlock_device(dev);
            return 0;
         }
@@ -2227,7 +2247,7 @@ static void qfillcmd()
       count = 1000;
    }
 
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
    block = new_block(dev);
    rec = new_record();
 
@@ -2261,10 +2281,10 @@ static void qfillcmd()
    scan_blocks();
 
 bail_out:
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
    free_record(rec);
    free_block(block);
-   sm_check(__FILE__, __LINE__, False);
+   sm_check(__FILE__, __LINE__, false);
 
 }
 
@@ -2410,7 +2430,7 @@ do_tape_cmds()
    bool found;
 
    while (get_cmd("*")) {
-      sm_check(__FILE__, __LINE__, False);
+      sm_check(__FILE__, __LINE__, false);
       found = false;
       parse_args(cmd, &args, &argc, argk, argv, MAX_CMD_ARGS);
       for (i=0; i<comsize; i++)       /* search for command */
@@ -2445,6 +2465,7 @@ static void usage()
 "       -b <file>   specify bootstrap file\n"
 "       -c <file>   set configuration file to file\n"
 "       -d <nn>     set debug level to nn\n"
+"       -p          proceed inspite of I/O errors\n"
 "       -s          turn off signals\n"
 "       -v          be verbose\n"
 "       -?          print this message.\n"  
@@ -2617,6 +2638,7 @@ static void set_volume_name(char *VolName, int volnum)
    dcr->VolCatInfo.Slot = volnum;
 }
 
+#ifdef xxx
 /*
  * Edit codes into ChangerCommand
  *  %% = %
@@ -2694,6 +2716,7 @@ static char *edit_device_codes(JCR *jcr, char *omsg, char *imsg, char *cmd)
    }
    return omsg;
 }
+#endif
 
 #ifdef xxxx_needed
 /*