]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/job.c
ebl update faketape driver to work with regress tests
[bacula/bacula] / bacula / src / stored / job.c
index 965c197bea3ecd947bdb6fcee4e0ec660f21ba47..0b5e6bd4a51e1dc1badec7b6ef5d429786f74a74 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -49,7 +49,11 @@ extern bool do_mac(JCR *jcr);
 /* Requests from the Director daemon */
 static char jobcmd[] = "JobId=%d job=%127s job_name=%127s client_name=%127s "
       "type=%d level=%d FileSet=%127s NoAttr=%d SpoolAttr=%d FileSetMD5=%127s "
-      "SpoolData=%d SpoolSize=%s WritePartAfterJob=%d PreferMountedVols=%d\n";
+      "SpoolData=%d WritePartAfterJob=%d PreferMountedVols=%d SpoolSize=%s\n";
+static char oldjobcmd[] = "JobId=%d job=%127s job_name=%127s client_name=%127s "
+      "type=%d level=%d FileSet=%127s NoAttr=%d SpoolAttr=%d FileSetMD5=%127s "
+      "SpoolData=%d WritePartAfterJob=%d PreferMountedVols=%d\n";
+
 
 
 /* Responses sent to Director daemon */
@@ -86,17 +90,26 @@ bool job_cmd(JCR *jcr)
     * Get JobId and permissions from Director
     */
    Dmsg1(100, "<dird: %s", dir->msg);
+   bstrncpy(spool_size, "0", sizeof(spool_size));
    stat = sscanf(dir->msg, jobcmd, &JobId, job.c_str(), job_name.c_str(),
               client_name.c_str(),
               &JobType, &level, fileset_name.c_str(), &no_attributes,
-              &spool_attributes, fileset_md5.c_str(), &spool_data, spool_size,
-              &write_part_after_job, &PreferMountedVols);
+              &spool_attributes, fileset_md5.c_str(), &spool_data,
+              &write_part_after_job, &PreferMountedVols, spool_size);
    if (stat != 14) {
-      pm_strcpy(jcr->errmsg, dir->msg);
-      dir->fsend(BAD_job, stat, jcr->errmsg);
-      Dmsg1(100, ">dird: %s", dir->msg);
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
-      return false;
+      /* Try old version */
+      stat = sscanf(dir->msg, oldjobcmd, &JobId, job.c_str(), job_name.c_str(),
+              client_name.c_str(),
+              &JobType, &level, fileset_name.c_str(), &no_attributes,
+              &spool_attributes, fileset_md5.c_str(), &spool_data,
+              &write_part_after_job, &PreferMountedVols);
+      if (stat != 13) {
+         pm_strcpy(jcr->errmsg, dir->msg);
+         dir->fsend(BAD_job, stat, jcr->errmsg);
+         Dmsg1(100, ">dird: %s", dir->msg);
+         set_jcr_job_status(jcr, JS_ErrorTerminated);
+         return false;
+      }
    }
    /*
     * Since this job could be rescheduled, we
@@ -152,14 +165,14 @@ bool run_cmd(JCR *jcr)
    struct timeval tv;
    struct timezone tz;
    struct timespec timeout;
-   int errstat;
+   int errstat = 0;
 
    Dsm_check(1);
    Dmsg1(200, "Run_cmd: %s\n", jcr->dir_bsock->msg);
    /* The following jobs don't need the FD */
    switch (jcr->JobType) {
-   case JT_MIGRATE:
    case JT_COPY:
+   case JT_MIGRATE:
    case JT_ARCHIVE:
       jcr->authenticated = true;
       do_mac(jcr);
@@ -174,7 +187,7 @@ bool run_cmd(JCR *jcr)
    timeout.tv_sec = tv.tv_sec + me->client_wait;
 
    Dmsg3(050, "%s waiting %d sec for FD to contact SD key=%s\n",
-         jcr->Job, (int)me->client_wait, jcr->sd_auth_key);
+         jcr->Job, (int)(timeout.tv_sec-time(NULL)), jcr->sd_auth_key);
 
    /*
     * Wait for the File daemon to contact us to start the Job,
@@ -188,6 +201,8 @@ bool run_cmd(JCR *jcr)
          break;
       }
    }
+   Dmsg3(100, "Auth=%d canceled=%d errstat=%d\n", jcr->authenticated,
+      job_canceled(jcr), errstat);
    V(mutex);
 
    memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key));
@@ -207,10 +222,14 @@ void handle_filed_connection(BSOCK *fd, char *job_name)
 {
    JCR *jcr;
 
-   bmicrosleep(0, 50000);             /* wait 50 millisecs */
+/*
+ * With the following bmicrosleep on, running the 
+ * SD under the debugger fails.   
+ */ 
+// bmicrosleep(0, 50000);             /* wait 50 millisecs */
    if (!(jcr=get_jcr_by_full_name(job_name))) {
       Jmsg1(NULL, M_FATAL, 0, _("FD connect failed: Job name not found: %s\n"), job_name);
-      Dmsg1(3, "**** Job \"%s\" not found", job_name);
+      Dmsg1(3, "**** Job \"%s\" not found.\n", job_name);
       return;
    }
 
@@ -393,5 +412,9 @@ void stored_free_jcr(JCR *jcr)
       jcr->write_store = NULL;
    }
    Dsm_check(1);
+
+   if (jcr->JobId != 0)
+      write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
+
    return;
 }