]> git.sur5r.net Git - bacula/bacula/commitdiff
Convert restore object to use STREAM_RESTORE_OBJECT; cleaner code
authorKern Sibbald <kern@sibbald.com>
Fri, 16 Apr 2010 18:15:15 +0000 (20:15 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 2 Aug 2010 14:50:33 +0000 (16:50 +0200)
21 files changed:
bacula/src/baconfig.h
bacula/src/cats/cats.h
bacula/src/cats/make_ingres_tables.in
bacula/src/cats/make_mysql_tables.in
bacula/src/cats/make_postgresql_tables.in
bacula/src/cats/make_sqlite3_tables.in
bacula/src/cats/sql_create.c
bacula/src/dird/catreq.c
bacula/src/filed/backup.c
bacula/src/filed/fd_plugins.c
bacula/src/filed/verify.c
bacula/src/filed/verify_vol.c
bacula/src/findlib/find.h
bacula/src/stored/append.c
bacula/src/stored/askdir.c
bacula/src/stored/bextract.c
bacula/src/stored/bls.c
bacula/src/stored/bscan.c
bacula/src/stored/mac.c
bacula/src/stored/protos.h
bacula/src/stored/record.c

index 31311507c803e4ecaccde50258d4fba9c23cf462..5f7bd43db7ec641b6b2647902e9617a7d9cc3e5f 100644 (file)
@@ -242,6 +242,7 @@ void InitWinAPIWrapper();
 #define STREAM_ENCRYPTED_MACOS_FORK_DATA   25    /* Encrypted, uncompressed Mac resource fork */
 #define STREAM_PLUGIN_NAME                 26    /* Plugin "file" string */
 #define STREAM_PLUGIN_DATA                 27    /* Plugin specific data */
+#define STREAM_RESTORE_OBJECT              28    /* Plugin restore object */
 
 /**
  * Additional Stream definitions. Once defined these must NEVER
index 1dc05e8d98e46b65b33a7ea552653a43882cce3c..e7f82e55e50db3302c0b7f8c8edf84cfa4393e4a 100644 (file)
@@ -942,8 +942,10 @@ struct ATTR_DBR {
 struct ROBJECT_DBR {
    char *object_name;
    char *object;
+   char *plugin_name;
    uint32_t object_len;
-   uint32_t ObjectIndex;
+   uint32_t object_index;
+   int32_t  object_compression;
    uint32_t FileIndex;
    uint32_t Stream;
    uint32_t FileType;
index a04baf8e5124a0beb83590d2efde3a8620c54305..5847e2934685da14f46428103e75ae110d7e32e0 100755 (executable)
@@ -70,14 +70,14 @@ CREATE INDEX file_jobid_idx on file(jobid);
 -- ***FIXME*** this needs to be corrected and turned on
 --CREATE TABLE RestoreObject (
 --   RestoreObjectId INTEGER NOT NULL DEFAULT RestoreObject_seq.nextval,
---   Fname TEXT NOT NULL,
---   Path TEXT NOT NULL,
+--   ObjectName TEXT NOT NULL,
 --   RestoreObject TEXT NOT NULL,
 --   PluginName TEXT NOT NULL,
 --   ObjectIndex INTEGER DEFAULT 0,
 --   ObjectType INTEGER DEFAULT 0,
 --   FileIndex INTEGER UNSIGNED DEFAULT 0,
 --   JobId INTEGER UNSIGNED,
+--   ObjectCompression INTEGER DEFAULT 0,
 --   PRIMARY KEY(RestoreObjectId),
 --   );
 --CREATE INDEX restore_jobid_idx on file(JobId);
index e92952bdcd53293e598d2f47aee19b862f34d447..da6d06d34753624a4430c86b487b7b478ebb4736 100644 (file)
@@ -47,15 +47,15 @@ CREATE TABLE File (
 
 CREATE TABLE RestoreObject (
    RestoreObjectId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
-   Fname BLOB NOT NULL,
-   Path BLOB NOT NULL,
-   RestoreObject BLOB NOT NULL,
+   ObjectName BLOB NOT NULL,
+   RestoreObject LONGBLOB NOT NULL,
    PluginName TINYBLOB NOT NULL,
    ObjectLength INTEGER DEFAULT 0,
    ObjectIndex INTEGER DEFAULT 0,
    ObjectType INTEGER DEFAULT 0,
    FileIndex INTEGER UNSIGNED DEFAULT 0,
    JobId INTEGER UNSIGNED NOT NULL REFERENCES Job,
+   ObjectCompression INTEGER DEFAULT 0,
    PRIMARY KEY(RestoreObjectId),
    INDEX (JobId)
    );
index 4339a28ebd0b86eb0ad40326ad600cccef39084b..dae28e4c8afc3c3b6b1f91820e42b4abca2f3fe8 100644 (file)
@@ -62,8 +62,7 @@ CREATE INDEX file_jobid_idx on file(jobid);
 
 CREATE TABLE RestoreObject (
    RestoreObjectId SERIAL NOT NULL,
-   Fname TEXT NOT NULL,
-   Path TEXT NOT NULL,
+   ObjectName TEXT NOT NULL,
    RestoreObject TEXT NOT NULL,
    PluginName TEXT NOT NULL,
    ObjectLength INTEGER DEFAULT 0,
@@ -71,6 +70,7 @@ CREATE TABLE RestoreObject (
    ObjectType INTEGER DEFAULT 0,
    FileIndex INTEGER UNSIGNED DEFAULT 0,
    JobId INTEGER UNSIGNED,
+   ObjectCompression INTEGER DEFAULT 0,
    PRIMARY KEY(RestoreObjectId),
    );
 CREATE INDEX restore_jobid_idx on file(JobId);
index b3ccb7f8e5576d0c668e02e333f1aa77dbdcf057..3c72458824d144db39a403a14f2e7cee79692983 100644 (file)
@@ -51,14 +51,14 @@ CREATE INDEX file_jpf_idx ON File (JobId, PathId, FilenameId);
 
 CREATE TABLE RestoreObject (
    RestoreObjectId INTEGER,
-   Fname TEXT DEFAULT '',
-   Path TEXT DEFAULT '',
+   ObjectName TEXT DEFAULT '',
    RestoreObject TEXT DEFAULT '',
    PluginName TEXT DEFAULT '',
    ObjectLength INTEGER DEFAULT 0,
    ObjectIndex INTEGER DEFAULT 0,
    ObjectType INTEGER DEFAULT 0,
    FileIndex INTEGER UNSIGNED DEFAULT 0,
+   ObejctCompression INTEGER DEFAULT 0,
    JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
    PRIMARY KEY(RestoreObjectId)
    );
index cf8b1ad2841d2951a2f794e3b08b1aa07e7dde82..539c8db9d571255bfb408877d2a9e86ae3ffea9d 100644 (file)
@@ -1235,11 +1235,11 @@ bool db_create_restore_object_record(JCR *jcr, B_DB *mdb, ROBJECT_DBR *ro)
    db_escape_string(jcr, mdb, esc_obj, ro->object, ro->object_len);
 
    Mmsg(mdb->cmd,
-        "INSERT INTO RestoreObject (Fname,RestoreObject,"
-        "ObjectLength,ObjectIndex,ObjectType,FileIndex,JobId) VALUES"
-        "('%s','%s',%d,%d,%d,%d,%u)",
-        mdb->esc_name, esc_obj, ro->object_len,
-        ro->ObjectIndex, FT_RESTORE_FIRST, ro->FileIndex, ro->JobId);
+        "INSERT INTO RestoreObject (ObjectName,RestoreObject,"
+        "ObjectLength,ObjectIndex,ObjectType,ObjectCompression,FileIndex,JobId) "
+        "VALUES ('%s','%s',%d,%d,%d,%d,%d,%u)",
+        mdb->esc_name, esc_obj, ro->object_len, ro->object_index, 
+        FT_RESTORE_FIRST, ro->object_compression, ro->FileIndex, ro->JobId);
 
    ro->RestoreObjectId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("RestoreObject"));
    if (ro->RestoreObjectId == 0) {
index 5627db594271aa2a704d11623a52463ec008967b..47e0b4790209e3a4d8702b65f6a877fc92231b6f 100644 (file)
@@ -393,8 +393,9 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen)
    skip_spaces(&p);
    skip_nonspaces(&p);                /* Job=nnn */
    skip_spaces(&p);
-   skip_nonspaces(&p);                /* FileAttributes */
+   skip_nonspaces(&p);                /* "FileAttributes" */
    p += 1;
+   /* The following "SD header" fields are serialized */
    unser_begin(p, 0);
    unser_uint32(VolSessionId);        /* VolSessionId */
    unser_uint32(VolSessionTime);      /* VolSessionTime */
@@ -403,9 +404,30 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen)
    unser_uint32(reclen);              /* Record length */
    p += unser_length(p);              /* Raw record follows */
 
-   /*
+   /**
     * At this point p points to the raw record, which varies according
-    *  to what kind of a record (Stream) was sent
+    *  to what kind of a record (Stream) was sent.  Note, the integer
+    *  fields at the beginning of these "raw" records are in ASCII with
+    *  spaces between them so one can use scanf or manual scanning to
+    *  extract the fields.
+    *
+    * File Attributes
+    *   File_index
+    *   File type
+    *   Filename (full path)
+    *   Encoded attributes
+    *   Link name (if type==FT_LNK or FT_LNKSAVED)
+    *   Encoded extended-attributes (for Win32)
+    *
+    * Restore Object
+    *   File_index
+    *   File_type
+    *   Object_index
+    *   Object_len
+    *   Object_compression
+    *   Plugin_name
+    *   Object_name
+    *   Binary Object data
     */
 
    Dmsg1(400, "UpdCat msg=%s\n", msg);
@@ -426,7 +448,7 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen)
       p = jcr->attr - msg + p;    /* point p into jcr->attr */
       skip_nonspaces(&p);             /* skip FileIndex */
       skip_spaces(&p);
-      ar->FileType = str_to_int32(p);     /* TODO: choose between unserialize and str_to_int32 */
+      ar->FileType = str_to_int32(p); 
       skip_nonspaces(&p);             /* skip FileType */
       skip_spaces(&p);
       fname = p;
@@ -449,48 +471,53 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen)
       } else {
          ar->JobId = jcr->JobId;
       }
-      /*
-       * Restore object */
-      if (ar->FileType == FT_RESTORE_FIRST) {
-         ROBJECT_DBR ro;
-         POOLMEM *attrEx = get_pool_memory(PM_MESSAGE);
-         char *p;
-         memset(&ro, 0, sizeof(ro));
-         ro.object_name = fname;
-         ro.Stream = Stream;
-         ro.FileType = ar->FileType;
-         ro.FileIndex = FileIndex;
-         ro.JobId = ar->JobId;
-         p = ar->attr;                   /* point to attributes */
-         while (*p++ != 0)               /* skip attributes */
-            { }
-         while (*p++ != 0)               /* skip link */
-            { }
-         /* We have an object, so do a binary copy */
-         ro.object_len = msglen + jcr->attr - p;
-         attrEx = check_pool_memory_size(attrEx, ro.object_len + 1);
-         memcpy(attrEx, p, ro.object_len);  
-         ro.object = attrEx;
-         /* Add a EOS for those who attempt to print the object */
-         p = attrEx + ro.object_len;
-         *p = 0;
-         Dmsg7(000, "oname=%s stream=%d FT=%d FI=%d JobId=%d, obj_len=%d\nobj=\"%s\"\n",
-            ro.object_name, ro.Stream, ro.FileType, ro.FileIndex, ro.JobId,
-            ro.object_len, attrEx);
-         /* Send it */
-         if (!db_create_restore_object_record(jcr, jcr->db, &ro)) {
-            Jmsg1(jcr, M_FATAL, 0, _("Restore object create error. %s"), db_strerror(jcr->db));
-         }
-         free_pool_memory(attrEx);
-      } else {
-         ar->Digest = NULL;
-         ar->DigestType = CRYPTO_DIGEST_NONE;
-         jcr->cached_attribute = true;
-      }
+      ar->Digest = NULL;
+      ar->DigestType = CRYPTO_DIGEST_NONE;
+      jcr->cached_attribute = true;
 
       Dmsg2(400, "dird<filed: stream=%d %s\n", Stream, fname);
       Dmsg1(400, "dird<filed: attr=%s\n", attr);
 
+   } else if (Stream == STREAM_RESTORE_OBJECT) {
+      ROBJECT_DBR ro;
+
+      memset(&ro, 0, sizeof(ro));
+      ro.Stream = Stream;
+      ro.FileIndex = FileIndex;
+      if (jcr->mig_jcr) {
+         ro.JobId = jcr->mig_jcr->JobId;
+      } else {
+         ro.JobId = jcr->JobId;
+      }
+
+      Dmsg1(100, "Robj=%s\n", p);
+      
+      skip_nonspaces(&p);             /* skip FileIndex */
+      skip_spaces(&p);
+      ro.FileType = str_to_int32(p); 
+      skip_nonspaces(&p);             /* move past FileType */
+      skip_spaces(&p);
+      ro.object_index = str_to_int32(p);
+      skip_nonspaces(&p);             /* move past object_index */
+      ro.object_len = str_to_int32(p);
+      skip_nonspaces(&p);             /* move past object_length */
+      ro.object_compression = str_to_int32(p);
+      skip_nonspaces(&p);             /* move past object_compression */
+
+      ro.plugin_name = p;                      /* point to plugin name */
+      len = strlen(ro.plugin_name);
+      ro.object_name = &ro.plugin_name[len+1]; /* point to object name */
+      len = strlen(ro.object_name);
+      ro.object = &ro.object_name[len+1];      /* point to object */
+      ro.object[ro.object_len] = 0;            /* add zero for those who attempt printing */
+      Dmsg7(100, "oname=%s stream=%d FT=%d FI=%d JobId=%d, obj_len=%d\nobj=\"%s\"\n",
+         ro.object_name, ro.Stream, ro.FileType, ro.FileIndex, ro.JobId,
+         ro.object_len, ro.object);
+      /* Send it */
+      if (!db_create_restore_object_record(jcr, jcr->db, &ro)) {
+         Jmsg1(jcr, M_FATAL, 0, _("Restore object create error. %s"), db_strerror(jcr->db));
+      }
+
    } else if (crypto_digest_stream_type(Stream) != CRYPTO_DIGEST_NONE) {
       fname = p;
       if (ar->FileIndex != FileIndex) {
index 4988b64451763c49c2dff5eb955467b01e4d2098..65e1c4472049e34d75bdd02ba9f043e7156d2955 100644 (file)
@@ -1129,7 +1129,7 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream)
        * attributes.
        */
       attribsEx = ff_pkt->object;
-      attr_stream = STREAM_UNIX_ATTRIBUTES_EX;
+      attr_stream = STREAM_RESTORE_OBJECT;
    } else {
       attribsEx = attribsExBuf;
       attr_stream = encode_attribsEx(jcr, attribsEx, ff_pkt);
@@ -1165,6 +1165,16 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream)
     *   Link name (if type==FT_LNK or FT_LNKSAVED)
     *   Encoded extended-attributes (for Win32)
     *
+    * or send Restore Object to Storage daemon
+    *   File_index
+    *   File_type
+    *   Object_index
+    *   Object_len
+    *   Object_compression
+    *   Plugin_name
+    *   Object_name
+    *   Binary Object data
+    *
     * For a directory, link is the same as fname, but with trailing
     * slash. For a linked file, link is the link.
     */
@@ -1186,19 +1196,14 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream)
                ff_pkt->type, ff_pkt->link, 0, attribs, 0, 0, attribsEx, 0);
       break;
    case FT_RESTORE_FIRST:
-      /**
-       * Note, we edit everything as we do for the default case, but the
-       *   object is tacked on to the end in place of the extended attributes,
-       *   but we do a memcpy so that the object can be a binary object.
-       */
-      Dmsg6(100, "Type=%d DataStream=%d attrStream=%d File=%s\nattribs=%s\nattribsEx=%s", 
-            ff_pkt->type, data_stream, STREAM_UNIX_ATTRIBUTES_EX,
-            ff_pkt->fname, attribs, ff_pkt->object);
-      sd->msglen = Mmsg(sd->msg, "%ld %d %s%c%s%c%c", 
-                        jcr->JobFiles, ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0);
-      sd->msg = check_pool_memory_size(sd->msg, sd->msglen + ff_pkt->object_len + 1);
+      sd->msglen = Mmsg(sd->msg, "%d %d %d %d %d %s%c%s%c", 
+                        jcr->JobFiles, ff_pkt->type, ff_pkt->object_index,
+                        ff_pkt->object_len, ff_pkt->object_compression,
+                        ff_pkt->fname, 0, ff_pkt->object_name, 0);
+      sd->msg = check_pool_memory_size(sd->msg, sd->msglen + ff_pkt->object_len + 2);
       memcpy(sd->msg + sd->msglen, ff_pkt->object, ff_pkt->object_len);
-      sd->msglen += ff_pkt->object_len;
+      /* Note we send one extra byte so Dir can store zero after object */
+      sd->msglen += ff_pkt->object_len + 1;
       stat = sd->send();
       break;
    default:
index 8e100671f0fee3133af56b6ce5ce7eab68881a9e..4d7abba2633867a7e274bb1ff02ebd4ca074c8a0 100644 (file)
@@ -294,9 +294,10 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
                   cmd);
                goto bail_out;
             }
-            pm_strcpy(fname, sp.object_name);
-            ff_pkt->fname = fname.c_str();
-            ff_pkt->LinkFI = sp.index;     /* restore object index */
+            ff_pkt->fname = cmd;                 /* full plugin string */
+            ff_pkt->object_name = sp.object_name;
+            ff_pkt->object_index = sp.index;     /* restore object index */
+            ff_pkt->object_compression = 0;      /* no compression for now */
             ff_pkt->object = sp.object;
             ff_pkt->object_len = sp.object_len;
          } else {
index 89f161504b015d3926711e949369df5a49c3bdc0..5f9647db81aeb737840684d8accf953fc3e0103d 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2009 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.
@@ -30,8 +30,6 @@
  *
  *    Kern Sibbald, October MM
  *
- *   Version $Id$
- *
  */
 
 #include "bacula.h"
index c3bdd2463b0c5355dfb04ea2d13f0e938fcefdd0..4c498192e8eb6d95645886cc15730e9e946c9ae1 100644 (file)
@@ -1,16 +1,7 @@
-/*
- *  Bacula File Daemon  verify-vol.c Verify files on a Volume
- *    versus attributes in Catalog
- *
- *    Kern Sibbald, July MMII
- *
- *   Version $Id$
- *
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2002-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2002-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.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *  Bacula File Daemon  verify-vol.c Verify files on a Volume
+ *    versus attributes in Catalog
+ *
+ *    Kern Sibbald, July MMII
+ *
+ */
 
 #include "bacula.h"
 #include "filed.h"
@@ -116,7 +114,6 @@ void do_verify_volume(JCR *jcr)
 
       /* File Attributes stream */
       switch (stream) {
-      case STREAM_UNIX_ATTRIBUTES:
       case STREAM_UNIX_ATTRIBUTES_EX:
          char *ap, *lp, *fp;
 
index f0324da3db33ea60fc863b04f96adfbe22c85c20..1ba8eb33dde66d14cadc481f2ceaa14381d9e6ef 100644 (file)
@@ -189,6 +189,7 @@ struct FF_PKT {
    char *top_fname;                   /* full filename before descending */
    char *fname;                       /* full filename */
    char *link;                        /* link if file linked */
+   char *object_name;                 /* Object name */
    char *object;                      /* restore object */
    POOLMEM *sys_fname;                /* system filename */
    POOLMEM *fname_save;               /* save when stripping path */
@@ -196,7 +197,9 @@ struct FF_PKT {
    struct stat statp;                 /* stat packet */
    int32_t FileIndex;                 /* FileIndex of this file */
    int32_t LinkFI;                    /* FileIndex of main hard linked file */
+   int32_t object_index;              /* Object index */
    int32_t object_len;                /* Object length */
+   int32_t object_compression;        /* Type of compression for object */
    struct f_link *linked;             /* Set if this file is hard linked */
    int type;                          /* FT_ type from above */
    int ff_errno;                      /* errno */
index 16062c4bf52c97aa31a9582204ae3ba5b70d74a1..7596531b0174caae43098428e47d14f64de1a376 100644 (file)
@@ -211,26 +211,7 @@ bool do_append_data(JCR *jcr)
             FI_to_ascii(buf1, rec.FileIndex), rec.VolSessionId,
             stream_to_ascii(buf2, rec.Stream, rec.FileIndex), rec.data_len);
 
-         /* Send attributes and digest to Director for Catalog */
-         if (stream == STREAM_UNIX_ATTRIBUTES    || 
-             stream == STREAM_UNIX_ATTRIBUTES_EX ||
-             crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
-            if (!jcr->no_attributes) {
-               BSOCK *dir = jcr->dir_bsock;
-               if (are_attributes_spooled(jcr)) {
-                  dir->set_spooling();
-               }
-               Dmsg0(850, "Send attributes to dir.\n");
-               if (!dir_update_file_attributes(dcr, &rec)) {
-                  dir->clear_spooling();
-                  Jmsg(jcr, M_FATAL, 0, _("Error updating file attributes. ERR=%s\n"),
-                     dir->bstrerror());
-                  ok = false;
-                  break;
-               }
-               dir->clear_spooling();
-            }
-         }
+         send_attrs_to_dir(jcr, &rec);
          Dmsg0(650, "Enter bnet_get\n");
       }
       Dmsg1(650, "End read loop with FD. Stat=%d\n", n);
@@ -339,3 +320,31 @@ bool do_append_data(JCR *jcr)
    Dmsg1(100, "return from do_append_data() ok=%d\n", ok);
    return ok;
 }
+
+
+/* Send attributes and digest to Director for Catalog */
+bool send_attrs_to_dir(JCR *jcr, DEV_RECORD *rec)
+{
+   int stream = rec->Stream;
+
+   if (stream == STREAM_UNIX_ATTRIBUTES    || 
+       stream == STREAM_UNIX_ATTRIBUTES_EX ||
+       stream == STREAM_RESTORE_OBJECT     ||
+       crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
+      if (!jcr->no_attributes) {
+         BSOCK *dir = jcr->dir_bsock;
+         if (are_attributes_spooled(jcr)) {
+            dir->set_spooling();
+         }
+         Dmsg0(850, "Send attributes to dir.\n");
+         if (!dir_update_file_attributes(jcr->dcr, rec)) {
+            Jmsg(jcr, M_FATAL, 0, _("Error updating file attributes. ERR=%s\n"),
+               dir->bstrerror());
+            dir->clear_spooling();
+            return false;
+         }
+         dir->clear_spooling();
+      }
+   }
+   return true;
+}
index 6e13beaa8f88a1a64b1f775c54a19ec970616982..5326e308a47ad4e5a32942740e7cb57ec33fd7b4 100644 (file)
@@ -73,7 +73,7 @@ static char Device_update[] = "DevUpd Job=%s device=%s "
    "changer_name=%s media_type=%s volume_name=%s\n";
 
 
-/* Send update information about a device to Director */
+/** Send update information about a device to Director */
 bool dir_update_device(JCR *jcr, DEVICE *dev)
 {
    BSOCK *dir = jcr->dir_bsock;
@@ -142,7 +142,7 @@ bool dir_update_changer(JCR *jcr, AUTOCHANGER *changer)
 #endif
 
 
-/*
+/**
  * Send current JobStatus to Director
  */
 bool dir_send_job_status(JCR *jcr)
@@ -150,7 +150,7 @@ bool dir_send_job_status(JCR *jcr)
    return jcr->dir_bsock->fsend(Job_status, jcr->Job, jcr->JobStatus);
 }
 
-/*
+/**
  * Common routine for:
  *   dir_get_volume_info()
  * and
@@ -208,7 +208,7 @@ static bool do_get_volume_info(DCR *dcr)
 }
 
 
-/*
+/**
  * Get Volume info for a specific volume from the Director's Database
  *
  * Returns: true  on success   (Director guarantees that Pool and MediaType
@@ -237,7 +237,7 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing)
 
 
 
-/*
+/**
  * Get info on the next appendable volume in the Director's database
  *
  * Returns: true  on success dcr->VolumeName is volume
@@ -314,7 +314,7 @@ get_out:
 }
 
 
-/*
+/**
  * After writing a Volume, send the updated statistics
  * back to the director. The information comes from the
  * dev record.
@@ -385,7 +385,7 @@ bail_out:
    return ok;
 }
 
-/*
+/**
  * After writing a Volume, create the JobMedia record.
  */
 bool dir_create_jobmedia_record(DCR *dcr, bool zero)
@@ -440,8 +440,21 @@ bool dir_create_jobmedia_record(DCR *dcr, bool zero)
 }
 
 
-/*
+/**
  * Update File Attribute data
+ * We do the following:
+ *  1. expand the bsock buffer to be large enough 
+ *  2. Write a "header" into the buffer with serialized data
+ *    VolSessionId
+ *    VolSeesionTime
+ *    FileIndex
+ *    Stream
+ *    data length that follows
+ *    start of raw byte data from the Device record.
+ * Note, this is primarily for Attribute data, but can
+ *   also handle any device record. The Director must know
+ *   the raw byte data format that is defined for each Stream.
+ * Now Restore Objects pass through here STREAM_RESTORE_OBJECT
  */
 bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec)
 {
@@ -474,7 +487,7 @@ bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec)
 }
 
 
-/*
+/**
  *   Request the sysop to create an appendable volume
  *
  *   Entered with device blocked.
@@ -568,7 +581,7 @@ get_out:
    return true;
 }
 
-/*
+/**
  *   Request to mount specific Volume
  *
  *   Entered with device blocked and dcr->VolumeName is desired
index 9ac4ed39b98f51c4f72fe69a06dfe99d9f61d035..82c85831a694033ebbc8798870ce343814134d08 100644 (file)
@@ -368,6 +368,10 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       }
       break;
 
+   case STREAM_RESTORE_OBJECT:
+      /* nothing to do */
+      break;
+
    /* Data stream and extracting */
    case STREAM_FILE_DATA:
    case STREAM_SPARSE_DATA:
index ae2f101129f6d875ea6e79c9876307abe5f8d589..d1281a54592f37f3f35fc9f483f9ba63f25a4210 100644 (file)
@@ -381,7 +381,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    /* File Attributes stream */
    if (rec->Stream == STREAM_UNIX_ATTRIBUTES ||
        rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) {
-
       if (!unpack_attributes_record(jcr, rec->Stream, rec->data, rec->data_len, attr)) {
          if (!forge_on) {
             Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
@@ -407,6 +406,8 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       if (strncmp("0 0", rec->data, 3) != 0) {
          Pmsg1(000, "Plugin data: %s\n", rec->data);
       }
+   } else if (rec->Stream == STREAM_RESTORE_OBJECT) {
+      Pmsg0(000, "Restore Object record\n");
    }
       
    return true;
index 619d6e37d612b4acd2b44dc373db0870cfe1ef1b..241f9071f872525b4eea1ed6c8d7c22935797710 100644 (file)
@@ -687,6 +687,11 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       free_jcr(mjcr);
       break;
 
+   case STREAM_RESTORE_OBJECT:
+   /* ****FIXME*****/
+      /* Implement putting into catalog */
+      break;
+
    /* Data stream */
    case STREAM_WIN32_DATA:
    case STREAM_FILE_DATA:
index f58ba6380cfc70a01f0b6c544ce27b8fcbc0763f..4a0615fe610acd161f5437d20abea7a55292db53 100644 (file)
@@ -186,7 +186,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    JCR *jcr = dcr->jcr;
    DEVICE *dev = jcr->dcr->dev;
    char buf1[100], buf2[100];
-   int32_t stream;   
    
 #ifdef xxx
    Dmsg5(000, "on entry     JobId=%d FI=%s SessId=%d Strm=%s len=%d\n",
@@ -262,26 +261,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       FI_to_ascii(buf1, rec->FileIndex), rec->VolSessionId,
       stream_to_ascii(buf2, rec->Stream, rec->FileIndex), rec->data_len);
 
-   /* Send attributes and digest to Director for Catalog */
-   stream = rec->Stream;
-   if (stream == STREAM_UNIX_ATTRIBUTES    || 
-       stream == STREAM_UNIX_ATTRIBUTES_EX ||
-       crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
-      if (!jcr->no_attributes) {
-         BSOCK *dir = jcr->dir_bsock;
-         if (are_attributes_spooled(jcr)) {
-            dir->set_spooling();
-         }
-         Dmsg0(850, "Send attributes to dir.\n");
-         if (!dir_update_file_attributes(jcr->dcr, rec)) {
-            dir->clear_spooling();
-            Jmsg(jcr, M_FATAL, 0, _("Error updating file attributes. ERR=%s\n"),
-               dir->bstrerror());
-            return false;
-         }
-         dir->clear_spooling();
-      }
-   }
+   send_attrs_to_dir(jcr, rec);
 
    return true;
 }
index 26ffd476de4b1722d4c75bf7155f4e0900e58ac2..c8563b69d7ded9de996bfbbb8561e17774ad8284 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2008 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.
@@ -28,7 +28,6 @@
 /*
  * Protypes for stored -- Kern Sibbald MM  
  *
- *   Version $Id$
  */
 
 /* From stored.c */
@@ -42,6 +41,9 @@ bool     clean_device(DCR *dcr);
 DCR     *new_dcr(JCR *jcr, DCR *dcr, DEVICE *dev);
 void     free_dcr(DCR *dcr);
 
+/* From append.c */
+bool send_attrs_to_dir(JCR *jcr, DEV_RECORD *rec);
+
 /* From askdir.c */
 enum get_vol_info_rw {
    GET_VOL_INFO_FOR_WRITE,
index dd6c7980aeb593c3aa91b9cf0bcab2186e273605..481eb8ae7d990e76db6ca7c41a605032fb9bd0df 100644 (file)
@@ -112,6 +112,8 @@ const char *stream_to_ascii(char *buf, int stream, int fi)
        return "GZIP";
     case STREAM_UNIX_ATTRIBUTES_EX:
        return "UNIX-ATTR-EX";
+    case STREAM_RESTORE_OBJECT:
+       return "RESTORE-OBJECT";
     case STREAM_SPARSE_DATA:
        return "SPARSE-DATA";
     case STREAM_SPARSE_GZIP_DATA:
@@ -160,6 +162,8 @@ const char *stream_to_ascii(char *buf, int stream, int fi)
        return "contGZIP";
     case -STREAM_UNIX_ATTRIBUTES_EX:
        return "contUNIX-ATTR-EX";
+    case -STREAM_RESTORE_OBJECT:
+       return "contRESTORE-OBJECT";
     case -STREAM_SPARSE_DATA:
        return "contSPARSE-DATA";
     case -STREAM_SPARSE_GZIP_DATA: