]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/filed/backup.c
Fix seg fault in FD.
[bacula/bacula] / bacula / src / filed / backup.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
5
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
11    in the file LICENSE.
12
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.
17
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
21    02110-1301, USA.
22
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.
27 */
28 /*
29  *  Bacula File Daemon  backup.c  send file attributes and data
30  *   to the Storage daemon.
31  *
32  *    Kern Sibbald, March MM
33  *
34  *   Version $Id$
35  *
36  */
37
38 #include "bacula.h"
39 #include "filed.h"
40
41 /* Forward referenced functions */
42 static int save_file(FF_PKT *ff_pkt, void *pkt, bool top_level);
43 static void strip_path(FF_PKT *ff_pkt);
44 static void unstrip_path(FF_PKT *ff_pkt);
45 static int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, DIGEST *signature_digest);
46 static bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream);
47 static bool read_and_send_acl(JCR *jcr, int acltype, int stream);
48
49 /*
50  * Find all the requested files and send them
51  * to the Storage daemon.
52  *
53  * Note, we normally carry on a one-way
54  * conversation from this point on with the SD, simply blasting
55  * data to him.  To properly know what is going on, we
56  * also run a "heartbeat" monitor which reads the socket and
57  * reacts accordingly (at the moment it has nothing to do
58  * except echo the heartbeat to the Director).
59  *
60  */
61 bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
62 {
63    BSOCK *sd;
64    bool ok = true;
65    // TODO landonf: Allow user to specify encryption algorithm
66    crypto_cipher_t cipher = CRYPTO_CIPHER_AES_128_CBC;
67
68
69    sd = jcr->store_bsock;
70
71    set_jcr_job_status(jcr, JS_Running);
72
73    Dmsg1(300, "bfiled: opened data connection %d to stored\n", sd->m_fd);
74
75    LockRes();
76    CLIENT *client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
77    UnlockRes();
78    uint32_t buf_size;
79    if (client) {
80       buf_size = client->max_network_buffer_size;
81    } else {
82       buf_size = 0;                   /* use default */
83    }
84    if (!bnet_set_buffer_size(sd, buf_size, BNET_SETBUF_WRITE)) {
85       set_jcr_job_status(jcr, JS_ErrorTerminated);
86       Jmsg(jcr, M_FATAL, 0, _("Cannot set buffer size FD->SD.\n"));
87       return false;
88    }
89
90    jcr->buf_size = sd->msglen;
91    /* Adjust for compression so that output buffer is
92     * 12 bytes + 0.1% larger than input buffer plus 18 bytes.
93     * This gives a bit extra plus room for the sparse addr if any.
94     * Note, we adjust the read size to be smaller so that the
95     * same output buffer can be used without growing it.
96     *
97     * The zlib compression workset is initialized here to minimise
98     * the "per file" load. The jcr member is only set, if the init was successful.
99     */
100    jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30;
101    jcr->compress_buf = get_memory(jcr->compress_buf_size);
102
103 #ifdef HAVE_LIBZ
104    z_stream *pZlibStream = (z_stream*)malloc(sizeof(z_stream));  
105    if (pZlibStream) {
106       pZlibStream->zalloc = Z_NULL;      
107       pZlibStream->zfree = Z_NULL;
108       pZlibStream->opaque = Z_NULL;
109       pZlibStream->state = Z_NULL;
110
111       if (deflateInit(pZlibStream, Z_DEFAULT_COMPRESSION) == Z_OK)
112          jcr->pZLIB_compress_workset = pZlibStream;
113       else
114          free (pZlibStream);
115    }
116 #endif
117
118    /* Create encryption session data and a cached, DER-encoded session data
119     * structure. We use a single session key for each backup, so we'll encode
120     * the session data only once. */
121    if (jcr->pki_encrypt) {
122       uint32_t size = 0;
123
124       /* Create per-job session encryption context */
125       jcr->pki_session = crypto_session_new(cipher, jcr->pki_recipients);
126
127       /* Get the session data size */
128       if (crypto_session_encode(jcr->pki_session, (uint8_t *)0, &size) == false) {
129          Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n"));
130          return 0;
131       }
132
133       /* Allocate buffer */
134       jcr->pki_session_encoded = (uint8_t *)malloc(size);
135
136       /* Encode session data */
137       if (crypto_session_encode(jcr->pki_session, jcr->pki_session_encoded, &size) == false) {
138          Jmsg(jcr, M_FATAL, 0, _("An error occurred while encrypting the stream.\n"));
139          return 0;
140       }
141
142       /* ... and store the encoded size */
143       jcr->pki_session_encoded_size = size;
144
145       /* Allocate the encryption/decryption buffer */
146       jcr->crypto_buf = get_memory(CRYPTO_CIPHER_MAX_BLOCK_SIZE);
147    }
148
149    Dmsg1(300, "set_find_options ff=%p\n", jcr->ff);
150    set_find_options((FF_PKT *)jcr->ff, jcr->incremental, jcr->mtime);
151    Dmsg0(300, "start find files\n");
152
153    start_heartbeat_monitor(jcr);
154
155    jcr->acl_text = get_pool_memory(PM_MESSAGE);
156
157    /* Subroutine save_file() is called for each file */
158    if (!find_files(jcr, (FF_PKT *)jcr->ff, save_file, (void *)jcr)) {
159       ok = false;                     /* error */
160       set_jcr_job_status(jcr, JS_ErrorTerminated);
161    }
162
163    free_pool_memory(jcr->acl_text);
164
165    stop_heartbeat_monitor(jcr);
166
167    sd->signal(BNET_EOD);            /* end of sending data */
168
169    if (jcr->big_buf) {
170       free(jcr->big_buf);
171       jcr->big_buf = NULL;
172    }
173    if (jcr->compress_buf) {
174       free_pool_memory(jcr->compress_buf);
175       jcr->compress_buf = NULL;
176    }
177    if (jcr->pZLIB_compress_workset) {
178       /* Free the zlib stream */
179 #ifdef HAVE_LIBZ
180       deflateEnd((z_stream *)jcr->pZLIB_compress_workset);
181 #endif
182       free (jcr->pZLIB_compress_workset);
183       jcr->pZLIB_compress_workset = NULL;
184    }
185    if (jcr->crypto_buf) {
186       free_pool_memory(jcr->crypto_buf);
187       jcr->crypto_buf = NULL;
188    }
189    if (jcr->pki_session) {
190       crypto_session_free(jcr->pki_session);
191    }
192    if (jcr->pki_session_encoded) {
193       free(jcr->pki_session_encoded);
194       jcr->pki_session_encoded = NULL;
195    }
196
197    Dmsg1(100, "end blast_data ok=%d\n", ok);
198    return ok;
199 }
200
201 /*
202  * Called here by find() for each file included.
203  *   This is a callback. The original is find_files() above.
204  *
205  *  Send the file and its data to the Storage daemon.
206  *
207  *  Returns: 1 if OK
208  *           0 if error
209  *          -1 to ignore file/directory (not used here)
210  */
211 static int save_file(FF_PKT *ff_pkt, void *vjcr, bool top_level)
212 {
213    bool do_read = false;
214    int stat, data_stream; 
215    int rtnstat = 0;
216    DIGEST *digest = NULL;
217    DIGEST *signing_digest = NULL;
218    int digest_stream = STREAM_NONE;
219    SIGNATURE *sig = NULL;
220    bool has_file_data = false;
221    // TODO landonf: Allow the user to specify the digest algorithm
222 #ifdef HAVE_SHA2
223    crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA256;
224 #else
225    crypto_digest_t signing_algorithm = CRYPTO_DIGEST_SHA1;
226 #endif
227    JCR *jcr = (JCR *)vjcr;
228    BSOCK *sd = jcr->store_bsock;
229
230    if (job_canceled(jcr)) {
231       return 0;
232    }
233
234    jcr->num_files_examined++;         /* bump total file count */
235
236    switch (ff_pkt->type) {
237    case FT_LNKSAVED:                  /* Hard linked, file already saved */
238       Dmsg2(130, "FT_LNKSAVED hard link: %s => %s\n", ff_pkt->fname, ff_pkt->link);
239       break;
240    case FT_REGE:
241       Dmsg1(130, "FT_REGE saving: %s\n", ff_pkt->fname);
242       has_file_data = true;
243       break;
244    case FT_REG:
245       Dmsg1(130, "FT_REG saving: %s\n", ff_pkt->fname);
246       has_file_data = true;
247       break;
248    case FT_LNK:
249       Dmsg2(130, "FT_LNK saving: %s -> %s\n", ff_pkt->fname, ff_pkt->link);
250       break;
251    case FT_DIRBEGIN:
252       jcr->num_files_examined--;      /* correct file count */
253       return 1;                       /* not used */
254    case FT_NORECURSE:
255       Jmsg(jcr, M_INFO, 1, _("     Recursion turned off. Will not descend from %s into %s\n"),
256            ff_pkt->top_fname, ff_pkt->fname);
257       ff_pkt->type = FT_DIREND;       /* Backup only the directory entry */
258       break;
259    case FT_NOFSCHG:
260       /* Suppress message for /dev filesystems */
261       if (strncmp(ff_pkt->fname, "/dev/", 5) != 0) {
262          Jmsg(jcr, M_INFO, 1, _("     %s is a different filesystem. Will not descend from %s into %s\n"),
263               ff_pkt->fname, ff_pkt->top_fname, ff_pkt->fname);
264       }
265       ff_pkt->type = FT_DIREND;       /* Backup only the directory entry */
266       break;
267    case FT_INVALIDFS:
268       Jmsg(jcr, M_INFO, 1, _("     Disallowed filesystem. Will not descend from %s into %s\n"),
269            ff_pkt->top_fname, ff_pkt->fname);
270       ff_pkt->type = FT_DIREND;       /* Backup only the directory entry */
271       break;
272    case FT_INVALIDDT:
273       Jmsg(jcr, M_INFO, 1, _("     Disallowed drive type. Will not descend into %s\n"),
274            ff_pkt->fname);
275       break;
276    case FT_DIREND:
277       Dmsg1(130, "FT_DIREND: %s\n", ff_pkt->link);
278       break;
279    case FT_SPEC:
280       Dmsg1(130, "FT_SPEC saving: %s\n", ff_pkt->fname);
281       break;
282    case FT_RAW:
283       Dmsg1(130, "FT_RAW saving: %s\n", ff_pkt->fname);
284       has_file_data = true;
285       break;
286    case FT_FIFO:
287       Dmsg1(130, "FT_FIFO saving: %s\n", ff_pkt->fname);
288       break;
289    case FT_NOACCESS: {
290       berrno be;
291       Jmsg(jcr, M_NOTSAVED, 0, _("     Could not access %s: ERR=%s\n"), ff_pkt->fname,
292          be.bstrerror(ff_pkt->ff_errno));
293       jcr->Errors++;
294       return 1;
295    }
296    case FT_NOFOLLOW: {
297       berrno be;
298       Jmsg(jcr, M_NOTSAVED, 0, _("     Could not follow link %s: ERR=%s\n"), 
299            ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno));
300       jcr->Errors++;
301       return 1;
302    }
303    case FT_NOSTAT: {
304       berrno be;
305       Jmsg(jcr, M_NOTSAVED, 0, _("     Could not stat %s: ERR=%s\n"), ff_pkt->fname,
306          be.bstrerror(ff_pkt->ff_errno));
307       jcr->Errors++;
308       return 1;
309    }
310    case FT_DIRNOCHG:
311    case FT_NOCHG:
312       Jmsg(jcr, M_SKIPPED, 1, _("     Unchanged file skipped: %s\n"), ff_pkt->fname);
313       return 1;
314    case FT_ISARCH:
315       Jmsg(jcr, M_NOTSAVED, 0, _("     Archive file not saved: %s\n"), ff_pkt->fname);
316       return 1;
317    case FT_NOOPEN: {
318       berrno be;
319       Jmsg(jcr, M_NOTSAVED, 0, _("     Could not open directory %s: ERR=%s\n"), 
320            ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno));
321       jcr->Errors++;
322       return 1;
323    }
324    default:
325       Jmsg(jcr, M_NOTSAVED, 0,  _("     Unknown file type %d; not saved: %s\n"), 
326            ff_pkt->type, ff_pkt->fname);
327       jcr->Errors++;
328       return 1;
329    }
330
331    Dmsg1(130, "bfiled: sending %s to stored\n", ff_pkt->fname);
332
333    /* Digests and encryption are only useful if there's file data */
334    if (has_file_data) {
335       /*
336        * Setup for digest handling. If this fails, the digest will be set to NULL
337        * and not used. Note, the digest (file hash) can be any one of the four
338        * algorithms below.
339        *
340        * The signing digest is a single algorithm depending on
341        * whether or not we have SHA2.              
342        *   ****FIXME****  the signing algoritm should really be
343        *   determined a different way!!!!!!  What happens if
344        *   sha2 was available during backup but not restore?
345        */
346       if (ff_pkt->flags & FO_MD5) {
347          digest = crypto_digest_new(jcr, CRYPTO_DIGEST_MD5);
348          digest_stream = STREAM_MD5_DIGEST;
349
350       } else if (ff_pkt->flags & FO_SHA1) {
351          digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA1);
352          digest_stream = STREAM_SHA1_DIGEST;
353
354       } else if (ff_pkt->flags & FO_SHA256) {
355          digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA256);
356          digest_stream = STREAM_SHA256_DIGEST;
357
358       } else if (ff_pkt->flags & FO_SHA512) {
359          digest = crypto_digest_new(jcr, CRYPTO_DIGEST_SHA512);
360          digest_stream = STREAM_SHA512_DIGEST;
361       }
362
363       /* Did digest initialization fail? */
364       if (digest_stream != STREAM_NONE && digest == NULL) {
365          Jmsg(jcr, M_WARNING, 0, _("%s digest initialization failed\n"),
366             stream_to_ascii(digest_stream));
367       }
368
369       /*
370        * Set up signature digest handling. If this fails, the signature digest will be set to
371        * NULL and not used.
372        */
373       // TODO landonf: We should really only calculate the digest once, for both verification and signing.
374       if (jcr->pki_sign) {
375          signing_digest = crypto_digest_new(jcr, signing_algorithm);
376
377          /* Full-stop if a failure occurred initializing the signature digest */
378          if (signing_digest == NULL) {
379             Jmsg(jcr, M_NOTSAVED, 0, _("%s signature digest initialization failed\n"),
380                stream_to_ascii(signing_algorithm));
381             jcr->Errors++;
382             goto good_rtn;
383          }
384       }
385
386       /* Enable encryption */
387       if (jcr->pki_encrypt) {
388          ff_pkt->flags |= FO_ENCRYPT;
389       }
390    }
391
392    /* Initialise the file descriptor we use for data and other streams. */
393    binit(&ff_pkt->bfd);
394    if (ff_pkt->flags & FO_PORTABLE) {
395       set_portable_backup(&ff_pkt->bfd); /* disable Win32 BackupRead() */
396    }
397    if (ff_pkt->reader) {
398       if (!set_prog(&ff_pkt->bfd, ff_pkt->reader, jcr)) {
399          Jmsg(jcr, M_FATAL, 0, _("Python reader program \"%s\" not found.\n"), 
400             ff_pkt->reader);
401          goto bail_out;
402       }
403    }
404
405    /* Send attributes -- must be done after binit() */
406    if (!encode_and_send_attributes(jcr, ff_pkt, data_stream)) {
407       goto bail_out;
408    }
409
410    /* Set up the encryption context and send the session data to the SD */
411    if (has_file_data && jcr->pki_encrypt) {
412       /* Send our header */
413       Dmsg2(100, "Send hdr fi=%ld stream=%d\n", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA);
414       sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_ENCRYPTED_SESSION_DATA);
415
416       /* Grow the bsock buffer to fit our message if necessary */
417       if (sizeof_pool_memory(sd->msg) < jcr->pki_session_encoded_size) {
418          sd->msg = realloc_pool_memory(sd->msg, jcr->pki_session_encoded_size);
419       }
420
421       /* Copy our message over and send it */
422       memcpy(sd->msg, jcr->pki_session_encoded, jcr->pki_session_encoded_size);
423       sd->msglen = jcr->pki_session_encoded_size;
424       jcr->JobBytes += sd->msglen;
425
426       Dmsg1(100, "Send data len=%d\n", sd->msglen);
427       sd->send();
428       sd->signal(BNET_EOD);
429    }
430
431    /*
432     * Open any file with data that we intend to save, then save it.
433     *
434     * Note, if is_win32_backup, we must open the Directory so that
435     * the BackupRead will save its permissions and ownership streams.
436     */
437    if (ff_pkt->type != FT_LNKSAVED && S_ISREG(ff_pkt->statp.st_mode)) {
438 #ifdef HAVE_WIN32
439       do_read = !is_portable_backup(&ff_pkt->bfd) || ff_pkt->statp.st_size > 0;
440 #else
441       do_read = ff_pkt->statp.st_size > 0;
442 #endif
443    } else if (ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO ||
444          (!is_portable_backup(&ff_pkt->bfd) && ff_pkt->type == FT_DIREND)) {
445       do_read = true;
446    }
447
448    if (do_read) {
449       btimer_t *tid;
450       if (ff_pkt->type == FT_FIFO) {
451          tid = start_thread_timer(pthread_self(), 60);
452       } else {
453          tid = NULL;
454       }
455       int noatime = ff_pkt->flags & FO_NOATIME ? O_NOATIME : 0;
456       if (bopen(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY | noatime, 0) < 0) {
457          ff_pkt->ff_errno = errno;
458          berrno be;
459          Jmsg(jcr, M_NOTSAVED, 0, _("     Cannot open %s: ERR=%s.\n"), ff_pkt->fname,
460               be.bstrerror());
461          jcr->Errors++;
462          if (tid) {
463             stop_thread_timer(tid);
464             tid = NULL;
465          }
466          goto good_rtn;
467       }
468       if (tid) {
469          stop_thread_timer(tid);
470          tid = NULL;
471       }
472
473       stat = send_data(jcr, data_stream, ff_pkt, digest, signing_digest);
474
475       if (ff_pkt->flags & FO_CHKCHANGES) {
476          has_file_changed(jcr, ff_pkt);
477       }
478
479       bclose(&ff_pkt->bfd);
480       
481       if (!stat) {
482          goto bail_out;
483       }
484    }
485
486 #ifdef HAVE_DARWIN_OS
487    /* Regular files can have resource forks and Finder Info */
488    if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) &&
489             ff_pkt->flags & FO_HFSPLUS)) {
490       if (ff_pkt->hfsinfo.rsrclength > 0) {
491          int flags;
492          int rsrc_stream;
493          if (!bopen_rsrc(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) {
494             ff_pkt->ff_errno = errno;
495             berrno be;
496             Jmsg(jcr, M_NOTSAVED, -1, _("     Cannot open resource fork for %s: ERR=%s.\n"), 
497                  ff_pkt->fname, be.bstrerror());
498             jcr->Errors++;
499             if (is_bopen(&ff_pkt->bfd)) {
500                bclose(&ff_pkt->bfd);
501             }
502             goto good_rtn;
503          }
504          flags = ff_pkt->flags;
505          ff_pkt->flags &= ~(FO_GZIP|FO_SPARSE);
506          if (flags & FO_ENCRYPT) {
507             rsrc_stream = STREAM_ENCRYPTED_MACOS_FORK_DATA;
508          } else {
509             rsrc_stream = STREAM_MACOS_FORK_DATA;
510          }
511          stat = send_data(jcr, rsrc_stream, ff_pkt, digest, signing_digest);
512          ff_pkt->flags = flags;
513          bclose(&ff_pkt->bfd);
514          if (!stat) {
515             goto bail_out;
516          }
517       }
518
519       Dmsg1(300, "Saving Finder Info for \"%s\"\n", ff_pkt->fname);
520       sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_HFSPLUS_ATTRIBUTES);
521       Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
522       memcpy(sd->msg, ff_pkt->hfsinfo.fndrinfo, 32);
523       sd->msglen = 32;
524       if (digest) {
525          crypto_digest_update(digest, (uint8_t *)sd->msg, sd->msglen);
526       }
527       if (signing_digest) {
528          crypto_digest_update(signing_digest, (uint8_t *)sd->msg, sd->msglen);
529       }
530       sd->send();
531       sd->signal(BNET_EOD);
532    }
533 #endif
534
535    if (ff_pkt->flags & FO_ACL) {
536       /* Read access ACLs for files, dirs and links */
537       if (!read_and_send_acl(jcr, BACL_TYPE_ACCESS, STREAM_UNIX_ATTRIBUTES_ACCESS_ACL)) {
538          goto bail_out;
539       }
540       /* Directories can have default ACLs too */
541       if (ff_pkt->type == FT_DIREND && (BACL_CAP & BACL_CAP_DEFAULTS_DIR)) {
542          if (!read_and_send_acl(jcr, BACL_TYPE_DEFAULT, STREAM_UNIX_ATTRIBUTES_DEFAULT_ACL)) {
543             goto bail_out;
544          }
545       }
546    }
547
548    /* Terminate the signing digest and send it to the Storage daemon */
549    if (signing_digest) {
550       uint32_t size = 0;
551
552       if ((sig = crypto_sign_new(jcr)) == NULL) {
553          Jmsg(jcr, M_FATAL, 0, _("Failed to allocate memory for crypto signature.\n"));
554          goto bail_out;
555       }
556
557       if (!crypto_sign_add_signer(sig, signing_digest, jcr->pki_keypair)) {
558          Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
559          goto bail_out;
560       }
561
562       /* Get signature size */
563       if (!crypto_sign_encode(sig, NULL, &size)) {
564          Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
565          goto bail_out;
566       }
567
568       /* Grow the bsock buffer to fit our message if necessary */
569       if (sizeof_pool_memory(sd->msg) < (int32_t)size) {
570          sd->msg = realloc_pool_memory(sd->msg, size);
571       }
572
573       /* Send our header */
574       sd->fsend("%ld %d 0", jcr->JobFiles, STREAM_SIGNED_DIGEST);
575       Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
576
577       /* Encode signature data */
578       if (!crypto_sign_encode(sig, (uint8_t *)sd->msg, &size)) {
579          Jmsg(jcr, M_FATAL, 0, _("An error occurred while signing the stream.\n"));
580          goto bail_out;
581       }
582
583       sd->msglen = size;
584       sd->send();
585       sd->signal(BNET_EOD);              /* end of checksum */
586    }
587
588    /* Terminate any digest and send it to Storage daemon and the Director */
589    if (digest) {
590       uint32_t size;
591
592       sd->fsend("%ld %d 0", jcr->JobFiles, digest_stream);
593       Dmsg1(300, "bfiled>stored:header %s\n", sd->msg);
594
595       size = CRYPTO_DIGEST_MAX_SIZE;
596
597       /* Grow the bsock buffer to fit our message if necessary */
598       if (sizeof_pool_memory(sd->msg) < (int32_t)size) {
599          sd->msg = realloc_pool_memory(sd->msg, size);
600       }
601
602       if (!crypto_digest_finalize(digest, (uint8_t *)sd->msg, &size)) {
603          Jmsg(jcr, M_FATAL, 0, _("An error occurred finalizing signing the stream.\n"));
604          goto bail_out;
605       }
606
607       sd->msglen = size;
608       sd->send();
609       sd->signal(BNET_EOD);              /* end of checksum */
610    }
611
612 good_rtn:
613    rtnstat = 1;                       /* good return */
614
615 bail_out:
616    if (digest) {
617       crypto_digest_free(digest);
618    }
619    if (signing_digest) {
620       crypto_digest_free(signing_digest);
621    }
622    if (sig) {
623       crypto_sign_free(sig);        
624    }
625    return rtnstat;
626 }
627
628 /*
629  * Send data read from an already open file descriptor.
630  *
631  * We return 1 on sucess and 0 on errors.
632  *
633  * ***FIXME***
634  * We use ff_pkt->statp.st_size when FO_SPARSE to know when to stop
635  *  reading.
636  * Currently this is not a problem as the only other stream, resource forks,
637  * are not handled as sparse files.
638  */
639 int send_data(JCR *jcr, int stream, FF_PKT *ff_pkt, DIGEST *digest, 
640               DIGEST *signing_digest)
641 {
642    BSOCK *sd = jcr->store_bsock;
643    uint64_t fileAddr = 0;             /* file address */
644    char *rbuf, *wbuf;
645    int32_t rsize = jcr->buf_size;      /* read buffer size */
646    POOLMEM *msgsave;
647    CIPHER_CONTEXT *cipher_ctx = NULL; /* Quell bogus uninitialized warnings */
648    const uint8_t *cipher_input;
649    uint32_t cipher_input_len;
650    uint32_t cipher_block_size;
651    uint32_t encrypted_len;
652 #ifdef FD_NO_SEND_TEST
653    return 1;
654 #endif
655
656    msgsave = sd->msg;
657    rbuf = sd->msg;                    /* read buffer */
658    wbuf = sd->msg;                    /* write buffer */
659    cipher_input = (uint8_t *)rbuf;    /* encrypt uncompressed data */
660
661    Dmsg1(300, "Saving data, type=%d\n", ff_pkt->type);
662
663 #ifdef HAVE_LIBZ
664    uLong compress_len = 0;
665    uLong max_compress_len = 0;
666    const Bytef *cbuf = NULL;
667    int zstat;
668
669    if (ff_pkt->flags & FO_GZIP) {
670       if (ff_pkt->flags & FO_SPARSE) {
671          cbuf = (Bytef *)jcr->compress_buf + SPARSE_FADDR_SIZE;
672          max_compress_len = jcr->compress_buf_size - SPARSE_FADDR_SIZE;
673       } else {
674          cbuf = (Bytef *)jcr->compress_buf;
675          max_compress_len = jcr->compress_buf_size; /* set max length */
676       }
677       wbuf = jcr->compress_buf;    /* compressed output here */
678       cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */
679
680       /* 
681        * Only change zlib parameters if there is no pending operation.
682        * This should never happen as deflatereset is called after each
683        * deflate.
684        */
685
686       if (((z_stream*)jcr->pZLIB_compress_workset)->total_in == 0) {
687          /* set gzip compression level - must be done per file */
688          if ((zstat=deflateParams((z_stream*)jcr->pZLIB_compress_workset, 
689               ff_pkt->GZIP_level, Z_DEFAULT_STRATEGY)) != Z_OK) {
690             Jmsg(jcr, M_FATAL, 0, _("Compression deflateParams error: %d\n"), zstat);
691             set_jcr_job_status(jcr, JS_ErrorTerminated);
692             goto err;
693          }
694       }
695    }
696 #else
697    const uint32_t max_compress_len = 0;
698 #endif
699
700    if (ff_pkt->flags & FO_ENCRYPT) {
701       if (ff_pkt->flags & FO_SPARSE) {
702          Jmsg0(jcr, M_FATAL, 0, _("Encrypting sparse data not supported.\n"));
703          goto err;
704       }
705       /* Allocate the cipher context */
706       if ((cipher_ctx = crypto_cipher_new(jcr->pki_session, true, 
707            &cipher_block_size)) == NULL) {
708          /* Shouldn't happen! */
709          Jmsg0(jcr, M_FATAL, 0, _("Failed to initialize encryption context.\n"));
710          goto err;
711       }
712
713       /*
714        * Grow the crypto buffer, if necessary.
715        * crypto_cipher_update() will buffer up to (cipher_block_size - 1).
716        * We grow crypto_buf to the maximum number of blocks that
717        * could be returned for the given read buffer size.
718        * (Using the larger of either rsize or max_compress_len)
719        */
720       jcr->crypto_buf = check_pool_memory_size(jcr->crypto_buf, 
721            (MAX(rsize + (int)sizeof(uint32_t), (int32_t)max_compress_len) + 
722             cipher_block_size - 1) / cipher_block_size * cipher_block_size);
723
724       wbuf = jcr->crypto_buf; /* Encrypted, possibly compressed output here. */
725    }
726
727    /*
728     * Send Data header to Storage daemon
729     *    <file-index> <stream> <info>
730     */
731    if (!sd->fsend("%ld %d 0", jcr->JobFiles, stream)) {
732       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
733             sd->bstrerror());
734       goto err;
735    }
736    Dmsg1(300, ">stored: datahdr %s\n", sd->msg);
737
738    /*
739     * Make space at beginning of buffer for fileAddr because this
740     *   same buffer will be used for writing if compression is off.
741     */
742    if (ff_pkt->flags & FO_SPARSE) {
743       rbuf += SPARSE_FADDR_SIZE;
744       rsize -= SPARSE_FADDR_SIZE;
745 #ifdef HAVE_FREEBSD_OS
746       /*
747        * To read FreeBSD partitions, the read size must be
748        *  a multiple of 512.
749        */
750       rsize = (rsize/512) * 512;
751 #endif
752    }
753
754    /* a RAW device read on win32 only works if the buffer is a multiple of 512 */
755 #ifdef HAVE_WIN32
756    if (S_ISBLK(ff_pkt->statp.st_mode))
757       rsize = (rsize/512) * 512;
758 #endif
759    
760    /*
761     * Read the file data
762     */
763    while ((sd->msglen=(uint32_t)bread(&ff_pkt->bfd, rbuf, rsize)) > 0) {
764
765       /* Check for sparse blocks */
766       if (ff_pkt->flags & FO_SPARSE) {
767          ser_declare;
768          bool haveBlock = true;
769          if (sd->msglen == rsize &&
770              fileAddr+sd->msglen < (uint64_t)ff_pkt->statp.st_size ||
771              ((ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO) &&
772                (uint64_t)ff_pkt->statp.st_size == 0)) {
773             haveBlock = !is_buf_zero(rbuf, rsize);
774          }
775          if (haveBlock) {
776             ser_begin(wbuf, SPARSE_FADDR_SIZE);
777             ser_uint64(fileAddr);     /* store fileAddr in begin of buffer */
778          }
779          fileAddr += sd->msglen;      /* update file address */
780          if (!haveBlock) {
781             continue;                 /* skip block of zeros */
782          }
783       }
784
785       jcr->ReadBytes += sd->msglen;         /* count bytes read */
786
787       /* Uncompressed cipher input length */
788       cipher_input_len = sd->msglen;
789
790       /* Update checksum if requested */
791       if (digest) {
792          crypto_digest_update(digest, (uint8_t *)rbuf, sd->msglen);
793       }
794
795       /* Update signing digest if requested */
796       if (signing_digest) {
797          crypto_digest_update(signing_digest, (uint8_t *)rbuf, sd->msglen);
798       }
799
800 #ifdef HAVE_LIBZ
801       /* Do compression if turned on */
802       if (ff_pkt->flags & FO_GZIP && jcr->pZLIB_compress_workset) {
803          Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", cbuf, rbuf, sd->msglen);
804          
805          ((z_stream*)jcr->pZLIB_compress_workset)->next_in   = (Bytef *)rbuf;
806                 ((z_stream*)jcr->pZLIB_compress_workset)->avail_in  = sd->msglen;
807          ((z_stream*)jcr->pZLIB_compress_workset)->next_out  = (Bytef *)cbuf;
808                 ((z_stream*)jcr->pZLIB_compress_workset)->avail_out = max_compress_len;
809
810          if ((zstat=deflate((z_stream*)jcr->pZLIB_compress_workset, Z_FINISH)) != Z_STREAM_END) {
811             Jmsg(jcr, M_FATAL, 0, _("Compression deflate error: %d\n"), zstat);
812             set_jcr_job_status(jcr, JS_ErrorTerminated);
813             goto err;
814          }
815          compress_len = ((z_stream*)jcr->pZLIB_compress_workset)->total_out;
816          /* reset zlib stream to be able to begin from scratch again */
817          if ((zstat=deflateReset((z_stream*)jcr->pZLIB_compress_workset)) != Z_OK) {
818             Jmsg(jcr, M_FATAL, 0, _("Compression deflateReset error: %d\n"), zstat);
819             set_jcr_job_status(jcr, JS_ErrorTerminated);
820             goto err;
821          }
822
823          Dmsg2(400, "compressed len=%d uncompressed len=%d\n", compress_len, 
824                sd->msglen);
825
826          sd->msglen = compress_len;      /* set compressed length */
827          cipher_input_len = compress_len;
828       }
829 #endif
830       /* 
831        * Note, here we prepend the current record length to the beginning
832        *  of the encrypted data. This is because both sparse and compression
833        *  restore handling want records returned to them with exactly the
834        *  same number of bytes that were processed in the backup handling.
835        *  That is, both are block filters rather than a stream.  When doing
836        *  compression, the compression routines may buffer data, so that for
837        *  any one record compressed, when it is decompressed the same size
838        *  will not be obtained. Of course, the buffered data eventually comes
839        *  out in subsequent crypto_cipher_update() calls or at least
840        *  when crypto_cipher_finalize() is called.  Unfortunately, this
841        *  "feature" of encryption enormously complicates the restore code.
842        */
843       if (ff_pkt->flags & FO_ENCRYPT) {
844          uint32_t initial_len = 0;
845          ser_declare;
846
847          if (ff_pkt->flags & FO_SPARSE) {
848             cipher_input_len += SPARSE_FADDR_SIZE;
849          }
850
851          /* Encrypt the length of the input block */
852          uint8_t packet_len[sizeof(uint32_t)];
853
854          ser_begin(packet_len, sizeof(uint32_t));
855          ser_uint32(cipher_input_len);    /* store data len in begin of buffer */
856          Dmsg1(20, "Encrypt len=%d\n", cipher_input_len);
857
858          if (!crypto_cipher_update(cipher_ctx, packet_len, sizeof(packet_len),
859              (u_int8_t *)jcr->crypto_buf, &initial_len)) {
860             /* Encryption failed. Shouldn't happen. */
861             Jmsg(jcr, M_FATAL, 0, _("Encryption error\n"));
862             goto err;
863          }
864
865          /* Encrypt the input block */
866          if (crypto_cipher_update(cipher_ctx, cipher_input, cipher_input_len, 
867              (u_int8_t *)&jcr->crypto_buf[initial_len], &encrypted_len)) {
868             if ((initial_len + encrypted_len) == 0) {
869                /* No full block of data available, read more data */
870                continue;
871             }
872             Dmsg2(400, "encrypted len=%d unencrypted len=%d\n", encrypted_len, 
873                   sd->msglen);
874             sd->msglen = initial_len + encrypted_len; /* set encrypted length */
875          } else {
876             /* Encryption failed. Shouldn't happen. */
877             Jmsg(jcr, M_FATAL, 0, _("Encryption error\n"));
878             goto err;
879          }
880       }
881
882       /* Send the buffer to the Storage daemon */
883       if (ff_pkt->flags & FO_SPARSE) {
884          sd->msglen += SPARSE_FADDR_SIZE; /* include fileAddr in size */
885       }
886       sd->msg = wbuf;              /* set correct write buffer */
887       if (!sd->send()) {
888          Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
889                sd->bstrerror());
890          goto err;
891       }
892       Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
893       /*          #endif */
894       jcr->JobBytes += sd->msglen;      /* count bytes saved possibly compressed/encrypted */
895       sd->msg = msgsave;                /* restore read buffer */
896
897    } /* end while read file data */
898
899    if (sd->msglen < 0) {                 /* error */
900       berrno be;
901       Jmsg(jcr, M_ERROR, 0, _("Read error on file %s. ERR=%s\n"),
902          ff_pkt->fname, be.bstrerror(ff_pkt->bfd.berrno));
903       if (jcr->Errors++ > 1000) {       /* insanity check */
904          Jmsg(jcr, M_FATAL, 0, _("Too many errors.\n"));
905       }
906    } else if (ff_pkt->flags & FO_ENCRYPT) {
907       /* 
908        * For encryption, we must call finalize to push out any
909        *  buffered data.
910        */
911       if (!crypto_cipher_finalize(cipher_ctx, (uint8_t *)jcr->crypto_buf, 
912            &encrypted_len)) {
913          /* Padding failed. Shouldn't happen. */
914          Jmsg(jcr, M_FATAL, 0, _("Encryption padding error\n"));
915          goto err;
916       }
917
918       /* Note, on SSL pre-0.9.7, there is always some output */
919       if (encrypted_len > 0) {
920          sd->msglen = encrypted_len;      /* set encrypted length */
921          sd->msg = jcr->crypto_buf;       /* set correct write buffer */
922          if (!sd->send()) {
923             Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
924                   sd->bstrerror());
925             goto err;
926          }
927          Dmsg1(130, "Send data to SD len=%d\n", sd->msglen);
928          jcr->JobBytes += sd->msglen;     /* count bytes saved possibly compressed/encrypted */
929          sd->msg = msgsave;               /* restore bnet buffer */
930       }
931    }
932
933    if (!sd->signal(BNET_EOD)) {        /* indicate end of file data */
934       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
935             sd->bstrerror());
936       goto err;
937    }
938
939    /* Free the cipher context */
940    if (cipher_ctx) {
941       crypto_cipher_free(cipher_ctx);
942    }
943    return 1;
944
945 err:
946    /* Free the cipher context */
947    if (cipher_ctx) {
948       crypto_cipher_free(cipher_ctx);
949    }
950
951    sd->msg = msgsave; /* restore bnet buffer */
952    sd->msglen = 0;
953    return 0;
954 }
955
956 /*
957  * Read and send an ACL for the last encountered file.
958  */
959 static bool read_and_send_acl(JCR *jcr, int acltype, int stream)
960 {
961 #ifdef HAVE_ACL
962    BSOCK *sd = jcr->store_bsock;
963    POOLMEM *msgsave;
964    int len;
965 #ifdef FD_NO_SEND_TEST
966    return true;
967 #endif
968
969    len = bacl_get(jcr, acltype);
970    if (len < 0) {
971       Jmsg1(jcr, M_WARNING, 0, _("Error reading ACL of %s\n"), jcr->last_fname);
972       return true; 
973    }
974    if (len == 0) {
975       return true;                    /* no ACL */
976    }
977
978    /* Send header */
979    if (!sd->fsend("%ld %d 0", jcr->JobFiles, stream)) {
980       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
981             sd->bstrerror());
982       return false;
983    }
984
985    /* Send the buffer to the storage deamon */
986    Dmsg2(400, "Backing up ACL type 0x%2x <%s>\n", acltype, jcr->acl_text);
987    msgsave = sd->msg;
988    sd->msg = jcr->acl_text;
989    sd->msglen = len + 1;
990    if (!sd->send()) {
991       sd->msg = msgsave;
992       sd->msglen = 0;
993       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
994             sd->bstrerror());
995       return false;
996    }
997
998    jcr->JobBytes += sd->msglen;
999    sd->msg = msgsave;
1000    if (!sd->signal(BNET_EOD)) {
1001       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1002             sd->bstrerror());
1003       return false;
1004    }
1005
1006    Dmsg1(200, "ACL of file: %s successfully backed up!\n", jcr->last_fname);
1007 #endif
1008    return true;
1009 }
1010
1011 static bool encode_and_send_attributes(JCR *jcr, FF_PKT *ff_pkt, int &data_stream) 
1012 {
1013    BSOCK *sd = jcr->store_bsock;
1014    char attribs[MAXSTRING];
1015    char attribsEx[MAXSTRING];
1016    int attr_stream;
1017    int stat;
1018 #ifdef FD_NO_SEND_TEST
1019    return true;
1020 #endif
1021
1022    Dmsg1(300, "encode_and_send_attrs fname=%s\n", ff_pkt->fname);
1023    /* Find what data stream we will use, then encode the attributes */
1024    if ((data_stream = select_data_stream(ff_pkt)) == STREAM_NONE) {
1025       /* This should not happen */
1026       Jmsg0(jcr, M_FATAL, 0, _("Invalid file flags, no supported data stream type.\n"));
1027       return false;
1028    }
1029    encode_stat(attribs, ff_pkt, data_stream);
1030
1031    /* Now possibly extend the attributes */
1032    attr_stream = encode_attribsEx(jcr, attribsEx, ff_pkt);
1033
1034    Dmsg3(300, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx);
1035
1036    jcr->lock();
1037    jcr->JobFiles++;                    /* increment number of files sent */
1038    ff_pkt->FileIndex = jcr->JobFiles;  /* return FileIndex */
1039    pm_strcpy(jcr->last_fname, ff_pkt->fname);
1040    jcr->unlock();
1041
1042    /*
1043     * Send Attributes header to Storage daemon
1044     *    <file-index> <stream> <info>
1045     */
1046    if (!sd->fsend("%ld %d 0", jcr->JobFiles, attr_stream)) {
1047       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1048             sd->bstrerror());
1049       return false;
1050    }
1051    Dmsg1(300, ">stored: attrhdr %s\n", sd->msg);
1052
1053    /*
1054     * Send file attributes to Storage daemon
1055     *   File_index
1056     *   File type
1057     *   Filename (full path)
1058     *   Encoded attributes
1059     *   Link name (if type==FT_LNK or FT_LNKSAVED)
1060     *   Encoded extended-attributes (for Win32)
1061     *
1062     * For a directory, link is the same as fname, but with trailing
1063     * slash. For a linked file, link is the link.
1064     */
1065    strip_path(ff_pkt);
1066    if (ff_pkt->type == FT_LNK || ff_pkt->type == FT_LNKSAVED) {
1067       Dmsg2(300, "Link %s to %s\n", ff_pkt->fname, ff_pkt->link);
1068       stat = sd->fsend("%ld %d %s%c%s%c%s%c%s%c", jcr->JobFiles,
1069                ff_pkt->type, ff_pkt->fname, 0, attribs, 0, ff_pkt->link, 0,
1070                attribsEx, 0);
1071    } else if (ff_pkt->type == FT_DIREND) {
1072       /* Here link is the canonical filename (i.e. with trailing slash) */
1073       stat = sd->fsend("%ld %d %s%c%s%c%c%s%c", jcr->JobFiles,
1074                ff_pkt->type, ff_pkt->link, 0, attribs, 0, 0, attribsEx, 0);
1075    } else {
1076       stat = sd->fsend("%ld %d %s%c%s%c%c%s%c", jcr->JobFiles,
1077                ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, attribsEx, 0);
1078    }
1079    unstrip_path(ff_pkt);
1080
1081    Dmsg2(300, ">stored: attr len=%d: %s\n", sd->msglen, sd->msg);
1082    if (!stat) {
1083       Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"),
1084             sd->bstrerror());
1085       return false;
1086    }
1087    sd->signal(BNET_EOD);            /* indicate end of attributes data */
1088    return true;
1089 }
1090
1091 /* 
1092  * Do in place strip of path
1093  */
1094 static bool do_strip(int count, char *in)
1095 {
1096    char *out = in;
1097    int stripped;
1098    int numsep = 0;
1099
1100    /* Copy to first path separator -- Win32 might have c: ... */
1101    while (*in && !IsPathSeparator(*in)) {    
1102       *out++ = *in++;
1103    }
1104    *out++ = *in++;
1105    numsep++;                     /* one separator seen */
1106    for (stripped=0; stripped<count && *in; stripped++) {
1107       while (*in && !IsPathSeparator(*in)) {
1108          in++;                   /* skip chars */
1109       }
1110       if (*in) {
1111          numsep++;               /* count separators seen */
1112          in++;                   /* skip separator */
1113       }
1114    }
1115    /* Copy to end */
1116    while (*in) {                /* copy to end */
1117       if (IsPathSeparator(*in)) {
1118          numsep++;
1119       }
1120       *out++ = *in++;
1121    }
1122    *out = 0;
1123    Dmsg4(500, "stripped=%d count=%d numsep=%d sep>count=%d\n", 
1124          stripped, count, numsep, numsep>count);
1125    return stripped==count && numsep>count;
1126 }
1127
1128 /*
1129  * If requested strip leading components of the path
1130  */
1131 static void strip_path(FF_PKT *ff_pkt)
1132 {
1133    if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) {
1134       Dmsg1(200, "No strip for %s\n", ff_pkt->fname);
1135       return;
1136    }
1137    if (!ff_pkt->fname_save) {
1138      ff_pkt->fname_save = get_pool_memory(PM_FNAME); 
1139      ff_pkt->link_save = get_pool_memory(PM_FNAME);
1140    }
1141    pm_strcpy(ff_pkt->fname_save, ff_pkt->fname);
1142
1143    /* 
1144     * Strip path.  If it doesn't succeed put it back.  If
1145     *  it does, and there is a different link string,
1146     *  attempt to strip the link. If it fails, but them
1147     *  both back.
1148     * I.e. if either stripping fails don't strip anything.
1149     */
1150    if (do_strip(ff_pkt->strip_path, ff_pkt->fname)) {
1151       if (ff_pkt->fname != ff_pkt->link) {
1152          pm_strcpy(ff_pkt->link_save, ff_pkt->link);
1153          if (!do_strip(ff_pkt->strip_path, ff_pkt->link)) {
1154             strcpy(ff_pkt->link, ff_pkt->link_save);
1155             strcpy(ff_pkt->fname, ff_pkt->fname_save);
1156          }
1157       }
1158    } else {
1159       strcpy(ff_pkt->fname, ff_pkt->fname_save);
1160    } 
1161    Dmsg2(200, "fname=%s stripped=%s\n", ff_pkt->fname_save, ff_pkt->fname);
1162 }
1163
1164 static void unstrip_path(FF_PKT *ff_pkt)
1165 {
1166    if (!(ff_pkt->flags & FO_STRIPPATH) || ff_pkt->strip_path <= 0) {
1167       return;
1168    }
1169    strcpy(ff_pkt->fname, ff_pkt->fname_save);
1170    if (ff_pkt->fname != ff_pkt->link) {
1171       strcpy(ff_pkt->link, ff_pkt->link_save);
1172    }
1173 }