X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffindlib%2Fcreate_file.c;h=ab8afd2ff55cf6570ae60683b76add4e18c9cd2f;hb=e34a533319e7b947448eb90eb1a269958190e7b1;hp=cd032b98173326ab3d25df681c0bf94a257e47e3;hpb=581c43bb2b40bc6b58f73754e5e6eb8c31e4c7ae;p=bacula%2Fbacula diff --git a/bacula/src/findlib/create_file.c b/bacula/src/findlib/create_file.c index cd032b9817..ab8afd2ff5 100644 --- a/bacula/src/findlib/create_file.c +++ b/bacula/src/findlib/create_file.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + Copyright (C) 2000-2011 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 + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,12 +15,12 @@ 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 + You should have received a copy of the GNU Affero 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. + 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. @@ -71,7 +71,8 @@ static int path_already_seen(JCR *jcr, char *path, int pnl); */ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) { - mode_t new_mode, parent_mode, mode; + mode_t new_mode, parent_mode; + int flags; uid_t uid; gid_t gid; int pnl; @@ -113,31 +114,38 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) } } #endif - - Dmsg2(400, "Replace=%c %d\n", (char)replace, replace); + Dmsg3(200, "Create %s Replace=%c FT=%d\n", attr->ofname, (char)replace, attr->type); if (lstat(attr->ofname, &mstatp) == 0) { exists = true; - switch (replace) { - case REPLACE_IFNEWER: - if (attr->statp.st_mtime <= mstatp.st_mtime) { - Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname); - return CF_SKIP; - } - break; + /* + * For directories we do not apply the replace options, because + * we must always create directories that do not exist, and thus + * when the directory end record comes, the directory exists. So + * we always apply the FT_DIREND record for directories. + */ + if (attr->type != FT_DIREND) { + switch (replace) { + case REPLACE_IFNEWER: + if (attr->statp.st_mtime <= mstatp.st_mtime) { + Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not newer: %s\n"), attr->ofname); + return CF_SKIP; + } + break; - case REPLACE_IFOLDER: - if (attr->statp.st_mtime >= mstatp.st_mtime) { - Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname); - return CF_SKIP; - } - break; + case REPLACE_IFOLDER: + if (attr->statp.st_mtime >= mstatp.st_mtime) { + Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Not older: %s\n"), attr->ofname); + return CF_SKIP; + } + break; - case REPLACE_NEVER: - Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname); - return CF_SKIP; + case REPLACE_NEVER: + Qmsg(jcr, M_SKIPPED, 0, _("File skipped. Already exists: %s\n"), attr->ofname); + return CF_SKIP; - case REPLACE_ALWAYS: - break; + case REPLACE_ALWAYS: + break; + } } } switch (attr->type) { @@ -185,12 +193,12 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) attr->ofname[pnl] = 0; /* terminate path */ if (!path_already_seen(jcr, attr->ofname, pnl)) { - Dmsg1(400, "Make path %s\n", attr->ofname); /* * If we need to make the directory, ensure that it is with * execute bit set (i.e. parent_mode), and preserve what already * exists. Normally, this should do nothing. */ + Dmsg1(400, "makepath %s\n", attr->ofname); if (!makepath(attr, attr->ofname, parent_mode, parent_mode, uid, gid, 1)) { Dmsg1(10, "Could not make path. %s\n", attr->ofname); attr->ofname[pnl] = savechr; /* restore full name */ @@ -204,28 +212,28 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) switch(attr->type) { case FT_REGE: case FT_REG: - Dmsg1(100, "Create file %s\n", attr->ofname); - mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; /* O_NOFOLLOW; */ + Dmsg1(100, "Create=%s\n", attr->ofname); + flags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY; /* O_NOFOLLOW; */ if (IS_CTG(attr->statp.st_mode)) { - mode |= O_CTG; /* set contiguous bit if needed */ + flags |= O_CTG; /* set contiguous bit if needed */ } - Dmsg1(50, "Create file: %s\n", attr->ofname); if (is_bopen(bfd)) { Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); bclose(bfd); } - if ((bopen(bfd, attr->ofname, mode, S_IRUSR | S_IWUSR)) < 0) { + if ((bopen(bfd, attr->ofname, flags, S_IRUSR | S_IWUSR)) < 0) { berrno be; be.set_errno(bfd->berrno); Qmsg2(jcr, M_ERROR, 0, _("Could not create %s: ERR=%s\n"), attr->ofname, be.bstrerror()); + Dmsg2(100,"Could not create %s: ERR=%s\n", attr->ofname, be.bstrerror()); return CF_ERROR; } return CF_EXTRACT; -#ifndef HAVE_WIN32 // none of these exists on MS Windows +#ifndef HAVE_WIN32 // none of these exist in MS Windows case FT_RAW: /* Bacula raw device e.g. /dev/sda1 */ case FT_FIFO: /* Bacula fifo to save data */ case FT_SPEC: @@ -265,19 +273,19 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) if (attr->type == FT_RAW || attr->type == FT_FIFO) { btimer_t *tid; Dmsg1(400, "FT_RAW|FT_FIFO %s\n", attr->ofname); - mode = O_WRONLY | O_BINARY; + flags = O_WRONLY | O_BINARY; /* Timeout open() in 60 seconds */ if (attr->type == FT_FIFO) { Dmsg0(400, "Set FIFO timer\n"); - tid = start_thread_timer(pthread_self(), 60); + tid = start_thread_timer(jcr, pthread_self(), 60); } else { tid = NULL; } if (is_bopen(bfd)) { Qmsg1(jcr, M_ERROR, 0, _("bpkt already open fid=%d\n"), bfd->fid); } - Dmsg2(400, "open %s mode=0x%x\n", attr->ofname, mode); - if ((bopen(bfd, attr->ofname, mode, 0)) < 0) { + Dmsg2(400, "open %s flags=0x%x\n", attr->ofname, flags); + if ((bopen(bfd, attr->ofname, flags, 0)) < 0) { berrno be; be.set_errno(bfd->berrno); Qmsg2(jcr, M_ERROR, 0, _("Could not open %s: ERR=%s\n"), @@ -327,6 +335,8 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) #endif /* HAVE_CHFLAGS */ Qmsg3(jcr, M_ERROR, 0, _("Could not hard link %s -> %s: ERR=%s\n"), attr->ofname, attr->olname, be.bstrerror()); + Dmsg3(200, "Could not hard link %s -> %s: ERR=%s\n", + attr->ofname, attr->olname, be.bstrerror()); return CF_ERROR; #ifdef HAVE_CHFLAGS } @@ -352,6 +362,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) } /* End inner switch */ case FT_REPARSE: + case FT_JUNCTION: bfd->reparse_point = true; /* Fall through wanted */ case FT_DIRBEGIN: @@ -389,6 +400,9 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace) return CF_CREATED; } + case FT_DELETED: + Qmsg2(jcr, M_INFO, 0, _("Original file %s have been deleted: type=%d\n"), attr->fname, attr->type); + break; /* The following should not occur */ case FT_NOACCESS: case FT_NOFOLLOW: