X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Ffindlib%2Fattribs.c;h=ab9a87f51d61de352d0041bde277d872bd33c411;hb=09c8c88482741e8f3e906be9159fa68015a9e3ec;hp=3079d00cc4ceb91bf1c220fc7c9af65ad84b1ba2;hpb=7f0eb42056b51c5d2f1fa40370723d48de14a5c7;p=bacula%2Fbacula diff --git a/bacula/src/findlib/attribs.c b/bacula/src/findlib/attribs.c index 3079d00cc4..ab9a87f51d 100755 --- a/bacula/src/findlib/attribs.c +++ b/bacula/src/findlib/attribs.c @@ -9,38 +9,30 @@ * */ /* - Copyright (C) 2002-2005 Kern Sibbald + Copyright (C) 2000-2005 Kern Sibbald This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. + modify it under the terms of the GNU General Public License + version 2 as amended with additional clauses defined in the + file LICENSE in the main source directory. 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 should have received a copy of the GNU General Public - License along with this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + the file LICENSE for additional details. */ #include "bacula.h" #include "find.h" -#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) - -#include "compat.h" - +#if defined(HAVE_WIN32) /* Forward referenced subroutines */ static bool set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd); void unix_name_to_win32(POOLMEM **win32_name, char *name); void win_error(JCR *jcr, char *prefix, POOLMEM *ofile); HANDLE bget_handle(BFILE *bfd); -#endif +#endif /* HAVE_WIN32 */ /* For old systems that don't have lchown() use chown() */ #ifndef HAVE_LCHOWN @@ -60,6 +52,15 @@ int select_data_stream(FF_PKT *ff_pkt) { int stream; + /* + * Fix all incompatible options + */ + + /* No sparse option for encrypted data */ + if (ff_pkt->flags & FO_ENCRYPT) { + ff_pkt->flags &= ~FO_SPARSE; + } + /* Note, no sparse option for win32_data */ if (!is_portable_backup(&ff_pkt->bfd)) { stream = STREAM_WIN32_DATA; @@ -69,17 +70,65 @@ int select_data_stream(FF_PKT *ff_pkt) } else { stream = STREAM_FILE_DATA; } + + /* Encryption is only supported for file data */ + if (stream != STREAM_FILE_DATA && stream != STREAM_WIN32_DATA && + stream != STREAM_MACOS_FORK_DATA) { + ff_pkt->flags &= ~FO_ENCRYPT; + } + + /* Compression is not supported for Mac fork data */ + if (stream == STREAM_MACOS_FORK_DATA) { + ff_pkt->flags &= ~FO_GZIP; + } + + /* + * Handle compression and encryption options + */ #ifdef HAVE_LIBZ if (ff_pkt->flags & FO_GZIP) { - if (stream == STREAM_WIN32_DATA) { + switch (stream) { + case STREAM_WIN32_DATA: stream = STREAM_WIN32_GZIP_DATA; - } else if (stream == STREAM_FILE_DATA) { - stream = STREAM_GZIP_DATA; - } else { + break; + case STREAM_SPARSE_DATA: stream = STREAM_SPARSE_GZIP_DATA; + break; + case STREAM_FILE_DATA: + stream = STREAM_GZIP_DATA; + break; + default: + /* All stream types that do not support gzip should clear out + * FO_GZIP above, and this code block should be unreachable. */ + ASSERT(!(ff_pkt->flags & FO_GZIP)); + return STREAM_NONE; } } #endif +#ifdef HAVE_CRYPTO + if (ff_pkt->flags & FO_ENCRYPT) { + switch (stream) { + case STREAM_WIN32_DATA: + stream = STREAM_ENCRYPTED_WIN32_DATA; + break; + case STREAM_WIN32_GZIP_DATA: + stream = STREAM_ENCRYPTED_WIN32_GZIP_DATA; + break; + case STREAM_FILE_DATA: + stream = STREAM_ENCRYPTED_FILE_DATA; + break; + case STREAM_GZIP_DATA: + stream = STREAM_ENCRYPTED_FILE_GZIP_DATA; + break; + default: + /* All stream types that do not support encryption should clear out + * FO_ENCRYPT above, and this code block should be unreachable. */ + ASSERT(!ff_pkt->flags & FO_ENCRYPT); + return STREAM_NONE; + } + } +#endif + return stream; } @@ -153,11 +202,17 @@ void encode_stat(char *buf, FF_PKT *ff_pkt, int data_stream) /* Do casting according to unknown type to keep compiler happy */ -#if !HAVE_GCC & HAVE_SUN_OS -#define plug(st, val) st = val /* brain damaged compiler */ +#ifdef HAVE_TYPEOF + #define plug(st, val) st = (typeof st)val #else -template void plug(T &st, uint64_t val) - { st = static_cast(val); } + #if !HAVE_GCC & HAVE_SUN_OS + /* Sun compiler does not handle templates correctly */ + #define plug(st, val) st = val + #else + /* Use templates to do the casting */ + template void plug(T &st, uint64_t val) + { st = static_cast(val); } + #endif #endif @@ -304,7 +359,7 @@ bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) bool ok = true; off_t fsize; -#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) +#if defined(HAVE_WIN32) if (attr->stream == STREAM_UNIX_ATTRIBUTES_EX && set_win32_attributes(jcr, attr, ofd)) { if (is_bopen(ofd)) { @@ -333,9 +388,9 @@ bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) old_mask = umask(0); if (is_bopen(ofd)) { char ec1[50], ec2[50]; - fsize = blseek(ofd, 0, SEEK_CUR); + fsize = blseek(ofd, 0, SEEK_END); bclose(ofd); /* first close file */ - if (fsize > 0 && fsize != attr->statp.st_size) { + if (fsize > 0 && fsize != (off_t)attr->statp.st_size) { Jmsg3(jcr, M_ERROR, 0, _("File size of restored file %s not correct. Original %s, restored %s.\n"), attr->ofname, edit_uint64(attr->statp.st_size, ec1), edit_uint64(fsize, ec2)); @@ -409,7 +464,7 @@ bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) /* */ /*=============================================================*/ -#if !defined(HAVE_CYGWIN) && !defined(HAVE_WIN32) +#if !defined(HAVE_WIN32) /* * It is possible to piggyback additional data e.g. ACLs on @@ -449,7 +504,7 @@ int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt) /* */ /*=============================================================*/ -#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) +#if defined(HAVE_WIN32) int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt) { @@ -459,24 +514,24 @@ int encode_attribsEx(JCR *jcr, char *attribsEx, FF_PKT *ff_pkt) attribsEx[0] = 0; /* no extended attributes */ + unix_name_to_win32(&ff_pkt->sys_fname, ff_pkt->fname); + // try unicode version if (p_GetFileAttributesExW) { - unix_name_to_win32(&ff_pkt->sys_fname, ff_pkt->fname); + POOLMEM* pwszBuf = get_pool_memory (PM_FNAME); + make_win32_path_UTF8_2_wchar(&pwszBuf, ff_pkt->fname); - WCHAR szBuf[MAX_PATH_UNICODE]; - UTF8_2_wchar(szBuf, ff_pkt->sys_fname, MAX_PATH_UNICODE); + BOOL b=p_GetFileAttributesExW((LPCWSTR) pwszBuf, GetFileExInfoStandard, (LPVOID)&atts); + free_pool_memory(pwszBuf); - if (!p_GetFileAttributesExW(szBuf, GetFileExInfoStandard, - (LPVOID)&atts)) { + if (!b) { win_error(jcr, "GetFileAttributesExW:", ff_pkt->sys_fname); return STREAM_UNIX_ATTRIBUTES; } } - else { + else { if (!p_GetFileAttributesExA) - return STREAM_UNIX_ATTRIBUTES; - - unix_name_to_win32(&ff_pkt->sys_fname, ff_pkt->fname); + return STREAM_UNIX_ATTRIBUTES; if (!p_GetFileAttributesExA(ff_pkt->sys_fname, GetFileExInfoStandard, (LPVOID)&atts)) { @@ -577,8 +632,6 @@ static bool set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) win32_ofile = get_pool_memory(PM_FNAME); unix_name_to_win32(&win32_ofile, attr->ofname); - - /* At this point, we have reconstructed the WIN32_FILE_ATTRIBUTE_DATA pkt */ if (!is_bopen(ofd)) { @@ -601,16 +654,18 @@ static bool set_win32_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) if (!(atts.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { if (p_SetFileAttributesW) { - WCHAR szBuf[MAX_PATH_UNICODE]; - UTF8_2_wchar(szBuf, win32_ofile, MAX_PATH_UNICODE); - - if (!SetFileAttributesW(szBuf, atts.dwFileAttributes & SET_ATTRS)) { - win_error(jcr, "SetFileAttributesW:", win32_ofile); - } + POOLMEM* pwszBuf = get_pool_memory (PM_FNAME); + make_win32_path_UTF8_2_wchar(&pwszBuf, attr->ofname); + + BOOL b=p_SetFileAttributesW((LPCWSTR)pwszBuf, atts.dwFileAttributes & SET_ATTRS); + free_pool_memory(pwszBuf); + + if (!b) + win_error(jcr, "SetFileAttributesW:", win32_ofile); } else { - if (!SetFileAttributes(win32_ofile, atts.dwFileAttributes & SET_ATTRS)) { - win_error(jcr, "SetFileAttributesA:", win32_ofile); + if (!p_SetFileAttributesA(win32_ofile, atts.dwFileAttributes & SET_ATTRS)) { + win_error(jcr, "SetFileAttributesA:", win32_ofile); } } } @@ -655,16 +710,4 @@ void win_error(JCR *jcr, char *prefix, DWORD lerror) } LocalFree(msg); } - - -/* Cygwin API definition */ -extern "C" void cygwin_conv_to_win32_path(const char *path, char *win32_path); - -void unix_name_to_win32(POOLMEM **win32_name, char *name) -{ - /* One extra byte should suffice, but we double it */ - *win32_name = check_pool_memory_size(*win32_name, 2*strlen(name)+1); - cygwin_conv_to_win32_path(name, *win32_name); -} - -#endif /* HAVE_CYGWIN */ +#endif /* HAVE_WIN32 */