]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/restore.c
Add new files
[bacula/bacula] / bacula / src / dird / restore.c
index a866320387d4c596975de99816b07db731d83bf8..52c1b66f88c9964d4734d791228d21de259a3758 100644 (file)
@@ -1,5 +1,4 @@
 /*
- *
  *   Bacula Director -- restore.c -- responsible for restoring files
  *
  *     Kern Sibbald, November MM
@@ -51,12 +50,9 @@ static char sessioncmd[]   = "session %s %ld %ld %ld %ld %ld %ld\n";
 static char OKrestore[]   = "2000 OK restore\n";
 static char OKstore[]     = "2000 OK storage\n";
 static char OKsession[]   = "2000 OK session\n";
-static char OKbootstrap[] = "2000 OK bootstrap\n";
-static char EndRestore[]  = "2800 End Job TermCode=%d JobFiles=%u JobBytes=%" lld " Errors=%u\n";
 
 /* Forward referenced functions */
 static void restore_cleanup(JCR *jcr, int status);
-static int send_bootstrap_file(JCR *jcr);
 
 /* External functions */
 
@@ -70,8 +66,6 @@ int do_restore(JCR *jcr)
 {
    BSOCK   *fd;
    JOB_DBR rjr;                      /* restore job record */
-   int ok = FALSE;
-
 
    if (!get_or_create_client_record(jcr)) {
       restore_cleanup(jcr, JS_ErrorTerminated);
@@ -235,8 +229,8 @@ int do_restore(JCR *jcr)
    } else {
       replace = REPLACE_ALWAYS;       /* always replace */
    }
-   if (jcr->RestoreWhere) {
-      where = jcr->RestoreWhere;      /* override */
+   if (jcr->where) {
+      where = jcr->where;            /* override */
    } else if (jcr->job->RestoreWhere) {
       where = jcr->job->RestoreWhere; /* no override take from job */
    } else {
@@ -252,23 +246,8 @@ int do_restore(JCR *jcr)
    }
 
    /* Wait for Job Termination */
-   Dmsg0(20, "wait for job termination\n");
-   while (bget_dirmsg(fd) >= 0) {
-      Dmsg1(100, "dird<filed: %s\n", fd->msg);
-      if (sscanf(fd->msg, EndRestore, &jcr->FDJobStatus, &jcr->JobFiles,
-         &jcr->JobBytes, &jcr->Errors) == 4) {
-        ok = TRUE;
-      }
-   }
-
-   if (is_bnet_error(fd)) {
-      Jmsg(jcr, M_FATAL, 0, _("Network error during RESTORE command. ERR=%s\n"),
-         bnet_strerror(fd));
-   }
-   bnet_sig(fd, BNET_TERMINATE);   /* tell Client we are terminating */
-
-
-   restore_cleanup(jcr, ok?jcr->FDJobStatus:JS_ErrorTerminated);
+   int stat = wait_for_job_termination(jcr);
+   restore_cleanup(jcr, stat);
 
    return 1;
 }
@@ -281,7 +260,7 @@ static void restore_cleanup(JCR *jcr, int TermCode)
 {
    char sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH];
    char ec1[30], ec2[30];
-   char term_code[100], fd_term_msg[100];
+   char term_code[100], fd_term_msg[100], sd_term_msg[100];
    char *term_msg;
    int msg_type;
    double kbps;
@@ -293,29 +272,29 @@ static void restore_cleanup(JCR *jcr, int TermCode)
 
    msg_type = M_INFO;                /* by default INFO message */
    switch (TermCode) {
-      case JS_Terminated:
-         term_msg = _("Restore OK");
-        break;
-      case JS_FatalError:
-      case JS_ErrorTerminated:
-         term_msg = _("*** Restore Error ***"); 
-        msg_type = M_ERROR;          /* Generate error message */
-        if (jcr->store_bsock) {
-           bnet_sig(jcr->store_bsock, BNET_TERMINATE);
-           pthread_cancel(jcr->SD_msg_chan);
-        }
-        break;
-      case JS_Canceled:
-         term_msg = _("Restore Canceled");
-        if (jcr->store_bsock) {
-           bnet_sig(jcr->store_bsock, BNET_TERMINATE);
-           pthread_cancel(jcr->SD_msg_chan);
-        }
-        break;
-      default:
-        term_msg = term_code;
-         sprintf(term_code, _("Inappropriate term code: %c\n"), TermCode);
-        break;
+   case JS_Terminated:
+      term_msg = _("Restore OK");
+      break;
+   case JS_FatalError:
+   case JS_ErrorTerminated:
+      term_msg = _("*** Restore Error ***"); 
+      msg_type = M_ERROR;         /* Generate error message */
+      if (jcr->store_bsock) {
+        bnet_sig(jcr->store_bsock, BNET_TERMINATE);
+        pthread_cancel(jcr->SD_msg_chan);
+      }
+      break;
+   case JS_Canceled:
+      term_msg = _("Restore Canceled");
+      if (jcr->store_bsock) {
+        bnet_sig(jcr->store_bsock, BNET_TERMINATE);
+        pthread_cancel(jcr->SD_msg_chan);
+      }
+      break;
+   default:
+      term_msg = term_code;
+      sprintf(term_code, _("Inappropriate term code: %c\n"), TermCode);
+      break;
    }
    bstrftime(sdt, sizeof(sdt), jcr->jr.StartTime);
    bstrftime(edt, sizeof(edt), jcr->jr.EndTime);
@@ -329,6 +308,7 @@ static void restore_cleanup(JCR *jcr, int TermCode)
    }
 
    jobstatus_to_ascii(jcr->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
+   jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
 
    Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\
 JobId:                  %d\n\
@@ -341,6 +321,7 @@ Bytes Restored:         %s\n\
 Rate:                   %.1f KB/s\n\
 Non-fatal FD Errors:    %d\n\
 FD termination status:  %s\n\
+SD termination status:  %s\n\
 Termination:            %s\n\n"),
        edt,
        jcr->jr.JobId,
@@ -353,41 +334,8 @@ Termination:            %s\n\n"),
        (float)kbps,
        jcr->Errors,
        fd_term_msg,
+       sd_term_msg,
        term_msg);
 
    Dmsg0(20, "Leaving restore_cleanup\n");
 }
-
-static int send_bootstrap_file(JCR *jcr)
-{
-   FILE *bs;
-   char buf[1000];
-   BSOCK *fd = jcr->file_bsock;
-   char *bootstrap = "bootstrap\n";
-
-   Dmsg1(400, "send_bootstrap_file: %s\n", jcr->RestoreBootstrap);
-   if (!jcr->RestoreBootstrap) {
-      return 1;
-   }
-   bs = fopen(jcr->RestoreBootstrap, "r");
-   if (!bs) {
-      Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"), 
-        jcr->RestoreBootstrap, strerror(errno));
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
-      return 0;
-   }
-   strcpy(fd->msg, bootstrap); 
-   fd->msglen = strlen(fd->msg);
-   bnet_send(fd);
-   while (fgets(buf, sizeof(buf), bs)) {
-      fd->msglen = Mmsg(&fd->msg, "%s", buf);
-      bnet_send(fd);      
-   }
-   bnet_sig(fd, BNET_EOD);
-   fclose(bs);
-   if (!response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
-      return 0;
-   }
-   return 1;
-}