]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/filed/job.c
Start adding back removed code.
[bacula/bacula] / bacula / src / filed / job.c
index 5b88dd67729646844273160c199592b49f5eccbf..0c81adc143c96e5aeec114a1824e45413e8df81c 100644 (file)
 
 #include "bacula.h"
 #include "filed.h"
-#ifdef WIN32_VSS
-#include "vss.h"   
+
+#if defined(WIN32_VSS)
+#include "vss.h"
+
 static pthread_mutex_t vss_mutex = PTHREAD_MUTEX_INITIALIZER;
+static int enable_vss;
 #endif
 
-extern char my_name[];
 extern CLIENT *me;                    /* our client resource */
 
-int enable_vss = 0;                   /* set to use vss */
-
 /* Imported functions */
 extern int status_cmd(JCR *jcr);
 extern int qstatus_cmd(JCR *jcr);
@@ -98,15 +98,16 @@ static struct s_cmds cmds[] = {
 
 /* Commands received from director that need scanning */
 static char jobcmd[]      = "JobId=%d Job=%127s SDid=%d SDtime=%d Authorization=%100s";
-static char storaddr[]    = "storage address=%s port=%d ssl=%d\n";
+static char storaddr[]    = "storage address=%s port=%d ssl=%d";
 static char sessioncmd[]  = "session %127s %ld %ld %ld %ld %ld %ld\n";
 static char restorecmd[]  = "restore replace=%c prelinks=%d where=%s\n";
 static char restorecmd1[] = "restore replace=%c prelinks=%d where=\n";
-static char verifycmd[]   = "verify level=%30s\n";
-static char estimatecmd[] = "estimate listing=%d\n";
-static char runbefore[]   = "RunBeforeJob %s\n";
-static char runafter[]    = "RunAfterJob %s\n";
-static char runscript[]   = "Run OnSuccess=%u OnFailure=%u AbortOnError=%u When=%u Command=%s\n";
+static char verifycmd[]   = "verify level=%30s";
+static char estimatecmd[] = "estimate listing=%d";
+static char runbefore[]   = "RunBeforeJob %s";
+static char runafter[]    = "RunAfterJob %s";
+static char runscript[]   = "Run OnSuccess=%u OnFailure=%u AbortOnError=%u When=%u Command=%s";
+
 /* Responses sent to Director */
 static char errmsg[]      = "2999 Invalid command\n";
 static char no_auth[]     = "2998 No Authorization\n";
@@ -234,9 +235,6 @@ void *handle_client_request(void *dirp)
       bnet_sig(jcr->store_bsock, BNET_TERMINATE);
    }
 
-   /* run after job */
-   run_scripts(jcr, jcr->RunScripts, "ClientAfterJob");
-
    generate_daemon_event(jcr, "JobEnd");
 
    dequeue_messages(jcr);             /* send any queued messages */
@@ -263,8 +261,10 @@ void *handle_client_request(void *dirp)
             fo->wild.destroy();
             fo->wilddir.destroy();
             fo->wildfile.destroy();
+            fo->wildbase.destroy();
             fo->base.destroy();
             fo->fstype.destroy();
+            fo->drivetype.destroy();
             if (fo->reader) {
                free(fo->reader);
             }
@@ -288,8 +288,10 @@ void *handle_client_request(void *dirp)
             fo->wild.destroy();
             fo->wilddir.destroy();
             fo->wildfile.destroy();
+            fo->wildbase.destroy();
             fo->base.destroy();
             fo->fstype.destroy();
+            fo->drivetype.destroy();
          }
          incexe->opts_list.destroy();
          incexe->name_list.destroy();
@@ -454,7 +456,11 @@ static int runbeforenow_cmd(JCR *jcr)
    BSOCK *dir = jcr->dir_bsock;
 
    run_scripts(jcr, jcr->RunScripts, "ClientBeforeJob");
-   return  bnet_fsend(dir, OKRunBeforeNow);
+   if (job_canceled(jcr)) {
+      return  bnet_fsend(dir, _("2905 Bad RunBeforeNow command.\n"));
+   } else {
+      return  bnet_fsend(dir, OKRunBeforeNow);
+   }
 }
 
 static int runafter_cmd(JCR *jcr)
@@ -552,8 +558,10 @@ static findFOPTS *start_options(FF_PKT *ff)
       fo->wild.init(1, true);
       fo->wilddir.init(1, true);
       fo->wildfile.init(1, true);
+      fo->wildbase.init(1, true);
       fo->base.init(1, true);
       fo->fstype.init(1, true);
+      fo->drivetype.init(1, true);
       incexe->current_opts = fo;
       incexe->opts_list.append(fo);
    }
@@ -583,19 +591,22 @@ static void add_file_to_fileset(JCR *jcr, const char *fname, findFILESET *filese
       fn = get_pool_memory(PM_FNAME);
       fn = edit_job_codes(jcr, fn, p, "");
       bpipe = open_bpipe(fn, 0, "r");
-      free_pool_memory(fn);
       if (!bpipe) {
+         berrno be;
          Jmsg(jcr, M_FATAL, 0, _("Cannot run program: %s. ERR=%s\n"),
-            p, strerror(errno));
+            p, be.strerror());
+         free_pool_memory(fn);
          return;
       }
+      free_pool_memory(fn);
       while (fgets(buf, sizeof(buf), bpipe->rfd)) {
          strip_trailing_junk(buf);
          fileset->incexe->name_list.append(bstrdup(buf));
       }
       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. stat=%d: ERR=%s\n"),
+            p, be.code(stat), be.strerror(stat));
          return;
       }
       break;
@@ -720,8 +731,14 @@ static void add_fileset(JCR *jcr, const char *item)
       break;
    case 'X':
       current_opts = start_options(ff);
-      current_opts->fstype.append(bstrdup(item));
       state = state_options;
+      if (subcode == ' ') {
+         current_opts->fstype.append(bstrdup(item));
+      } else if (subcode == 'D') {
+         current_opts->drivetype.append(bstrdup(item));
+      } else {
+         state = state_error;
+      }
       break;
    case 'W':
       current_opts = start_options(ff);
@@ -732,6 +749,8 @@ static void add_fileset(JCR *jcr, const char *item)
          current_opts->wilddir.append(bstrdup(item));
       } else if (subcode == 'F') {
          current_opts->wildfile.append(bstrdup(item));
+      } else if (subcode == 'B') {
+         current_opts->wildbase.append(bstrdup(item));
       } else {
          state = state_error;
       }
@@ -790,12 +809,18 @@ static bool term_fileset(JCR *jcr)
          for (k=0; k<fo->wildfile.size(); k++) {
             Dmsg1(400, "WF %s\n", (char *)fo->wildfile.get(k));
          }
+         for (k=0; k<fo->wildbase.size(); k++) {
+            Dmsg1(400, "WB %s\n", (char *)fo->wildbase.get(k));
+         }
          for (k=0; k<fo->base.size(); k++) {
             Dmsg1(400, "B %s\n", (char *)fo->base.get(k));
          }
          for (k=0; k<fo->fstype.size(); k++) {
             Dmsg1(400, "X %s\n", (char *)fo->fstype.get(k));
          }
+         for (k=0; k<fo->drivetype.size(); k++) {
+            Dmsg1(400, "XD %s\n", (char *)fo->drivetype.get(k));
+         }
          if (fo->reader) {
             Dmsg1(400, "D %s\n", fo->reader);
          }
@@ -830,12 +855,18 @@ static bool term_fileset(JCR *jcr)
          for (k=0; k<fo->wildfile.size(); k++) {
             Dmsg1(400, "WF %s\n", (char *)fo->wildfile.get(k));
          }
+         for (k=0; k<fo->wildbase.size(); k++) {
+            Dmsg1(400, "WB %s\n", (char *)fo->wildbase.get(k));
+         }
          for (k=0; k<fo->base.size(); k++) {
             Dmsg1(400, "B %s\n", (char *)fo->base.get(k));
          }
          for (k=0; k<fo->fstype.size(); k++) {
             Dmsg1(400, "X %s\n", (char *)fo->fstype.get(k));
          }
+         for (k=0; k<fo->drivetype.size(); k++) {
+            Dmsg1(400, "XD %s\n", (char *)fo->drivetype.get(k));
+         }
       }
       for (j=0; j<incexe->name_list.size(); j++) {
          Dmsg1(400, "F %s\n", (char *)incexe->name_list.get(j));
@@ -943,6 +974,9 @@ static void set_options(findFOPTS *fo, const char *opts)
       case 'w':
          fo->flags |= FO_IF_NEWER;
          break;
+      case 'W':
+         fo->flags |= FO_ENHANCEDWILD;
+         break;
       case 'Z':                 /* gzip compression */
          fo->flags |= FO_GZIP;
          fo->GZIP_level = *++p - '0';
@@ -965,10 +999,13 @@ static void set_options(findFOPTS *fo, const char *opts)
 static int fileset_cmd(JCR *jcr)
 {
    BSOCK *dir = jcr->dir_bsock;
+
+#if defined(WIN32_VSS)
    int vss = 0;
 
    sscanf(dir->msg, "fileset vss=%d", &vss);
    enable_vss = vss;
+#endif
 
    if (!init_fileset(jcr)) {
       return 0;
@@ -994,6 +1031,9 @@ static void free_bootstrap(JCR *jcr)
 }
 
 
+static pthread_mutex_t bsr_mutex = PTHREAD_MUTEX_INITIALIZER;
+static uint32_t bsr_uniq = 0;
+
 /* 
  * The Director sends us the bootstrap file, which
  *   we will in turn pass to the SD.
@@ -1005,8 +1045,11 @@ static int bootstrap_cmd(JCR *jcr)
    FILE *bs;
 
    free_bootstrap(jcr);
-   Mmsg(fname, "%s/%s.%s.bootstrap", me->working_directory, me->hdr.name,
-      jcr->Job);
+   P(bsr_mutex);
+   bsr_uniq++;
+   Mmsg(fname, "%s/%s.%s.%d.bootstrap", me->working_directory, me->hdr.name,
+      jcr->Job, bsr_uniq);
+   V(bsr_mutex);
    Dmsg1(400, "bootstrap=%s\n", fname);
    jcr->RestoreBootstrap = fname;
    bs = fopen(fname, "a+b");           /* create file */
@@ -1218,7 +1261,7 @@ static int backup_cmd(JCR *jcr)
    int SDJobStatus;
    char ed1[50], ed2[50];
 
-#ifdef WIN32_VSS
+#if defined(WIN32_VSS)
    // capture state here, if client is backed up by multiple directors
    // and one enables vss and the other does not then enable_vss can change
    // between here and where its evaluated after the job completes.
@@ -1278,7 +1321,7 @@ static int backup_cmd(JCR *jcr)
    
    generate_daemon_event(jcr, "JobStart");
 
-#ifdef WIN32_VSS
+#if defined(WIN32_VSS)
    /* START VSS ON WIN 32 */
    if (bDoVSS) {      
       if (g_pVSSClient->InitializeForBackup()) {   
@@ -1292,14 +1335,14 @@ static int backup_cmd(JCR *jcr)
             } else {
                /* tell user if snapshot creation of a specific drive failed */
                int i;
-               for (i=0; i < strlen(szWinDriveLetters); i++) {
+               for (i=0; i < (int)strlen(szWinDriveLetters); i++) {
                   if (islower(szWinDriveLetters[i])) {
                      Jmsg(jcr, M_WARNING, 0, _("Generate VSS snapshot of drive \"%c:\\\" failed. VSS support is disabled on this drive.\n"), szWinDriveLetters[i]);
                      jcr->Errors++;
                   }
                }
                /* inform user about writer states */
-               for (i=0; i<g_pVSSClient->GetWriterCount(); i++)                
+               for (i=0; i < (int)g_pVSSClient->GetWriterCount(); i++)                
                   if (g_pVSSClient->GetWriterState(i) < 1) {
                      Jmsg(jcr, M_WARNING, 0, _("VSS Writer (PrepareForBackup): %s\n"), g_pVSSClient->GetWriterInfo(i));                    
                      jcr->Errors++;
@@ -1324,11 +1367,14 @@ static int backup_cmd(JCR *jcr)
       bnet_suppress_error_messages(sd, 1);
       bget_msg(sd);                   /* Read final response from append_data */
       Dmsg0(110, "Error in blast_data.\n");
+      /* run shortly after end of data transmission */ 
+      run_scripts(jcr, jcr->RunScripts, "ClientAfterJob");
+
    } else {
       set_jcr_job_status(jcr, JS_Terminated);
 
-      /* run shortly after end of data transmission */ 
-      run_scripts(jcr, jcr->RunScripts, "ClientAfterJobShort");
+      /* run shortly after end of data transmission */   
+      run_scripts(jcr, jcr->RunScripts, "ClientAfterJob");
 
       if (jcr->JobStatus != JS_Terminated) {
          bnet_suppress_error_messages(sd, 1);
@@ -1373,7 +1419,7 @@ static int backup_cmd(JCR *jcr)
    }
 
 cleanup:
-#ifdef WIN32_VSS
+#if defined(WIN32_VSS)
    /* STOP VSS ON WIN 32 */
    /* tell vss to close the backup session */
    if (bDoVSS) {