]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/findlib/bfile.c
Fix #1370 about the implementation of the "Exclude Dir Containing" option on FD.
[bacula/bacula] / bacula / src / findlib / bfile.c
index f4c9c7f4beb65b79e92b41160b84bcc6b561a9d4..7ba1fca33040371678ff4b12aa8e4e1721bcd007 100644 (file)
@@ -20,7 +20,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Bacula® is a registered trademark of John Walker.
+   Bacula® is a registered trademark of Kern Sibbald.
    The licensor of Bacula is the Free Software Foundation Europe
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 
 const int dbglvl = 200;
 
-int       (*plugin_bopen)(JCR *jcr, const char *fname, int flags, mode_t mode) = NULL;
-int       (*plugin_bclose)(JCR *jcr) = NULL;
-ssize_t   (*plugin_bread)(JCR *jcr, void *buf, size_t count) = NULL;
-ssize_t   (*plugin_bwrite)(JCR *jcr, void *buf, size_t count) = NULL;
-boffset_t (*plugin_blseek)(JCR *jcr, boffset_t offset, int whence) = NULL;
+int       (*plugin_bopen)(BFILE *bfd, const char *fname, int flags, mode_t mode) = NULL;
+int       (*plugin_bclose)(BFILE *bfd) = NULL;
+ssize_t   (*plugin_bread)(BFILE *bfd, void *buf, size_t count) = NULL;
+ssize_t   (*plugin_bwrite)(BFILE *bfd, void *buf, size_t count) = NULL;
+boffset_t (*plugin_blseek)(BFILE *bfd, boffset_t offset, int whence) = NULL;
 
 
 #ifdef HAVE_DARWIN_OS
@@ -143,6 +143,44 @@ const char *stream_to_ascii(int stream)
       return _("Encrypted Win32 GZIP data");
    case STREAM_ENCRYPTED_MACOS_FORK_DATA:
       return _("Encrypted MacOS fork data");
+   case STREAM_ACL_AIX_TEXT:
+      return _("AIX Specific ACL attribs");
+   case STREAM_ACL_DARWIN_ACCESS_ACL:
+      return _("Darwin Specific ACL attribs");
+   case STREAM_ACL_FREEBSD_DEFAULT_ACL:
+      return _("FreeBSD Specific Default ACL attribs");
+   case STREAM_ACL_FREEBSD_ACCESS_ACL:
+      return _("FreeBSD Specific Access ACL attribs");
+   case STREAM_ACL_HPUX_ACL_ENTRY:
+      return _("HPUX Specific ACL attribs");
+   case STREAM_ACL_IRIX_DEFAULT_ACL:
+      return _("Irix Specific Default ACL attribs");
+   case STREAM_ACL_IRIX_ACCESS_ACL:
+      return _("Irix Specific Access ACL attribs");
+   case STREAM_ACL_LINUX_DEFAULT_ACL:
+      return _("Linux Specific Default ACL attribs");
+   case STREAM_ACL_LINUX_ACCESS_ACL:
+      return _("Linux Specific Access ACL attribs");
+   case STREAM_ACL_TRU64_DEFAULT_ACL:
+      return _("OSF1 Specific Default ACL attribs");
+   case STREAM_ACL_TRU64_ACCESS_ACL:
+      return _("OSF1 Specific Access ACL attribs");
+   case STREAM_ACL_SOLARIS_ACLENT:
+      return _("Solaris Specific ACL attribs");
+   case STREAM_ACL_SOLARIS_ACE:
+      return _("Solaris Specific ACL attribs");
+   case STREAM_XATTR_SOLARIS_SYS:
+      return _("Solaris Specific Extensible attribs or System Extended attribs");
+   case STREAM_XATTR_SOLARIS:
+      return _("Solaris Specific Extended attribs");
+   case STREAM_XATTR_DARWIN:
+      return _("Darwin Specific Extended attribs");
+   case STREAM_XATTR_FREEBSD:
+      return _("FreeBSD Specific Extended attribs");
+   case STREAM_XATTR_LINUX:
+      return _("Linux Specific Extended attribs");
+   case STREAM_XATTR_NETBSD:
+      return _("NetBSD Specific Extended attribs");
    default:
       sprintf(buf, "%d", stream);
       return (const char *)buf;
@@ -420,18 +458,35 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 
    if (bfd->cmd_plugin && plugin_bopen) {
       int rtnstat;
-      Dmsg1(000, "call plugin_bopen fname=%s\n", fname);
-      rtnstat = plugin_bopen(bfd->jcr, fname, flags, mode);
+      Dmsg1(50, "call plugin_bopen fname=%s\n", fname);
+      rtnstat = plugin_bopen(bfd, fname, flags, mode);
+      Dmsg1(50, "return from plugin_bopen status=%d\n", rtnstat);
+      if (rtnstat >= 0) {
+         if (flags & O_CREAT || flags & O_WRONLY) {   /* Open existing for write */
+            Dmsg1(50, "plugin_open for write OK file=%s.\n", fname);
+            bfd->mode = BF_WRITE;
+         } else {
+            Dmsg1(50, "plugin_open for read OK file=%s.\n", fname);
+            bfd->mode = BF_READ;
+         }
+      } else {
+         bfd->mode = BF_CLOSED;
+         Dmsg1(000, "==== plugin_bopen returned bad status=%d\n", rtnstat);
+      }
       free_pool_memory(win32_fname_wchar);
       free_pool_memory(win32_fname);
-      return rtnstat;
+      return bfd->mode == BF_CLOSED ? -1 : 1;
    }
+   Dmsg0(50, "=== NO plugin\n");
 
-   if (!(p_CreateFileA || p_CreateFileW))
+   if (!(p_CreateFileA || p_CreateFileW)) {
+      Dmsg0(50, "No CreateFileA and no CreateFileW!!!!!\n");
       return 0;
+   }
 
-   if (p_CreateFileW && p_MultiByteToWideChar)
+   if (p_CreateFileW && p_MultiByteToWideChar) {
       make_win32_path_UTF8_2_wchar(&win32_fname_wchar, fname);
+   }
 
    if (flags & O_CREAT) {             /* Create */
       if (bfd->use_backup_api) {
@@ -444,6 +499,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 
       if (p_CreateFileW && p_MultiByteToWideChar) {   
          // unicode open for create write
+         Dmsg1(100, "Create CreateFileW=%s\n", win32_fname);
          bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
                 dwaccess,                /* Requested access */
                 0,                       /* Shared mode */
@@ -453,6 +509,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
                 NULL);                   /* TemplateFile */
       } else {
          // ascii open
+         Dmsg1(100, "Create CreateFileA=%s\n", win32_fname);
          bfd->fh = p_CreateFileA(win32_fname,
                 dwaccess,                /* Requested access */
                 0,                       /* Shared mode */
@@ -475,6 +532,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 
       if (p_CreateFileW && p_MultiByteToWideChar) {   
          // unicode open for open existing write
+         Dmsg1(100, "Write only CreateFileW=%s\n", win32_fname);
          bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
                 dwaccess,                /* Requested access */
                 0,                       /* Shared mode */
@@ -484,6 +542,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
                 NULL);                   /* TemplateFile */
       } else {
          // ascii open
+         Dmsg1(100, "Write only CreateFileA=%s\n", win32_fname);
          bfd->fh = p_CreateFileA(win32_fname,
                 dwaccess,                /* Requested access */
                 0,                       /* Shared mode */
@@ -510,6 +569,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 
       if (p_CreateFileW && p_MultiByteToWideChar) {   
          // unicode open for open existing read
+         Dmsg1(100, "Read CreateFileW=%s\n", win32_fname);
          bfd->fh = p_CreateFileW((LPCWSTR)win32_fname_wchar,
                 dwaccess,                /* Requested access */
                 dwshare,                 /* Share modes */
@@ -519,6 +579,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
                 NULL);                   /* TemplateFile */
       } else {
          // ascii open 
+         Dmsg1(100, "Read CreateFileA=%s\n", win32_fname);
          bfd->fh = p_CreateFileA(win32_fname,
                 dwaccess,                /* Requested access */
                 dwshare,                 /* Share modes */
@@ -559,11 +620,13 @@ int bclose(BFILE *bfd)
       bfd->errmsg = NULL;
    }
    if (bfd->mode == BF_CLOSED) {
+      Dmsg0(50, "=== BFD already closed.\n");
       return 0;
    }
 
    if (bfd->cmd_plugin && plugin_bclose) {
-      stat = plugin_bclose(bfd->jcr);
+      stat = plugin_bclose(bfd);
+      Dmsg0(50, "==== BFD closed!!!\n");
       goto all_done;
    }
 
@@ -618,7 +681,7 @@ ssize_t bread(BFILE *bfd, void *buf, size_t count)
    bfd->rw_bytes = 0;
 
    if (bfd->cmd_plugin && plugin_bread) {
-      return plugin_bread(bfd->jcr, buf, count);
+      return plugin_bread(bfd, buf, count);
    }
 
    if (bfd->use_backup_api) {
@@ -655,7 +718,7 @@ ssize_t bwrite(BFILE *bfd, void *buf, size_t count)
    bfd->rw_bytes = 0;
 
    if (bfd->cmd_plugin && plugin_bwrite) {
-      return plugin_bwrite(bfd->jcr, buf, count);
+      return plugin_bwrite(bfd, buf, count);
    }
 
    if (bfd->use_backup_api) {
@@ -697,8 +760,8 @@ boffset_t blseek(BFILE *bfd, boffset_t offset, int whence)
    LONG  offset_high = (LONG)(offset >> 32);
    DWORD dwResult;
 
-   if (bfd->cmd_plugin && plugin_bwrite) {
-      return plugin_blseek(bfd->jcr, offset, whence);
+   if (bfd->cmd_plugin && plugin_blseek) {
+      return plugin_blseek(bfd, offset, whence);
    }
 
    dwResult = SetFilePointer(bfd->fh, offset_low, &offset_high, whence);
@@ -827,8 +890,10 @@ bool is_restore_stream_supported(int stream)
 int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 {
    if (bfd->cmd_plugin && plugin_bopen) {
-      Dmsg1(000, "call plugin_bopen fname=%s\n", fname);
-      return plugin_bopen(bfd->jcr, fname, flags, mode);
+      Dmsg1(50, "call plugin_bopen fname=%s\n", fname);
+      bfd->fid = plugin_bopen(bfd, fname, flags, mode);
+      Dmsg1(50, "Plugin bopen stat=%d\n", bfd->fid);
+      return bfd->fid;
    }
 
    /* Normal file open */
@@ -885,6 +950,11 @@ int bopen_rsrc(BFILE *bfd, const char *fname, int flags, mode_t mode)
    free_pool_memory(rsrc_fname);
    return bfd->fid;
 }
+#else
+int bopen_rsrc(BFILE *bfd, const char *fname, int flags, mode_t mode)
+{
+   return -1;
+}
 #endif
 
 
@@ -895,7 +965,7 @@ int bclose(BFILE *bfd)
    Dmsg1(400, "Close file %d\n", bfd->fid);
 
    if (bfd->cmd_plugin && plugin_bclose) {
-      stat = plugin_bclose(bfd->jcr);
+      stat = plugin_bclose(bfd);
       bfd->fid = -1;
       bfd->cmd_plugin = false;
    }
@@ -924,7 +994,7 @@ ssize_t bread(BFILE *bfd, void *buf, size_t count)
    ssize_t stat;
 
    if (bfd->cmd_plugin && plugin_bread) {
-      return plugin_bread(bfd->jcr, buf, count);
+      return plugin_bread(bfd, buf, count);
    }
 
    stat = read(bfd->fid, buf, count);
@@ -937,7 +1007,7 @@ ssize_t bwrite(BFILE *bfd, void *buf, size_t count)
    ssize_t stat;
 
    if (bfd->cmd_plugin && plugin_bwrite) {
-      return plugin_bwrite(bfd->jcr, buf, count);
+      return plugin_bwrite(bfd, buf, count);
    }
    stat = write(bfd->fid, buf, count);
    bfd->berrno = errno;
@@ -954,9 +1024,9 @@ boffset_t blseek(BFILE *bfd, boffset_t offset, int whence)
    boffset_t pos;
 
    if (bfd->cmd_plugin && plugin_bwrite) {
-      return plugin_blseek(bfd->jcr, offset, whence);
+      return plugin_blseek(bfd, offset, whence);
    }
-   pos = (boffset_t)lseek(bfd->fid, (off_t)offset, whence);
+   pos = (boffset_t)lseek(bfd->fid, offset, whence);
    bfd->berrno = errno;
    return pos;
 }