]> git.sur5r.net Git - bacula/bacula/commitdiff
Get binary objects working
authorKern Sibbald <kern@sibbald.com>
Wed, 7 Apr 2010 19:26:25 +0000 (21:26 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 2 Aug 2010 14:50:30 +0000 (16:50 +0200)
20 files changed:
bacula/src/baconfig.h
bacula/src/dird/catreq.c
bacula/src/filed/backup.c
bacula/src/filed/fd_plugins.c
bacula/src/filed/fd_plugins.h
bacula/src/filed/restore.c
bacula/src/findlib/attribs.c
bacula/src/findlib/find.h
bacula/src/lib/attr.c
bacula/src/lib/mem_pool.h
bacula/src/lib/protos.h
bacula/src/plugins/fd/test-plugin-fd.c
bacula/src/stored/append.c
bacula/src/stored/bextract.c
bacula/src/stored/bls.c
bacula/src/stored/bscan.c
bacula/src/stored/mac.c
bacula/src/stored/match_bsr.c
bacula/src/stored/record.c
bacula/src/stored/record.h

index c9ed17001bd204920de58b8fe37081d90f682692..31311507c803e4ecaccde50258d4fba9c23cf462 100644 (file)
@@ -242,7 +242,6 @@ 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    /* Special restore object */
 
 /**
  * Additional Stream definitions. Once defined these must NEVER
index 1c85ee8cf2ccad22cdb20bb7f146b80b8fbd9a99..573a279520e036bc73e66f47d7e651d8557d87bb 100644 (file)
@@ -455,10 +455,6 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen)
       Dmsg2(400, "dird<filed: stream=%d %s\n", Stream, fname);
       Dmsg1(400, "dird<filed: attr=%s\n", attr);
 
-   } else if (Stream == STREAM_RESTORE_OBJECT) {
-      /* p is beginning of RESTORE_OBJECT */
-      /* ***FIXME**** put RESTORE_OBJECT into catalog */
-
    } else if (crypto_digest_stream_type(Stream) != CRYPTO_DIGEST_NONE) {
       fname = p;
       if (ar->FileIndex != FileIndex) {
index a8303798bfac11859c2462ab78913efa607fb8fa..717ff977a6807ce4d960226ba1c8026d59797b41 100644 (file)
@@ -528,11 +528,12 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
          (!is_portable_backup(&ff_pkt->bfd) && ff_pkt->type == FT_DIREND)) {
       do_read = true;
    }
-   if (ff_pkt->cmd_plugin) {
+
+   if (ff_pkt->cmd_plugin && ff_pkt->type != FT_RESTORE_FIRST) {
       do_read = true;
    }
 
-   Dmsg1(400, "do_read=%d\n", do_read);
+   Dmsg2(000, "type=%d do_read=%d\n", ff_pkt->type, do_read);
    if (do_read) {
       btimer_t *tid;
 
@@ -1113,8 +1114,17 @@ bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream)
    encode_stat(attribs, &ff_pkt->statp, ff_pkt->LinkFI, data_stream);
 
    /** Now possibly extend the attributes */
-   attribsEx = attribsExBuf;
-   attr_stream = encode_attribsEx(jcr, attribsEx, ff_pkt);
+   if (ff_pkt->type == FT_RESTORE_FIRST) {
+      /**
+       * For restore objects, we return the object in the extended 
+       * attributes.
+       */
+      attribsEx = ff_pkt->object;
+      attr_stream = STREAM_UNIX_ATTRIBUTES_EX;
+   } else {
+      attribsEx = attribsExBuf;
+      attr_stream = encode_attribsEx(jcr, attribsEx, ff_pkt);
+   }
 
    Dmsg3(300, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx);
 
@@ -1167,8 +1177,20 @@ 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:
-      attribsEx = ff_pkt->object;        /* put object as extended attributes */
-      /* Fall through wanted */
+      /**
+       * 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(000, "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);
+      memcpy(sd->msg + sd->msglen, ff_pkt->object, ff_pkt->object_len);
+      sd->msglen += ff_pkt->object_len;
+      stat = sd->send();
    default:
       stat = sd->fsend("%ld %d %s%c%s%c%c%s%c", jcr->JobFiles,
                ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, attribsEx, 0);
index beefdef0c6fedd11519a2940b86de64a8a690d4c..4f5b7a2e12ce2fec7a0161e7e9a35140f62787b3 100644 (file)
@@ -34,7 +34,7 @@
 #include "bacula.h"
 #include "filed.h"
 
-const int dbglvl = 150;
+const int dbglvl = 0;
 #ifdef HAVE_WIN32
 const char *plugin_type = "-fd.dll";
 #else
@@ -293,11 +293,15 @@ int plugin_save(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
          ff_pkt->link = link.c_str();
          ff_pkt->type = sp.type;
          ff_pkt->object = sp.object;
+         ff_pkt->object_len = sp.object_len;
          if (sp.type == FT_RESTORE_FIRST) {
             ff_pkt->LinkFI = sp.index;     /* restore object index */
          }
          memcpy(&ff_pkt->statp, &sp.statp, sizeof(ff_pkt->statp));
-         Dmsg1(dbglvl, "Save_file: file=%s\n", fname.c_str());
+         Dmsg2(dbglvl, "startBackup returned type=%d, fname=%s\n", sp.type, sp.fname);
+         if (sp.object) {
+            Dmsg2(dbglvl, "index=%d object=%s\n", sp.index, sp.object);
+         }   
          save_file(jcr, ff_pkt, true);
          bRC rc = plug_func(plugin)->endBackupFile(jcr->plugin_ctx);
          if (rc == bRC_More || rc == bRC_OK) {
@@ -493,7 +497,11 @@ int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
    rp.RegexWhere = jcr->RegexWhere;
    rp.replace = jcr->replace;
    rp.create_status = CF_ERROR;
-   Dmsg1(dbglvl, "call plugin createFile=%s\n", rp.ofname);
+   Dmsg4(dbglvl, "call plugin createFile stream=%d type=%d LinkFI=%d File=%s\n", 
+         rp.stream, rp.type, rp.LinkFI, rp.ofname);
+   if (rp.attrEx) {
+      Dmsg1(dbglvl, "attrEx=\"%s\"\n", rp.attrEx);
+   }
    rc = plug_func(plugin)->createFile(plugin_ctx, &rp);
    if (rc != bRC_OK) {
       Qmsg2(jcr, M_ERROR, 0, _("Plugin createFile call failed. Stat=%d file=%s\n"),
@@ -509,6 +517,9 @@ int plugin_create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
    if (rp.create_status == CF_CREATED) {
       return rp.create_status;        /* yes, no need to bopen */
    }
+   if (rp.type == FT_RESTORE_FIRST) {
+      return CF_CREATED;
+   }
 
    flags =  O_WRONLY | O_CREAT | O_TRUNC | O_BINARY;
    Dmsg0(dbglvl, "call bopen\n");
@@ -660,7 +671,7 @@ void new_plugins(JCR *jcr)
       Dmsg0(dbglvl, "plugin list is NULL\n");
       return;
    }
-   if (jcr->is_job_canceled()) {
+   if (jcr->is_job_canceled() || jcr->JobId == 0) {
       return;
    }
 
index 6858a5e16de1bd436717eb50664139e10c31a205..e88d77e549bc7b24d0008936efbb5a72a83491ff 100644 (file)
@@ -83,6 +83,7 @@ struct save_pkt {
    bool portable;                     /* set if data format is portable */
    char *cmd;                         /* command */
    char *object;                      /* restore object data to save */
+   int32_t object_len;                /* restore object length */
    int32_t index;                     /* restore object index */
    int32_t pkt_end;                   /* end packet sentinel */
 };
index b79146ee072d442ead6f0ae02b9257fada56d3ef..ff2925aa8a9c41f0a6febbd32ce3c69d8b4771bf 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.
@@ -323,20 +323,14 @@ void do_restore(JCR *jcr)
          /*
           * Unpack attributes and do sanity check them
           */
-         if (!unpack_attributes_record(jcr, rctx.stream, sd->msg, attr)) {
+         if (!unpack_attributes_record(jcr, rctx.stream, sd->msg, sd->msglen, attr)) {
             goto bail_out;
          }
-#ifdef xxx
-         if (file_index != attr->file_index) {
-            Jmsg(jcr, M_FATAL, 0, _("Record header file index %ld not equal record index %ld\n"),
-                 file_index, attr->file_index);
-            Dmsg0(200, "File index error\n");
-            goto bail_out;
-         }
-#endif
 
-         Dmsg3(200, "File %s\nattrib=%s\nattribsEx=%s\n", attr->fname,
+         Dmsg3(000, "File %s\nattrib=%s\nattribsEx=%s\n", attr->fname,
                attr->attr, attr->attrEx);
+         Dmsg3(000, "=== msglen=%d attrExlen=%d msg=%s\n", sd->msglen,
+               strlen(attr->attrEx), sd->msg);
 
          attr->data_stream = decode_stat(attr->attr, &attr->statp, &attr->LinkFI);
 
@@ -760,10 +754,6 @@ void do_restore(JCR *jcr)
          plugin_name_stream(jcr, sd->msg);
          break;
 
-      case STREAM_RESTORE_OBJECT:
-         close_previous_stream(rctx);
-         break;
-
       default:
          close_previous_stream(rctx);
          Jmsg(jcr, M_ERROR, 0, _("Unknown stream=%d ignored. This shouldn't happen!\n"),
index 950bb2ad78986232665d3aa6f6e053d16ffaab7d..53b60fff8210ebbe3c2a41428efeb8e67693d70b 100644 (file)
@@ -71,7 +71,7 @@ int select_data_stream(FF_PKT *ff_pkt)
    /* This is a plugin special restore object */
    if (ff_pkt->type == FT_RESTORE_FIRST) {
       ff_pkt->flags = 0;
-      return STREAM_RESTORE_OBJECT;
+      return STREAM_FILE_DATA;
    }
 
    /**
index 7d2cbb9b251e68b80ad5263f1a53a28592e8ca2d..f0324da3db33ea60fc863b04f96adfbe22c85c20 100644 (file)
@@ -196,6 +196,7 @@ 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_len;                /* Object length */
    struct f_link *linked;             /* Set if this file is hard linked */
    int type;                          /* FT_ type from above */
    int ff_errno;                      /* errno */
index e2eae5f28c519f824fa87f66a6138ae414a854fc..321895c3a63884fc8665a0a73d185110f8891a47 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2003-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2003-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,7 +30,6 @@
  *
  *    Kern Sibbald, June MMIII  (code pulled from filed/restore.c and updated)
  *
- *   Version $Id$
  */
 
 
@@ -58,9 +57,10 @@ void free_attr(ATTR *attr)
    free(attr);
 }
 
-int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr)
+int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, int32_t reclen, ATTR *attr)
 {
    char *p;
+   int object_len;
    /*
     * An Attributes record consists of:
     *    File_index
@@ -102,14 +102,23 @@ int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr)
    attr->lname = p;                   /* set link position */
    while (*p++ != 0)                  /* skip link */
       { }
-   pm_strcpy(attr->attrEx, p);        /* copy extended attributes, if any */
-
-   if (attr->data_stream) {
-      int64_t val;
-      while (*p++ != 0)               /* skip extended attributes */
-         { }
-      from_base64(&val, p);
-      attr->data_stream = (int32_t)val;
+   if (attr->type == FT_RESTORE_FIRST) {
+      /* We have an object, so do a binary copy */
+      object_len = reclen + rec - p;
+      attr->attrEx = check_pool_memory_size(attr->attrEx, object_len + 1);
+      memcpy(attr->attrEx, p, object_len);  
+      /* Add a EOS for those who attempt to print the object */
+      p = attr->attrEx + object_len;
+      *p = 0;
+   } else {
+      pm_strcpy(attr->attrEx, p);     /* copy extended attributes, if any */
+      if (attr->data_stream) {
+         int64_t val;
+         while (*p++ != 0)               /* skip extended attributes */
+            { }
+         from_base64(&val, p);
+         attr->data_stream = (int32_t)val;
+      }
    }
    Dmsg7(400, "unpack_attr FI=%d Type=%d fname=%s attr=%s lname=%s attrEx=%s ds=%d\n",
       attr->file_index, attr->type, attr->fname, attr->attr, attr->lname,
index 8926b2f2d3cd8a97da48eedb6320b99ea332db45..a4d85468f8c6e8c04b97baf17270e24001871184 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.
@@ -30,7 +30,6 @@
  *
  *  Kern Sibbald, MM
  *
- *   Version $Id$
  */
 
 #ifndef __MEM_POOL_H_
index 6e024ea1618095f9851c94af42567d6414a0dd7d..48196a0bf46eebed24b464d0f7a33664540a1dc9 100644 (file)
@@ -39,7 +39,7 @@ class JCR;
 /* attr.c */
 ATTR     *new_attr(JCR *jcr);
 void      free_attr(ATTR *attr);
-int       unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr);
+int       unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, int32_t reclen, ATTR *attr);
 void      build_attr_output_fnames(JCR *jcr, ATTR *attr);
 void      print_ls_output(JCR *jcr, ATTR *attr);
 
index df36da3b80ae3321cd6c8a4ab0b8abbea514e074..2a509278137c161ce670dd5b939d4ccf97e8e64c 100644 (file)
@@ -287,7 +287,8 @@ static bRC startBackupFile(bpContext *ctx, struct save_pkt *sp)
    sp->statp.st_size = -1;
    sp->statp.st_blksize = 4096;
    sp->statp.st_blocks = 1;
-   sp->object = (char *)"This is test data for the restore object\n";
+   sp->object = (char *)"This is test data for the restore object.";
+   sp->object_len = strlen(sp->object);
    sp->index = 2;
    p_ctx->backup = true;
    printf("test-plugin-fd: startBackupFile\n");
@@ -312,7 +313,8 @@ static bRC endBackupFile(bpContext *ctx)
  */
 static bRC pluginIO(bpContext *ctx, struct io_pkt *io)
 {
-   return bRC_OK;
+   printf("test-plugin-fd: pluginIO\n");
+   return bRC_Error;
 }
 
 /*
index 9ad04b60c30850cc225ef31e41e36d9756a0e4b1..16062c4bf52c97aa31a9582204ae3ba5b70d74a1 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.
@@ -29,7 +29,6 @@
  * Append code for Storage daemon
  *  Kern Sibbald, May MM
  *
- *  Version $Id$
  */
 
 #include "bacula.h"
@@ -215,7 +214,6 @@ bool do_append_data(JCR *jcr)
          /* Send attributes and digest to Director for Catalog */
          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;
index f4aa3dbaa62a9bb4bf0fff060a18095d0654cf5f..9ac4ed39b98f51c4f72fe69a06dfe99d9f61d035 100644 (file)
@@ -323,7 +323,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
          extract = false;
       }
 
-      if (!unpack_attributes_record(jcr, rec->Stream, rec->data, attr)) {
+      if (!unpack_attributes_record(jcr, rec->Stream, rec->data, rec->data_len, attr)) {
          Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
       }
 
index 4a53a64b5700f3904de74830705cfb78d7dc4776..ae2f101129f6d875ea6e79c9876307abe5f8d589 100644 (file)
@@ -382,7 +382,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    if (rec->Stream == STREAM_UNIX_ATTRIBUTES ||
        rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) {
 
-      if (!unpack_attributes_record(jcr, rec->Stream, rec->data, attr)) {
+      if (!unpack_attributes_record(jcr, rec->Stream, rec->data, rec->data_len, attr)) {
          if (!forge_on) {
             Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
          } else {
index 3c09d96bf15445aa6e2f74613d9c97f2fafb75ce..619d6e37d612b4acd2b44dc373db0870cfe1ef1b 100644 (file)
@@ -662,7 +662,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    case STREAM_UNIX_ATTRIBUTES:
    case STREAM_UNIX_ATTRIBUTES_EX:
 
-      if (!unpack_attributes_record(bjcr, rec->Stream, rec->data, attr)) {
+      if (!unpack_attributes_record(bjcr, rec->Stream, rec->data, rec->data_len, attr)) {
          Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
       }
 
index 88a9aa9147165a3e329520fd2c36a2fbe5e0c36a..f58ba6380cfc70a01f0b6c544ce27b8fcbc0763f 100644 (file)
@@ -266,7 +266,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    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;
index 769c8f3a5db2e351e6a850552c43f9a4d6fedaaa..2ba46e9c524ab7a270686f43ac71f3e013d28492 100644 (file)
@@ -155,7 +155,7 @@ static int match_fileregex(BSR *bsr, DEV_RECORD *rec, JCR *jcr)
    if (rec->Stream == STREAM_UNIX_ATTRIBUTES ||
        rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) {
       bsr->skip_file = false;
-      if (unpack_attributes_record(jcr, rec->Stream, rec->data, bsr->attr)) {
+      if (unpack_attributes_record(jcr, rec->Stream, rec->data, rec->data_len, bsr->attr)) {
          if (regexec(bsr->fileregex_re, bsr->attr->fname, 0, NULL, 0) == 0) {
             Dmsg2(dbglevel, "Matched pattern, fname=%s FI=%d\n",
                   bsr->attr->fname, rec->FileIndex);
index 3ac2fef9bd4f236ca5396d77cd8930a1a4e1057a..dd6c7980aeb593c3aa91b9cf0bcab2186e273605 100644 (file)
@@ -100,8 +100,6 @@ const char *stream_to_ascii(char *buf, int stream, int fi)
        return "UATTR";
     case STREAM_FILE_DATA:
        return "DATA";
-    case STREAM_RESTORE_OBJECT:
-       return "RESTORE_OBJECT";
     case STREAM_WIN32_DATA:
        return "WIN32-DATA";
     case STREAM_WIN32_GZIP_DATA:
@@ -150,8 +148,6 @@ const char *stream_to_ascii(char *buf, int stream, int fi)
        return "contUATTR";
     case -STREAM_FILE_DATA:
        return "contDATA";
-    case -STREAM_RESTORE_OBJECT:
-       return "contRESTORE_OBJECT";
     case -STREAM_WIN32_DATA:
        return "contWIN32-DATA";
     case -STREAM_WIN32_GZIP_DATA:
index eb3f91f9e2d9a0f04c352be755bc724f0dba0d65..c9e7bd4dfd7a80bc40017c6d09d1f46b594f217c 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.
@@ -31,8 +31,6 @@
  *
  *   Kern Sibbald, MM
  *
- *   Version $Id$
- *
  */