]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Fix bextract to be able to extract non-portable Win32 data to
authorEric Bollengier <eric@eb.homelinux.org>
Wed, 23 Jan 2008 20:47:28 +0000 (20:47 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Wed, 23 Jan 2008 20:47:28 +0000 (20:47 +0000)
     Unix/Linux clients

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6303 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/stored/bextract.c
bacula/technotes-2.3

index 70508df1f4dc567f002f56932e7fd06a8bf84f8e..3737551d75544e5b7d95511e702def3956781297 100644 (file)
@@ -271,6 +271,26 @@ static void do_extract(char *devname)
    return;
 }
 
+static bool store_data(BFILE *bfd, char *data, const int32_t length)
+{
+   if (is_win32_stream(attr->data_stream) && !have_win32_api()) {
+      set_portable_backup(bfd);
+      if (!processWin32BackupAPIBlock(bfd, data, length)) {
+        berrno be;
+        Emsg2(M_ERROR_TERM, 0, _("Write error on %s: %s\n"),
+              attr->ofname, be.bstrerror());
+         return false;
+      }
+   } else if (bwrite(bfd, data, length) != (ssize_t)length) {
+      berrno be;
+      Emsg2(M_ERROR_TERM, 0, _("Write error on %s: %s\n"),
+           attr->ofname, be.bstrerror());
+      return false;
+   }
+
+   return true;
+}
+
 /*
  * Called here for each record from read_records()
  */
@@ -321,7 +341,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
             return true;
          }
 
-
          build_attr_output_fnames(jcr, attr);
 
          extract = false;
@@ -373,11 +392,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
          }
          total += wsize;
          Dmsg2(8, "Write %u bytes, total=%u\n", wsize, total);
-         if ((uint32_t)bwrite(&bfd, wbuf, wsize) != wsize) {
-            berrno be;
-            Emsg2(M_ERROR_TERM, 0, _("Write error on %s: %s\n"),
-               attr->ofname, be.bstrerror());
-         }
+         store_data(&bfd, wbuf, wsize);
          fileAddr += wsize;
       }
       break;
@@ -422,14 +437,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
          }
 
          Dmsg2(100, "Write uncompressed %d bytes, total before write=%d\n", compress_len, total);
-         if ((uLongf)bwrite(&bfd, compress_buf, (size_t)compress_len) != compress_len) {
-            berrno be;
-            Pmsg0(0, _("===Write error===\n"));
-            Emsg2(M_ERROR, 0, _("Write error on %s: %s\n"),
-               attr->ofname, be.bstrerror());
-            extract = false;
-            return true;
-         }
+         store_data(&bfd, compress_buf, compress_len);
          total += compress_len;
          fileAddr += compress_len;
          Dmsg2(100, "Compress len=%d uncompressed=%d\n", rec->data_len,
index 8f68eccbc8a5436bbb776b6312f2f58643c74bff..0b775c2e18d527f9e11952326eab136a9f797ad3 100644 (file)
@@ -2,6 +2,8 @@
 
 General:
 23Jan08
+ebl  Fix bextract to be able to extract non-portable Win32 data to 
+     Unix/Linux clients
 kes  Move initialization of read/write res lock earlier in the code.
      This fixes the crash with a null conf file. This fixes bug
      #1030.