X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Frestore.c;h=f9e8c5f8cb827b2f3db94c28b0335364fc22919b;hb=5c53840c9a02cefaaa45aee96c02c6f9cdaf3703;hp=a4ee03a8420849e23b46c04e4205a71684f20415;hpb=6a6cba0ab43be4ba5572b408c3c4fb79352a5273;p=bacula%2Fbacula diff --git a/bacula/src/filed/restore.c b/bacula/src/filed/restore.c index a4ee03a842..f9e8c5f8cb 100644 --- a/bacula/src/filed/restore.c +++ b/bacula/src/filed/restore.c @@ -30,8 +30,6 @@ * * Kern Sibbald, November MM * - * Version $Id$ - * */ #include "bacula.h" @@ -120,7 +118,7 @@ static void close_previous_stream(r_ctx &rctx); static bool verify_signature(JCR *jcr, r_ctx &rctx); -int32_t extract_data(JCR *jcr, r_ctx &rctx, POOLMEM *buf, int32_t buflen, +int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, uint64_t *addr, int flags, RESTORE_CIPHER_CTX *cipher_ctx); bool flush_cipher(JCR *jcr, BFILE *bfd, uint64_t *addr, int flags, RESTORE_CIPHER_CTX *cipher_ctx); @@ -367,7 +365,6 @@ void do_restore(JCR *jcr) rctx.extract = true; /* FALLTHROUGH */ case CF_CREATED: /* File created, but there is no content */ - jcr->JobFiles++; rctx.fileAddr = 0; print_ls_output(jcr, attr); @@ -377,7 +374,17 @@ void do_restore(JCR *jcr) if (attr->type == FT_REG && rsrc_len > 0) { rctx.extract = true; } + + /* + * Count the resource forks not as regular files being restored. + */ + if (rsrc_len == 0) { + jcr->JobFiles++; + } + } else { + jcr->JobFiles++; } + if (!rctx.extract) { /* set attributes now because file will not be extracted */ if (jcr->plugin) { @@ -508,82 +515,86 @@ void do_restore(JCR *jcr) rctx.flags |= FO_WIN32DECOMP; /* "decompose" BackupWrite data */ } - if (extract_data(jcr, rctx, sd->msg, sd->msglen, &rctx.fileAddr, + if (extract_data(jcr, &rctx.bfd, sd->msg, sd->msglen, &rctx.fileAddr, rctx.flags, &rctx.cipher_ctx) < 0) { + rctx.extract = false; bclose(&rctx.bfd); continue; } } break; - /* Resource fork stream - only recorded after a file to be restored */ - /* Silently ignore if we cannot write - we already reported that */ + /* + * Resource fork stream - only recorded after a file to be restored + * Silently ignore if we cannot write - we already reported that + */ case STREAM_ENCRYPTED_MACOS_FORK_DATA: case STREAM_MACOS_FORK_DATA: -#ifdef HAVE_DARWIN_OS - rctx.fork_flags = 0; - jcr->ff->flags |= FO_HFSPLUS; + if (have_darwin_os) { + rctx.fork_flags = 0; + jcr->ff->flags |= FO_HFSPLUS; - if (rctx.stream == STREAM_ENCRYPTED_MACOS_FORK_DATA) { - rctx.fork_flags |= FO_ENCRYPT; + if (rctx.stream == STREAM_ENCRYPTED_MACOS_FORK_DATA) { + rctx.fork_flags |= FO_ENCRYPT; - /* Set up a decryption context */ - if (rctx.extract && !rctx.fork_cipher_ctx.cipher) { - if (!rctx.cs) { - Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname); - rctx.extract = false; - bclose(&rctx.bfd); - continue; - } + /* Set up a decryption context */ + if (rctx.extract && !rctx.fork_cipher_ctx.cipher) { + if (!rctx.cs) { + Jmsg1(jcr, M_ERROR, 0, _("Missing encryption session data stream for %s\n"), jcr->last_fname); + rctx.extract = false; + bclose(&rctx.bfd); + continue; + } - if ((rctx.fork_cipher_ctx.cipher = crypto_cipher_new(rctx.cs, false, &rctx.fork_cipher_ctx.block_size)) == NULL) { - Jmsg1(jcr, M_ERROR, 0, _("Failed to initialize decryption context for %s\n"), jcr->last_fname); - free_session(rctx); - rctx.extract = false; - bclose(&rctx.bfd); - continue; + if ((rctx.fork_cipher_ctx.cipher = crypto_cipher_new(rctx.cs, false, &rctx.fork_cipher_ctx.block_size)) == NULL) { + Jmsg1(jcr, M_ERROR, 0, _("Failed to initialize decryption context for %s\n"), jcr->last_fname); + free_session(rctx); + rctx.extract = false; + bclose(&rctx.bfd); + continue; + } } } - } - if (rctx.extract) { - if (rctx.prev_stream != rctx.stream) { - if (bopen_rsrc(&rctx.forkbfd, jcr->last_fname, O_WRONLY | O_TRUNC | O_BINARY, 0) < 0) { - Jmsg(jcr, M_ERROR, 0, _(" Cannot open resource fork for %s.\n"), jcr->last_fname); + if (rctx.extract) { + if (rctx.prev_stream != rctx.stream) { + if (bopen_rsrc(&rctx.forkbfd, jcr->last_fname, O_WRONLY | O_TRUNC | O_BINARY, 0) < 0) { + Jmsg(jcr, M_ERROR, 0, _(" Cannot open resource fork for %s.\n"), jcr->last_fname); + rctx.extract = false; + continue; + } + + rctx.fork_size = rsrc_len; + Dmsg0(130, "Restoring resource fork\n"); + } + + if (extract_data(jcr, &rctx.forkbfd, sd->msg, sd->msglen, &rctx.fork_addr, rctx.fork_flags, + &rctx.fork_cipher_ctx) < 0) { rctx.extract = false; + bclose(&rctx.forkbfd); continue; } - - rctx.fork_size = rsrc_len; - Dmsg0(130, "Restoring resource fork\n"); - } - - if (extract_data(jcr, rctx, sd->msg, sd->msglen, &rctx.fork_addr, rctx.fork_flags, - &rctx.fork_cipher_ctx) < 0) { - bclose(&rctx.forkbfd); - continue; } + } else { + non_support_rsrc++; } -#else - non_support_rsrc++; -#endif break; case STREAM_HFSPLUS_ATTRIBUTES: -#ifdef HAVE_DARWIN_OS - Dmsg0(130, "Restoring Finder Info\n"); - jcr->ff->flags |= FO_HFSPLUS; - if (sd->msglen != 32) { - Jmsg(jcr, M_ERROR, 0, _(" Invalid length of Finder Info (got %d, not 32)\n"), sd->msglen); - continue; - } - if (setattrlist(jcr->last_fname, &attrList, sd->msg, sd->msglen, 0) != 0) { - Jmsg(jcr, M_ERROR, 0, _(" Could not set Finder Info on %s\n"), jcr->last_fname); - continue; + if (have_darwin_os) { + Dmsg0(130, "Restoring Finder Info\n"); + jcr->ff->flags |= FO_HFSPLUS; + if (sd->msglen != 32) { + Jmsg(jcr, M_ERROR, 0, _(" Invalid length of Finder Info (got %d, not 32)\n"), sd->msglen); + continue; + } + if (setattrlist(jcr->last_fname, &attrList, sd->msg, sd->msglen, 0) != 0) { + Jmsg(jcr, M_ERROR, 0, _(" Could not set Finder Info on %s\n"), jcr->last_fname); + continue; + } + } else { + non_support_finfo++; } -#else - non_support_finfo++; -#endif break; case STREAM_UNIX_ACCESS_ACL: @@ -1069,10 +1080,9 @@ bool store_data(JCR *jcr, BFILE *bfd, char *data, const int32_t length, bool win * The flags specify whether to use sparse files or compression. * Return value is the number of bytes written, or -1 on errors. */ -int32_t extract_data(JCR *jcr, r_ctx &rctx, POOLMEM *buf, int32_t buflen, - uint64_t *addr, int flags, RESTORE_CIPHER_CTX *cipher_ctx) +int32_t extract_data(JCR *jcr, BFILE *bfd, POOLMEM *buf, int32_t buflen, + uint64_t *addr, int flags, RESTORE_CIPHER_CTX *cipher_ctx) { - BFILE *bfd = &rctx.bfd; char *wbuf; /* write buffer */ uint32_t wsize; /* write size */ uint32_t rsize; /* read size */ @@ -1172,9 +1182,7 @@ int32_t extract_data(JCR *jcr, r_ctx &rctx, POOLMEM *buf, int32_t buflen, return wsize; bail_out: - rctx.extract = false; return -1; - }