From: Kern Sibbald Date: Wed, 15 Mar 2017 10:40:49 +0000 (+0100) Subject: Attempt once again to fix OpenBSD acl/xattr problems X-Git-Tag: Release-7.4.7~6 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9a00f0ca3b597d70bf73911b2138fab7ae333ef9;p=bacula%2Fbacula Attempt once again to fix OpenBSD acl/xattr problems --- diff --git a/bacula/src/filed/backup.c b/bacula/src/filed/backup.c index a036cb6a07..5b2138e729 100644 --- a/bacula/src/filed/backup.c +++ b/bacula/src/filed/backup.c @@ -1,7 +1,7 @@ /* Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2016 Kern Sibbald + Copyright (C) 2000-2017 Kern Sibbald The original author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -17,7 +17,7 @@ Bacula(R) is a registered trademark of Kern Sibbald. */ /* - * Bacula File Daemon backup.c send file attributes and data + * Bacula File Daemon backup.c send file attributes and data * to the Storage daemon. * * Kern Sibbald, March MM @@ -82,7 +82,7 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) if (client) { buf_size = client->max_network_buffer_size; } else { - buf_size = 0; /* use default */ + buf_size = 0; /* use default */ } if (!sd->set_buffer_size(buf_size, BNET_SETBUF_WRITE)) { jcr->setJobStatus(JS_ErrorTerminated); @@ -99,7 +99,7 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) * same output buffer can be used without growing it. * * For LZO1X compression the recommended value is : - * output_block_size = input_block_size + (input_block_size / 16) + 64 + 3 + sizeof(comp_stream_header) + * output_block_size = input_block_size + (input_block_size / 16) + 64 + 3 + sizeof(comp_stream_header) * * The zlib compression workset is initialized here to minimize * the "per file" load. The jcr member is only set, if the init @@ -124,9 +124,9 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) pZlibStream->state = Z_NULL; if (deflateInit(pZlibStream, Z_DEFAULT_COMPRESSION) == Z_OK) { - jcr->pZLIB_compress_workset = pZlibStream; + jcr->pZLIB_compress_workset = pZlibStream; } else { - free (pZlibStream); + free (pZlibStream); } } #endif @@ -135,9 +135,9 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) lzo_voidp pLzoMem = (lzo_voidp) malloc(LZO1X_1_MEM_COMPRESS); if (pLzoMem) { if (lzo_init() == LZO_E_OK) { - jcr->LZO_compress_workset = pLzoMem; + jcr->LZO_compress_workset = pLzoMem; } else { - free (pLzoMem); + free (pLzoMem); } } #endif @@ -159,27 +159,29 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) /* Subroutine save_file() is called for each file */ if (!find_files(jcr, (FF_PKT *)jcr->ff, save_file, plugin_save)) { - ok = false; /* error */ + ok = false; /* error */ jcr->setJobStatus(JS_ErrorTerminated); } - if (jcr->xacl->get_acl_nr_errors() > 0) { - Jmsg(jcr, M_WARNING, 0, _("Had %ld acl errors while doing backup\n"), jcr->xacl->get_acl_nr_errors()); - } - - if (jcr->xacl->get_xattr_nr_errors() > 0) { - Jmsg(jcr, M_WARNING, 0, _("Had %ld xattr errors while doing backup\n"), jcr->xacl->get_xattr_nr_errors()); + if (jcr->xacl) { + if (jcr->xacl->get_acl_nr_errors() > 0) { + Jmsg(jcr, M_WARNING, 0, _("Had %ld acl errors while doing backup\n"), + jcr->xacl->get_acl_nr_errors()); + } + if (jcr->xacl->get_xattr_nr_errors() > 0) { + Jmsg(jcr, M_WARNING, 0, _("Had %ld xattr errors while doing backup\n"), + jcr->xacl->get_xattr_nr_errors()); + } } - /* Delete or keep snapshots */ close_snapshot_backup_session(jcr); close_vss_backup_session(jcr); - accurate_finish(jcr); /* send deleted or base file list to SD */ + accurate_finish(jcr); /* send deleted or base file list to SD */ stop_heartbeat_monitor(jcr); - sd->signal(BNET_EOD); /* end of sending data */ + sd->signal(BNET_EOD); /* end of sending data */ if (jcr->xacl) { delete(jcr->xacl); @@ -217,8 +219,8 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr) * Send the file and its data to the Storage daemon. * * Returns: 1 if OK - * 0 if error - * -1 to ignore file/directory (not used here) + * 0 if error + * -1 to ignore file/directory (not used here) */ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) { @@ -228,9 +230,9 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) int stat; int rtnstat = 0; bool has_file_data = false; - struct save_pkt sp; /* used by option plugin */ + struct save_pkt sp; /* used by option plugin */ BSOCK *sd = jcr->store_bsock; - bctx_t bctx; /* backup context */ + bctx_t bctx; /* backup context */ memset(&bctx, 0, sizeof(bctx)); bctx.sd = sd; @@ -241,10 +243,10 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) time_t now = time(NULL); if (jcr->last_stat_time == 0) { jcr->last_stat_time = now; - jcr->stat_interval = 30; /* Default 30 seconds */ + jcr->stat_interval = 30; /* Default 30 seconds */ } else if (now >= jcr->last_stat_time + jcr->stat_interval) { jcr->dir_bsock->fsend("Progress Job=x files=%ld bytes=%lld bps=%ld\n", - jcr->JobFiles, jcr->JobBytes, jcr->LastRate); + jcr->JobFiles, jcr->JobBytes, jcr->LastRate); jcr->last_stat_time = now; } @@ -253,10 +255,10 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) return 0; } - jcr->num_files_examined++; /* bump total file count */ + jcr->num_files_examined++; /* bump total file count */ switch (ff_pkt->type) { - case FT_LNKSAVED: /* Hard linked, file already saved */ + case FT_LNKSAVED: /* Hard linked, file already saved */ Dmsg2(130, "FT_LNKSAVED hard link: %s => %s\n", ff_pkt->fname, ff_pkt->link); break; case FT_REGE: @@ -278,28 +280,28 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) break; case FT_DIRBEGIN: jcr->num_files_examined--; /* correct file count */ - return 1; /* not used */ + return 1; /* not used */ case FT_NORECURSE: - Jmsg(jcr, M_INFO, 1, _(" Recursion turned off. Will not descend from %s into %s\n"), - ff_pkt->top_fname, ff_pkt->fname); + Jmsg(jcr, M_INFO, 1, _(" Recursion turned off. Will not descend from %s into %s\n"), + ff_pkt->top_fname, ff_pkt->fname); ff_pkt->type = FT_DIREND; /* Backup only the directory entry */ break; case FT_NOFSCHG: /* Suppress message for /dev filesystems */ if (!is_in_fileset(ff_pkt)) { - Jmsg(jcr, M_INFO, 1, _(" %s is a different filesystem. Will not descend from %s into it.\n"), - ff_pkt->fname, ff_pkt->top_fname); + Jmsg(jcr, M_INFO, 1, _(" %s is a different filesystem. Will not descend from %s into it.\n"), + ff_pkt->fname, ff_pkt->top_fname); } ff_pkt->type = FT_DIREND; /* Backup only the directory entry */ break; case FT_INVALIDFS: - Jmsg(jcr, M_INFO, 1, _(" Disallowed filesystem. Will not descend from %s into %s\n"), - ff_pkt->top_fname, ff_pkt->fname); + Jmsg(jcr, M_INFO, 1, _(" Disallowed filesystem. Will not descend from %s into %s\n"), + ff_pkt->top_fname, ff_pkt->fname); ff_pkt->type = FT_DIREND; /* Backup only the directory entry */ break; case FT_INVALIDDT: - Jmsg(jcr, M_INFO, 1, _(" Disallowed drive type. Will not descend into %s\n"), - ff_pkt->fname); + Jmsg(jcr, M_INFO, 1, _(" Disallowed drive type. Will not descend into %s\n"), + ff_pkt->fname); break; case FT_REPARSE: case FT_JUNCTION: @@ -309,8 +311,8 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) case FT_SPEC: Dmsg1(130, "FT_SPEC saving: %s\n", ff_pkt->fname); if (S_ISSOCK(ff_pkt->statp.st_mode)) { - Jmsg(jcr, M_SKIPPED, 1, _(" Socket file skipped: %s\n"), ff_pkt->fname); - return 1; + Jmsg(jcr, M_SKIPPED, 1, _(" Socket file skipped: %s\n"), ff_pkt->fname); + return 1; } break; case FT_RAW: @@ -323,21 +325,21 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) case FT_NOACCESS: { berrno be; Jmsg(jcr, M_NOTSAVED, 0, _(" Could not access \"%s\": ERR=%s\n"), ff_pkt->fname, - be.bstrerror(ff_pkt->ff_errno)); + be.bstrerror(ff_pkt->ff_errno)); jcr->JobErrors++; return 1; } case FT_NOFOLLOW: { berrno be; Jmsg(jcr, M_NOTSAVED, 0, _(" Could not follow link \"%s\": ERR=%s\n"), - ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno)); + ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno)); jcr->JobErrors++; return 1; } case FT_NOSTAT: { berrno be; Jmsg(jcr, M_NOTSAVED, 0, _(" Could not stat \"%s\": ERR=%s\n"), ff_pkt->fname, - be.bstrerror(ff_pkt->ff_errno)); + be.bstrerror(ff_pkt->ff_errno)); jcr->JobErrors++; return 1; } @@ -351,7 +353,7 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) case FT_NOOPEN: { berrno be; Jmsg(jcr, M_NOTSAVED, 0, _(" Could not open directory \"%s\": ERR=%s\n"), - ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno)); + ff_pkt->fname, be.bstrerror(ff_pkt->ff_errno)); jcr->JobErrors++; return 1; } @@ -359,8 +361,8 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) Dmsg1(130, "FT_DELETED: %s\n", ff_pkt->fname); break; default: - Jmsg(jcr, M_NOTSAVED, 0, _(" Unknown file type %d; not saved: %s\n"), - ff_pkt->type, ff_pkt->fname); + Jmsg(jcr, M_NOTSAVED, 0, _(" Unknown file type %d; not saved: %s\n"), + ff_pkt->type, ff_pkt->fname); jcr->JobErrors++; return 1; } @@ -387,27 +389,27 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) /* ask the option plugin what to do with this file */ switch (plugin_option_handle_file(jcr, ff_pkt, &sp)) { case bRC_OK: - Dmsg2(10, "Option plugin %s will be used to backup %s\n", - ff_pkt->plugin, ff_pkt->fname); - do_plugin_set = true; - break; + Dmsg2(10, "Option plugin %s will be used to backup %s\n", + ff_pkt->plugin, ff_pkt->fname); + do_plugin_set = true; + break; case bRC_Skip: - Dmsg2(10, "Option plugin %s decided to skip %s\n", - ff_pkt->plugin, ff_pkt->fname); - goto good_rtn; + Dmsg2(10, "Option plugin %s decided to skip %s\n", + ff_pkt->plugin, ff_pkt->fname); + goto good_rtn; default: - Dmsg2(10, "Option plugin %s decided to let bacula handle %s\n", - ff_pkt->plugin, ff_pkt->fname); - break; + Dmsg2(10, "Option plugin %s decided to let bacula handle %s\n", + ff_pkt->plugin, ff_pkt->fname); + break; } } if (do_plugin_set) { /* Tell bfile that it needs to call plugin */ if (!set_cmd_plugin(&ff_pkt->bfd, jcr)) { - goto bail_out; + goto bail_out; } - send_plugin_name(jcr, sd, true); /* signal start of plugin data */ + send_plugin_name(jcr, sd, true); /* signal start of plugin data */ plugin_started = true; } @@ -426,7 +428,7 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) /** Set up the encryption context and send the session data to the SD */ if (has_file_data && jcr->crypto.pki_encrypt) { if (!crypto_session_send(jcr, sd)) { - goto bail_out; + goto bail_out; } } @@ -443,8 +445,8 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) do_read = ff_pkt->statp.st_size > 0; #endif } else if (ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO || - ff_pkt->type == FT_REPARSE || ff_pkt->type == FT_JUNCTION || - (!is_portable_backup(&ff_pkt->bfd) && ff_pkt->type == FT_DIREND)) { + ff_pkt->type == FT_REPARSE || ff_pkt->type == FT_JUNCTION || + (!is_portable_backup(&ff_pkt->bfd) && ff_pkt->type == FT_DIREND)) { do_read = true; } @@ -457,41 +459,41 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) btimer_t *tid; if (ff_pkt->type == FT_FIFO) { - tid = start_thread_timer(jcr, pthread_self(), 60); + tid = start_thread_timer(jcr, pthread_self(), 60); } else { - tid = NULL; + tid = NULL; } int noatime = ff_pkt->flags & FO_NOATIME ? O_NOATIME : 0; ff_pkt->bfd.reparse_point = (ff_pkt->type == FT_REPARSE || - ff_pkt->type == FT_JUNCTION); + ff_pkt->type == FT_JUNCTION); set_fattrs(&ff_pkt->bfd, &ff_pkt->statp); if (bopen(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY | noatime, 0) < 0) { - ff_pkt->ff_errno = errno; - berrno be; - Jmsg(jcr, M_NOTSAVED, 0, _(" Cannot open \"%s\": ERR=%s.\n"), ff_pkt->fname, - be.bstrerror()); - jcr->JobErrors++; - if (tid) { - stop_thread_timer(tid); - tid = NULL; - } - goto good_rtn; + ff_pkt->ff_errno = errno; + berrno be; + Jmsg(jcr, M_NOTSAVED, 0, _(" Cannot open \"%s\": ERR=%s.\n"), ff_pkt->fname, + be.bstrerror()); + jcr->JobErrors++; + if (tid) { + stop_thread_timer(tid); + tid = NULL; + } + goto good_rtn; } if (tid) { - stop_thread_timer(tid); - tid = NULL; + stop_thread_timer(tid); + tid = NULL; } stat = send_data(bctx, bctx.data_stream); if (ff_pkt->flags & FO_CHKCHANGES) { - has_file_changed(jcr, ff_pkt); + has_file_changed(jcr, ff_pkt); } bclose(&ff_pkt->bfd); if (!stat) { - goto bail_out; + goto bail_out; } } @@ -507,10 +509,10 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level) */ if (jcr->xacl){ if (jcr->xacl->backup_acl(jcr, ff_pkt) == bRC_XACL_error) { - goto bail_out; + goto bail_out; } if (jcr->xacl->backup_xattr(jcr, ff_pkt) == bRC_XACL_error) { - goto bail_out; + goto bail_out; } } @@ -530,7 +532,7 @@ bail_out: send_plugin_name(jcr, sd, false); /* signal end of plugin data */ } if (ff_pkt->opt_plugin) { - jcr->plugin_sp = NULL; /* sp is local to this function */ + jcr->plugin_sp = NULL; /* sp is local to this function */ jcr->plugin_ctx = NULL; jcr->plugin = NULL; jcr->opt_plugin = false; @@ -563,9 +565,9 @@ static int send_data(bctx_t &bctx, int stream) bctx.fileAddr = 0; bctx.cipher_ctx = NULL; bctx.msgsave = sd->msg; - bctx.rbuf = sd->msg; /* read buffer */ - bctx.wbuf = sd->msg; /* write buffer */ - bctx.cipher_input = (uint8_t *)bctx.rbuf; /* encrypt uncompressed data */ + bctx.rbuf = sd->msg; /* read buffer */ + bctx.wbuf = sd->msg; /* write buffer */ + bctx.cipher_input = (uint8_t *)bctx.rbuf; /* encrypt uncompressed data */ Dmsg1(300, "Saving data, type=%d\n", bctx.ff_pkt->type); @@ -579,13 +581,13 @@ static int send_data(bctx_t &bctx, int stream) /** * Send Data header to Storage daemon - * + * */ if (!sd->fsend("%ld %d %lld", jcr->JobFiles, stream, - (int64_t)bctx.ff_pkt->statp.st_size)) { + (int64_t)bctx.ff_pkt->statp.st_size)) { if (!jcr->is_job_canceled()) { - Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), - sd->bstrerror()); + Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), + sd->bstrerror()); } goto err; } @@ -593,7 +595,7 @@ static int send_data(bctx_t &bctx, int stream) /** * Make space at beginning of buffer for fileAddr because this - * same buffer will be used for writing if compression is off. + * same buffer will be used for writing if compression is off. */ if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { bctx.rbuf += OFFSET_FADDR_SIZE; @@ -615,13 +617,13 @@ static int send_data(bctx_t &bctx, int stream) Dmsg1(200, "Fattrs=0X%x\n", bctx.ff_pkt->bfd.fattrs); if (bctx.ff_pkt->bfd.fattrs & FILE_ATTRIBUTE_ENCRYPTED) { if (!p_ReadEncryptedFileRaw) { - Jmsg0(bctx.jcr, M_FATAL, 0, _("Windows Encrypted data not supported on this OS.\n")); - goto err; + Jmsg0(bctx.jcr, M_FATAL, 0, _("Windows Encrypted data not supported on this OS.\n")); + goto err; } /* This single call reads all EFS data delivers it to a callback */ if (p_ReadEncryptedFileRaw((PFE_EXPORT_FUNC)read_efs_data_cb, &bctx, - bctx.ff_pkt->bfd.pvContext) != 0) { - goto err; + bctx.ff_pkt->bfd.pvContext) != 0) { + goto err; } /* All read, so skip to finish sending */ goto finish_sending; @@ -634,18 +636,18 @@ static int send_data(bctx_t &bctx, int stream) */ while ((sd->msglen=(uint32_t)bread(&bctx.ff_pkt->bfd, bctx.rbuf, bctx.rsize)) > 0) { if (!process_and_send_data(bctx)) { - goto err; + goto err; } } /* end while read file data */ goto finish_sending; finish_sending: - if (sd->msglen < 0) { /* error */ + if (sd->msglen < 0) { /* error */ berrno be; Jmsg(jcr, M_ERROR, 0, _("Read error on file %s. ERR=%s\n"), - bctx.ff_pkt->fname, be.bstrerror(bctx.ff_pkt->bfd.berrno)); - if (jcr->JobErrors++ > 1000) { /* insanity check */ - Jmsg(jcr, M_FATAL, 0, _("Too many errors. JobErrors=%d.\n"), jcr->JobErrors); + bctx.ff_pkt->fname, be.bstrerror(bctx.ff_pkt->bfd.berrno)); + if (jcr->JobErrors++ > 1000) { /* insanity check */ + Jmsg(jcr, M_FATAL, 0, _("Too many errors. JobErrors=%d.\n"), jcr->JobErrors); } } else if (bctx.ff_pkt->flags & FO_ENCRYPT) { /** @@ -653,34 +655,34 @@ finish_sending: * buffered data. */ if (!crypto_cipher_finalize(bctx.cipher_ctx, (uint8_t *)jcr->crypto.crypto_buf, - &bctx.encrypted_len)) { - /* Padding failed. Shouldn't happen. */ - Jmsg(jcr, M_FATAL, 0, _("Encryption padding error\n")); - goto err; + &bctx.encrypted_len)) { + /* Padding failed. Shouldn't happen. */ + Jmsg(jcr, M_FATAL, 0, _("Encryption padding error\n")); + goto err; } /** Note, on SSL pre-0.9.7, there is always some output */ if (bctx.encrypted_len > 0) { - sd->msglen = bctx.encrypted_len; /* set encrypted length */ - sd->msg = jcr->crypto.crypto_buf; /* set correct write buffer */ - if (!sd->send()) { - if (!jcr->is_job_canceled()) { - Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), - sd->bstrerror()); - } - goto err; - } - Dmsg1(130, "Send data to SD len=%d\n", sd->msglen); - jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */ - sd->msg = bctx.msgsave; /* restore bnet buffer */ + sd->msglen = bctx.encrypted_len; /* set encrypted length */ + sd->msg = jcr->crypto.crypto_buf; /* set correct write buffer */ + if (!sd->send()) { + if (!jcr->is_job_canceled()) { + Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), + sd->bstrerror()); + } + goto err; + } + Dmsg1(130, "Send data to SD len=%d\n", sd->msglen); + jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */ + sd->msg = bctx.msgsave; /* restore bnet buffer */ } } if (!sd->signal(BNET_EOD)) { /* indicate end of file data */ if (!jcr->is_job_canceled()) { - Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), - sd->bstrerror()); + Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), + sd->bstrerror()); } goto err; } @@ -717,20 +719,20 @@ bool process_and_send_data(bctx_t &bctx) ser_declare; bool allZeros = false; if ((sd->msglen == bctx.rsize && - bctx.fileAddr+sd->msglen < (uint64_t)bctx.ff_pkt->statp.st_size) || - ((bctx.ff_pkt->type == FT_RAW || bctx.ff_pkt->type == FT_FIFO) && - (uint64_t)bctx.ff_pkt->statp.st_size == 0)) { - allZeros = is_buf_zero(bctx.rbuf, bctx.rsize); + bctx.fileAddr+sd->msglen < (uint64_t)bctx.ff_pkt->statp.st_size) || + ((bctx.ff_pkt->type == FT_RAW || bctx.ff_pkt->type == FT_FIFO) && + (uint64_t)bctx.ff_pkt->statp.st_size == 0)) { + allZeros = is_buf_zero(bctx.rbuf, bctx.rsize); } if (!allZeros) { - /** Put file address as first data in buffer */ - ser_begin(bctx.wbuf, OFFSET_FADDR_SIZE); - ser_uint64(bctx.fileAddr); /* store fileAddr in begin of buffer */ + /** Put file address as first data in buffer */ + ser_begin(bctx.wbuf, OFFSET_FADDR_SIZE); + ser_uint64(bctx.fileAddr); /* store fileAddr in begin of buffer */ } - bctx.fileAddr += sd->msglen; /* update file address */ + bctx.fileAddr += sd->msglen; /* update file address */ /** Skip block of all zeros */ if (allZeros) { - return true; /* skip block of zeros */ + return true; /* skip block of zeros */ } } else if (bctx.ff_pkt->flags & FO_OFFSETS) { ser_declare; @@ -738,7 +740,7 @@ bool process_and_send_data(bctx_t &bctx) ser_uint64(bctx.ff_pkt->bfd.offset); /* store offset in begin of buffer */ } - jcr->ReadBytes += sd->msglen; /* count bytes read */ + jcr->ReadBytes += sd->msglen; /* count bytes read */ /** Uncompressed cipher input length */ bctx.cipher_input_len = sd->msglen; @@ -779,7 +781,7 @@ bool process_and_send_data(bctx_t &bctx) ser_declare; if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { - bctx.cipher_input_len += OFFSET_FADDR_SIZE; + bctx.cipher_input_len += OFFSET_FADDR_SIZE; } /** Encrypt the length of the input block */ @@ -790,26 +792,26 @@ bool process_and_send_data(bctx_t &bctx) Dmsg1(20, "Encrypt len=%d\n", bctx.cipher_input_len); if (!crypto_cipher_update(bctx.cipher_ctx, packet_len, sizeof(packet_len), - (uint8_t *)jcr->crypto.crypto_buf, &initial_len)) { - /** Encryption failed. Shouldn't happen. */ - Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); - goto err; + (uint8_t *)jcr->crypto.crypto_buf, &initial_len)) { + /** Encryption failed. Shouldn't happen. */ + Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); + goto err; } /** Encrypt the input block */ if (crypto_cipher_update(bctx.cipher_ctx, bctx.cipher_input, bctx.cipher_input_len, - (uint8_t *)&jcr->crypto.crypto_buf[initial_len], &bctx.encrypted_len)) { - if ((initial_len + bctx.encrypted_len) == 0) { - /** No full block of data available, read more data */ - return true; - } - Dmsg2(400, "encrypted len=%d unencrypted len=%d\n", bctx.encrypted_len, - sd->msglen); - sd->msglen = initial_len + bctx.encrypted_len; /* set encrypted length */ + (uint8_t *)&jcr->crypto.crypto_buf[initial_len], &bctx.encrypted_len)) { + if ((initial_len + bctx.encrypted_len) == 0) { + /** No full block of data available, read more data */ + return true; + } + Dmsg2(400, "encrypted len=%d unencrypted len=%d\n", bctx.encrypted_len, + sd->msglen); + sd->msglen = initial_len + bctx.encrypted_len; /* set encrypted length */ } else { - /** Encryption failed. Shouldn't happen. */ - Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); - goto err; + /** Encryption failed. Shouldn't happen. */ + Jmsg(jcr, M_FATAL, 0, _("Encryption error\n")); + goto err; } } @@ -817,18 +819,18 @@ bool process_and_send_data(bctx_t &bctx) if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { sd->msglen += OFFSET_FADDR_SIZE; /* include fileAddr in size */ } - sd->msg = bctx.wbuf; /* set correct write buffer */ + sd->msg = bctx.wbuf; /* set correct write buffer */ if (!sd->send()) { if (!jcr->is_job_canceled()) { - Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), - sd->bstrerror()); + Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), + sd->bstrerror()); } goto err; } Dmsg1(130, "Send data to SD len=%d\n", sd->msglen); - /* #endif */ + /* #endif */ jcr->JobBytes += sd->msglen; /* count bytes saved possibly compressed/encrypted */ - sd->msg = bctx.msgsave; /* restore read buffer */ + sd->msg = bctx.msgsave; /* restore read buffer */ return true; err: @@ -872,7 +874,7 @@ bool encode_and_send_attributes(bctx_t &bctx) Dmsg3(300, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx); jcr->lock(); - jcr->JobFiles++; /* increment number of files sent */ + jcr->JobFiles++; /* increment number of files sent */ ff_pkt->FileIndex = jcr->JobFiles; /* return FileIndex */ pm_strcpy(jcr->last_fname, ff_pkt->fname); jcr->unlock(); @@ -892,12 +894,12 @@ bool encode_and_send_attributes(bctx_t &bctx) /** * Send Attributes header to Storage daemon - * + * */ if (!sd->fsend("%ld %d 0", jcr->JobFiles, attr_stream)) { if (!jcr->is_canceled() && !jcr->is_incomplete()) { - Jmsg2(jcr, M_FATAL, 0, _("Network send error to SD. Data=%s ERR=%s\n"), - sd->msg, sd->bstrerror()); + Jmsg2(jcr, M_FATAL, 0, _("Network send error to SD. Data=%s ERR=%s\n"), + sd->msg, sd->bstrerror()); } return false; } @@ -905,23 +907,23 @@ bool encode_and_send_attributes(bctx_t &bctx) /** * Send file attributes to Storage daemon - * File_index - * File type - * Filename (full path) - * Encoded attributes - * Link name (if type==FT_LNK or FT_LNKSAVED) - * Encoded extended-attributes (for Win32) + * File_index + * File type + * Filename (full path) + * Encoded attributes + * Link name (if type==FT_LNK or FT_LNKSAVED) + * Encoded extended-attributes (for Win32) * * or send Restore Object to Storage daemon - * File_index - * File_type - * Object_index - * Object_len (possibly compressed) - * Object_full_len (not compressed) - * Object_compression - * Plugin_name - * Object_name - * Binary Object data + * File_index + * File_type + * Object_index + * Object_len (possibly compressed) + * Object_full_len (not compressed) + * Object_compression + * Plugin_name + * Object_name + * Binary Object data * * For a directory, link is the same as fname, but with trailing * slash. For a linked file, link is the link. @@ -934,58 +936,58 @@ bool encode_and_send_attributes(bctx_t &bctx) case FT_LNKSAVED: Dmsg3(300, "Link %d %s to %s\n", jcr->JobFiles, ff_pkt->fname, ff_pkt->link); stat = sd->fsend("%ld %d %s%c%s%c%s%c%s%c%u%c", jcr->JobFiles, - ff_pkt->type, ff_pkt->fname, 0, attribs, 0, - ff_pkt->link, 0, attribsEx, 0, ff_pkt->delta_seq, 0); + ff_pkt->type, ff_pkt->fname, 0, attribs, 0, + ff_pkt->link, 0, attribsEx, 0, ff_pkt->delta_seq, 0); break; case FT_DIREND: case FT_REPARSE: case FT_JUNCTION: /* Here link is the canonical filename (i.e. with trailing slash) */ stat = sd->fsend("%ld %d %s%c%s%c%c%s%c%u%c", jcr->JobFiles, - ff_pkt->type, ff_pkt->link, 0, attribs, 0, 0, - attribsEx, 0, ff_pkt->delta_seq, 0); + ff_pkt->type, ff_pkt->link, 0, attribs, 0, 0, + attribsEx, 0, ff_pkt->delta_seq, 0); break; case FT_PLUGIN_CONFIG: case FT_RESTORE_FIRST: comp_len = ff_pkt->object_len; ff_pkt->object_compression = 0; if (ff_pkt->object_len > 1000) { - /* Big object, compress it */ - comp_len = ff_pkt->object_len + 1000; - POOLMEM *comp_obj = get_memory(comp_len); - /* *** FIXME *** check Zdeflate error */ - Zdeflate(ff_pkt->object, ff_pkt->object_len, comp_obj, comp_len); - if (comp_len < ff_pkt->object_len) { - ff_pkt->object = comp_obj; - ff_pkt->object_compression = 1; /* zlib level 9 compression */ - } else { - /* Uncompressed object smaller, use it */ - comp_len = ff_pkt->object_len; - } - Dmsg2(100, "Object compressed from %d to %d bytes\n", ff_pkt->object_len, comp_len); + /* Big object, compress it */ + comp_len = ff_pkt->object_len + 1000; + POOLMEM *comp_obj = get_memory(comp_len); + /* *** FIXME *** check Zdeflate error */ + Zdeflate(ff_pkt->object, ff_pkt->object_len, comp_obj, comp_len); + if (comp_len < ff_pkt->object_len) { + ff_pkt->object = comp_obj; + ff_pkt->object_compression = 1; /* zlib level 9 compression */ + } else { + /* Uncompressed object smaller, use it */ + comp_len = ff_pkt->object_len; + } + Dmsg2(100, "Object compressed from %d to %d bytes\n", ff_pkt->object_len, comp_len); } sd->msglen = Mmsg(sd->msg, "%d %d %d %d %d %d %s%c%s%c", - jcr->JobFiles, ff_pkt->type, ff_pkt->object_index, - comp_len, ff_pkt->object_len, ff_pkt->object_compression, - ff_pkt->fname, 0, ff_pkt->object_name, 0); + jcr->JobFiles, ff_pkt->type, ff_pkt->object_index, + comp_len, ff_pkt->object_len, ff_pkt->object_compression, + ff_pkt->fname, 0, ff_pkt->object_name, 0); sd->msg = check_pool_memory_size(sd->msg, sd->msglen + comp_len + 2); memcpy(sd->msg + sd->msglen, ff_pkt->object, comp_len); /* Note we send one extra byte so Dir can store zero after object */ sd->msglen += comp_len + 1; stat = sd->send(); if (ff_pkt->object_compression) { - free_and_null_pool_memory(ff_pkt->object); + free_and_null_pool_memory(ff_pkt->object); } break; case FT_REG: stat = sd->fsend("%ld %d %s%c%s%c%c%s%c%d%c", jcr->JobFiles, - ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, attribsEx, 0, - ff_pkt->delta_seq, 0); + ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, attribsEx, 0, + ff_pkt->delta_seq, 0); break; default: stat = sd->fsend("%ld %d %s%c%s%c%c%s%c%u%c", jcr->JobFiles, - ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, - attribsEx, 0, ff_pkt->delta_seq, 0); + ff_pkt->type, ff_pkt->fname, 0, attribs, 0, 0, + attribsEx, 0, ff_pkt->delta_seq, 0); break; } @@ -996,9 +998,9 @@ bool encode_and_send_attributes(bctx_t &bctx) Dmsg2(300, ">stored: attr len=%d: %s\n", sd->msglen, sd->msg); if (!stat && !jcr->is_job_canceled()) { Jmsg1(jcr, M_FATAL, 0, _("Network send error to SD. ERR=%s\n"), - sd->bstrerror()); + sd->bstrerror()); } - sd->signal(BNET_EOD); /* indicate end of attributes data */ + sd->signal(BNET_EOD); /* indicate end of attributes data */ return stat; } @@ -1018,13 +1020,13 @@ static bool setup_compression(bctx_t &bctx) if ((bctx.ff_pkt->flags & FO_COMPRESS) && bctx.ff_pkt->Compress_algo == COMPRESS_GZIP) { if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { - bctx.cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; - bctx.max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; + bctx.cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; + bctx.max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; } else { - bctx.cbuf = (Bytef *)jcr->compress_buf; - bctx.max_compress_len = jcr->compress_buf_size; /* set max length */ + bctx.cbuf = (Bytef *)jcr->compress_buf; + bctx.max_compress_len = jcr->compress_buf_size; /* set max length */ } - bctx.wbuf = jcr->compress_buf; /* compressed output here */ + bctx.wbuf = jcr->compress_buf; /* compressed output here */ bctx.cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */ /** @@ -1034,13 +1036,13 @@ static bool setup_compression(bctx_t &bctx) */ if (((z_stream*)jcr->pZLIB_compress_workset)->total_in == 0) { - /** set gzip compression level - must be done per file */ - if ((zstat=deflateParams((z_stream*)jcr->pZLIB_compress_workset, - bctx.ff_pkt->Compress_level, Z_DEFAULT_STRATEGY)) != Z_OK) { - Jmsg(jcr, M_FATAL, 0, _("Compression deflateParams error: %d\n"), zstat); - jcr->setJobStatus(JS_ErrorTerminated); - return false; - } + /** set gzip compression level - must be done per file */ + if ((zstat=deflateParams((z_stream*)jcr->pZLIB_compress_workset, + bctx.ff_pkt->Compress_level, Z_DEFAULT_STRATEGY)) != Z_OK) { + Jmsg(jcr, M_FATAL, 0, _("Compression deflateParams error: %d\n"), zstat); + jcr->setJobStatus(JS_ErrorTerminated); + return false; + } } } #endif @@ -1050,17 +1052,17 @@ static bool setup_compression(bctx_t &bctx) if ((bctx.ff_pkt->flags & FO_COMPRESS) && bctx.ff_pkt->Compress_algo == COMPRESS_LZO1X) { if ((bctx.ff_pkt->flags & FO_SPARSE) || (bctx.ff_pkt->flags & FO_OFFSETS)) { - bctx.cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; - bctx.cbuf2 = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE + sizeof(comp_stream_header); - bctx.max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; + bctx.cbuf = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE; + bctx.cbuf2 = (Bytef *)jcr->compress_buf + OFFSET_FADDR_SIZE + sizeof(comp_stream_header); + bctx.max_compress_len = jcr->compress_buf_size - OFFSET_FADDR_SIZE; } else { - bctx.cbuf = (Bytef *)jcr->compress_buf; - bctx.cbuf2 = (Bytef *)jcr->compress_buf + sizeof(comp_stream_header); - bctx.max_compress_len = jcr->compress_buf_size; /* set max length */ + bctx.cbuf = (Bytef *)jcr->compress_buf; + bctx.cbuf2 = (Bytef *)jcr->compress_buf + sizeof(comp_stream_header); + bctx.max_compress_len = jcr->compress_buf_size; /* set max length */ } bctx.ch.magic = COMPRESS_LZO1X; bctx.ch.version = COMP_HEAD_VERSION; - bctx.wbuf = jcr->compress_buf; /* compressed output here */ + bctx.wbuf = jcr->compress_buf; /* compressed output here */ bctx.cipher_input = (uint8_t *)jcr->compress_buf; /* encrypt compressed data */ } #endif @@ -1085,32 +1087,32 @@ static bool send_resource_fork(bctx_t &bctx) if (ff_pkt->type != FT_LNKSAVED && (S_ISREG(ff_pkt->statp.st_mode) && ff_pkt->flags & FO_HFSPLUS)) { if (ff_pkt->hfsinfo.rsrclength > 0) { - int flags; - int rsrc_stream; - if (bopen_rsrc(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { - ff_pkt->ff_errno = errno; - berrno be; - Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open resource fork for \"%s\": ERR=%s.\n"), - ff_pkt->fname, be.bstrerror()); - jcr->JobErrors++; - if (is_bopen(&ff_pkt->bfd)) { - bclose(&ff_pkt->bfd); - } - return true; - } - flags = ff_pkt->flags; - ff_pkt->flags &= ~(FO_COMPRESS|FO_SPARSE|FO_OFFSETS); - if (flags & FO_ENCRYPT) { - rsrc_stream = STREAM_ENCRYPTED_MACOS_FORK_DATA; - } else { - rsrc_stream = STREAM_MACOS_FORK_DATA; - } - stat = send_data(bctx, rsrc_stream); - ff_pkt->flags = flags; - bclose(&ff_pkt->bfd); - if (!stat) { - return false; - } + int flags; + int rsrc_stream; + if (bopen_rsrc(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { + ff_pkt->ff_errno = errno; + berrno be; + Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open resource fork for \"%s\": ERR=%s.\n"), + ff_pkt->fname, be.bstrerror()); + jcr->JobErrors++; + if (is_bopen(&ff_pkt->bfd)) { + bclose(&ff_pkt->bfd); + } + return true; + } + flags = ff_pkt->flags; + ff_pkt->flags &= ~(FO_COMPRESS|FO_SPARSE|FO_OFFSETS); + if (flags & FO_ENCRYPT) { + rsrc_stream = STREAM_ENCRYPTED_MACOS_FORK_DATA; + } else { + rsrc_stream = STREAM_MACOS_FORK_DATA; + } + stat = send_data(bctx, rsrc_stream); + ff_pkt->flags = flags; + bclose(&ff_pkt->bfd); + if (!stat) { + return false; + } } Dmsg1(300, "Saving Finder Info for \"%s\"\n", ff_pkt->fname); @@ -1119,10 +1121,10 @@ static bool send_resource_fork(bctx_t &bctx) pm_memcpy(sd->msg, ff_pkt->hfsinfo.fndrinfo, 32); sd->msglen = 32; if (bctx.digest) { - crypto_digest_update(bctx.digest, (uint8_t *)sd->msg, sd->msglen); + crypto_digest_update(bctx.digest, (uint8_t *)sd->msg, sd->msglen); } if (bctx.signing_digest) { - crypto_digest_update(bctx.signing_digest, (uint8_t *)sd->msg, sd->msglen); + crypto_digest_update(bctx.signing_digest, (uint8_t *)sd->msg, sd->msglen); } sd->send(); sd->signal(BNET_EOD); @@ -1143,27 +1145,27 @@ static bool do_libz_compression(bctx_t &bctx) Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", bctx.cbuf, bctx.rbuf, sd->msglen); ((z_stream*)jcr->pZLIB_compress_workset)->next_in = (Bytef *)bctx.rbuf; - ((z_stream*)jcr->pZLIB_compress_workset)->avail_in = sd->msglen; + ((z_stream*)jcr->pZLIB_compress_workset)->avail_in = sd->msglen; ((z_stream*)jcr->pZLIB_compress_workset)->next_out = bctx.cbuf; - ((z_stream*)jcr->pZLIB_compress_workset)->avail_out = bctx.max_compress_len; + ((z_stream*)jcr->pZLIB_compress_workset)->avail_out = bctx.max_compress_len; if ((zstat=deflate((z_stream*)jcr->pZLIB_compress_workset, Z_FINISH)) != Z_STREAM_END) { - Jmsg(jcr, M_FATAL, 0, _("Compression deflate error: %d\n"), zstat); - jcr->setJobStatus(JS_ErrorTerminated); - return false; + Jmsg(jcr, M_FATAL, 0, _("Compression deflate error: %d\n"), zstat); + jcr->setJobStatus(JS_ErrorTerminated); + return false; } bctx.compress_len = ((z_stream*)jcr->pZLIB_compress_workset)->total_out; /** reset zlib stream to be able to begin from scratch again */ if ((zstat=deflateReset((z_stream*)jcr->pZLIB_compress_workset)) != Z_OK) { - Jmsg(jcr, M_FATAL, 0, _("Compression deflateReset error: %d\n"), zstat); - jcr->setJobStatus(JS_ErrorTerminated); - return false; + Jmsg(jcr, M_FATAL, 0, _("Compression deflateReset error: %d\n"), zstat); + jcr->setJobStatus(JS_ErrorTerminated); + return false; } Dmsg2(400, "GZIP compressed len=%d uncompressed len=%d\n", bctx.compress_len, - sd->msglen); + sd->msglen); - sd->msglen = bctx.compress_len; /* set compressed length */ + sd->msglen = bctx.compress_len; /* set compressed length */ bctx.cipher_input_len = bctx.compress_len; } #endif @@ -1179,7 +1181,7 @@ static bool do_lzo_compression(bctx_t &bctx) /** Do compression if turned on */ if (bctx.ff_pkt->flags & FO_COMPRESS && bctx.ff_pkt->Compress_algo == COMPRESS_LZO1X && jcr->LZO_compress_workset) { - lzo_uint len; /* TODO: See with the latest patch how to handle lzo_uint with 64bit */ + lzo_uint len; /* TODO: See with the latest patch how to handle lzo_uint with 64bit */ ser_declare; ser_begin(bctx.cbuf, sizeof(comp_stream_header)); @@ -1187,26 +1189,26 @@ static bool do_lzo_compression(bctx_t &bctx) Dmsg3(400, "cbuf=0x%x rbuf=0x%x len=%u\n", bctx.cbuf, bctx.rbuf, sd->msglen); lzores = lzo1x_1_compress((const unsigned char*)bctx.rbuf, sd->msglen, bctx.cbuf2, - &len, jcr->LZO_compress_workset); + &len, jcr->LZO_compress_workset); bctx.compress_len = len; if (lzores == LZO_E_OK && bctx.compress_len <= bctx.max_compress_len) { - /* complete header */ - ser_uint32(COMPRESS_LZO1X); - ser_uint32(bctx.compress_len); - ser_uint16(bctx.ch.level); - ser_uint16(bctx.ch.version); + /* complete header */ + ser_uint32(COMPRESS_LZO1X); + ser_uint32(bctx.compress_len); + ser_uint16(bctx.ch.level); + ser_uint16(bctx.ch.version); } else { - /** this should NEVER happen */ - Jmsg(jcr, M_FATAL, 0, _("Compression LZO error: %d\n"), lzores); - jcr->setJobStatus(JS_ErrorTerminated); - return false; + /** this should NEVER happen */ + Jmsg(jcr, M_FATAL, 0, _("Compression LZO error: %d\n"), lzores); + jcr->setJobStatus(JS_ErrorTerminated); + return false; } Dmsg2(400, "LZO compressed len=%d uncompressed len=%d\n", bctx.compress_len, - sd->msglen); + sd->msglen); bctx.compress_len += sizeof(comp_stream_header); /* add size of header */ - sd->msglen = bctx.compress_len; /* set compressed length */ + sd->msglen = bctx.compress_len; /* set compressed length */ bctx.cipher_input_len = bctx.compress_len; } #endif @@ -1229,13 +1231,13 @@ static bool do_snap_strip(FF_PKT *ff) last = MAX(last - 1, 0); if (ff->snap_fname[last] == '/') { - if (ff->fname[sp_first] == '/') { /* compare with the first character of the string (sp_first not sp_first-1) */ - ff->snap_fname[last] = 0; - } + if (ff->fname[sp_first] == '/') { /* compare with the first character of the string (sp_first not sp_first-1) */ + ff->snap_fname[last] = 0; + } } else { - if (ff->fname[sp_first] != '/') { - pm_strcat(ff->snap_fname, "/"); - } + if (ff->fname[sp_first] != '/') { + pm_strcat(ff->snap_fname, "/"); + } } pm_strcat(ff->snap_fname, ff->fname + sp_first); @@ -1248,13 +1250,13 @@ static bool do_snap_strip(FF_PKT *ff) last = MAX(last - 1, 0); if (ff->snap_fname[last] == '/') { - if (ff->link[sp_first] == '/') { /* compare with the first character of the string (sp_first not sp_first-1) */ - ff->snap_fname[last] = 0; - } + if (ff->link[sp_first] == '/') { /* compare with the first character of the string (sp_first not sp_first-1) */ + ff->snap_fname[last] = 0; + } } else { - if (ff->link[sp_first] != '/') { - pm_strcat(ff->snap_fname, "/"); - } + if (ff->link[sp_first] != '/') { + pm_strcat(ff->snap_fname, "/"); + } } pm_strcat(ff->snap_fname, ff->link + sp_first); @@ -1279,29 +1281,29 @@ static bool do_strip(int count, char *in) while (*in && !IsPathSeparator(*in)) { out++; in++; } - if (*in) { /* Not at the end of the string */ + if (*in) { /* Not at the end of the string */ out++; in++; - numsep++; /* one separator seen */ + numsep++; /* one separator seen */ } for (stripped=0; strippedcount=%d\n", - stripped, count, numsep, numsep>count); + stripped, count, numsep, numsep>count); return stripped==count && numsep>count; } @@ -1333,15 +1335,15 @@ void strip_path(FF_PKT *ff_pkt) if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) { pm_strcpy(ff_pkt->link_save, ff_pkt->link); Dmsg2(500, "strcpy link_save=%d link=%d\n", strlen(ff_pkt->link_save), - strlen(ff_pkt->link)); + strlen(ff_pkt->link)); Dsm_check(200); } if (ff_pkt->strip_snap_path) { if (!do_snap_strip(ff_pkt)) { - Dmsg1(0, "Something wrong with do_snap_strip(%s)\n", ff_pkt->fname); - unstrip_path(ff_pkt); - goto rtn; + Dmsg1(0, "Something wrong with do_snap_strip(%s)\n", ff_pkt->fname); + unstrip_path(ff_pkt); + goto rtn; } } @@ -1365,7 +1367,7 @@ void strip_path(FF_PKT *ff_pkt) /** Strip links but not symlinks */ if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) { if (!do_strip(ff_pkt->strip_path, ff_pkt->link)) { - unstrip_path(ff_pkt); + unstrip_path(ff_pkt); } } @@ -1385,10 +1387,10 @@ void unstrip_path(FF_PKT *ff_pkt) strcpy(ff_pkt->fname, ff_pkt->fname_save); if (ff_pkt->type != FT_LNK && ff_pkt->fname != ff_pkt->link) { Dmsg2(10, "strcpy link=%s link_save=%s\n", ff_pkt->link, - ff_pkt->link_save); + ff_pkt->link_save); strcpy(ff_pkt->link, ff_pkt->link_save); Dmsg2(10, "strcpy link=%d link_save=%d\n", strlen(ff_pkt->link), - strlen(ff_pkt->link_save)); + strlen(ff_pkt->link_save)); Dsm_check(200); } } @@ -1400,28 +1402,28 @@ static void close_vss_backup_session(JCR *jcr) /* tell vss to close the backup session */ if (jcr->Snapshot) { if (g_pVSSClient->CloseBackup()) { - /* inform user about writer states */ - for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) { - int msg_type = M_INFO; - if (g_pVSSClient->GetWriterState(i) < 1) { - msg_type = M_WARNING; - jcr->JobErrors++; - } - Jmsg(jcr, msg_type, 0, _("VSS Writer (BackupComplete): %s\n"), g_pVSSClient->GetWriterInfo(i)); - } + /* inform user about writer states */ + for (int i=0; i<(int)g_pVSSClient->GetWriterCount(); i++) { + int msg_type = M_INFO; + if (g_pVSSClient->GetWriterState(i) < 1) { + msg_type = M_WARNING; + jcr->JobErrors++; + } + Jmsg(jcr, msg_type, 0, _("VSS Writer (BackupComplete): %s\n"), g_pVSSClient->GetWriterInfo(i)); + } } /* Generate Job global writer metadata */ WCHAR *metadata = g_pVSSClient->GetMetadata(); if (metadata) { - FF_PKT *ff_pkt = jcr->ff; - ff_pkt->fname = (char *)"*all*"; /* for all plugins */ - ff_pkt->type = FT_RESTORE_FIRST; - ff_pkt->LinkFI = 0; - ff_pkt->object_name = (char *)"job_metadata.xml"; - ff_pkt->object = (char *)metadata; - ff_pkt->object_len = (wcslen(metadata) + 1) * sizeof(WCHAR); - ff_pkt->object_index = (int)time(NULL); - save_file(jcr, ff_pkt, true); + FF_PKT *ff_pkt = jcr->ff; + ff_pkt->fname = (char *)"*all*"; /* for all plugins */ + ff_pkt->type = FT_RESTORE_FIRST; + ff_pkt->LinkFI = 0; + ff_pkt->object_name = (char *)"job_metadata.xml"; + ff_pkt->object = (char *)metadata; + ff_pkt->object_len = (wcslen(metadata) + 1) * sizeof(WCHAR); + ff_pkt->object_index = (int)time(NULL); + save_file(jcr, ff_pkt, true); } } #endif diff --git a/bacula/src/filed/restore.c b/bacula/src/filed/restore.c index 20ef9abf22..f7ee5a6d00 100644 --- a/bacula/src/filed/restore.c +++ b/bacula/src/filed/restore.c @@ -1,7 +1,7 @@ /* Bacula(R) - The Network Backup Solution - Copyright (C) 2000-2016 Kern Sibbald + Copyright (C) 2000-2017 Kern Sibbald Copyright (C) 2000-2014 Free Software Foundation Europe e.V. The original author of Bacula is Kern Sibbald, with contributions @@ -199,6 +199,9 @@ static inline void push_delayed_restore_stream(r_ctx &rctx, char *msg, int msgle static inline bool do_restore_acl(JCR *jcr, int stream, char *content, uint32_t content_length) { + if (!jcr->xacl) { + return true; + } switch (jcr->xacl->restore_acl(jcr, stream, content, content_length)) { case bRC_XACL_fatal: return false; @@ -224,6 +227,9 @@ static inline bool do_restore_acl(JCR *jcr, int stream, char *content, static inline bool do_restore_xattr(JCR *jcr, int stream, char *content, uint32_t content_length) { + if (!jcr->xacl) { + return true; + } switch (jcr->xacl->restore_xattr(jcr, stream, content, content_length)) { case bRC_XACL_fatal: return false; @@ -1006,13 +1012,14 @@ ok_out: Dmsg2(10, "End Do Restore. Files=%d Bytes=%s\n", jcr->JobFiles, edit_uint64(jcr->JobBytes, ec1)); - if (jcr->xacl->get_acl_nr_errors() > 0) { - Jmsg(jcr, M_WARNING, 0, _("Encountered %ld acl errors while doing restore\n"), jcr->xacl->get_acl_nr_errors()); - } - if (jcr->xacl->get_xattr_nr_errors() > 0) { - Jmsg(jcr, M_WARNING, 0, _("Encountered %ld xattr errors while doing restore\n"), jcr->xacl->get_xattr_nr_errors()); + if (jcr->xacl) { + if (jcr->xacl->get_acl_nr_errors() > 0) { + Jmsg(jcr, M_WARNING, 0, _("Encountered %ld acl errors while doing restore\n"), jcr->xacl->get_acl_nr_errors()); + } + if (jcr->xacl->get_xattr_nr_errors() > 0) { + Jmsg(jcr, M_WARNING, 0, _("Encountered %ld xattr errors while doing restore\n"), jcr->xacl->get_xattr_nr_errors()); + } } - if (non_suppored_data > 1 || non_suppored_attr > 1) { Jmsg(jcr, M_WARNING, 0, _("%d non-supported data streams and %d non-supported attrib streams ignored.\n"), non_suppored_data, non_suppored_attr); diff --git a/bacula/src/filed/xacl.c b/bacula/src/filed/xacl.c index a66f95a49a..8eea8a2937 100644 --- a/bacula/src/filed/xacl.c +++ b/bacula/src/filed/xacl.c @@ -1313,7 +1313,6 @@ bRC_XACL XACL::afs_restore_acl (JCR *jcr, int stream){ */ void *new_xacl() { - XACL *xacl; #if defined(HAVE_DARWIN_OS) return new XACL_OSX(); #elif defined(HAVE_LINUX_OS) @@ -1331,10 +1330,6 @@ void *new_xacl() #elif defined(HAVE_SUN_OS) return new XACL_Solaris(); #else - /* No driver defined */ - xacl = new XACL(); - xacl->disable_acl(); - xacl->disable_xattr(); - return xacl; + return NULL; #endif };