2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2008 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 John Walker.
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
40 #include "lib/htable.h"
42 /* Forward referenced functions */
43 int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level);
44 static void strip_path(FF_PKT *ff_pkt);
45 static void unstrip_path(FF_PKT *ff_pkt);
46 static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *signature_digest);
47 static bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream);
48 static bool read_and_send_acl(JCR *jcr, int acltype, int stream);
49 static bool crypto_session_start(JCR *jcr);
50 static void crypto_session_end(JCR *jcr);
51 static bool crypto_session_send(JCR *jcr, BSOCK *sd);
53 typedef struct CurFile {
60 #define accurate_mark_file_as_seen(elt) ((elt)->seen = 1)
61 #define accurate_file_has_been_seen(elt) ((elt)->seen)
64 * This function is called for each file seen in fileset.
65 * We check in file_list hash if fname have been backuped
66 * the last time. After we can compare Lstat field.
69 /* TODO: tweak verify code to use the same function ?? */
70 bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
74 struct stat statc; /* catalog stat */
81 if (*ff_pkt->VerifyOpts) { /* use mtime + ctime checks by default */
82 Opts_Digest = ff_pkt->VerifyOpts;
87 if (jcr->accurate == false || jcr->JobLevel == L_FULL) {
93 if (S_ISDIR(ff_pkt->statp.st_mode)) {
96 fname = ff_pkt->fname;
99 elt = (CurFile *) jcr->file_list->lookup(fname);
102 Dmsg1(500, "accurate %s = yes (not found)\n", fname);
107 if (accurate_file_has_been_seen(elt)) {
108 Dmsg1(500, "accurate %s = no (already seen)\n", fname);
113 decode_stat(elt->lstat, &statc, &LinkFIc); /* decode catalog stat */
114 // *do_Digest = CRYPTO_DIGEST_NONE;
116 for (p=Opts_Digest; *p; p++) {
117 char ed1[30], ed2[30];
119 case 'i': /* compare INODEs */
120 if (statc.st_ino != ff_pkt->statp.st_ino) {
121 Jmsg(jcr, M_SAVED, 0, _("%s st_ino differ. Cat: %s File: %s\n"), fname,
122 edit_uint64((uint64_t)statc.st_ino, ed1),
123 edit_uint64((uint64_t)ff_pkt->statp.st_ino, ed2));
127 case 'p': /* permissions bits */
128 if (statc.st_mode != ff_pkt->statp.st_mode) {
129 Jmsg(jcr, M_SAVED, 0, _("%s st_mode differ. Cat: %x File: %x\n"), fname,
130 (uint32_t)statc.st_mode, (uint32_t)ff_pkt->statp.st_mode);
134 // case 'n': /* number of links */
135 // if (statc.st_nlink != ff_pkt->statp.st_nlink) {
136 // Jmsg(jcr, M_SAVED, 0, _("%s st_nlink differ. Cat: %d File: %d\n"), fname,
137 // (uint32_t)statc.st_nlink, (uint32_t)ff_pkt->statp.st_nlink);
141 case 'u': /* user id */
142 if (statc.st_uid != ff_pkt->statp.st_uid) {
143 Jmsg(jcr, M_SAVED, 0, _("%s st_uid differ. Cat: %u File: %u\n"), fname,
144 (uint32_t)statc.st_uid, (uint32_t)ff_pkt->statp.st_uid);
148 case 'g': /* group id */
149 if (statc.st_gid != ff_pkt->statp.st_gid) {
150 Jmsg(jcr, M_SAVED, 0, _("%s st_gid differ. Cat: %u File: %u\n"), fname,
151 (uint32_t)statc.st_gid, (uint32_t)ff_pkt->statp.st_gid);
156 if (statc.st_size != ff_pkt->statp.st_size) {
157 Jmsg(jcr, M_SAVED, 0, _("%s st_size differ. Cat: %s File: %s\n"), fname,
158 edit_uint64((uint64_t)statc.st_size, ed1),
159 edit_uint64((uint64_t)ff_pkt->statp.st_size, ed2));
163 // case 'a': /* access time */
164 // if (statc.st_atime != ff_pkt->statp.st_atime) {
165 // Jmsg(jcr, M_SAVED, 0, _("%s st_atime differs\n"), fname);
170 if (statc.st_mtime != ff_pkt->statp.st_mtime) {
171 Jmsg(jcr, M_SAVED, 0, _("%s st_mtime differs\n"), fname);
175 case 'c': /* ctime */
176 if (statc.st_ctime != ff_pkt->statp.st_ctime) {
177 Jmsg(jcr, M_SAVED, 0, _("%s st_ctime differs\n"), fname);
181 case 'd': /* file size decrease */
182 if (statc.st_size > ff_pkt->statp.st_size) {
183 Jmsg(jcr, M_SAVED, 0, _("%s st_size decrease. Cat: %s File: %s\n"), fname,
184 edit_uint64((uint64_t)statc.st_size, ed1),
185 edit_uint64((uint64_t)ff_pkt->statp.st_size, ed2));
189 case '5': /* compare MD5 */
190 Dmsg1(500, "set Do_MD5 for %s\n", ff_pkt->fname);
191 // *do_Digest = CRYPTO_DIGEST_MD5;
193 case '1': /* compare SHA1 */
194 // *do_Digest = CRYPTO_DIGEST_SHA1;
202 accurate_mark_file_as_seen(elt);
203 Dmsg2(500, "accurate %s = %i\n", fname, stat);
206 unstrip_path(ff_pkt);
211 * This function doesn't work very well with smartalloc
212 * TODO: use bigbuffer from htable
214 int accurate_cmd(JCR *jcr)
216 BSOCK *dir = jcr->dir_bsock;
221 if (jcr->accurate==false || job_canceled(jcr) || jcr->JobLevel==L_FULL) {
225 if (sscanf(dir->msg, "accurate files=%ld", &nb) != 1) {
226 dir->fsend(_("2991 Bad accurate command\n"));
230 jcr->file_list = (htable *)malloc(sizeof(htable));
231 jcr->file_list->init(elt, &elt->link, nb);
234 * buffer = sizeof(CurFile) + dirmsg
235 * dirmsg = fname + lstat
237 /* get current files */
238 while (dir->recv() >= 0) {
239 len = strlen(dir->msg);
240 if ((len+1) < dir->msglen) {
241 // elt = (CurFile *)malloc(sizeof(CurFile));
242 // elt->fname = (char *) malloc(dir->msglen+1);
244 /* we store CurFile, fname and lstat in the same chunk */
245 elt = (CurFile *)malloc(sizeof(CurFile)+dir->msglen+1);
246 elt->fname = (char *) elt+sizeof(CurFile);
247 memcpy(elt->fname, dir->msg, dir->msglen);
248 elt->fname[dir->msglen]='\0';
249 elt->lstat = elt->fname + len + 1;
251 jcr->file_list->insert(elt->fname, elt);
252 Dmsg2(500, "add fname=%s lstat=%s\n", elt->fname, elt->lstat);
256 // jcr->file_list->stats();
257 /* TODO: send a EOM ?
258 * dir->fsend("2000 OK accurate\n");
263 bool accurate_send_deleted_list(JCR *jcr)
268 int stream = STREAM_UNIX_ATTRIBUTES;
270 if (jcr->accurate == false || jcr->JobLevel == L_FULL) {
274 if (jcr->file_list == NULL) {
278 ff_pkt = init_find_files();
279 ff_pkt->type = FT_DELETED;
281 foreach_htable (elt, jcr->file_list) {
282 if (!accurate_file_has_been_seen(elt)) { /* already seen */
283 Dmsg3(500, "deleted fname=%s lstat=%s seen=%i\n", elt->fname, elt->lstat, elt->seen);
284 ff_pkt->fname = elt->fname;
285 decode_stat(elt->lstat, &ff_pkt->statp, &ff_pkt->LinkFI); /* decode catalog stat */
286 encode_and_send_attributes(jcr, ff_pkt, stream);
290 term_find_files(ff_pkt);
292 /* TODO: clean htable when this function is not reached ? */
293 if (jcr->file_list) {
294 jcr->file_list->destroy();
295 free(jcr->file_list);
296 jcr->file_list = NULL;
302 * Find all the requested files and send them
303 * to the Storage daemon.
305 * Note, we normally carry on a one-way
306 * conversation from this point on with the SD, simply blasting
307 * data to him. To properly know what is going on, we
308 * also run a "heartbeat" monitor which reads the socket and
309 * reacts accordingly (at the moment it has nothing to do
310 * except echo the heartbeat to the Director).
313 bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
317 // TODO landonf: Allow user to specify encryption algorithm
319 sd = jcr->store_bsock;
321 set_jcr_job_status(jcr, JS_Running);
323 Dmsg1(300, "bfiled: opened data connection %d to stored\n", sd->m_fd);
326 CLIENT *client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
330 buf_size = client->max_network_buffer_size;
332 buf_size = 0; /* use default */
334 if (!bnet_set_buffer_size(sd, buf_size, BNET_SETBUF_WRITE)) {
335 set_jcr_job_status(jcr, JS_ErrorTerminated);
336 Jmsg(jcr, M_FATAL, 0, _("Cannot set buffer size FD->SD.\n"));
340 jcr->buf_size = sd->msglen;
341 /* Adjust for compression so that output buffer is
342 * 12 bytes + 0.1% larger than input buffer plus 18 bytes.
343 * This gives a bit extra plus room for the sparse addr if any.
344 * Note, we adjust the read size to be smaller so that the
345 * same output buffer can be used without growing it.
347 * The zlib compression workset is initialized here to minimise
348 * the "per file" load. The jcr member is only set, if the init was successful.
350 jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30;
351 jcr->compress_buf = get_memory(jcr->compress_buf_size);
354 z_stream *pZlibStream = (z_stream*)malloc(sizeof(z_stream));
356 pZlibStream->zalloc = Z_NULL;
357 pZlibStream->zfree = Z_NULL;
358 pZlibStream->opaque = Z_NULL;
359 pZlibStream->state = Z_NULL;
361 if (deflateInit(pZlibStream, Z_DEFAULT_COMPRESSION) == Z_OK) {
362 jcr->pZLIB_compress_workset = pZlibStream;
369 if (!crypto_session_start(jcr)) {
373 set_find_options((FF_PKT *)jcr->ff, jcr->incremental, jcr->mtime);
375 /* in accurate mode, we overwrite the find_one check function */
377 set_find_changed_function((FF_PKT *)jcr->ff, accurate_check_file);
380 start_heartbeat_monitor(jcr);
382 jcr->acl_text = get_pool_memory(PM_MESSAGE);
384 /* Subroutine save_file() is called for each file */
385 if (!find_files(jcr, (FF_PKT *)jcr->ff, save_file, plugin_save)) {
386 ok = false; /* error */
387 set_jcr_job_status(jcr, JS_ErrorTerminated);
390 accurate_send_deleted_list(jcr); /* send deleted list to SD */
392 free_pool_memory(jcr->acl_text);
394 stop_heartbeat_monitor(jcr);
396 sd->signal(BNET_EOD); /* end of sending data */
402 if (jcr->compress_buf) {
403 free_pool_memory(jcr->compress_buf);
404 jcr->compress_buf = NULL;
406 if (jcr->pZLIB_compress_workset) {
407 /* Free the zlib stream */
409 deflateEnd((z_stream *)jcr->pZLIB_compress_workset);
411 free (jcr->pZLIB_compress_workset);
412 jcr->pZLIB_compress_workset = NULL;
414 crypto_session_end(jcr);
417 Dmsg1(100, "end blast_data ok=%d\n", ok);
421 static bool crypto_session_start(JCR *jcr)
423 crypto_cipher_t cipher = CRYPTO_CIPHER_AES_128_CBC;
426 * Create encryption session data and a cached, DER-encoded session data
427 * structure. We use a single session key for each backup, so we'll encode
428 * the session data only once.
430 if (jcr->crypto.pki_encrypt) {
433 /* Create per-job session encryption context */
434 jcr->crypto.pki_session = crypto_session_new(cipher, jcr->crypto.pki_recipients);
436 /* Get the session data size */
437 if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)0, &size)) {
438 Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n"));
442 /* Allocate buffer */
443 jcr->crypto.pki_session_encoded = get_memory(size);
445 /* Encode session data */
446 if (!crypto_session_encode(jcr->crypto.pki_session, (uint8_t *)jcr->crypto.pki_session_encoded, &size)) {
447 Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n"));
451 /* ... and store the encoded size */
452 jcr->crypto.pki_session_encoded_size = size;
454 /* Allocate the encryption/decryption buffer */
455 jcr->crypto.crypto_buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
460 static void crypto_session_end(JCR *jcr)
462 if (jcr->crypto.crypto_buf) {
463 free_pool_memory(jcr->crypto.crypto_buf);
464 jcr->crypto.crypto_buf = NULL;
466 if (jcr->crypto.pki_session) {
467 crypto_session_free(jcr->crypto.pki_session);
469 if (jcr->crypto.pki_session_encoded) {
470 free_pool_memory(jcr->crypto.pki_session_encoded);
471 jcr->crypto.pki_session_encoded = NULL;
475 static bool crypto_session_send(JCR *jcr, BSOCK *sd)
479 /* Send our header */
480 Dmsg2(100, "Send hdr fi=%ld stream=%d\n", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA);
481 sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA);
484 sd->msg = jcr->crypto.pki_session_encoded;
485 sd->msglen = jcr->crypto.pki_session_encoded_size;
486 jcr->JobBytes += sd->msglen;
488 Dmsg1(100, "Send data len=%d\n", sd->msglen);
491 sd->signal(BNET_EOD);
497 * Called here by find() for each file included.
498 * This is a callback. The original is find_files() above.
500 * Send the file and its data to the Storage daemon.
504 * -1 to ignore file/directory (not used here)
506 int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
508 bool do_read = false;
509 int stat, data_stream;
511 DIGEST *digest = NULL;
512 DIGEST *signing_digest = NULL;
513 int digest_stream = STREAM_NONE;
514 SIGNATURE *sig = NULL;
515 bool has_file_data = false;
516 // TODO landonf: Allow the user to specify the digest algorithm
518 crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA256;
520 crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA1;
522 BSOCK *sd = jcr->store_bsock;
524 if (job_canceled(jcr)) {
528 jcr->num_files_examined++; /* bump total file count */
530 switch (ff_pkt->type) {
531 case FT_LNKSAVED: /* Hard linked, file already saved */
532 Dmsg2(130, "FT_LNKSAVED hard link: %s => %s\n", ff_pkt->fname, ff_pkt->link);
535 Dmsg1(130, "FT_REGE saving: %s\n", ff_pkt->fname);
536 has_file_data = true;
539 Dmsg1(130, "FT_REG saving: %s\n", ff_pkt->fname);
540 has_file_data = true;
543 Dmsg2(130, "FT_LNK saving: %s -> %s\n", ff_pkt->fname, ff_pkt->link);
546 jcr->num_files_examined--; /* correct file count */
547 return 1; /* not used */
549 Jmsg(jcr, M_INFO, 1, _(" Recursion turned off. Will not descend from %s into %s\n"),
550 ff_pkt->top_fname, ff_pkt->fname);
551 ff_pkt->type = FT_DIREND; /* Backup only the directory entry */
554 /* Suppress message for /dev filesystems */
555 // if (strncmp(ff_pkt->fname, "/dev/", 5) != 0) {
556 if (!is_in_fileset(ff_pkt)) {
557 Jmsg(jcr, M_INFO, 1, _(" %s is a different filesystem. Will not descend from %s into %s\n"),
558 ff_pkt->fname, ff_pkt->top_fname, ff_pkt->fname);
560 ff_pkt->type = FT_DIREND; /* Backup only the directory entry */
563 Jmsg(jcr, M_INFO, 1, _(" Disallowed filesystem. Will not descend from %s into %s\n"),
564 ff_pkt->top_fname, ff_pkt->fname);
565 ff_pkt->type = FT_DIREND; /* Backup only the directory entry */
568 Jmsg(jcr, M_INFO, 1, _(" Disallowed drive type. Will not descend into %s\n"),
573 Dmsg1(130, "FT_DIREND: %s\n", ff_pkt->link);
576 Dmsg1(130, "FT_SPEC saving: %s\n", ff_pkt->fname);
577 if (S_ISSOCK(ff_pkt->statp.st_mode)) {
578 Jmsg(jcr, M_SKIPPED, 1, _(" Socket file skipped: %s\n"), ff_pkt->fname);
583 Dmsg1(130, "FT_RAW saving: %s\n", ff_pkt->fname);
584 has_file_data = true;
587 Dmsg1(130, "FT_FIFO saving: %s\n", ff_pkt->fname);
591 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not access %s: ERR=%s\n"), ff_pkt->fname,
592 be.bstrerror(ff_pkt->ff_errno));
598 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not follow link %s: ERR=%s\n"),
599 ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno));
605 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not stat %s: ERR=%s\n"), ff_pkt->fname,
606 be.bstrerror(ff_pkt->ff_errno));
612 Jmsg(jcr, M_SKIPPED, 1, _(" Unchanged file skipped: %s\n"), ff_pkt->fname);
615 Jmsg(jcr, M_NOTSAVED, 0, _(" Archive file not saved: %s\n"), ff_pkt->fname);
619 Jmsg(jcr, M_NOTSAVED, 0, _(" Could not open directory %s: ERR=%s\n"),
620 ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno));
625 Jmsg(jcr, M_NOTSAVED, 0, _(" Unknown file type %d; not saved: %s\n"),
626 ff_pkt->type, ff_pkt->fname);
631 Dmsg1(130, "bfiled: sending %s to stored\n", ff_pkt->fname);
633 /* Digests and encryption are only useful if there's file data */
636 * Setup for digest handling. If this fails, the digest will be set to NULL
637 * and not used. Note, the digest (file hash) can be any one of the four
640 * The signing digest is a single algorithm depending on
641 * whether or not we have SHA2.
642 * ****FIXME**** the signing algoritm should really be
643 * determined a different way!!!!!! What happens if
644 * sha2 was available during backup but not restore?
646 if (ff_pkt->flags & FO_MD5) {
647 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_MD5);
648 digest_stream = STREAM_MD5_DIGEST;
650 } else if (ff_pkt->flags & FO_SHA1) {
651 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA1);
652 digest_stream = STREAM_SHA1_DIGEST;
654 } else if (ff_pkt->flags & FO_SHA256) {
655 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA256);
656 digest_stream = STREAM_SHA256_DIGEST;
658 } else if (ff_pkt->flags & FO_SHA512) {
659 digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA512);
660 digest_stream = STREAM_SHA512_DIGEST;
663 /* Did digest initialization fail? */
664 if (digest_stream != STREAM_NONE && digest == NULL) {
665 Jmsg(jcr, M_WARNING, 0, _("%s digest initialization failed\n"),
666 stream_to_ascii(digest_stream));
670 * Set up signature digest handling. If this fails, the signature digest will be set to
673 // TODO landonf: We should really only calculate the digest once, for both verification and signing.
674 if (jcr->crypto.pki_sign) {
675 signing_digest = crypto_digest_new(jcr, signing_algorithm);
677 /* Full-stop if a failure occurred initializing the signature digest */
678 if (signing_digest == NULL) {
679 Jmsg(jcr, M_NOTSAVED, 0, _("%s signature digest initialization failed\n"),
680 stream_to_ascii(signing_algorithm));
686 /* Enable encryption */
687 if (jcr->crypto.pki_encrypt) {
688 ff_pkt->flags |= FO_ENCRYPT;
692 /* Initialize the file descriptor we use for data and other streams. */
694 if (ff_pkt->flags & FO_PORTABLE) {
695 set_portable_backup(&ff_pkt->bfd); /* disable Win32 BackupRead() */
697 if (ff_pkt->cmd_plugin) {
698 if (!set_cmd_plugin(&ff_pkt->bfd, jcr)) {
701 send_plugin_name(jcr, sd, true); /* signal start of plugin data */
704 /* Send attributes -- must be done after binit() */
705 if (!encode_and_send_attributes(jcr, ff_pkt, data_stream)) {
709 /* Set up the encryption context and send the session data to the SD */
710 if (has_file_data && jcr->crypto.pki_encrypt) {
711 if (!crypto_session_send(jcr, sd)) {
717 * Open any file with data that we intend to save, then save it.
719 * Note, if is_win32_backup, we must open the Directory so that
720 * the BackupRead will save its permissions and ownership streams.
722 if (ff_pkt->type != FT_LNKSAVED && S_ISREG(ff_pkt->statp.st_mode)) {
724 do_read = !is_portable_backup(&ff_pkt->bfd) || ff_pkt->statp.st_size > 0;
726 do_read = ff_pkt->statp.st_size > 0;
728 } else if (ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO ||
729 ff_pkt->type == FT_REPARSE ||
730 (!is_portable_backup(&ff_pkt->bfd) && ff_pkt->type == FT_DIREND)) {
733 if (ff_pkt->cmd_plugin) {
737 Dmsg1(100, "do_read=%d\n", do_read);
741 if (ff_pkt->type == FT_FIFO) {
742 tid = start_thread_timer(jcr, pthread_self(), 60);
746 int noatime = ff_pkt->flags & FO_NOATIME ? O_NOATIME : 0;
747 ff_pkt->bfd.reparse_point = ff_pkt->type == FT_REPARSE;
748 if (bopen(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY | noatime, 0) < 0) {
749 ff_pkt->ff_errno = errno;
751 Jmsg(jcr, M_NOTSAVED, 0, _(" Cannot open %s: ERR=%s.\n"), ff_pkt->fname,
755 stop_thread_timer(tid);
761 stop_thread_timer(tid);
765 stat = send_data(jcr, data_stream, ff_pkt, digest, signing_digest);
767 if (ff_pkt->flags & FO_CHKCHANGES) {
768 has_file_changed(jcr, ff_pkt);
771 bclose(&ff_pkt->bfd);
778 #ifdef HAVE_DARWIN_OS
779 /* Regular files can have resource forks and Finder Info */
780 if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) &&
781 ff_pkt->flags & FO_HFSPLUS)) {
782 if (ff_pkt->hfsinfo.rsrclength > 0) {
785 if (!bopen_rsrc(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) {
786 ff_pkt->ff_errno = errno;
788 Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open resource fork for %s: ERR=%s.\n"),
789 ff_pkt->fname, be.bstrerror());
791 if (is_bopen(&ff_pkt->bfd)) {
792 bclose(&ff_pkt->bfd);
796 flags = ff_pkt->flags;
797 ff_pkt->flags &= ~(FO_GZIP|FO_SPARSE);
798 if (flags & FO_ENCRYPT) {
799 rsrc_stream = STREAM_ENCRYPTED_MACOS_FORK_DATA;
801 rsrc_stream = STREAM_MACOS_FORK_DATA;
803 stat = send_data(jcr, rsrc_stream, ff_pkt, digest, signing_digest);
804 ff_pkt->flags = flags;
805 bclose(&ff_pkt->bfd);
811 Dmsg1(300, "Saving Finder Info for \"%s\"\n", ff_pkt->fname);
812 sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_HFSPLUS_ATTRIBUTES);
813 Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
814 memcpy(sd->msg, ff_pkt->hfsinfo.fndrinfo, 32);
817 crypto_digest_update(digest, (uint8_t *)sd->msg, sd->msglen);
819 if (signing_digest) {
820 crypto_digest_update(signing_digest, (uint8_t *)sd->msg, sd->msglen);
823 sd->signal(BNET_EOD);
827 if (ff_pkt->flags & FO_ACL) {
828 /* Read access ACLs for files, dirs and links */
829 if (!read_and_send_acl(jcr, BACL_TYPE_ACCESS, STREAM_UNIX_ACCESS_ACL)) {
832 /* Directories can have default ACLs too */
833 if (ff_pkt->type == FT_DIREND && (BACL_CAP & BACL_CAP_DEFAULTS_DIR)) {
834 if (!read_and_send_acl(jcr, BACL_TYPE_DEFAULT, STREAM_UNIX_DEFAULT_ACL)) {
840 /* Terminate the signing digest and send it to the Storage daemon */
841 if (signing_digest) {
844 if ((sig = crypto_sign_new(jcr)) == NULL) {
845 Jmsg(jcr, M_FATAL, 0, _("Failed to allocate memory for crypto signature.\n"));
849 if (!crypto_sign_add_signer(sig, signing_digest, jcr->crypto.pki_keypair)) {
850 Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
854 /* Get signature size */
855 if (!crypto_sign_encode(sig, NULL, &size)) {
856 Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
860 /* Grow the bsock buffer to fit our message if necessary */
861 if (sizeof_pool_memory(sd->msg) < (int32_t)size) {
862 sd->msg = realloc_pool_memory(sd->msg, size);
865 /* Send our header */
866 sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_SIGNED_DIGEST);
867 Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
869 /* Encode signature data */
870 if (!crypto_sign_encode(sig, (uint8_t *)sd->msg, &size)) {
871 Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
877 sd->signal(BNET_EOD); /* end of checksum */
880 /* Terminate any digest and send it to Storage daemon */
884 sd->fsend("%ld %d 0", jcr->JobFiles, digest_stream);
885 Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
887 size = CRYPTO_DIGEST_MAX_SIZE;
889 /* Grow the bsock buffer to fit our message if necessary */
890 if (sizeof_pool_memory(sd->msg) < (int32_t)size) {
891 sd->msg = realloc_pool_memory(sd->msg, size);
894 if (!crypto_digest_finalize(digest, (uint8_t *)sd->msg, &size)) {
895 Jmsg(jcr, M_FATAL, 0, _("An error occurred finalizing signing the stream.\n"));
901 sd->signal(BNET_EOD); /* end of checksum */
903 if (ff_pkt->cmd_plugin) {
904 send_plugin_name(jcr, sd, false); /* signal end of plugin data */
908 rtnstat = 1; /* good return */
912 crypto_digest_free(digest);
914 if (signing_digest) {
915 crypto_digest_free(signing_digest);
918 crypto_sign_free(sig);
924 * Send data read from an already open file descriptor.
926 * We return 1 on sucess and 0 on errors.
929 * We use ff_pkt->statp.st_size when FO_SPARSE to know when to stop
931 * Currently this is not a problem as the only other stream, resource forks,
932 * are not handled as sparse files.
934 int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest,
935 DIGEST *signing_digest)
937 BSOCK *sd = jcr->store_bsock;
938 uint64_t fileAddr = 0; /* file address */
940 int32_t rsize = jcr->buf_size; /* read buffer size */
942 CIPHER_CONTEXT *cipher_ctx = NULL; /* Quell bogus uninitialized warnings */
943 const uint8_t *cipher_input;
944 uint32_t cipher_input_len;
945 uint32_t cipher_block_size;
946 uint32_t encrypted_len;
947 #ifdef FD_NO_SEND_TEST
952 rbuf = sd->msg; /* read buffer */
953 wbuf = sd->msg; /* write buffer */
954 cipher_input = (uint8_t *)rbuf; /* encrypt uncompressed data */
956 Dmsg1(300, "Saving data, type=%d\n", ff_pkt->type);
959 uLong compress_len = 0;
960 uLong max_compress_len = 0;
961 const Bytef *cbuf = NULL;
964 if (ff_pkt->flags & FO_GZIP) {
965 if (ff_pkt->flags & FO_SPARSE) {
966 cbuf = (Bytef *)jcr->compress_buf + SPARSE_FADDR_SIZE;
967 max_compress_len = jcr->compress_buf_size - SPARSE_FADDR_SIZE;
969 cbuf = (Bytef *)jcr->compress_buf;
970 max_compress_len = jcr->compress_buf_size; /* set max length */
972 wbuf = jcr->compress_buf; /* compressed output here */
973 cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */
976 * Only change zlib parameters if there is no pending operation.
977 * This should never happen as deflatereset is called after each
981 if (((z_stream*)jcr->pZLIB_compress_workset)->total_in == 0) {
982 /* set gzip compression level - must be done per file */
983 if ((zstat=deflateParams((z_stream*)jcr->pZLIB_compress_workset,
984 ff_pkt->GZIP_level, Z_DEFAULT_STRATEGY)) != Z_OK) {
985 Jmsg(jcr, M_FATAL, 0, _("Compression deflateParams error: %d\n"), zstat);
986 set_jcr_job_status(jcr, JS_ErrorTerminated);
992 const uint32_t max_compress_len = 0;
995 if (ff_pkt->flags & FO_ENCRYPT) {
996 if (ff_pkt->flags & FO_SPARSE) {
997 Jmsg0(jcr, M_FATAL, 0, _("Encrypting sparse data not supported.\n"));
1000 /* Allocate the cipher context */
1001 if ((cipher_ctx = crypto_cipher_new(jcr->crypto.pki_session, true,
1002 &cipher_block_size)) == NULL) {
1003 /* Shouldn't happen! */
1004 Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context.\n"));
1009 * Grow the crypto buffer, if necessary.
1010 * crypto_cipher_update() will buffer up to (cipher_block_size - 1).
1011 * We grow crypto_buf to the maximum number of blocks that
1012 * could be returned for the given read buffer size.
1013 * (Using the larger of either rsize or max_compress_len)
1015 jcr->crypto.crypto_buf = check_pool_memory_size(jcr->crypto.crypto_buf,
1016 (MAX(rsize + (int)sizeof(uint32_t), (int32_t)max_compress_len) +
1017 cipher_block_size - 1) / cipher_block_size * cipher_block_size);
1019 wbuf = jcr->crypto.crypto_buf; /* Encrypted, possibly compressed output here. */
1023 * Send Data header to Storage daemon
1024 * <file-index> <stream> <info>
1026 if (!sd->fsend("%ld %d 0", jcr->JobFiles, stream)) {
1027 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1031 Dmsg1(300, ">stored: datahdr %s\n", sd->msg);
1034 * Make space at beginning of buffer for fileAddr because this
1035 * same buffer will be used for writing if compression is off.
1037 if (ff_pkt->flags & FO_SPARSE) {
1038 rbuf += SPARSE_FADDR_SIZE;
1039 rsize -= SPARSE_FADDR_SIZE;
1040 #ifdef HAVE_FREEBSD_OS
1042 * To read FreeBSD partitions, the read size must be
1043 * a multiple of 512.
1045 rsize = (rsize/512) * 512;
1049 /* a RAW device read on win32 only works if the buffer is a multiple of 512 */
1051 if (S_ISBLK(ff_pkt->statp.st_mode))
1052 rsize = (rsize/512) * 512;
1056 * Read the file data
1058 while ((sd->msglen=(uint32_t)bread(&ff_pkt->bfd, rbuf, rsize)) > 0) {
1060 /* Check for sparse blocks */
1061 if (ff_pkt->flags & FO_SPARSE) {
1063 bool haveBlock = true;
1064 if (sd->msglen == rsize &&
1065 fileAddr+sd->msglen < (uint64_t)ff_pkt->statp.st_size ||
1066 ((ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO) &&
1067 (uint64_t)ff_pkt->statp.st_size == 0)) {
1068 haveBlock = !is_buf_zero(rbuf, rsize);
1071 ser_begin(wbuf, SPARSE_FADDR_SIZE);
1072 ser_uint64(fileAddr); /* store fileAddr in begin of buffer */
1074 fileAddr += sd->msglen; /* update file address */
1076 continue; /* skip block of zeros */
1080 jcr->ReadBytes += sd->msglen; /* count bytes read */
1082 /* Uncompressed cipher input length */
1083 cipher_input_len = sd->msglen;
1085 /* Update checksum if requested */
1087 crypto_digest_update(digest, (uint8_t *)rbuf, sd->msglen);
1090 /* Update signing digest if requested */
1091 if (signing_digest) {
1092 crypto_digest_update(signing_digest, (uint8_t *)rbuf, sd->msglen);
1096 /* Do compression if turned on */
1097 if (ff_pkt->flags & FO_GZIP && jcr->pZLIB_compress_workset) {
1098 Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", cbuf, rbuf, sd->msglen);
1100 ((z_stream*)jcr->pZLIB_compress_workset)->next_in = (Bytef *)rbuf;
1101 ((z_stream*)jcr->pZLIB_compress_workset)->avail_in = sd->msglen;
1102 ((z_stream*)jcr->pZLIB_compress_workset)->next_out = (Bytef *)cbuf;
1103 ((z_stream*)jcr->pZLIB_compress_workset)->avail_out = max_compress_len;
1105 if ((zstat=deflate((z_stream*)jcr->pZLIB_compress_workset, Z_FINISH)) != Z_STREAM_END) {
1106 Jmsg(jcr, M_FATAL, 0, _("Compression deflate error: %d\n"), zstat);
1107 set_jcr_job_status(jcr, JS_ErrorTerminated);
1110 compress_len = ((z_stream*)jcr->pZLIB_compress_workset)->total_out;
1111 /* reset zlib stream to be able to begin from scratch again */
1112 if ((zstat=deflateReset((z_stream*)jcr->pZLIB_compress_workset)) != Z_OK) {
1113 Jmsg(jcr, M_FATAL, 0, _("Compression deflateReset error: %d\n"), zstat);
1114 set_jcr_job_status(jcr, JS_ErrorTerminated);
1118 Dmsg2(400, "compressed len=%d uncompressed len=%d\n", compress_len,
1121 sd->msglen = compress_len; /* set compressed length */
1122 cipher_input_len = compress_len;
1126 * Note, here we prepend the current record length to the beginning
1127 * of the encrypted data. This is because both sparse and compression
1128 * restore handling want records returned to them with exactly the
1129 * same number of bytes that were processed in the backup handling.
1130 * That is, both are block filters rather than a stream. When doing
1131 * compression, the compression routines may buffer data, so that for
1132 * any one record compressed, when it is decompressed the same size
1133 * will not be obtained. Of course, the buffered data eventually comes
1134 * out in subsequent crypto_cipher_update() calls or at least
1135 * when crypto_cipher_finalize() is called. Unfortunately, this
1136 * "feature" of encryption enormously complicates the restore code.
1138 if (ff_pkt->flags & FO_ENCRYPT) {
1139 uint32_t initial_len = 0;
1142 if (ff_pkt->flags & FO_SPARSE) {
1143 cipher_input_len += SPARSE_FADDR_SIZE;
1146 /* Encrypt the length of the input block */
1147 uint8_t packet_len[sizeof(uint32_t)];
1149 ser_begin(packet_len, sizeof(uint32_t));
1150 ser_uint32(cipher_input_len); /* store data len in begin of buffer */
1151 Dmsg1(20, "Encrypt len=%d\n", cipher_input_len);
1153 if (!crypto_cipher_update(cipher_ctx, packet_len, sizeof(packet_len),
1154 (uint8_t *)jcr->crypto.crypto_buf, &initial_len)) {
1155 /* Encryption failed. Shouldn't happen. */
1156 Jmsg(jcr, M_FATAL, 0, _("Encryption error\n"));
1160 /* Encrypt the input block */
1161 if (crypto_cipher_update(cipher_ctx, cipher_input, cipher_input_len,
1162 (uint8_t *)&jcr->crypto.crypto_buf[initial_len], &encrypted_len)) {
1163 if ((initial_len + encrypted_len) == 0) {
1164 /* No full block of data available, read more data */
1167 Dmsg2(400, "encrypted len=%d unencrypted len=%d\n", encrypted_len,
1169 sd->msglen = initial_len + encrypted_len; /* set encrypted length */
1171 /* Encryption failed. Shouldn't happen. */
1172 Jmsg(jcr, M_FATAL, 0, _("Encryption error\n"));
1177 /* Send the buffer to the Storage daemon */
1178 if (ff_pkt->flags & FO_SPARSE) {
1179 sd->msglen += SPARSE_FADDR_SIZE; /* include fileAddr in size */
1181 sd->msg = wbuf; /* set correct write buffer */
1183 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1187 Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
1189 jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */
1190 sd->msg = msgsave; /* restore read buffer */
1192 } /* end while read file data */
1194 if (sd->msglen < 0) { /* error */
1196 Jmsg(jcr, M_ERROR, 0, _("Read error on file %s. ERR=%s\n"),
1197 ff_pkt->fname, be.bstrerror(ff_pkt->bfd.berrno));
1198 if (jcr->Errors++ > 1000) { /* insanity check */
1199 Jmsg(jcr, M_FATAL, 0, _("Too many errors.\n"));
1201 } else if (ff_pkt->flags & FO_ENCRYPT) {
1203 * For encryption, we must call finalize to push out any
1206 if (!crypto_cipher_finalize(cipher_ctx, (uint8_t *)jcr->crypto.crypto_buf,
1208 /* Padding failed. Shouldn't happen. */
1209 Jmsg(jcr, M_FATAL, 0, _("Encryption padding error\n"));
1213 /* Note, on SSL pre-0.9.7, there is always some output */
1214 if (encrypted_len > 0) {
1215 sd->msglen = encrypted_len; /* set encrypted length */
1216 sd->msg = jcr->crypto.crypto_buf; /* set correct write buffer */
1218 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1222 Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
1223 jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */
1224 sd->msg = msgsave; /* restore bnet buffer */
1228 if (!sd->signal(BNET_EOD)) { /* indicate end of file data */
1229 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1234 /* Free the cipher context */
1236 crypto_cipher_free(cipher_ctx);
1241 /* Free the cipher context */
1243 crypto_cipher_free(cipher_ctx);
1246 sd->msg = msgsave; /* restore bnet buffer */
1252 * Read and send an ACL for the last encountered file.
1254 static bool read_and_send_acl(JCR *jcr, int acltype, int stream)
1257 BSOCK *sd = jcr->store_bsock;
1260 #ifdef FD_NO_SEND_TEST
1264 len = bacl_get(jcr, acltype);
1266 Jmsg1(jcr, M_WARNING, 0, _("Error reading ACL of %s\n"), jcr->last_fname);
1270 return true; /* no ACL */
1274 if (!sd->fsend("%ld %d 0", jcr->JobFiles, stream)) {
1275 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1280 /* Send the buffer to the storage deamon */
1281 Dmsg2(400, "Backing up ACL type 0x%2x <%s>\n", acltype, jcr->acl_text);
1283 sd->msg = jcr->acl_text;
1284 sd->msglen = len + 1;
1288 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1293 jcr->JobBytes += sd->msglen;
1295 if (!sd->signal(BNET_EOD)) {
1296 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1301 Dmsg1(200, "ACL of file: %s successfully backed up!\n", jcr->last_fname);
1306 static bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream)
1308 BSOCK *sd = jcr->store_bsock;
1309 char attribs[MAXSTRING];
1310 char attribsEx[MAXSTRING];
1313 #ifdef FD_NO_SEND_TEST
1317 Dmsg1(300, "encode_and_send_attrs fname=%s\n", ff_pkt->fname);
1318 /* Find what data stream we will use, then encode the attributes */
1319 if ((data_stream = select_data_stream(ff_pkt)) == STREAM_NONE) {
1320 /* This should not happen */
1321 Jmsg0(jcr, M_FATAL, 0, _("Invalid file flags, no supported data stream type.\n"));
1324 encode_stat(attribs, ff_pkt, data_stream);
1326 /* Now possibly extend the attributes */
1327 attr_stream = encode_attribsEx(jcr, attribsEx, ff_pkt);
1329 Dmsg3(300, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx);
1332 jcr->JobFiles++; /* increment number of files sent */
1333 ff_pkt->FileIndex = jcr->JobFiles; /* return FileIndex */
1334 pm_strcpy(jcr->last_fname, ff_pkt->fname);
1338 * Send Attributes header to Storage daemon
1339 * <file-index> <stream> <info>
1341 if (!sd->fsend("%ld %d 0", jcr->JobFiles, attr_stream)) {
1342 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1346 Dmsg1(300, ">stored: attrhdr %s\n", sd->msg);
1349 * Send file attributes to Storage daemon
1352 * Filename (full path)
1353 * Encoded attributes
1354 * Link name (if type==FT_LNK or FT_LNKSAVED)
1355 * Encoded extended-attributes (for Win32)
1357 * For a directory, link is the same as fname, but with trailing
1358 * slash. For a linked file, link is the link.
1360 if (ff_pkt->type != FT_DELETED) { /* already stripped */
1363 if (ff_pkt->type == FT_LNK || ff_pkt->type == FT_LNKSAVED) {
1364 Dmsg2(300, "Link %s to %s\n", ff_pkt->fname, ff_pkt->link);
1365 stat = sd->fsend("%ld %d %s%c%s%c%s%c%s%c", jcr->JobFiles,
1366 ff_pkt->type, ff_pkt->fname, 0, attribs, 0, ff_pkt->link, 0,
1368 } else if (ff_pkt->type == FT_DIREND || ff_pkt->type == FT_REPARSE) {
1369 /* Here link is the canonical filename (i.e. with trailing slash) */
1370 stat = sd->fsend("%ld %d %s%c%s%c%c%s%c", jcr->JobFiles,
1371 ff_pkt->type, ff_pkt->link, 0, attribs, 0, 0, attribsEx, 0);
1373 stat = sd->fsend("%ld %d %s%c%s%c%c%s%c", jcr->JobFiles,
1374 ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, attribsEx, 0);
1376 if (ff_pkt->type != FT_DELETED) {
1377 unstrip_path(ff_pkt);
1380 Dmsg2(300, ">stored: attr len=%d: %s\n", sd->msglen, sd->msg);
1382 Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1386 sd->signal(BNET_EOD); /* indicate end of attributes data */
1391 * Do in place strip of path
1393 static bool do_strip(int count, char *in)
1399 /* Copy to first path separator -- Win32 might have c: ... */
1400 while (*in && !IsPathSeparator(*in)) {
1404 numsep++; /* one separator seen */
1405 for (stripped=0; stripped<count && *in; stripped++) {
1406 while (*in && !IsPathSeparator(*in)) {
1407 in++; /* skip chars */
1410 numsep++; /* count separators seen */
1411 in++; /* skip separator */
1415 while (*in) { /* copy to end */
1416 if (IsPathSeparator(*in)) {
1422 Dmsg4(500, "stripped=%d count=%d numsep=%d sep>count=%d\n",
1423 stripped, count, numsep, numsep>count);
1424 return stripped==count && numsep>count;
1428 * If requested strip leading components of the path
1430 static void strip_path(FF_PKT *ff_pkt)
1432 if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) {
1433 Dmsg1(200, "No strip for %s\n", ff_pkt->fname);
1436 if (!ff_pkt->fname_save) {
1437 ff_pkt->fname_save = get_pool_memory(PM_FNAME);
1438 ff_pkt->link_save = get_pool_memory(PM_FNAME);
1440 pm_strcpy(ff_pkt->fname_save, ff_pkt->fname);
1443 * Strip path. If it doesn't succeed put it back. If
1444 * it does, and there is a different link string,
1445 * attempt to strip the link. If it fails, back them
1447 * Do not strip symlinks.
1448 * I.e. if either stripping fails don't strip anything.
1450 if (do_strip(ff_pkt->strip_path, ff_pkt->fname)) {
1451 /* Strip links but not symlinks */
1452 if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) {
1453 pm_strcpy(ff_pkt->link_save, ff_pkt->link);
1454 if (!do_strip(ff_pkt->strip_path, ff_pkt->link)) {
1455 strcpy(ff_pkt->link, ff_pkt->link_save);
1456 strcpy(ff_pkt->fname, ff_pkt->fname_save);
1460 strcpy(ff_pkt->fname, ff_pkt->fname_save);
1462 Dmsg2(200, "fname=%s stripped=%s\n", ff_pkt->fname_save, ff_pkt->fname);
1465 static void unstrip_path(FF_PKT *ff_pkt)
1467 if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) {
1470 strcpy(ff_pkt->fname, ff_pkt->fname_save);
1471 if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) {
1472 strcpy(ff_pkt->link, ff_pkt->link_save);