]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/filed/job.c
kes Fix sscanf problems reported by Peter Buschman that caused
[bacula/bacula] / bacula / src / filed / job.c
index eb0af2470fba1f1aeeb31f4cf113c0a24d0169f3..8fc6dbdc5de0f0cfc054459c0870c66793d00ec5 100644 (file)
@@ -115,12 +115,12 @@ 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 restorecmdR[] = "restore replace=%c prelinks=%d rwhere=%s\n";
+static char restorecmdR[] = "restore replace=%c prelinks=%d regexwhere=%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";
+static char runscript[]   = "Run OnSuccess=%d OnFailure=%d AbortOnError=%d When=%d Command=%s";
 
 /* Responses sent to Director */
 static char errmsg[]      = "2999 Invalid command\n";
@@ -340,6 +340,7 @@ void *handle_client_request(void *dirp)
    Dmsg0(100, "Done with term_find_files\n");
    free_jcr(jcr);                     /* destroy JCR record */
    Dmsg0(100, "Done with free_jcr\n");
+   Dsm_check(1);
    return NULL;
 }
 
@@ -372,8 +373,8 @@ static int cancel_cmd(JCR *jcr)
          bnet_fsend(dir, _("2901 Job %s not found.\n"), Job);
       } else {
          if (cjcr->store_bsock) {
-            cjcr->store_bsock->timed_out = 1;
-            cjcr->store_bsock->terminated = 1;
+            cjcr->store_bsock->m_timed_out = 1;
+            cjcr->store_bsock->m_terminated = 1;
             pthread_kill(cjcr->my_thread_id, TIMEOUT_SIGNAL);
          }
          set_jcr_job_status(cjcr, JS_Canceled);
@@ -529,13 +530,15 @@ static int runscript_cmd(JCR *jcr)
 {
    BSOCK *dir = jcr->dir_bsock;
    POOLMEM *msg = get_memory(dir->msglen+1);
+   int on_success, on_failure, abort_on_error;
 
    RUNSCRIPT *cmd = new_runscript() ;
 
    Dmsg1(100, "runscript_cmd: '%s'\n", dir->msg);
-   if (sscanf(dir->msg, runscript, &cmd->on_success, 
-                                  &cmd->on_failure,
-                                  &cmd->abort_on_error,
+   /* Note, we cannot sscanf into bools */
+   if (sscanf(dir->msg, runscript, &on_success, 
+                                  &on_failure,
+                                  &abort_on_error,
                                   &cmd->when,
                                   msg) != 5) {
       pm_strcpy(jcr->errmsg, dir->msg);
@@ -545,6 +548,9 @@ static int runscript_cmd(JCR *jcr)
       free_memory(msg);
       return 0;
    }
+   cmd->on_success = on_success;
+   cmd->on_failure = on_failure;
+   cmd->abort_on_error = abort_on_error;
    unbash_spaces(msg);
 
    cmd->set_command(msg);
@@ -628,7 +634,7 @@ static void add_file_to_fileset(JCR *jcr, const char *fname, findFILESET *filese
       if (!bpipe) {
          berrno be;
          Jmsg(jcr, M_FATAL, 0, _("Cannot run program: %s. ERR=%s\n"),
-            p, be.strerror());
+            p, be.bstrerror());
          free_pool_memory(fn);
          return;
       }
@@ -640,7 +646,7 @@ static void add_file_to_fileset(JCR *jcr, const char *fname, findFILESET *filese
       if ((stat=close_bpipe(bpipe)) != 0) {
          berrno be;
          Jmsg(jcr, M_FATAL, 0, _("Error running program: %s. stat=%d: ERR=%s\n"),
-            p, be.code(stat), be.strerror(stat));
+            p, be.code(stat), be.bstrerror(stat));
          return;
       }
       break;
@@ -650,7 +656,7 @@ static void add_file_to_fileset(JCR *jcr, const char *fname, findFILESET *filese
       if ((ffd = fopen(p, "rb")) == NULL) {
          berrno be;
          Jmsg(jcr, M_FATAL, 0, _("Cannot open FileSet input file: %s. ERR=%s\n"),
-            p, be.strerror());
+            p, be.bstrerror());
          return;
       }
       while (fgets(buf, sizeof(buf), ffd)) {
@@ -924,6 +930,7 @@ static void set_options(findFOPTS *fo, const char *opts)
 {
    int j;
    const char *p;
+   char strip[100];
 
    for (p=opts; *p; p++) {
       switch (*p) {
@@ -1009,6 +1016,20 @@ static void set_options(findFOPTS *fo, const char *opts)
          }
          fo->VerifyOpts[j] = 0;
          break;
+      case 'P':                  /* strip path */
+         /* Get integer */
+         p++;                    /* skip P */
+         for (j=0; *p && *p != ':'; p++) {
+            strip[j] = *p;
+            if (j < (int)sizeof(strip) - 1) {
+               j++;
+            }
+         }
+         strip[j] = 0;
+         fo->strip_path = atoi(strip);
+         fo->flags |= FO_STRIPPATH;
+         Dmsg2(100, "strip=%s strip_path=%d\n", strip, fo->strip_path);
+         break;
       case 'w':
          fo->flags |= FO_IF_NEWER;
          break;
@@ -1096,7 +1117,7 @@ static int bootstrap_cmd(JCR *jcr)
    if (!bs) {
       berrno be;
       Jmsg(jcr, M_FATAL, 0, _("Could not create bootstrap file %s: ERR=%s\n"),
-         jcr->RestoreBootstrap, be.strerror());
+         jcr->RestoreBootstrap, be.bstrerror());
       /*
        * Suck up what he is sending to us so that he will then
        *   read our error message.
@@ -1197,7 +1218,13 @@ static int level_cmd(JCR *jcr)
       adj = btime_to_utime(bt_adj);
       since_time += adj;              /* adjust for clock difference */
       if (adj != 0) {
-         Jmsg(jcr, M_INFO, 0, _("DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"), adj);
+         int type;
+         if (adj > 600 || adj < -600) {
+            type = M_WARNING;
+         } else {
+            type = M_INFO;
+         }
+         Jmsg(jcr, type, 0, _("DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"), adj);
       }
       bnet_sig(dir, BNET_EOD);
 
@@ -1393,7 +1420,7 @@ static int backup_cmd(JCR *jcr)
         }
       } else {
          berrno be;
-         Jmsg(jcr, M_WARNING, 0, _("VSS was not initialized properly. VSS support is disabled. ERR=%s\n"), be.strerror());
+         Jmsg(jcr, M_WARNING, 0, _("VSS was not initialized properly. VSS support is disabled. ERR=%s\n"), be.bstrerror());
       } 
    }
 #endif
@@ -1573,7 +1600,8 @@ static int restore_cmd(JCR *jcr)
 {
    BSOCK *dir = jcr->dir_bsock;
    BSOCK *sd = jcr->store_bsock;
-   POOLMEM *where;
+   POOLMEM *args;
+   bool use_regexwhere=false;
    int prefix_links;
    char replace;
    char ed1[50], ed2[50];
@@ -1583,38 +1611,40 @@ static int restore_cmd(JCR *jcr)
     */
    Dmsg0(150, "restore command\n");
    /* Pickup where string */
-   where = get_memory(dir->msglen+1);
-   *where = 0;
+   args = get_memory(dir->msglen+1);
+   *args = 0;
 
-   if (sscanf(dir->msg, restorecmd, &replace, &prefix_links, where) != 3) {
-      if (sscanf(dir->msg, restorecmdR, &replace, &prefix_links, where) != 3){
+   if (sscanf(dir->msg, restorecmd, &replace, &prefix_links, args) != 3) {
+      if (sscanf(dir->msg, restorecmdR, &replace, &prefix_links, args) != 3){
          if (sscanf(dir->msg, restorecmd1, &replace, &prefix_links) != 2) {
             pm_strcpy(jcr->errmsg, dir->msg);
             Jmsg(jcr, M_FATAL, 0, _("Bad replace command. CMD=%s\n"), jcr->errmsg);
             return 0;
          }
-         *where = 0;
+         *args = 0;
       }
-      jcr->where_use_regexp = true;
+      use_regexwhere = true;
    }
    /* Turn / into nothing */
-   if (IsPathSeparator(where[0]) && where[1] == '\0') {
-      where[0] = '\0';
+   if (IsPathSeparator(args[0]) && args[1] == '\0') {
+      args[0] = '\0';
    }
 
-   Dmsg2(150, "Got replace %c, where=%s\n", replace, where);
-   unbash_spaces(where);
-   jcr->where = bstrdup(where);
+   Dmsg2(150, "Got replace %c, where=%s\n", replace, args);
+   unbash_spaces(args);
 
-   if (jcr->where_use_regexp) {
-      jcr->where_bregexp = get_bregexps(jcr->where);
+   if (use_regexwhere) {
+      jcr->where_bregexp = get_bregexps(args);
       if (!jcr->where_bregexp) {
-        Jmsg(jcr, M_FATAL, 0, _("Bad where regexp. where=%s\n"), jcr->where);
-        free_pool_memory(where);
-        return 0;
+         Jmsg(jcr, M_FATAL, 0, _("Bad where regexp. where=%s\n"), args);
+         free_pool_memory(args);
+         return 0;
       }
+   } else {
+      jcr->where = bstrdup(args);
    }
-   free_pool_memory(where);
+
+   free_pool_memory(args);
    jcr->replace = replace;
    jcr->prefix_links = prefix_links;
 
@@ -1794,7 +1824,7 @@ static int send_bootstrap_file(JCR *jcr)
    if (!bs) {
       berrno be;
       Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"),
-         jcr->RestoreBootstrap, be.strerror());
+         jcr->RestoreBootstrap, be.bstrerror());
       set_jcr_job_status(jcr, JS_ErrorTerminated);
       goto bail_out;
    }