]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/job.c
Implement berrno for bpipes and run_program
[bacula/bacula] / bacula / src / dird / job.c
index 0a21271352795978ccf59626f523a6bc482bf086..e387dd9255193a5622c35c6b9c1e1b9dae96508b 100644 (file)
@@ -57,7 +57,9 @@ void init_job_server(int max_workers)
    watchdog_t *wd;
    
    if ((stat = jobq_init(&job_queue, max_workers, job_thread)) != 0) {
-      Emsg1(M_ABORT, 0, _("Could not init job queue: ERR=%s\n"), strerror(stat));
+      berrno be;
+      be.set_errno(stat);
+      Emsg1(M_ABORT, 0, _("Could not init job queue: ERR=%s\n"), be.strerror());
    }
    if ((wd = new_watchdog()) == NULL) {
       Emsg0(M_ABORT, 0, _("Could not init job monitor watchdogs\n"));
@@ -74,10 +76,14 @@ void init_job_server(int max_workers)
  * Run a job -- typically called by the scheduler, but may also
  *             be called by the UA (Console program).
  *
+ *  Returns: 0 on failure
+ *          JobId on success
+ *
  */
-void run_job(JCR *jcr)
+JobId_t run_job(JCR *jcr)
 {
    int stat, errstat;
+   JobId_t JobId = 0;
 
    P(jcr->mutex);
    sm_check(__FILE__, __LINE__, true);
@@ -85,7 +91,9 @@ void run_job(JCR *jcr)
 
    /* Initialize termination condition variable */
    if ((errstat = pthread_cond_init(&jcr->term_wait, NULL)) != 0) {
-      Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat));
+      berrno be;
+      be.set_errno(errstat);
+      Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), be.strerror());
       goto bail_out;
    }
    jcr->term_wait_inited = true;
@@ -117,7 +125,7 @@ void run_job(JCR *jcr)
       Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
       goto bail_out;
    }
-   jcr->JobId = jcr->jr.JobId;
+   JobId = jcr->JobId = jcr->jr.JobId;
 
    Dmsg4(100, "Created job record JobId=%d Name=%s Type=%c Level=%c\n", 
        jcr->JobId, jcr->Job, jcr->jr.JobType, jcr->jr.JobLevel);
@@ -125,18 +133,21 @@ void run_job(JCR *jcr)
 
    /* Queue the job to be run */
    if ((stat = jobq_add(&job_queue, jcr)) != 0) {
-      Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), strerror(stat));
+      berrno be;
+      be.set_errno(stat);
+      Jmsg(jcr, M_FATAL, 0, _("Could not add job queue: ERR=%s\n"), be.strerror());
+      JobId = 0;
       goto bail_out;
    }
    Dmsg0(100, "Done run_job()\n");
 
    V(jcr->mutex);
-   return;
+   return JobId;
 
 bail_out:
    set_jcr_job_status(jcr, JS_ErrorTerminated);
    V(jcr->mutex);
-   return;
+   return JobId;
 
 }
 
@@ -184,8 +195,9 @@ static void *job_thread(void *arg)
            }
            status = close_bpipe(bpipe);
            if (status != 0) {
-               Jmsg(jcr, M_FATAL, 0, _("RunBeforeJob returned non-zero status=%d\n"),
-                 status);
+              berrno be;
+              be.set_errno(status);
+               Jmsg(jcr, M_FATAL, 0, _("RunBeforeJob error: ERR=%s\n"), be.strerror());
               set_jcr_job_status(jcr, JS_FatalError);
               update_job_end_record(jcr);
               goto bail_out;
@@ -243,12 +255,12 @@ static void *job_thread(void *arg)
             *  job in error, simply report the error condition.   
             */
            if (status != 0) {
+              berrno be;
+              be.set_errno(status);
               if (jcr->JobStatus == JS_Terminated) {
-                  Jmsg(jcr, M_WARNING, 0, _("RunAfterJob returned non-zero status=%d\n"),
-                      status);
+                  Jmsg(jcr, M_WARNING, 0, _("RunAfterJob error: ERR=%s\n"), be.strerror());
               } else {
-                  Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob returned non-zero status=%d\n"),
-                      status);
+                  Jmsg(jcr, M_FATAL, 0, _("RunAfterFailedJob error: ERR=%s\n"), be.strerror());
               }
            }
         }