]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/restore.c
kes Pass jcr to tls routines so debug messages can be handled better.
[bacula/bacula] / bacula / src / dird / restore.c
index e3a60613b0b2517c39264162afdc55d476a667c1..2a73362e51c65e9a0185c9aae149e777f23fca72 100644 (file)
@@ -1,7 +1,7 @@
 /*
    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.
@@ -69,15 +69,21 @@ bool do_restore(JCR *jcr)
 {
    BSOCK   *fd;
    JOB_DBR rjr;                       /* restore job record */
+   char replace, *where, *cmd;
+   char empty = '\0';
+   int stat;
 
    free_wstorage(jcr);                /* we don't write */
 
+   if (!allow_duplicate_job(jcr)) {
+      goto bail_out;
+   }
+
    memset(&rjr, 0, sizeof(rjr));
    jcr->jr.JobLevel = L_FULL;         /* Full restore */
    if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
       Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
    Dmsg0(20, "Updated job start record\n");
 
@@ -87,8 +93,7 @@ bool do_restore(JCR *jcr)
       Jmsg0(jcr, M_FATAL, 0, _("Cannot restore without a bootstrap file.\n"
           "You probably ran a restore job directly. All restore jobs must\n"
           "be run using the restore command.\n"));
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
 
 
@@ -107,25 +112,22 @@ bool do_restore(JCR *jcr)
     * Start conversation with Storage daemon
     */
    if (!connect_to_storage_daemon(jcr, 10, SDConnectTimeout, 1)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
    /*
     * Now start a job with the Storage daemon
     */
    if (!start_storage_daemon_job(jcr, jcr->rstorage, NULL)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
-   if (!bnet_fsend(jcr->store_bsock, "run")) {
-      return false;
+   if (!jcr->store_bsock->fsend("run")) {
+      goto bail_out;
    }
    /*
     * Now start a Storage daemon message thread
     */
    if (!start_storage_daemon_message_thread(jcr)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
    Dmsg0(50, "Storage daemon connection OK\n");
 
@@ -135,9 +137,7 @@ bool do_restore(JCR *jcr)
     */
    set_jcr_job_status(jcr, JS_WaitFD);
    if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) {
-      cancel_storage_daemon_job(jcr);
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
 
    fd = jcr->file_bsock;
@@ -151,11 +151,10 @@ bool do_restore(JCR *jcr)
    if (jcr->rstore->SDDport == 0) {
       jcr->rstore->SDDport = jcr->rstore->SDport;
    }
-   bnet_fsend(fd, storaddr, jcr->rstore->address, jcr->rstore->SDDport);
+   fd->fsend(storaddr, jcr->rstore->address, jcr->rstore->SDDport);
    Dmsg1(6, "dird>filed: %s\n", fd->msg);
    if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
 
    /*
@@ -163,19 +162,15 @@ bool do_restore(JCR *jcr)
     */
    if (!send_bootstrap_file(jcr, fd) ||
        !response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
 
 
    if (!send_runscripts_commands(jcr)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
 
    /* Send restore command */
-   char replace, *where, *cmd=NULL;
-   char empty = '\0';
 
    if (jcr->replace != 0) {
       replace = jcr->replace;
@@ -185,13 +180,11 @@ bool do_restore(JCR *jcr)
       replace = REPLACE_ALWAYS;       /* always replace */
    }
    
-   where = ∅                    /* default */
-
    if (jcr->RegexWhere) {
       where = jcr->RegexWhere;             /* override */
       cmd = restorecmdR;
    } else if (jcr->job->RegexWhere) {
-      where = jcr->job->RegexWhere; /* no override take from job */
+      where = jcr->job->RegexWhere;   /* no override take from job */
       cmd = restorecmdR;
 
    } else if (jcr->where) {
@@ -200,24 +193,30 @@ bool do_restore(JCR *jcr)
    } else if (jcr->job->RestoreWhere) {
       where = jcr->job->RestoreWhere; /* no override take from job */
       cmd = restorecmd;
-   } 
+
+   } else {                           /* nothing was specified */
+      where = ∅                 /* use default */
+      cmd   = restorecmd;                    
+   }
    
    jcr->prefix_links = jcr->job->PrefixLinks;
 
    bash_spaces(where);
-   bnet_fsend(fd, cmd, replace, jcr->prefix_links, where);
+   fd->fsend(cmd, replace, jcr->prefix_links, where);
    unbash_spaces(where);
 
    if (!response(jcr, fd, OKrestore, "Restore", DISPLAY_ERROR)) {
-      restore_cleanup(jcr, JS_ErrorTerminated);
-      return false;
+      goto bail_out;
    }
 
    /* Wait for Job Termination */
-   int stat = wait_for_job_termination(jcr);
+   stat = wait_for_job_termination(jcr);
    restore_cleanup(jcr, stat);
-
    return true;
+
+bail_out:
+   restore_cleanup(jcr, JS_ErrorTerminated);
+   return false;
 }
 
 bool do_restore_init(JCR *jcr) 
@@ -247,6 +246,10 @@ void restore_cleanup(JCR *jcr, int TermCode)
       jcr->unlink_bsr = false;
    }
 
+   if (job_canceled(jcr)) {
+      cancel_storage_daemon_job(jcr);
+   }  
+
    switch (TermCode) {
    case JS_Terminated:
       if (jcr->ExpectedFiles > jcr->jr.JobFiles) {
@@ -260,7 +263,7 @@ void restore_cleanup(JCR *jcr, int TermCode)
       term_msg = _("*** Restore Error ***");
       msg_type = M_ERROR;          /* Generate error message */
       if (jcr->store_bsock) {
-         bnet_sig(jcr->store_bsock, BNET_TERMINATE);
+         jcr->store_bsock->signal(BNET_TERMINATE);
          if (jcr->SD_msg_chan) {
             pthread_cancel(jcr->SD_msg_chan);
          }
@@ -269,7 +272,7 @@ void restore_cleanup(JCR *jcr, int TermCode)
    case JS_Canceled:
       term_msg = _("Restore Canceled");
       if (jcr->store_bsock) {
-         bnet_sig(jcr->store_bsock, BNET_TERMINATE);
+         jcr->store_bsock->signal(BNET_TERMINATE);
          if (jcr->SD_msg_chan) {
             pthread_cancel(jcr->SD_msg_chan);
          }