]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/findlib/bfile.c
- Integrated Preben 'Peppe' Guldberg <peppe@wielders.org>
[bacula/bacula] / bacula / src / findlib / bfile.c
index f2ff68dbaa9c7c1f52820cdab90fb92272c345b5..dc72bbc7bc7464ec7022b35ea2c2781505b030d8 100644 (file)
@@ -9,7 +9,7 @@
  *
  */
 /*
-   Copyright (C) 2000-2003 Kern Sibbald and John Walker
+   Copyright (C) 2003-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
 #include "bacula.h"
 #include "find.h"
 
+#ifdef HAVE_DARWIN_OS
+#include <sys/paths.h>
+#endif
+
 /* ===============================================================
  * 
  *           U N I X   AND   W I N D O W S
@@ -77,6 +81,10 @@ const char *stream_to_ascii(int stream)
       return "Program data";
    case STREAM_SHA1_SIGNATURE:
       return "SHA1 signature";
+   case STREAM_MACOS_FORK_DATA:
+      return "HFS+ resource fork";
+   case STREAM_HFSPLUS_ATTRIBUTES:
+      return "HFS+ Finder Info";
    default:
       sprintf(buf, "%d", stream);
       return (const char *)buf;
@@ -105,10 +113,6 @@ void binit(BFILE *bfd)
    bfd->fid = -1;
    bfd->mode = BF_CLOSED;
    bfd->use_backup_api = have_win32_api();
-   bfd->errmsg = NULL;
-   bfd->lpContext = NULL;
-   bfd->lerror = 0;
-   bfd->berrno = 0;
 }
 
 /*
@@ -130,6 +134,12 @@ int set_portable_backup(BFILE *bfd)
    return 1;
 }
 
+void set_prog(BFILE *bfd, char *prog, JCR *jcr)
+{
+   bfd->prog = prog;
+   bfd->jcr = jcr;
+}
+
 /*
  * Return 1 if we are NOT using Win32 BackupWrite() 
  * return 0 if are
@@ -176,6 +186,10 @@ int is_stream_supported(int stream)
    case STREAM_PROGRAM_NAMES:
    case STREAM_PROGRAM_DATA:
    case STREAM_SHA1_SIGNATURE:
+#ifdef HAVE_DARWIN_OS
+   case STREAM_MACOS_FORK_DATA:
+   case STREAM_HFSPLUS_ATTRIBUTES:
+#endif
    case 0:                           /* compatibility with old tapes */
       return 1;
    }
@@ -190,7 +204,7 @@ HANDLE bget_handle(BFILE *bfd)
 int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 {
    POOLMEM *win32_fname;
-   DWORD dwaccess, dwflags;
+   DWORD dwaccess, dwflags, dwshare;
 
    /* Convert to Windows path format */
    win32_fname = get_pool_memory(PM_FNAME);
@@ -215,11 +229,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 
    } else if (flags & O_WRONLY) {     /* Open existing for write */
       if (bfd->use_backup_api) {
-#ifdef HAVE_WIN32
-         dwaccess = GENERIC_WRITE|/*FILE_ALL_ACCESS|*/WRITE_OWNER|WRITE_DAC/*|ACCESS_SYSTEM_SECURITY*/;
-#else
-         dwaccess = GENERIC_WRITE|FILE_ALL_ACCESS|WRITE_OWNER|WRITE_DAC|ACCESS_SYSTEM_SECURITY;
-#endif
+        dwaccess = GENERIC_WRITE|WRITE_OWNER|WRITE_DAC;
         dwflags = FILE_FLAG_BACKUP_SEMANTICS;
       } else {
         dwaccess = GENERIC_WRITE;
@@ -238,13 +248,15 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
       if (bfd->use_backup_api) {
         dwaccess = GENERIC_READ|READ_CONTROL|ACCESS_SYSTEM_SECURITY;
         dwflags = FILE_FLAG_BACKUP_SEMANTICS;
+        dwshare = FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE;
       } else {
         dwaccess = GENERIC_READ;
         dwflags = 0;
+        dwshare = FILE_SHARE_READ|FILE_SHARE_WRITE;
       }
       bfd->fh = CreateFile(win32_fname,
             dwaccess,                /* Requested access */
-            FILE_SHARE_READ,         /* Shared mode */
+            dwshare,                 /* Share modes */
             NULL,                    /* SecurityAttributes */
             OPEN_EXISTING,           /* CreationDisposition */
             dwflags,                 /* Flags and attributes */
@@ -255,6 +267,7 @@ int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
    if (bfd->fh == INVALID_HANDLE_VALUE) {
       bfd->lerror = GetLastError();
       bfd->berrno = b_errno_win32;
+      errno = b_errno_win32;
       bfd->mode = BF_CLOSED;
    }
    bfd->errmsg = NULL;
@@ -287,6 +300,7 @@ int bclose(BFILE *bfd)
              1,                      /* Abort */
              1,                      /* ProcessSecurity */
              &bfd->lpContext)) {     /* Read context */
+        errno = b_errno_win32;
         stat = -1;
       } 
    } else if (bfd->use_backup_api && bfd->mode == BF_WRITE) {
@@ -298,41 +312,19 @@ int bclose(BFILE *bfd)
              1,                      /* Abort */
              1,                      /* ProcessSecurity */
              &bfd->lpContext)) {     /* Write context */
+        errno = b_errno_win32;
         stat = -1;
       } 
    }
    if (!CloseHandle(bfd->fh)) {
       stat = -1;
+      errno = b_errno_win32;
    }
    bfd->mode = BF_CLOSED;
    bfd->lpContext = NULL;
    return stat;
 }
 
-/*
- * Generate error message 
- */
-char *berror(BFILE *bfd)
-{
-   LPTSTR msg;
-
-   FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
-                FORMAT_MESSAGE_FROM_SYSTEM,
-                NULL,
-                bfd->lerror,
-                0,
-                (LPTSTR)&msg,
-                0,
-                NULL);
-   strip_trailing_junk(msg);
-   if (!bfd->errmsg) {
-      bfd->errmsg = get_pool_memory(PM_FNAME);
-   }
-   pm_strcpy(&bfd->errmsg, msg);
-   LocalFree(msg);
-   return bfd->errmsg;
-}
-
 /* Returns: bytes read on success
  *          0         on EOF
  *         -1         on error
@@ -351,6 +343,7 @@ ssize_t bread(BFILE *bfd, void *buf, size_t count)
           &bfd->lpContext)) {          /* Context */
         bfd->lerror = GetLastError();
         bfd->berrno = b_errno_win32;
+        errno = b_errno_win32;
         return -1;
       }
    } else {
@@ -361,6 +354,7 @@ ssize_t bread(BFILE *bfd, void *buf, size_t count)
           NULL)) {
         bfd->lerror = GetLastError();
         bfd->berrno = b_errno_win32;
+        errno = b_errno_win32;
         return -1;
       }
    }
@@ -382,6 +376,7 @@ ssize_t bwrite(BFILE *bfd, void *buf, size_t count)
           &bfd->lpContext)) {          /* Context */
         bfd->lerror = GetLastError();
         bfd->berrno = b_errno_win32;
+        errno = b_errno_win32;
         return -1;
       }
    } else {
@@ -392,6 +387,7 @@ ssize_t bwrite(BFILE *bfd, void *buf, size_t count)
           NULL)) {
         bfd->lerror = GetLastError();
         bfd->berrno = b_errno_win32;
+        errno = b_errno_win32;
         return -1;
       }
    }
@@ -405,7 +401,7 @@ int is_bopen(BFILE *bfd)
 
 off_t blseek(BFILE *bfd, off_t offset, int whence)
 {
-   /* ****FIXME**** this is needed if we want to read Win32 Archives */
+   /* ****FIXME**** this must be implemented if we want to read Win32 Archives */
    return -1;
 }
 
@@ -453,6 +449,13 @@ int is_portable_backup(BFILE *bfd)
    return 1;                         /* portable by definition */
 }
 
+void set_prog(BFILE *bfd, char *prog, JCR *jcr)
+{
+   bfd->prog = prog;
+   bfd->jcr = jcr;
+}
+
+
 int is_stream_supported(int stream)
 {
    /* No Win32 backup on this machine */
@@ -478,6 +481,10 @@ int is_stream_supported(int stream)
    case STREAM_PROGRAM_NAMES:
    case STREAM_PROGRAM_DATA:
    case STREAM_SHA1_SIGNATURE:
+#ifdef HAVE_DARWIN_OS
+   case STREAM_MACOS_FORK_DATA:
+   case STREAM_HFSPLUS_ATTRIBUTES:
+#endif
    case 0:                           /* compatibility with old tapes */
       return 1;
 
@@ -487,11 +494,58 @@ int is_stream_supported(int stream)
 
 int bopen(BFILE *bfd, const char *fname, int flags, mode_t mode)
 {
+   /* Open reader/writer program */
+   if (bfd->prog) {
+      POOLMEM *ecmd = get_pool_memory(PM_FNAME);
+      ecmd = edit_job_codes(bfd->jcr, ecmd, bfd->prog, fname);
+      const char *pmode;
+      if (flags & O_RDONLY) {
+         pmode = "r";
+      } else {
+         pmode = "w";
+      }
+      bfd->bpipe = open_bpipe(ecmd, 0, pmode);
+      if (bfd->bpipe == NULL) {
+        bfd->berrno = errno;
+        bfd->fid = -1;
+        free_pool_memory(ecmd);
+        return -1;
+      }
+      free_pool_memory(ecmd);
+      if (flags & O_RDONLY) {
+        bfd->fid = fileno(bfd->bpipe->rfd);
+      } else {
+        bfd->fid = fileno(bfd->bpipe->wfd);
+      }
+      errno = 0;
+      return bfd->fid;
+   }
+
+   /* Normal file open */
    bfd->fid = open(fname, flags, mode);
    bfd->berrno = errno;
    Dmsg1(400, "Open file %d\n", bfd->fid);
+   errno = bfd->berrno;
+   return bfd->fid;
+}
+
+#ifdef HAVE_DARWIN_OS
+/* Open the resource fork of a file. */
+int bopen_rsrc(BFILE *bfd, const char *fname, int flags, mode_t mode)
+{
+   POOLMEM *rsrc_fname;
+   size_t fname_len;
+
+   fname_len = strlen(fname);
+   rsrc_fname = get_pool_memory(PM_FNAME);
+   bstrncpy(rsrc_fname, fname, fname_len + 1);
+   bstrncpy(rsrc_fname + fname_len, _PATH_RSRCFORKSPEC,
+      strlen(_PATH_RSRCFORKSPEC) + 1);
+   bopen(bfd, rsrc_fname, flags, mode);
+   free_pool_memory(rsrc_fname);
    return bfd->fid;
 }
+#endif
 
 int bclose(BFILE *bfd)
 { 
@@ -500,10 +554,19 @@ int bclose(BFILE *bfd)
    if (bfd->fid == -1) {
       return 0;
    }
+   /* Close reader/writer program */
+   if (bfd->prog && bfd->bpipe) {
+      stat = close_bpipe(bfd->bpipe);
+      bfd->berrno = errno;
+      bfd->fid = -1;
+      bfd->bpipe = NULL;
+      return stat;
+   }
+   
+   /* Close normal file */
    stat = close(bfd->fid);
    bfd->berrno = errno;
    bfd->fid = -1;
-
    return stat;
 }
 
@@ -536,7 +599,8 @@ off_t blseek(BFILE *bfd, off_t offset, int whence)
     return pos;
 }
 
-char *berror(BFILE *bfd)
+/* DO NOT USE */
+char *xberror(BFILE *bfd)
 {
     return strerror(bfd->berrno);
 }