2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
29 * Bacula File Daemon backup.c send file attributes and data
30 * to the Storage daemon.
32 * Kern Sibbald, March MM
42 const bool have_acl = true;
44 const bool have_acl = false;
47 #if defined(HAVE_XATTR)
48 const bool have_xattr = true;
50 const bool have_xattr = false;
53 /* Forward referenced functions */
54 int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
55 static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *signature_digest);
56 bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream);
57 static bool crypto_session_start(JCR *jcr);
58 static void crypto_session_end(JCR *jcr);
59 static bool crypto_session_send(JCR *jcr, BSOCK *sd);
62 * Find all the requested files and send them
63 * to the Storage daemon.
65 * Note, we normally carry on a one-way
66 * conversation from this point on with the SD, simply blasting
67 * data to him. To properly know what is going on, we
68 * also run a "heartbeat" monitor which reads the socket and
69 * reacts accordingly (at the moment it has nothing to do
70 * except echo the heartbeat to the Director).
73 bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
77 // TODO landonf: Allow user to specify encryption algorithm
79 sd = jcr->store_bsock;
81 set_jcr_job_status(jcr, JS_Running);
83 Dmsg1(300, "bfiled: opened data connection %d to stored\n", sd->m_fd);
86 CLIENT *client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
90 buf_size = client->max_network_buffer_size;
92 buf_size = 0; /* use default */
94 if (!sd->set_buffer_size(buf_size, BNET_SETBUF_WRITE)) {
95 set_jcr_job_status(jcr, JS_ErrorTerminated);
96 Jmsg(jcr, M_FATAL, 0, _("Cannot set buffer size FD->SD.\n"));
100 jcr->buf_size = sd->msglen;
101 /* Adjust for compression so that output buffer is
102 * 12 bytes + 0.1% larger than input buffer plus 18 bytes.
103 * This gives a bit extra plus room for the sparse addr if any.
104 * Note, we adjust the read size to be smaller so that the
105 * same output buffer can be used without growing it.
107 * The zlib compression workset is initialized here to minimize
108 * the "per file" load. The jcr member is only set, if the init
111 jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30;
112 jcr->compress_buf = get_memory(jcr->compress_buf_size);
115 z_stream *pZlibStream = (z_stream*)malloc(sizeof(z_stream));
117 pZlibStream->zalloc = Z_NULL;
118 pZlibStream->zfree = Z_NULL;
119 pZlibStream->opaque = Z_NULL;
120 pZlibStream->state = Z_NULL;
122 if (deflateInit(pZlibStream, Z_DEFAULT_COMPRESSION) == Z_OK) {
123 jcr->pZLIB_compress_workset = pZlibStream;
130 if (!crypto_session_start(jcr)) {
134 set_find_options((FF_PKT *)jcr->ff, jcr->incremental, jcr->mtime);
136 /* in accurate mode, we overwrite the find_one check function */
138 set_find_changed_function((FF_PKT *)jcr->ff, accurate_check_file);
141 start_heartbeat_monitor(jcr);
144 jcr->acl_data = get_pool_memory(PM_MESSAGE);
145 jcr->total_acl_errors = 0;
148 jcr->xattr_data = get_pool_memory(PM_MESSAGE);
151 /* Subroutine save_file() is called for each file */
152 if (!find_files(jcr, (FF_PKT *)jcr->ff, save_file, plugin_save)) {
153 ok = false; /* error */
154 set_jcr_job_status(jcr, JS_ErrorTerminated);
157 if (jcr->total_acl_errors > 0) {
158 Jmsg(jcr, M_ERROR, 0, _("Encountered %ld acl errors while doing backup\n"),
159 jcr->total_acl_errors);
162 accurate_send_deleted_list(jcr); /* send deleted list to SD */
164 stop_heartbeat_monitor(jcr);
166 sd->signal(BNET_EOD); /* end of sending data */
168 if (have_acl && jcr->acl_data) {
169 free_pool_memory(jcr->acl_data);
170 jcr->acl_data = NULL;
172 if (have_xattr && jcr->xattr_data) {
173 free_pool_memory(jcr->xattr_data);
174 jcr->xattr_data = NULL;
180 if (jcr->compress_buf) {
181 free_pool_memory(jcr->compress_buf);
182 jcr->compress_buf = NULL;
184 if (jcr->pZLIB_compress_workset) {
185 /* Free the zlib stream */
187 deflateEnd((z_stream *)jcr->pZLIB_compress_workset);
189 free (jcr->pZLIB_compress_workset);
190 jcr->pZLIB_compress_workset = NULL;
192 crypto_session_end(jcr);
195 Dmsg1(100, "end blast_data ok=%d\n", ok);
199 static bool crypto_session_start(JCR *jcr)
201 crypto_cipher_t cipher = CRYPTO_CIPHER_AES_128_CBC;
204 * Create encryption session data and a cached, DER-encoded session data
205 * structure. We use a single session key for each backup, so we'll encode
206 * the session data only once.
208 if (jcr->crypto.pki_encrypt) {
211 /* Create per-job session encryption context */
212 jcr->crypto.pki_session = crypto_session_new(cipher, jcr->crypto.pki_recipients);
214 /* Get the session data size */
215 if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)0, &size)) {
216 Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n"));
220 /* Allocate buffer */
221 jcr->crypto.pki_session_encoded = get_memory(size);
223 /* Encode session data */
224 if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)jcr->crypto.pki_session_encoded, &size)) {
225 Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n"));
229 /* ... and store the encoded size */
230 jcr->crypto.pki_session_encoded_size = size;
232 /* Allocate the encryption/decryption buffer */
233 jcr->crypto.crypto_buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
238 static void crypto_session_end(JCR *jcr)
240 if (jcr->crypto.crypto_buf) {
241 free_pool_memory(jcr->crypto.crypto_buf);
242 jcr->crypto.crypto_buf = NULL;
244 if (jcr->crypto.pki_session) {
245 crypto_session_free(jcr->crypto.pki_session);
247 if (jcr->crypto.pki_session_encoded) {
248 free_pool_memory(jcr->crypto.pki_session_encoded);
249 jcr->crypto.pki_session_encoded = NULL;
253 static bool crypto_session_send(JCR *jcr, BSOCK *sd)
257 /* Send our header */
258 Dmsg2(100, "Send hdr fi=%ld stream=%d\n", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA);
259 sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA);
262 sd->msg = jcr->crypto.pki_session_encoded;
263 sd->msglen = jcr->crypto.pki_session_encoded_size;
264 jcr->JobBytes += sd->msglen;
266 Dmsg1(100, "Send data len=%d\n", sd->msglen);
269 sd->signal(BNET_EOD);
275 * Called here by find() for each file included.
276 * This is a callback. The original is find_files() above.
278 * Send the file and its data to the Storage daemon.
282 * -1 to ignore file/directory (not used here)
284 int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
286 bool do_read = false;
287 int stat, data_stream;
289 DIGEST *digest = NULL;
290 DIGEST *signing_digest = NULL;
291 int digest_stream = STREAM_NONE;
292 SIGNATURE *sig = NULL;
293 bool has_file_data = false;
294 // TODO landonf: Allow the user to specify the digest algorithm
296 crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA256;
298 crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA1;
300 BSOCK *sd = jcr->store_bsock;
302 if (job_canceled(jcr)) {
306 jcr->num_files_examined++; /* bump total file count */
308 switch (ff_pkt->type) {
309 case FT_LNKSAVED: /* Hard linked, file already saved */
310 Dmsg2(130, "FT_LNKSAVED hard link: %s => %s\n", ff_pkt->fname, ff_pkt->link);
313 Dmsg1(130, "FT_REGE saving: %s\n", ff_pkt->fname);
314 has_file_data = true;
317 Dmsg1(130, "FT_REG saving: %s\n", ff_pkt->fname);
318 has_file_data = true;
321 Dmsg2(130, "FT_LNK saving: %s -> %s\n", ff_pkt->fname, ff_pkt->link);
324 jcr->num_files_examined--; /* correct file count */
325 return 1; /* not used */
327 Jmsg(jcr, M_INFO, 1, _(" Recursion turned off. Will not descend from %s into %s\n"),
328 ff_pkt->top_fname, ff_pkt->fname);
329 ff_pkt->type = FT_DIREND; /* Backup only the directory entry */
332 /* Suppress message for /dev filesystems */
333 if (!is_in_fileset(ff_pkt)) {
334 Jmsg(jcr, M_INFO, 1, _(" %s is a different filesystem. Will not descend from %s into %s\n"),
335 ff_pkt->fname, ff_pkt->top_fname, ff_pkt->fname);
337 ff_pkt->type = FT_DIREND; /* Backup only the directory entry */
340 Jmsg(jcr, M_INFO, 1, _(" Disallowed filesystem. Will not descend from %s into %s\n"),
341 ff_pkt->top_fname, ff_pkt->fname);
342 ff_pkt->type = FT_DIREND; /* Backup only the directory entry */
345 Jmsg(jcr, M_INFO, 1, _(" Disallowed drive type. Will not descend into %s\n"),
350 Dmsg1(130, "FT_DIREND: %s\n", ff_pkt->link);
353 Dmsg1(130, "FT_SPEC saving: %s\n", ff_pkt->fname);
354 if (S_ISSOCK(ff_pkt->statp.st_mode)) {
355 Jmsg(jcr, M_SKIPPED, 1, _(" Socket file skipped: %s\n"), ff_pkt->fname);
360 Dmsg1(130, "FT_RAW saving: %s\n", ff_pkt->fname);
361 has_file_data = true;
364 Dmsg1(130, "FT_FIFO saving: %s\n", ff_pkt->fname);
368 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not access \"%s\": ERR=%s\n"), ff_pkt->fname,
369 be.bstrerror(ff_pkt->ff_errno));
375 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not follow link \"%s\": ERR=%s\n"),
376 ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno));
382 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not stat \"%s\": ERR=%s\n"), ff_pkt->fname,
383 be.bstrerror(ff_pkt->ff_errno));
389 Jmsg(jcr, M_SKIPPED, 1, _(" Unchanged file skipped: %s\n"), ff_pkt->fname);
392 Jmsg(jcr, M_NOTSAVED, 0, _(" Archive file not saved: %s\n"), ff_pkt->fname);
396 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not open directory \"%s\": ERR=%s\n"),
397 ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno));
402 Jmsg(jcr, M_NOTSAVED, 0, _(" Unknown file type %d; not saved: %s\n"),
403 ff_pkt->type, ff_pkt->fname);
408 Dmsg1(130, "bfiled: sending %s to stored\n", ff_pkt->fname);
410 /* Digests and encryption are only useful if there's file data */
413 * Setup for digest handling. If this fails, the digest will be set to NULL
414 * and not used. Note, the digest (file hash) can be any one of the four
417 * The signing digest is a single algorithm depending on
418 * whether or not we have SHA2.
419 * ****FIXME**** the signing algoritm should really be
420 * determined a different way!!!!!! What happens if
421 * sha2 was available during backup but not restore?
423 if (ff_pkt->flags & FO_MD5) {
424 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_MD5);
425 digest_stream = STREAM_MD5_DIGEST;
427 } else if (ff_pkt->flags & FO_SHA1) {
428 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA1);
429 digest_stream = STREAM_SHA1_DIGEST;
431 } else if (ff_pkt->flags & FO_SHA256) {
432 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA256);
433 digest_stream = STREAM_SHA256_DIGEST;
435 } else if (ff_pkt->flags & FO_SHA512) {
436 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA512);
437 digest_stream = STREAM_SHA512_DIGEST;
440 /* Did digest initialization fail? */
441 if (digest_stream != STREAM_NONE && digest == NULL) {
442 Jmsg(jcr, M_WARNING, 0, _("%s digest initialization failed\n"),
443 stream_to_ascii(digest_stream));
447 * Set up signature digest handling. If this fails, the signature digest will be set to
450 // TODO landonf: We should really only calculate the digest once, for both verification and signing.
451 if (jcr->crypto.pki_sign) {
452 signing_digest = crypto_digest_new(jcr, signing_algorithm);
454 /* Full-stop if a failure occurred initializing the signature digest */
455 if (signing_digest == NULL) {
456 Jmsg(jcr, M_NOTSAVED, 0, _("%s signature digest initialization failed\n"),
457 stream_to_ascii(signing_algorithm));
463 /* Enable encryption */
464 if (jcr->crypto.pki_encrypt) {
465 ff_pkt->flags |= FO_ENCRYPT;
469 /* Initialize the file descriptor we use for data and other streams. */
471 if (ff_pkt->flags & FO_PORTABLE) {
472 set_portable_backup(&ff_pkt->bfd); /* disable Win32 BackupRead() */
474 if (ff_pkt->cmd_plugin) {
475 if (!set_cmd_plugin(&ff_pkt->bfd, jcr)) {
478 send_plugin_name(jcr, sd, true); /* signal start of plugin data */
481 /* Send attributes -- must be done after binit() */
482 if (!encode_and_send_attributes(jcr, ff_pkt, data_stream)) {
486 /* Set up the encryption context and send the session data to the SD */
487 if (has_file_data && jcr->crypto.pki_encrypt) {
488 if (!crypto_session_send(jcr, sd)) {
494 * Open any file with data that we intend to save, then save it.
496 * Note, if is_win32_backup, we must open the Directory so that
497 * the BackupRead will save its permissions and ownership streams.
499 if (ff_pkt->type != FT_LNKSAVED && S_ISREG(ff_pkt->statp.st_mode)) {
501 do_read = !is_portable_backup(&ff_pkt->bfd) || ff_pkt->statp.st_size > 0;
503 do_read = ff_pkt->statp.st_size > 0;
505 } else if (ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO ||
506 ff_pkt->type == FT_REPARSE ||
507 (!is_portable_backup(&ff_pkt->bfd) && ff_pkt->type == FT_DIREND)) {
510 if (ff_pkt->cmd_plugin) {
514 Dmsg1(400, "do_read=%d\n", do_read);
518 if (ff_pkt->type == FT_FIFO) {
519 tid = start_thread_timer(jcr, pthread_self(), 60);
523 int noatime = ff_pkt->flags & FO_NOATIME ? O_NOATIME : 0;
524 ff_pkt->bfd.reparse_point = ff_pkt->type == FT_REPARSE;
525 if (bopen(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY | noatime, 0) < 0) {
526 ff_pkt->ff_errno = errno;
528 Jmsg(jcr, M_NOTSAVED, 0, _(" Cannot open \"%s\": ERR=%s.\n"), ff_pkt->fname,
532 stop_thread_timer(tid);
538 stop_thread_timer(tid);
542 stat = send_data(jcr, data_stream, ff_pkt, digest, signing_digest);
544 if (ff_pkt->flags & FO_CHKCHANGES) {
545 has_file_changed(jcr, ff_pkt);
548 bclose(&ff_pkt->bfd);
555 #ifdef HAVE_DARWIN_OS
556 /* Regular files can have resource forks and Finder Info */
557 if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) &&
558 ff_pkt->flags & FO_HFSPLUS)) {
559 if (ff_pkt->hfsinfo.rsrclength > 0) {
562 if (!bopen_rsrc(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) {
563 ff_pkt->ff_errno = errno;
565 Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open resource fork for \"%s\": ERR=%s.\n"),
566 ff_pkt->fname, be.bstrerror());
568 if (is_bopen(&ff_pkt->bfd)) {
569 bclose(&ff_pkt->bfd);
573 flags = ff_pkt->flags;
574 ff_pkt->flags &= ~(FO_GZIP|FO_SPARSE);
575 if (flags & FO_ENCRYPT) {
576 rsrc_stream = STREAM_ENCRYPTED_MACOS_FORK_DATA;
578 rsrc_stream = STREAM_MACOS_FORK_DATA;
580 stat = send_data(jcr, rsrc_stream, ff_pkt, digest, signing_digest);
581 ff_pkt->flags = flags;
582 bclose(&ff_pkt->bfd);
588 Dmsg1(300, "Saving Finder Info for \"%s\"\n", ff_pkt->fname);
589 sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_HFSPLUS_ATTRIBUTES);
590 Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
591 pm_memcpy(sd->msg, ff_pkt->hfsinfo.fndrinfo, 32);
594 crypto_digest_update(digest, (uint8_t *)sd->msg, sd->msglen);
596 if (signing_digest) {
597 crypto_digest_update(signing_digest, (uint8_t *)sd->msg, sd->msglen);
600 sd->signal(BNET_EOD);
605 * Save ACLs when requested and available for anything not being a symlink and not being a plugin.
608 if (ff_pkt->flags & FO_ACL && ff_pkt->type != FT_LNK && !ff_pkt->cmd_plugin) {
609 switch (build_acl_streams(jcr, ff_pkt))
610 case bsub_exit_fatal:
614 * Non-fatal errors, count them and when the number is under ACL_REPORT_ERR_MAX_PER_JOB
615 * print the error message set by the lower level routine in jcr->errmsg.
617 if (jcr->total_acl_errors < ACL_REPORT_ERR_MAX_PER_JOB) {
618 Jmsg(jcr, M_ERROR, 0, "%s", jcr->errmsg);
620 jcr->total_acl_errors++;
629 * Save Extended Attributes when requested and available for all files not being a plugin.
632 if (ff_pkt->flags & FO_XATTR && !ff_pkt->cmd_plugin) {
633 if (build_xattr_streams(jcr, ff_pkt) == bsub_exit_fatal)
638 /* Terminate the signing digest and send it to the Storage daemon */
639 if (signing_digest) {
642 if ((sig = crypto_sign_new(jcr)) == NULL) {
643 Jmsg(jcr, M_FATAL, 0, _("Failed to allocate memory for crypto signature.\n"));
647 if (!crypto_sign_add_signer(sig, signing_digest, jcr->crypto.pki_keypair)) {
648 Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
652 /* Get signature size */
653 if (!crypto_sign_encode(sig, NULL, &size)) {
654 Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
658 /* Grow the bsock buffer to fit our message if necessary */
659 if (sizeof_pool_memory(sd->msg) < (int32_t)size) {
660 sd->msg = realloc_pool_memory(sd->msg, size);
663 /* Send our header */
664 sd->fsend("%ld %ld 0", jcr->JobFiles, STREAM_SIGNED_DIGEST);
665 Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
667 /* Encode signature data */
668 if (!crypto_sign_encode(sig, (uint8_t *)sd->msg, &size)) {
669 Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
675 sd->signal(BNET_EOD); /* end of checksum */
678 /* Terminate any digest and send it to Storage daemon */
682 sd->fsend("%ld %d 0", jcr->JobFiles, digest_stream);
683 Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
685 size = CRYPTO_DIGEST_MAX_SIZE;
687 /* Grow the bsock buffer to fit our message if necessary */
688 if (sizeof_pool_memory(sd->msg) < (int32_t)size) {
689 sd->msg = realloc_pool_memory(sd->msg, size);
692 if (!crypto_digest_finalize(digest, (uint8_t *)sd->msg, &size)) {
693 Jmsg(jcr, M_FATAL, 0, _("An error occurred finalizing signing the stream.\n"));
699 sd->signal(BNET_EOD); /* end of checksum */
701 if (ff_pkt->cmd_plugin) {
702 send_plugin_name(jcr, sd, false); /* signal end of plugin data */
706 rtnstat = 1; /* good return */
710 crypto_digest_free(digest);
712 if (signing_digest) {
713 crypto_digest_free(signing_digest);
716 crypto_sign_free(sig);
722 * Send data read from an already open file descriptor.
724 * We return 1 on sucess and 0 on errors.
727 * We use ff_pkt->statp.st_size when FO_SPARSE to know when to stop
729 * Currently this is not a problem as the only other stream, resource forks,
730 * are not handled as sparse files.
732 static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest,
733 DIGEST *signing_digest)
735 BSOCK *sd = jcr->store_bsock;
736 uint64_t fileAddr = 0; /* file address */
738 int32_t rsize = jcr->buf_size; /* read buffer size */
740 CIPHER_CONTEXT *cipher_ctx = NULL; /* Quell bogus uninitialized warnings */
741 const uint8_t *cipher_input;
742 uint32_t cipher_input_len;
743 uint32_t cipher_block_size;
744 uint32_t encrypted_len;
745 #ifdef FD_NO_SEND_TEST
750 rbuf = sd->msg; /* read buffer */
751 wbuf = sd->msg; /* write buffer */
752 cipher_input = (uint8_t *)rbuf; /* encrypt uncompressed data */
754 Dmsg1(300, "Saving data, type=%d\n", ff_pkt->type);
757 uLong compress_len = 0;
758 uLong max_compress_len = 0;
759 const Bytef *cbuf = NULL;
762 if (ff_pkt->flags & FO_GZIP) {
763 if (ff_pkt->flags & FO_SPARSE) {
764 cbuf = (Bytef *)jcr->compress_buf + SPARSE_FADDR_SIZE;
765 max_compress_len = jcr->compress_buf_size - SPARSE_FADDR_SIZE;
767 cbuf = (Bytef *)jcr->compress_buf;
768 max_compress_len = jcr->compress_buf_size; /* set max length */
770 wbuf = jcr->compress_buf; /* compressed output here */
771 cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */
774 * Only change zlib parameters if there is no pending operation.
775 * This should never happen as deflatereset is called after each
779 if (((z_stream*)jcr->pZLIB_compress_workset)->total_in == 0) {
780 /* set gzip compression level - must be done per file */
781 if ((zstat=deflateParams((z_stream*)jcr->pZLIB_compress_workset,
782 ff_pkt->GZIP_level, Z_DEFAULT_STRATEGY)) != Z_OK) {
783 Jmsg(jcr, M_FATAL, 0, _("Compression deflateParams error: %d\n"), zstat);
784 set_jcr_job_status(jcr, JS_ErrorTerminated);
790 const uint32_t max_compress_len = 0;
793 if (ff_pkt->flags & FO_ENCRYPT) {
794 if (ff_pkt->flags & FO_SPARSE) {
795 Jmsg0(jcr, M_FATAL, 0, _("Encrypting sparse data not supported.\n"));
798 /* Allocate the cipher context */
799 if ((cipher_ctx = crypto_cipher_new(jcr->crypto.pki_session, true,
800 &cipher_block_size)) == NULL) {
801 /* Shouldn't happen! */
802 Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context.\n"));
807 * Grow the crypto buffer, if necessary.
808 * crypto_cipher_update() will buffer up to (cipher_block_size - 1).
809 * We grow crypto_buf to the maximum number of blocks that
810 * could be returned for the given read buffer size.
811 * (Using the larger of either rsize or max_compress_len)
813 jcr->crypto.crypto_buf = check_pool_memory_size(jcr->crypto.crypto_buf,
814 (MAX(rsize + (int)sizeof(uint32_t), (int32_t)max_compress_len) +
815 cipher_block_size - 1) / cipher_block_size * cipher_block_size);
817 wbuf = jcr->crypto.crypto_buf; /* Encrypted, possibly compressed output here. */
821 * Send Data header to Storage daemon
822 * <file-index> <stream> <info>
824 if (!sd->fsend("%ld %d 0", jcr->JobFiles, stream)) {
825 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
829 Dmsg1(300, ">stored: datahdr %s\n", sd->msg);
832 * Make space at beginning of buffer for fileAddr because this
833 * same buffer will be used for writing if compression is off.
835 if (ff_pkt->flags & FO_SPARSE) {
836 rbuf += SPARSE_FADDR_SIZE;
837 rsize -= SPARSE_FADDR_SIZE;
838 #ifdef HAVE_FREEBSD_OS
840 * To read FreeBSD partitions, the read size must be
843 rsize = (rsize/512) * 512;
847 /* a RAW device read on win32 only works if the buffer is a multiple of 512 */
849 if (S_ISBLK(ff_pkt->statp.st_mode))
850 rsize = (rsize/512) * 512;
856 while ((sd->msglen=(uint32_t)bread(&ff_pkt->bfd, rbuf, rsize)) > 0) {
858 /* Check for sparse blocks */
859 if (ff_pkt->flags & FO_SPARSE) {
861 bool allZeros = false;
862 if ((sd->msglen == rsize &&
863 fileAddr+sd->msglen < (uint64_t)ff_pkt->statp.st_size) ||
864 ((ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO) &&
865 (uint64_t)ff_pkt->statp.st_size == 0)) {
866 allZeros = is_buf_zero(rbuf, rsize);
869 /* Put file address as first data in buffer */
870 ser_begin(wbuf, SPARSE_FADDR_SIZE);
871 ser_uint64(fileAddr); /* store fileAddr in begin of buffer */
873 fileAddr += sd->msglen; /* update file address */
874 /* Skip block of all zeros */
876 continue; /* skip block of zeros */
880 jcr->ReadBytes += sd->msglen; /* count bytes read */
882 /* Uncompressed cipher input length */
883 cipher_input_len = sd->msglen;
885 /* Update checksum if requested */
887 crypto_digest_update(digest, (uint8_t *)rbuf, sd->msglen);
890 /* Update signing digest if requested */
891 if (signing_digest) {
892 crypto_digest_update(signing_digest, (uint8_t *)rbuf, sd->msglen);
896 /* Do compression if turned on */
897 if (ff_pkt->flags & FO_GZIP && jcr->pZLIB_compress_workset) {
898 Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", cbuf, rbuf, sd->msglen);
900 ((z_stream*)jcr->pZLIB_compress_workset)->next_in = (Bytef *)rbuf;
901 ((z_stream*)jcr->pZLIB_compress_workset)->avail_in = sd->msglen;
902 ((z_stream*)jcr->pZLIB_compress_workset)->next_out = (Bytef *)cbuf;
903 ((z_stream*)jcr->pZLIB_compress_workset)->avail_out = max_compress_len;
905 if ((zstat=deflate((z_stream*)jcr->pZLIB_compress_workset, Z_FINISH)) != Z_STREAM_END) {
906 Jmsg(jcr, M_FATAL, 0, _("Compression deflate error: %d\n"), zstat);
907 set_jcr_job_status(jcr, JS_ErrorTerminated);
910 compress_len = ((z_stream*)jcr->pZLIB_compress_workset)->total_out;
911 /* reset zlib stream to be able to begin from scratch again */
912 if ((zstat=deflateReset((z_stream*)jcr->pZLIB_compress_workset)) != Z_OK) {
913 Jmsg(jcr, M_FATAL, 0, _("Compression deflateReset error: %d\n"), zstat);
914 set_jcr_job_status(jcr, JS_ErrorTerminated);
918 Dmsg2(400, "compressed len=%d uncompressed len=%d\n", compress_len,
921 sd->msglen = compress_len; /* set compressed length */
922 cipher_input_len = compress_len;
926 * Note, here we prepend the current record length to the beginning
927 * of the encrypted data. This is because both sparse and compression
928 * restore handling want records returned to them with exactly the
929 * same number of bytes that were processed in the backup handling.
930 * That is, both are block filters rather than a stream. When doing
931 * compression, the compression routines may buffer data, so that for
932 * any one record compressed, when it is decompressed the same size
933 * will not be obtained. Of course, the buffered data eventually comes
934 * out in subsequent crypto_cipher_update() calls or at least
935 * when crypto_cipher_finalize() is called. Unfortunately, this
936 * "feature" of encryption enormously complicates the restore code.
938 if (ff_pkt->flags & FO_ENCRYPT) {
939 uint32_t initial_len = 0;
942 if (ff_pkt->flags & FO_SPARSE) {
943 cipher_input_len += SPARSE_FADDR_SIZE;
946 /* Encrypt the length of the input block */
947 uint8_t packet_len[sizeof(uint32_t)];
949 ser_begin(packet_len, sizeof(uint32_t));
950 ser_uint32(cipher_input_len); /* store data len in begin of buffer */
951 Dmsg1(20, "Encrypt len=%d\n", cipher_input_len);
953 if (!crypto_cipher_update(cipher_ctx, packet_len, sizeof(packet_len),
954 (uint8_t *)jcr->crypto.crypto_buf, &initial_len)) {
955 /* Encryption failed. Shouldn't happen. */
956 Jmsg(jcr, M_FATAL, 0, _("Encryption error\n"));
960 /* Encrypt the input block */
961 if (crypto_cipher_update(cipher_ctx, cipher_input, cipher_input_len,
962 (uint8_t *)&jcr->crypto.crypto_buf[initial_len], &encrypted_len)) {
963 if ((initial_len + encrypted_len) == 0) {
964 /* No full block of data available, read more data */
967 Dmsg2(400, "encrypted len=%d unencrypted len=%d\n", encrypted_len,
969 sd->msglen = initial_len + encrypted_len; /* set encrypted length */
971 /* Encryption failed. Shouldn't happen. */
972 Jmsg(jcr, M_FATAL, 0, _("Encryption error\n"));
977 /* Send the buffer to the Storage daemon */
978 if (ff_pkt->flags & FO_SPARSE) {
979 sd->msglen += SPARSE_FADDR_SIZE; /* include fileAddr in size */
981 sd->msg = wbuf; /* set correct write buffer */
983 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
987 Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
989 jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */
990 sd->msg = msgsave; /* restore read buffer */
992 } /* end while read file data */
994 if (sd->msglen < 0) { /* error */
996 Jmsg(jcr, M_ERROR, 0, _("Read error on file %s. ERR=%s\n"),
997 ff_pkt->fname, be.bstrerror(ff_pkt->bfd.berrno));
998 if (jcr->JobErrors++ > 1000) { /* insanity check */
999 Jmsg(jcr, M_FATAL, 0, _("Too many errors.\n"));
1001 } else if (ff_pkt->flags & FO_ENCRYPT) {
1003 * For encryption, we must call finalize to push out any
1006 if (!crypto_cipher_finalize(cipher_ctx, (uint8_t *)jcr->crypto.crypto_buf,
1008 /* Padding failed. Shouldn't happen. */
1009 Jmsg(jcr, M_FATAL, 0, _("Encryption padding error\n"));
1013 /* Note, on SSL pre-0.9.7, there is always some output */
1014 if (encrypted_len > 0) {
1015 sd->msglen = encrypted_len; /* set encrypted length */
1016 sd->msg = jcr->crypto.crypto_buf; /* set correct write buffer */
1018 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1022 Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
1023 jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */
1024 sd->msg = msgsave; /* restore bnet buffer */
1028 if (!sd->signal(BNET_EOD)) { /* indicate end of file data */
1029 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1034 /* Free the cipher context */
1036 crypto_cipher_free(cipher_ctx);
1041 /* Free the cipher context */
1043 crypto_cipher_free(cipher_ctx);
1046 sd->msg = msgsave; /* restore bnet buffer */
1051 bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream)
1053 BSOCK *sd = jcr->store_bsock;
1054 char attribs[MAXSTRING];
1055 char attribsEx[MAXSTRING];
1058 #ifdef FD_NO_SEND_TEST
1062 Dmsg1(300, "encode_and_send_attrs fname=%s\n", ff_pkt->fname);
1063 /* Find what data stream we will use, then encode the attributes */
1064 if ((data_stream = select_data_stream(ff_pkt)) == STREAM_NONE) {
1065 /* This should not happen */
1066 Jmsg0(jcr, M_FATAL, 0, _("Invalid file flags, no supported data stream type.\n"));
1069 encode_stat(attribs, &ff_pkt->statp, ff_pkt->LinkFI, data_stream);
1071 /* Now possibly extend the attributes */
1072 attr_stream = encode_attribsEx(jcr, attribsEx, ff_pkt);
1074 Dmsg3(300, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx);
1077 jcr->JobFiles++; /* increment number of files sent */
1078 ff_pkt->FileIndex = jcr->JobFiles; /* return FileIndex */
1079 pm_strcpy(jcr->last_fname, ff_pkt->fname);
1083 * Send Attributes header to Storage daemon
1084 * <file-index> <stream> <info>
1086 if (!sd->fsend("%ld %d 0", jcr->JobFiles, attr_stream)) {
1087 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1091 Dmsg1(300, ">stored: attrhdr %s\n", sd->msg);
1094 * Send file attributes to Storage daemon
1097 * Filename (full path)
1098 * Encoded attributes
1099 * Link name (if type==FT_LNK or FT_LNKSAVED)
1100 * Encoded extended-attributes (for Win32)
1102 * For a directory, link is the same as fname, but with trailing
1103 * slash. For a linked file, link is the link.
1105 if (ff_pkt->type != FT_DELETED) { /* already stripped */
1108 if (ff_pkt->type == FT_LNK || ff_pkt->type == FT_LNKSAVED) {
1109 Dmsg2(300, "Link %s to %s\n", ff_pkt->fname, ff_pkt->link);
1110 stat = sd->fsend("%ld %d %s%c%s%c%s%c%s%c", jcr->JobFiles,
1111 ff_pkt->type, ff_pkt->fname, 0, attribs, 0, ff_pkt->link, 0,
1113 } else if (ff_pkt->type == FT_DIREND || ff_pkt->type == FT_REPARSE) {
1114 /* Here link is the canonical filename (i.e. with trailing slash) */
1115 stat = sd->fsend("%ld %d %s%c%s%c%c%s%c", jcr->JobFiles,
1116 ff_pkt->type, ff_pkt->link, 0, attribs, 0, 0, attribsEx, 0);
1118 stat = sd->fsend("%ld %d %s%c%s%c%c%s%c", jcr->JobFiles,
1119 ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, attribsEx, 0);
1121 if (ff_pkt->type != FT_DELETED) {
1122 unstrip_path(ff_pkt);
1125 Dmsg2(300, ">stored: attr len=%d: %s\n", sd->msglen, sd->msg);
1127 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1131 sd->signal(BNET_EOD); /* indicate end of attributes data */
1136 * Do in place strip of path
1138 static bool do_strip(int count, char *in)
1144 /* Copy to first path separator -- Win32 might have c: ... */
1145 while (*in && !IsPathSeparator(*in)) {
1149 numsep++; /* one separator seen */
1150 for (stripped=0; stripped<count && *in; stripped++) {
1151 while (*in && !IsPathSeparator(*in)) {
1152 in++; /* skip chars */
1155 numsep++; /* count separators seen */
1156 in++; /* skip separator */
1160 while (*in) { /* copy to end */
1161 if (IsPathSeparator(*in)) {
1167 Dmsg4(500, "stripped=%d count=%d numsep=%d sep>count=%d\n",
1168 stripped, count, numsep, numsep>count);
1169 return stripped==count && numsep>count;
1173 * If requested strip leading components of the path so that we can
1174 * save file as if it came from a subdirectory. This is most useful
1175 * for dealing with snapshots, by removing the snapshot directory, or
1176 * in handling vendor migrations where files have been restored with
1177 * a vendor product into a subdirectory.
1179 void strip_path(FF_PKT *ff_pkt)
1181 if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) {
1182 Dmsg1(200, "No strip for %s\n", ff_pkt->fname);
1185 if (!ff_pkt->fname_save) {
1186 ff_pkt->fname_save = get_pool_memory(PM_FNAME);
1187 ff_pkt->link_save = get_pool_memory(PM_FNAME);
1189 pm_strcpy(ff_pkt->fname_save, ff_pkt->fname);
1190 if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) {
1191 pm_strcpy(ff_pkt->link_save, ff_pkt->link);
1192 Dmsg2(500, "strcpy link_save=%d link=%d\n", strlen(ff_pkt->link_save),
1193 strlen(ff_pkt->link));
1194 sm_check(__FILE__, __LINE__, true);
1198 * Strip path. If it doesn't succeed put it back. If
1199 * it does, and there is a different link string,
1200 * attempt to strip the link. If it fails, back them
1202 * Do not strip symlinks.
1203 * I.e. if either stripping fails don't strip anything.
1205 if (!do_strip(ff_pkt->strip_path, ff_pkt->fname)) {
1206 unstrip_path(ff_pkt);
1209 /* Strip links but not symlinks */
1210 if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) {
1211 if (!do_strip(ff_pkt->strip_path, ff_pkt->link)) {
1212 unstrip_path(ff_pkt);
1217 Dmsg3(100, "fname=%s stripped=%s link=%s\n", ff_pkt->fname_save, ff_pkt->fname,
1221 void unstrip_path(FF_PKT *ff_pkt)
1223 if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) {
1226 strcpy(ff_pkt->fname, ff_pkt->fname_save);
1227 if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) {
1228 Dmsg2(500, "strcpy link=%s link_save=%s\n", ff_pkt->link,
1230 strcpy(ff_pkt->link, ff_pkt->link_save);
1231 Dmsg2(500, "strcpy link=%d link_save=%d\n", strlen(ff_pkt->link),
1232 strlen(ff_pkt->link_save));
1233 sm_check(__FILE__, __LINE__, true);