X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Fverify.c;h=f280c05b01f6ed82ed5bca20e73715b5e0b5cf56;hb=8694fe83738792584b6c7c1a42a6225159dbf998;hp=f4da34b6666bb017712b55fe1b2a6e4c5285f8f0;hpb=f5c84d71c548c3996d0073166dbc59b08151e3e3;p=bacula%2Fbacula diff --git a/bacula/src/filed/verify.c b/bacula/src/filed/verify.c index f4da34b666..f280c05b01 100644 --- a/bacula/src/filed/verify.c +++ b/bacula/src/filed/verify.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2009 Free Software Foundation Europe e.V. + Copyright (C) 2000-2010 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,7 +15,7 @@ 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. @@ -30,13 +30,17 @@ * * Kern Sibbald, October MM * - * Version $Id$ - * */ #include "bacula.h" #include "filed.h" +#ifdef HAVE_DARWIN_OS +const bool have_darwin_os = true; +#else +const bool have_darwin_os = false; +#endif + static int verify_file(JCR *jcr, FF_PKT *ff_pkt, bool); static int read_digest(BFILE *bfd, DIGEST *digest, JCR *jcr); @@ -151,6 +155,8 @@ static int verify_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) case FT_NOFSCHG: Jmsg(jcr, M_SKIPPED, 1, _(" File system change prohibited. Directory skipped: %s\n"), ff_pkt->fname); return 1; + case FT_RESTORE_FIRST: + return 1; /* silently skip */ case FT_NOOPEN: { berrno be; be.set_errno(ff_pkt->ff_errno); @@ -288,8 +294,9 @@ int digest_file(JCR *jcr, FF_PKT *ff_pkt, DIGEST *digest) Dmsg0(50, "=== digest_file\n"); binit(&bfd); - if (ff_pkt->statp.st_size > 0 || ff_pkt->type == FT_RAW - || ff_pkt->type == FT_FIFO) { + if (ff_pkt->statp.st_size > 0 || + ff_pkt->type == FT_RAW || + ff_pkt->type == FT_FIFO) { int noatime = ff_pkt->flags & FO_NOATIME ? O_NOATIME : 0; if ((bopen(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY | noatime, 0)) < 0) { ff_pkt->ff_errno = errno; @@ -304,28 +311,27 @@ int digest_file(JCR *jcr, FF_PKT *ff_pkt, DIGEST *digest) bclose(&bfd); } -#ifdef HAVE_DARWIN_OS + if (have_darwin_os) { /* Open resource fork if necessary */ - if (ff_pkt->flags & FO_HFSPLUS && ff_pkt->hfsinfo.rsrclength > 0) { - if (bopen_rsrc(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { - ff_pkt->ff_errno = errno; - berrno be; - Jmsg(jcr, M_ERROR, -1, _(" Cannot open resource fork for %s: ERR=%s.\n"), - ff_pkt->fname, be.bstrerror()); - if (is_bopen(&ff_pkt->bfd)) { - bclose(&ff_pkt->bfd); + if (ff_pkt->flags & FO_HFSPLUS && ff_pkt->hfsinfo.rsrclength > 0) { + if (bopen_rsrc(&bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { + ff_pkt->ff_errno = errno; + berrno be; + Jmsg(jcr, M_ERROR, -1, _(" Cannot open resource fork for %s: ERR=%s.\n"), + ff_pkt->fname, be.bstrerror()); + if (is_bopen(&ff_pkt->bfd)) { + bclose(&ff_pkt->bfd); + } + return 1; } - return 1; + read_digest(&bfd, digest, jcr); + bclose(&bfd); } - read_digest(&bfd, digest, jcr); - bclose(&bfd); - } - if (digest && ff_pkt->flags & FO_HFSPLUS) { - crypto_digest_update(digest, (uint8_t *)ff_pkt->hfsinfo.fndrinfo, 32); + if (digest && ff_pkt->flags & FO_HFSPLUS) { + crypto_digest_update(digest, (uint8_t *)ff_pkt->hfsinfo.fndrinfo, 32); + } } -#endif - return 0; } @@ -361,8 +367,12 @@ static int read_digest(BFILE *bfd, DIGEST *digest, JCR *jcr) } crypto_digest_update(digest, (uint8_t *)buf, n); - jcr->JobBytes += n; - jcr->ReadBytes += n; + + /* Can be used by BaseJobs, update only for Verify jobs */ + if (jcr->getJobLevel() != L_FULL) { + jcr->JobBytes += n; + jcr->ReadBytes += n; + } } if (n < 0) { berrno be;