]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/attr.c
Change copyright as per agreement with FSFE
[bacula/bacula] / bacula / src / lib / attr.c
index 138dad8ad4b2b61288c5051f2bb3a53d610af472..24dc05f455f050f4374b68d26625e0fc1663b099 100644 (file)
@@ -1,49 +1,44 @@
 /*
- *   attr.c  Unpack an Attribute record returned from the tape
- *
- *    Kern Sibbald, June MMIII  (code pulled from filed/restore.c and updated)
- *
- *   Version $Id$
- */
-/*
-   Bacula® - The Network Backup Solution
+   Bacula(R) - The Network Backup Solution
 
-   Copyright (C) 2003-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2016 Kern Sibbald
 
-   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
-   License as published by the Free Software Foundation plus additions
-   that are listed in the file LICENSE.
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
 
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details.
+   You may use this file and others of this release according to the
+   license defined in the LICENSE file, which includes the Affero General
+   Public License, v3.0 ("AGPLv3") and some additional permissions and
+   terms pursuant to its AGPLv3 Section 7.
 
-   You should have received a copy of the GNU 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.
+   This notice must be preserved when any source code is 
+   conveyed and/or propagated.
 
-   Bacula® is a registered trademark of John Walker.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
+   Bacula(R) is a registered trademark of Kern Sibbald.
 */
+/*
+ *   attr.c  Unpack an Attribute record returned from the tape
+ *
+ *    Kern Sibbald, June MMIII  (code pulled from filed/restore.c and updated)
+ *
+ */
+
 
 #include "bacula.h"
 #include "jcr.h"
 #include "lib/breg.h"
 
-ATTR *new_attr()
+static const int dbglvl = 150;
+
+ATTR *new_attr(JCR *jcr)
 {
    ATTR *attr = (ATTR *)malloc(sizeof(ATTR));
    memset(attr, 0, sizeof(ATTR));
    attr->ofname = get_pool_memory(PM_FNAME);
    attr->olname = get_pool_memory(PM_FNAME);
    attr->attrEx = get_pool_memory(PM_FNAME);
+   attr->jcr = jcr;
+   attr->uid = getuid();
    return attr;
 }
 
@@ -55,9 +50,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
@@ -71,13 +67,17 @@ int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr)
     *
     */
    attr->stream = stream;
-   Dmsg1(400, "Attr: %s\n", rec);
-   if (sscanf(rec, "%ld %ld", &attr->file_index, &attr->type) != 2) {
+   Dmsg1(dbglvl, "Attr: %s\n", rec);
+   if (sscanf(rec, "%d %d", &attr->file_index, &attr->type) != 2) {
       Jmsg(jcr, M_FATAL, 0, _("Error scanning attributes: %s\n"), rec);
-      Dmsg1(100, "\nError scanning attributes. %s\n", rec);
+      Dmsg1(dbglvl, "\nError scanning attributes. %s\n", rec);
       return 0;
    }
-   Dmsg2(400, "Got Attr: FilInx=%d type=%d\n", attr->file_index, attr->type);
+   Dmsg2(dbglvl, "Got Attr: FilInx=%d type=%d\n", attr->file_index, attr->type);
+   /*
+    * Note AR_DATA_STREAM should never be set since it is encoded
+    *  at the end of the attributes.
+    */
    if (attr->type & AR_DATA_STREAM) {
       attr->data_stream = 1;
    } else {
@@ -90,7 +90,7 @@ int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr)
    while (*p++ != ' ')               /* skip type */
       { }
 
-   attr->fname = p;                   /* set filname position */
+   attr->fname = p;                   /* set filename position */
    while (*p++ != 0)                  /* skip filename */
       { }
    attr->attr = p;                    /* set attributes position */
@@ -99,18 +99,34 @@ 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;
+   attr->delta_seq = 0;
+   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;
+      } else {
+         while (*p++ != 0)            /* skip extended attributes */
+            { }
+         if (p - rec < reclen) {
+            attr->delta_seq = str_to_int32(p); /* delta_seq */
+         }
+      }
    }
-   Dmsg7(400, "unpack_attr FI=%d Type=%d fname=%s attr=%s lname=%s attrEx=%s ds=%d\n",
+   Dmsg8(dbglvl, "unpack_attr FI=%d Type=%d fname=%s attr=%s lname=%s attrEx=%s datastr=%d delta_seq=%d\n",
       attr->file_index, attr->type, attr->fname, attr->attr, attr->lname,
-      attr->attrEx, attr->data_stream);
+      attr->attrEx, attr->data_stream, attr->delta_seq);
    *attr->ofname = 0;
    *attr->olname = 0;
    return 1;
@@ -149,11 +165,7 @@ void build_attr_output_fnames(JCR *jcr, ATTR *attr)
     *
     */
 
-   if (jcr->where[0] == 0) {
-      pm_strcpy(attr->ofname, attr->fname);
-      pm_strcpy(attr->olname, attr->lname);
-
-   } else if (jcr->where_bregexp) { 
+   if (jcr->where_bregexp) {
       char *ret;
       apply_bregexps(attr->fname, jcr->where_bregexp, &ret);
       pm_strcpy(attr->ofname, ret);
@@ -171,7 +183,11 @@ void build_attr_output_fnames(JCR *jcr, ATTR *attr)
             pm_strcpy(attr->olname, attr->lname);
          }
       }
-      
+
+   } else if (jcr->where[0] == 0) {
+      pm_strcpy(attr->ofname, attr->fname);
+      pm_strcpy(attr->olname, attr->lname);
+
    } else {
       const char *fn;
       int wherelen = strlen(jcr->where);
@@ -211,8 +227,8 @@ void build_attr_output_fnames(JCR *jcr, ATTR *attr)
 #endif
          fn = attr->lname;       /* take whole name */
          /* Ensure where is terminated with a slash */
-         if (add_link && 
-            !IsPathSeparator(jcr->where[wherelen-1]) && 
+         if (add_link &&
+            !IsPathSeparator(jcr->where[wherelen-1]) &&
             !IsPathSeparator(fn[0])) {
             pm_strcat(attr->olname, "/");
          }
@@ -237,12 +253,26 @@ void print_ls_output(JCR *jcr, ATTR *attr)
    char ec1[30];
    char en1[30], en2[30];
    char *p, *f;
+   guid_list *guid;
 
+   if (attr->type == FT_DELETED) { /* TODO: change this to get last seen values */
+      bsnprintf(buf, sizeof(buf),
+                "----------   - -        -                  - ---------- --------  %s\n", attr->ofname);
+      Dmsg1(dbglvl, "%s", buf);
+      Jmsg(jcr, M_RESTORED, 1, "%s", buf);
+      return;
+   }
+
+   if (!jcr->id_list) {
+      jcr->id_list = new_guid_list();
+   }
+   guid = jcr->id_list;
    p = encode_mode(attr->statp.st_mode, buf);
    p += sprintf(p, "  %2d ", (uint32_t)attr->statp.st_nlink);
-   p += sprintf(p, "%-8.8s %-8.8s", getuser(attr->statp.st_uid, en1, sizeof(en1)),
-                getgroup(attr->statp.st_gid, en2, sizeof(en2)));
-   p += sprintf(p, "%10.10s ", edit_uint64(attr->statp.st_size, ec1));
+   p += sprintf(p, "%-8.8s %-8.8s",
+                guid->uid_to_name(attr->statp.st_uid, en1, sizeof(en1)),
+                guid->gid_to_name(attr->statp.st_gid, en2, sizeof(en2)));
+   p += sprintf(p, "%12.12s ", edit_int64(attr->statp.st_size, ec1));
    p = encode_time(attr->statp.st_ctime, p);
    *p++ = ' ';
    *p++ = ' ';
@@ -261,6 +291,6 @@ void print_ls_output(JCR *jcr, ATTR *attr)
    }
    *p++ = '\n';
    *p = 0;
-   Dmsg1(20, "%s", buf);
+   Dmsg1(dbglvl, "%s", buf);
    Jmsg(jcr, M_RESTORED, 1, "%s", buf);
 }