]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/getmsg.c
Keep the same keywords as in previous version
[bacula/bacula] / bacula / src / dird / getmsg.c
index ec1c16cf00bcdaa5f51c75a116e3907748027c02..2aa5999f6432c8ed38c8246aab5dd4db78fc8031 100644 (file)
@@ -1,12 +1,12 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2010 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.
    This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
+   modify it under the terms of version three of the GNU Affero General Public
    License as published by the Free Software Foundation and included
    in the file LICENSE.
 
@@ -15,7 +15,7 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Affero General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
@@ -45,7 +45,6 @@
  *       Requests are any message that does not begin with a digit.
  *       In affect, they are commands.
  *
- *   Version $Id$
  */
 
 #include "bacula.h"
@@ -71,7 +70,7 @@ static char Device_update[]   = "DevUpd Job=%127s "
 static char OK_msg[] = "1000 OK\n";
 
 
-void set_jcr_sd_job_status(JCR *jcr, int SDJobStatus)
+static void set_jcr_sd_job_status(JCR *jcr, int SDJobStatus)
 {
    bool set_waittime=false;
    Dmsg2(800, "set_jcr_sd_job_status(%s, %c)\n", jcr->Job, SDJobStatus);
@@ -125,18 +124,19 @@ void set_jcr_sd_job_status(JCR *jcr, int SDJobStatus)
  */
 int bget_dirmsg(BSOCK *bs)
 {
-   int32_t n;
+   int32_t n = BNET_TERMINATE;
    char Job[MAX_NAME_LENGTH];
    char MsgType[20];
-   int type, level;
-   JCR *jcr;
+   int type;
+   utime_t mtime;                     /* message time */
+   JCR *jcr = bs->jcr();
    char *msg;
 
-   for (;;) {
+   for ( ; !bs->is_stop() && !bs->is_timed_out(); ) {
       n = bs->recv();
-      Dmsg2(300, "bget_dirmsg %d: %s\n", n, bs->msg);
+      Dmsg2(100, "bget_dirmsg %d: %s\n", n, bs->msg);
 
-      if (is_bnet_stop(bs)) {
+      if (bs->is_stop() || bs->is_timed_out()) {
          return n;                    /* error or terminate */
       }
       if (n == BNET_SIGNAL) {          /* handle signal */
@@ -169,7 +169,7 @@ int bget_dirmsg(BSOCK *bs)
             bs->fsend("btime %s\n", edit_uint64(get_current_btime(),ed1));
             break;
          default:
-            Emsg1(M_WARNING, 0, _("bget_dirmsg: unknown bnet signal %d\n"), bs->msglen);
+            Jmsg1(jcr, M_WARNING, 0, _("bget_dirmsg: unknown bnet signal %d\n"), bs->msglen);
             return n;
          }
          continue;
@@ -187,33 +187,26 @@ int bget_dirmsg(BSOCK *bs)
        *  Try to fulfill it.
        */
       if (sscanf(bs->msg, "%020s Job=%127s ", MsgType, Job) != 2) {
-         Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+         Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
          continue;
       }
-      if (strcmp(Job, "*System*") == 0) {
-         jcr = NULL;                  /* No jcr */
-      } else if (!(jcr=get_jcr_by_full_name(Job))) {
-         Emsg1(M_ERROR, 0, _("Job not found: %s\n"), bs->msg);
-         continue;
-      }
-      Dmsg1(900, "Getmsg got jcr 0x%x\n", jcr);
 
       /* Skip past "Jmsg Job=nnn" */
       if (!(msg=find_msg_start(bs->msg))) {
-         Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
-         free_jcr(jcr);
+         Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
          continue;
       }
 
       /*
        * Here we are expecting a message of the following format:
        *   Jmsg Job=nnn type=nnn level=nnn Message-string
+       * Note, level should really be mtime, but that changes
+       *   the protocol.
        */
       if (bs->msg[0] == 'J') {           /* Job message */
-         if (sscanf(bs->msg, "Jmsg Job=%127s type=%d level=%d",
-                    Job, &type, &level) != 3) {
-            Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
-            free_jcr(jcr);
+         if (sscanf(bs->msg, "Jmsg Job=%127s type=%d level=%lld",
+                    Job, &type, &mtime) != 3) {
+            Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
             continue;
          }
          Dmsg1(900, "Got msg: %s\n", bs->msg);
@@ -225,8 +218,7 @@ int bget_dirmsg(BSOCK *bs)
             msg++;                    /* skip leading space */
          }
          Dmsg1(900, "Dispatch msg: %s", msg);
-         dispatch_message(jcr, type, level, msg);
-         free_jcr(jcr);
+         dispatch_message(jcr, type, mtime, msg);
          continue;
       }
       /*
@@ -236,32 +228,42 @@ int bget_dirmsg(BSOCK *bs)
       if (bs->msg[0] == 'C') {        /* Catalog request */
          Dmsg2(900, "Catalog req jcr 0x%x: %s", jcr, bs->msg);
          catalog_request(jcr, bs);
-         Dmsg1(900, "Calling freejcr 0x%x\n", jcr);
-         free_jcr(jcr);
          continue;
       }
       if (bs->msg[0] == 'U') {        /* SD sending attributes */
          Dmsg2(900, "Catalog upd jcr 0x%x: %s", jcr, bs->msg);
          catalog_update(jcr, bs);
-         Dmsg1(900, "Calling freejcr 0x%x\n", jcr);
-         free_jcr(jcr);
+         continue;
+      }
+      if (bs->msg[0] == 'B') {        /* SD sending file spool attributes */
+         Dmsg2(100, "Blast attributes jcr 0x%x: %s", jcr, bs->msg);
+         char filename[256];
+         if (sscanf(bs->msg, "BlastAttr Job=%127s File=%255s", 
+                    Job, filename) != 2) {
+            Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+            continue;
+         }
+         unbash_spaces(filename);
+         if (despool_attributes_from_file(jcr, filename)) {
+            bs->fsend("1000 OK BlastAttr\n");
+         } else {
+            bs->fsend("1990 ERROR BlastAttr\n");
+         }
          continue;
       }
       if (bs->msg[0] == 'M') {        /* Mount request */
          Dmsg1(900, "Mount req: %s", bs->msg);
          mount_request(jcr, bs, msg);
-         free_jcr(jcr);
          continue;
       }
       if (bs->msg[0] == 'S') {       /* Status change */
          int JobStatus;
          char Job[MAX_NAME_LENGTH];
          if (sscanf(bs->msg, Job_status, &Job, &JobStatus) == 2) {
-            set_jcr_sd_job_status(jcr,JobStatus); /* current status */
+            set_jcr_sd_job_status(jcr, JobStatus); /* current status */
          } else {
-            Emsg1(M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
+            Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
          }
-         free_jcr(jcr);
          continue;
       }
 #ifdef needed
@@ -325,6 +327,7 @@ int bget_dirmsg(BSOCK *bs)
 #endif
       return n;
    }
+   return n;
 }
 
 static char *find_msg_start(char *msg)