]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/fd_cmds.c
Massive SD calling sequence reorganization
[bacula/bacula] / bacula / src / dird / fd_cmds.c
index 28fd36ae852a4964e9af85a1a2c654275c5b86fc..ee2e89eda405d34161cad03b70048510ac5bdd26 100644 (file)
@@ -76,14 +76,18 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time,
 {
    BSOCK   *fd;
 
-   fd = bnet_connect(jcr, retry_interval, max_retry_time,
-        _("File daemon"), jcr->client->address, 
-       NULL, jcr->client->FDport, verbose);
-   if (fd == NULL) {
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
-      return 0;
+   if (!jcr->file_bsock) {
+      fd = bnet_connect(jcr, retry_interval, max_retry_time,
+           _("File daemon"), jcr->client->address, 
+          NULL, jcr->client->FDport, verbose);
+      if (fd == NULL) {
+        set_jcr_job_status(jcr, JS_ErrorTerminated);
+        return 0;
+      }
+      Dmsg0(10, "Opened connection with File daemon\n");
+   } else {
+      fd = jcr->file_bsock;          /* use existing connection */
    }
-   Dmsg0(10, "Opened connection with File daemon\n");
    fd->res = (RES *)jcr->client;      /* save resource in BSOCK */
    jcr->file_bsock = fd;
    set_jcr_job_status(jcr, JS_Running);
@@ -140,8 +144,7 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time,
  */
 void get_level_since_time(JCR *jcr, char *since, int since_len)
 {
-   /* Lookup the last
-    * FULL backup job to get the time/date for a 
+   /* Lookup the last FULL backup job to get the time/date for a 
     * differential or incremental save.
     */
    if (!jcr->stime) {
@@ -153,20 +156,21 @@ void get_level_since_time(JCR *jcr, char *since, int since_len)
    case L_DIFFERENTIAL:
    case L_INCREMENTAL:
       /* Look up start time of last job */
-      jcr->jr.JobId = 0;
+      jcr->jr.JobId = 0;     /* flag for db_find_job_start time */
       if (!db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime)) {
          Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db));
          Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found. Doing FULL backup.\n"));
          bsnprintf(since, since_len, " (upgraded from %s)", 
            level_to_str(jcr->JobLevel));
-        jcr->JobLevel = jcr->jr.Level = L_FULL;
+        jcr->JobLevel = jcr->jr.JobLevel = L_FULL;
       } else {
          bstrncpy(since, ", since=", since_len);
         bstrncat(since, jcr->stime, since_len);
       }
-      Dmsg1(100, "Last start time = %s\n", jcr->stime);
+      jcr->jr.JobId = jcr->JobId;
       break;
    }
+   Dmsg2(100, "Level=%c last start time=%s\n", jcr->JobLevel, jcr->stime);
 }
 
 
@@ -193,7 +197,6 @@ int send_level_command(JCR *jcr)
       break;
    case L_DIFFERENTIAL:
    case L_INCREMENTAL:
-//    bnet_fsend(fd, levelcmd, "since ", jcr->stime, 0); /* old code, deprecated */
       stime = str_to_utime(jcr->stime);
       bnet_fsend(fd, levelcmd, "since_utime ", edit_uint64(stime, ed1), 0);
       while (bget_dirmsg(fd) >= 0) {  /* allow him to poll us to sync clocks */
@@ -254,8 +257,9 @@ static int send_list(JCR *jcr, int list)
             fd->msg = edit_job_codes(jcr, fd->msg, p, "");
             bpipe = open_bpipe(fd->msg, 0, "r");
            if (!bpipe) {
+              berrno be;
                Jmsg(jcr, M_FATAL, 0, _("Cannot run program: %s. ERR=%s\n"),
-                 p, strerror(errno));
+                 p, be.strerror());
               goto bail_out;
            }
            /* Copy File options */
@@ -265,19 +269,20 @@ static int send_list(JCR *jcr, int list)
            } else {
                bstrncpy(buf, "0 ", sizeof(buf));
            }
-            Dmsg1(100, "Opts=%s\n", buf);
+            Dmsg1(500, "Opts=%s\n", buf);
            optlen = strlen(buf);
            while (fgets(buf+optlen, sizeof(buf)-optlen, bpipe->rfd)) {
-               fd->msglen = Mmsg(&fd->msg, "%s", buf);
-               Dmsg2(200, "Inc/exc len=%d: %s", fd->msglen, fd->msg);
+               fd->msglen = Mmsg(fd->msg, "%s", buf);
+               Dmsg2(500, "Inc/exc len=%d: %s", fd->msglen, fd->msg);
               if (!bnet_send(fd)) {
                   Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
                  goto bail_out;
               }
            }
            if ((stat=close_bpipe(bpipe)) != 0) {
-               Jmsg(jcr, M_FATAL, 0, _("Error running program: %s. RtnStat=%d ERR=%s\n"),
-                 p, stat, strerror(errno));
+              berrno be;
+               Jmsg(jcr, M_FATAL, 0, _("Error running program %p: ERR=%s\n"),
+                 p, be.strerror(stat));
               goto bail_out;
            }
            break;
@@ -295,10 +300,10 @@ static int send_list(JCR *jcr, int list)
            } else {
                bstrncpy(buf, "0 ", sizeof(buf));
            }
-            Dmsg1(100, "Opts=%s\n", buf);
+            Dmsg1(500, "Opts=%s\n", buf);
            optlen = strlen(buf);
            while (fgets(buf+optlen, sizeof(buf)-optlen, ffd)) {
-               fd->msglen = Mmsg(&fd->msg, "%s", buf);
+               fd->msglen = Mmsg(fd->msg, "%s", buf);
               if (!bnet_send(fd)) {
                   Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
                  goto bail_out;
@@ -311,14 +316,14 @@ static int send_list(JCR *jcr, int list)
            /* Note, fall through wanted */
         default:
            if (ie->num_opts) {
-               Dmsg2(100, "numopts=%d opts=%s\n", ie->num_opts, NPRT(ie->opts_list[0]->opts));
-              pm_strcpy(&fd->msg, ie->opts_list[0]->opts);
-               pm_strcat(&fd->msg, " ");
+               Dmsg2(500, "numopts=%d opts=%s\n", ie->num_opts, NPRT(ie->opts_list[0]->opts));
+              pm_strcpy(fd->msg, ie->opts_list[0]->opts);
+               pm_strcat(fd->msg, " ");
            } else {
-               pm_strcpy(&fd->msg, "0 ");
+               pm_strcpy(fd->msg, "0 ");
            }
-           fd->msglen = pm_strcat(&fd->msg, p);
-            Dmsg1(100, "Inc/Exc name=%s\n", fd->msg);
+           fd->msglen = pm_strcat(fd->msg, p);
+            Dmsg1(500, "Inc/Exc name=%s\n", fd->msg);
            if (!bnet_send(fd)) {
                Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
               goto bail_out;
@@ -388,6 +393,12 @@ static int send_fileset(JCR *jcr)
            for (k=0; k<fo->base.size(); k++) {
                bnet_fsend(fd, "B %s\n", fo->base.get(k));
            }
+           if (fo->reader) {
+               bnet_fsend(fd, "D %s\n", fo->reader);
+           }
+           if (fo->writer) {
+               bnet_fsend(fd, "T %s\n", fo->writer);
+           }
             bnet_fsend(fd, "N\n");
         }
 
@@ -399,39 +410,42 @@ static int send_fileset(JCR *jcr)
                fd->msg = edit_job_codes(jcr, fd->msg, p, "");
                bpipe = open_bpipe(fd->msg, 0, "r");
               if (!bpipe) {
+                 berrno be;
                   Jmsg(jcr, M_FATAL, 0, _("Cannot run program: %s. ERR=%s\n"),
-                    p, strerror(errno));
+                    p, be.strerror());
                  goto bail_out;
               }
                bstrncpy(buf, "F ", sizeof(buf));
-               Dmsg1(100, "Opts=%s\n", buf);
+               Dmsg1(500, "Opts=%s\n", buf);
               optlen = strlen(buf);
               while (fgets(buf+optlen, sizeof(buf)-optlen, bpipe->rfd)) {
-                  fd->msglen = Mmsg(&fd->msg, "%s", buf);
-                  Dmsg2(200, "Inc/exc len=%d: %s", fd->msglen, fd->msg);
+                  fd->msglen = Mmsg(fd->msg, "%s", buf);
+                  Dmsg2(500, "Inc/exc len=%d: %s", fd->msglen, fd->msg);
                  if (!bnet_send(fd)) {
                      Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
                     goto bail_out;
                  }
               }
               if ((stat=close_bpipe(bpipe)) != 0) {
-                  Jmsg(jcr, M_FATAL, 0, _("Error running program: %s. RtnStat=%d ERR=%s\n"),
-                    p, stat, strerror(errno));
+                 berrno be;
+                  Jmsg(jcr, M_FATAL, 0, _("Error running program: %s. ERR=%s\n"),
+                    p, be.strerror(stat));
                  goto bail_out;
               }
               break;
             case '<':
               p++;                      /* skip over < */
                if ((ffd = fopen(p, "r")) == NULL) {
+                 berrno be;
                   Jmsg(jcr, M_FATAL, 0, _("Cannot open included file: %s. ERR=%s\n"),
-                    p, strerror(errno));
+                    p, be.strerror());
                  goto bail_out;
               }
                bstrncpy(buf, "F ", sizeof(buf));
-               Dmsg1(100, "Opts=%s\n", buf);
+               Dmsg1(500, "Opts=%s\n", buf);
               optlen = strlen(buf);
               while (fgets(buf+optlen, sizeof(buf)-optlen, ffd)) {
-                  fd->msglen = Mmsg(&fd->msg, "%s", buf);
+                  fd->msglen = Mmsg(fd->msg, "%s", buf);
                  if (!bnet_send(fd)) {
                      Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
                     goto bail_out;
@@ -443,9 +457,9 @@ static int send_fileset(JCR *jcr)
                p++;                      /* skip over \ */
               /* Note, fall through wanted */
            default:
-               pm_strcpy(&fd->msg, "F ");
-              fd->msglen = pm_strcat(&fd->msg, p);
-               Dmsg1(100, "Inc/Exc name=%s\n", fd->msg);
+               pm_strcpy(fd->msg, "F ");
+              fd->msglen = pm_strcat(fd->msg, p);
+               Dmsg1(500, "Inc/Exc name=%s\n", fd->msg);
               if (!bnet_send(fd)) {
                   Jmsg(jcr, M_FATAL, 0, _(">filed: write error on socket\n"));
                  goto bail_out;
@@ -513,7 +527,7 @@ int send_bootstrap_file(JCR *jcr)
    FILE *bs;
    char buf[1000];
    BSOCK *fd = jcr->file_bsock;
-   char *bootstrap = "bootstrap\n";
+   const char *bootstrap = "bootstrap\n";
 
    Dmsg1(400, "send_bootstrap_file: %s\n", jcr->RestoreBootstrap);
    if (!jcr->RestoreBootstrap) {
@@ -521,8 +535,9 @@ int send_bootstrap_file(JCR *jcr)
    }
    bs = fopen(jcr->RestoreBootstrap, "r");
    if (!bs) {
+      berrno be;
       Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"), 
-        jcr->RestoreBootstrap, strerror(errno));
+        jcr->RestoreBootstrap, be.strerror());
       set_jcr_job_status(jcr, JS_ErrorTerminated);
       return 0;
    }
@@ -547,7 +562,7 @@ int send_run_before_and_after_commands(JCR *jcr)
    POOLMEM *msg = get_pool_memory(PM_FNAME);
    BSOCK *fd = jcr->file_bsock;
    if (jcr->job->ClientRunBeforeJob) {
-      pm_strcpy(&msg, jcr->job->ClientRunBeforeJob);
+      pm_strcpy(msg, jcr->job->ClientRunBeforeJob);
       bash_spaces(msg);
       bnet_fsend(fd, runbefore, msg);
       if (!response(jcr, fd, OKRunBefore, "ClientRunBeforeJob", DISPLAY_ERROR)) {
@@ -557,7 +572,7 @@ int send_run_before_and_after_commands(JCR *jcr)
       }
    }
    if (jcr->job->ClientRunAfterJob) {
-      fd->msglen = pm_strcpy(&msg, jcr->job->ClientRunAfterJob);
+      fd->msglen = pm_strcpy(msg, jcr->job->ClientRunAfterJob);
       bash_spaces(msg);
       bnet_fsend(fd, runafter, msg);
       if (!response(jcr, fd, OKRunAfter, "ClientRunAfterJob", DISPLAY_ERROR)) {