X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffindlib%2Fattribs.c;h=d747543e188cc62c3b76bc82c4afbf9930c4ad21;hb=fb023b61aa95fdf2763963be726e18b896d6c01f;hp=fecbddb67dd1686de55f9a2a1dba9cb8888f2a04;hpb=eded68175638980d2eb61907471807a07f3b2a95;p=bacula%2Fbacula diff --git a/bacula/src/findlib/attribs.c b/bacula/src/findlib/attribs.c old mode 100755 new mode 100644 index fecbddb67d..d747543e18 --- a/bacula/src/findlib/attribs.c +++ b/bacula/src/findlib/attribs.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + Copyright (C) 2002-2007 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation plus additions + that are listed in the file LICENSE. + + 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., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of John Walker. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * Encode and decode standard Unix attributes and * Extended attributes for Win32 and @@ -8,35 +35,17 @@ * Version $Id$ * */ -/* - 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 - 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 - the file LICENSE for additional details. - - */ #include "bacula.h" #include "find.h" -#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) - -#include "../lib/winapi.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 @@ -104,7 +113,7 @@ int select_data_stream(FF_PKT *ff_pkt) 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); + ASSERT(!(ff_pkt->flags & FO_GZIP)); return STREAM_NONE; } } @@ -127,7 +136,7 @@ int select_data_stream(FF_PKT *ff_pkt) 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); + ASSERT(!(ff_pkt->flags & FO_ENCRYPT)); return STREAM_NONE; } } @@ -206,11 +215,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 @@ -355,9 +370,9 @@ bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) struct utimbuf ut; mode_t old_mask; bool ok = true; - off_t fsize; + boffset_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)) { @@ -388,13 +403,21 @@ bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) char ec1[50], ec2[50]; fsize = blseek(ofd, 0, SEEK_END); bclose(ofd); /* first close file */ - if (fsize > 0 && fsize != (off_t)attr->statp.st_size) { + if (attr->type == FT_REG && fsize > 0 && fsize != (boffset_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)); } } + /* + * We do not restore sockets, so skip trying to restore their + * attributes. + */ + if (attr->type == FT_SPEC && S_ISSOCK(attr->statp.st_mode)) { + goto bail_out; + } + ut.actime = attr->statp.st_atime; ut.modtime = attr->statp.st_mtime; @@ -450,6 +473,8 @@ bool set_attributes(JCR *jcr, ATTR *attr, BFILE *ofd) } #endif } + +bail_out: pm_strcpy(attr->ofname, "*none*"); umask(old_mask); return ok; @@ -462,7 +487,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 @@ -502,7 +527,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) { @@ -708,17 +733,4 @@ void win_error(JCR *jcr, char *prefix, DWORD lerror) } LocalFree(msg); } - - -/* Conversion of a Unix filename to a Win32 filename */ -extern void conv_unix_to_win32_path(const char *path, char *win32_path, DWORD dwSize); -void unix_name_to_win32(POOLMEM **win32_name, char *name) -{ - /* One extra byte should suffice, but we double it */ - /* add MAX_PATH bytes for VSS shadow copy name */ - DWORD dwSize = 2*strlen(name)+MAX_PATH; - *win32_name = check_pool_memory_size(*win32_name, dwSize); - conv_unix_to_win32_path(name, *win32_name, dwSize); -} - -#endif /* HAVE_CYGWIN */ +#endif /* HAVE_WIN32 */