]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/verify.c
ebl Modify disk-changer to check if slot contains something before
[bacula/bacula] / bacula / src / dird / verify.c
index 192cbbc2c1fc607c4cfff2c5707fbe0e98cf4db4..57663a26e29c9f0ac2629e9863a14782bc235070 100644 (file)
@@ -1,14 +1,14 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    This program is Free Software; you can redistribute it and/or
    modify it under the terms of version two of the GNU General Public
-   License as published by the Free Software Foundation plus additions
-   that are listed in the file LICENSE.
+   License as published by the Free Software Foundation and included
+   in the file LICENSE.
 
    This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -66,6 +66,9 @@ static int missing_handler(void *ctx, int num_fields, char **row);
  */
 bool do_verify_init(JCR *jcr) 
 {
+   if (!allow_duplicate_job(jcr)) {
+      return false;
+   }
    return true;
 }
 
@@ -193,7 +196,7 @@ bool do_verify(JCR *jcr)
       if (!start_storage_daemon_job(jcr, jcr->rstorage, NULL)) {
          return false;
       }
-      if (!bnet_fsend(jcr->store_bsock, "run")) {
+      if (!jcr->store_bsock->fsend("run")) {
          return false;
       }
       /*
@@ -211,7 +214,7 @@ bool do_verify(JCR *jcr)
     */
    set_jcr_job_status(jcr, JS_Blocked);
    if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) {
-      return false;
+      goto bail_out;
    }
 
    set_jcr_job_status(jcr, JS_Running);
@@ -220,12 +223,12 @@ bool do_verify(JCR *jcr)
 
    Dmsg0(30, ">filed: Send include list\n");
    if (!send_include_list(jcr)) {
-      return false;
+      goto bail_out;
    }
 
    Dmsg0(30, ">filed: Send exclude list\n");
    if (!send_exclude_list(jcr)) {
-      return false;
+      goto bail_out;
    }
 
    /*
@@ -248,7 +251,7 @@ bool do_verify(JCR *jcr)
       }
       bnet_fsend(fd, storaddr, jcr->rstore->address, jcr->rstore->SDDport);
       if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) {
-         return false;
+         goto bail_out;
       }
 
       /*
@@ -256,12 +259,12 @@ bool do_verify(JCR *jcr)
        */
       if (!send_bootstrap_file(jcr, fd) ||
           !response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
-         return false;
+         goto bail_out;
       }
 
       if (!jcr->RestoreBootstrap) {
          Jmsg0(jcr, M_FATAL, 0, _("Deprecated feature ... use bootstrap.\n"));
-         return false;
+         goto bail_out;
       }
 
       level = "volume";
@@ -275,19 +278,19 @@ bool do_verify(JCR *jcr)
    default:
       Jmsg2(jcr, M_FATAL, 0, _("Unimplemented Verify level %d(%c)\n"), jcr->JobLevel,
          jcr->JobLevel);
-      return false;
+      goto bail_out;
    }
 
    if (!send_runscripts_commands(jcr)) {
-      return false;
+      goto bail_out;
    }
 
    /*
     * Send verify command/level to File daemon
     */
-   bnet_fsend(fd, verifycmd, level);
+   fd->fsend(verifycmd, level);
    if (!response(jcr, fd, OKverify, "Verify", DISPLAY_ERROR)) {
-      return false;
+      goto bail_out;
    }
 
    /*
@@ -328,14 +331,14 @@ bool do_verify(JCR *jcr)
 
    default:
       Jmsg1(jcr, M_FATAL, 0, _("Unimplemented verify level %d\n"), jcr->JobLevel);
-      return false;
+      goto bail_out;
    }
 
    stat = wait_for_job_termination(jcr);
-   if (stat == JS_Terminated) {
-      verify_cleanup(jcr, stat);
-      return true;
-   }
+   verify_cleanup(jcr, stat);
+   return true;
+
+bail_out:
    return false;
 }
 
@@ -373,6 +376,10 @@ void verify_cleanup(JCR *jcr, int TermCode)
 
    update_job_end(jcr, TermCode);
 
+   if (job_canceled(jcr)) {
+      cancel_storage_daemon_job(jcr);
+   }
+
    if (jcr->unlink_bsr && jcr->RestoreBootstrap) {
       unlink(jcr->RestoreBootstrap);
       jcr->unlink_bsr = false;
@@ -414,7 +421,7 @@ void verify_cleanup(JCR *jcr, int TermCode)
    jobstatus_to_ascii(jcr->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
    if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) {
       jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
-   Jmsg(jcr, msg_type, 0, _("Bacula %s %s (%s): %s\n"
+      Jmsg(jcr, msg_type, 0, _("Bacula %s %s (%s): %s\n"
 "  Build OS:               %s %s %s\n"
 "  JobId:                  %d\n"
 "  Job:                    %s\n"
@@ -449,7 +456,7 @@ void verify_cleanup(JCR *jcr, int TermCode)
          sd_term_msg,
          term_msg);
    } else {
-   Jmsg(jcr, msg_type, 0, _("Bacula %s %s (%s): %s\n"
+      Jmsg(jcr, msg_type, 0, _("Bacula %s %s (%s): %s\n"
 "  Build:                  %s %s %s\n"
 "  JobId:                  %d\n"
 "  Job:                    %s\n"
@@ -470,7 +477,7 @@ void verify_cleanup(JCR *jcr, int TermCode)
          jcr->jr.Job,
          jcr->fileset->hdr.name,
          level_to_str(jcr->JobLevel),
-         jcr->client->hdr.name,
+         jcr->client->name(),
          jcr->previous_jr.JobId,
          Name,
          sdt,
@@ -694,7 +701,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
       } else if (crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
          Dmsg2(400, "stream=Digest inx=%d Digest=%s\n", file_index, Opts_Digest);
          /*
-          * When ever we get a digest is MUST have been
+          * When ever we get a digest it MUST have been
           * preceded by an attributes record, which sets attr_file_index
           */
          if (jcr->FileIndex != (uint32_t)file_index) {
@@ -703,7 +710,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
             return false;
          }
          if (do_Digest != CRYPTO_DIGEST_NONE) {
-            db_escape_string(buf, Opts_Digest, strlen(Opts_Digest));
+            db_escape_string(jcr, jcr->db, buf, Opts_Digest, strlen(Opts_Digest));
             if (strcmp(buf, fdbr.Digest) != 0) {
                prt_fname(jcr);
                if (debug_level >= 10) {
@@ -743,7 +750,9 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
       stat = JS_Differences;
    }
    free_pool_memory(fname);
-   set_jcr_job_status(jcr, stat);
+   if (!job_canceled(jcr)) {
+      jcr->JobStatus = stat;
+   }
    return stat == JS_Terminated;
 }
 
@@ -761,11 +770,11 @@ static int missing_handler(void *ctx, int num_fields, char **row)
       return 1;
    }
    if (!jcr->fn_printed) {
-      Jmsg(jcr, M_INFO, 0, "\n");
-      Jmsg(jcr, M_INFO, 0, _("The following files are in the Catalog but not on disk:\n"));
+      Qmsg(jcr, M_INFO, 0, _("\nThe following files are in the Catalog but not on %s:\n"),
+       jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ? "the Volume(s)" : "disk");
       jcr->fn_printed = true;
    }
-   Jmsg(jcr, M_INFO, 0, "      %s%s\n", row[0]?row[0]:"", row[1]?row[1]:"");
+   Qmsg(jcr, M_INFO, 0, "      %s%s\n", row[0]?row[0]:"", row[1]?row[1]:"");
    return 0;
 }
 
@@ -777,6 +786,6 @@ static void prt_fname(JCR *jcr)
 {
    if (!jcr->fn_printed) {
       Jmsg(jcr, M_INFO, 0, _("File: %s\n"), jcr->fname);
-      jcr->fn_printed = TRUE;
+      jcr->fn_printed = true;
    }
 }