*
*/
/*
- 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
return 0;
}
-char *stream_to_ascii(int stream)
+const char *stream_to_ascii(int stream)
{
static char buf[20];
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 buf;
+ return (const char *)buf;
}
}
void binit(BFILE *bfd)
{
+ memset(bfd, 0, sizeof(BFILE));
bfd->fid = -1;
bfd->mode = BF_CLOSED;
bfd->use_backup_api = have_win32_api();
- bfd->errmsg = NULL;
- bfd->lpContext = NULL;
- bfd->lerror = 0;
}
/*
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
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;
}
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);
} 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;
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 */
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;
1, /* Abort */
1, /* ProcessSecurity */
&bfd->lpContext)) { /* Read context */
+ errno = b_errno_win32;
stat = -1;
}
} else if (bfd->use_backup_api && bfd->mode == BF_WRITE) {
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
1, /* Process Security */
&bfd->lpContext)) { /* Context */
bfd->lerror = GetLastError();
+ bfd->berrno = b_errno_win32;
+ errno = b_errno_win32;
return -1;
}
} else {
&bfd->rw_bytes,
NULL)) {
bfd->lerror = GetLastError();
+ bfd->berrno = b_errno_win32;
+ errno = b_errno_win32;
return -1;
}
}
1, /* Process Security */
&bfd->lpContext)) { /* Context */
bfd->lerror = GetLastError();
+ bfd->berrno = b_errno_win32;
+ errno = b_errno_win32;
return -1;
}
} else {
&bfd->rw_bytes,
NULL)) {
bfd->lerror = GetLastError();
+ bfd->berrno = b_errno_win32;
+ errno = b_errno_win32;
return -1;
}
}
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;
}
*/
void binit(BFILE *bfd)
{
+ memset(bfd, 0, sizeof(BFILE));
bfd->fid = -1;
}
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 */
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;
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(50, "Open file %d\n", bfd->fid);
+ 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)
{
int stat;
- Dmsg1(50, "Close file %d\n", bfd->fid);
+ Dmsg1(400, "Close file %d\n", bfd->fid);
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;
}
return pos;
}
-char *berror(BFILE *bfd)
+/* DO NOT USE */
+char *xberror(BFILE *bfd)
{
return strerror(bfd->berrno);
}