if (elt->seen) {
Dmsg2(dbglvl, "base file fname=%s seen=%i\n", elt->fname, elt->seen);
/* TODO: skip the decode and use directly the lstat field */
- decode_stat(elt->lstat, &statc, &LinkFIc); /* decode catalog stat */
+ decode_stat(elt->lstat, &statc, sizeof(statc), &LinkFIc); /* decode catalog stat */
ff_pkt->fname = elt->fname;
ff_pkt->statp = statc;
encode_and_send_attributes(jcr, ff_pkt, stream);
}
Dmsg2(dbglvl, "deleted fname=%s seen=%i\n", elt->fname, elt->seen);
/* TODO: skip the decode and use directly the lstat field */
- decode_stat(elt->lstat, &statc, &LinkFIc); /* decode catalog stat */
+ decode_stat(elt->lstat, &statc, sizeof(statc), &LinkFIc); /* decode catalog stat */
ff_pkt->fname = elt->fname;
ff_pkt->statp.st_mtime = statc.st_mtime;
ff_pkt->statp.st_ctime = statc.st_ctime;
/* Send the deleted or the base file list and cleanup */
bool accurate_finish(JCR *jcr)
{
- bool ret=true;
+ bool ret = true;
+
+ if (jcr->is_canceled() || jcr->is_incomplete()) {
+ accurate_free(jcr);
+ return ret;
+ }
if (jcr->accurate) {
- if (!jcr->incomplete) {
- if (jcr->is_JobLevel(L_FULL)) {
+ if (jcr->is_JobLevel(L_FULL)) {
+ if (!jcr->rerunning) {
ret = accurate_send_base_file_list(jcr);
- } else if (!jcr->incomplete) {
- ret = accurate_send_deleted_list(jcr);
}
+ } else {
+ ret = accurate_send_deleted_list(jcr);
}
accurate_free(jcr);
if (jcr->is_JobLevel(L_FULL)) {
bool ret = true;
CurFile *item;
- /* we store CurFile, fname and ctime/mtime in the same chunk */
- item = (CurFile *)jcr->file_list->hash_malloc(sizeof(CurFile)+len);
+ /* we store CurFile, fname and ctime/mtime in the same chunk
+ * we need one extra byte to handle an empty chksum
+ */
+ item = (CurFile *)jcr->file_list->hash_malloc(sizeof(CurFile)+len+3);
item->seen = 0;
/* TODO: see if we can optimize this part with memcpy instead of strcpy */
CurFile elt;
ff_pkt->delta_seq = 0;
+ ff_pkt->accurate_found = false;
- if (!jcr->accurate && !jcr->incomplete) {
+ if (!jcr->accurate && !jcr->rerunning) {
return true;
}
goto bail_out;
}
+ ff_pkt->accurate_found = true;
ff_pkt->delta_seq = elt.delta_seq;
- if (elt.seen) { /* file has been seen ? */
- Dmsg1(dbglvl, "accurate %s (already seen)\n", fname);
- goto bail_out;
- }
-
- decode_stat(elt.lstat, &statc, &LinkFIc); /* decode catalog stat */
+ decode_stat(elt.lstat, &statc, sizeof(statc), &LinkFIc); /* decode catalog stat */
- if (!jcr->incomplete && (jcr->getJobLevel() == L_FULL)) {
+ if (!jcr->rerunning && (jcr->getJobLevel() == L_FULL)) {
opts = ff_pkt->BaseJobOpts;
} else {
opts = ff_pkt->AccurateOpts;
stat = true;
}
break;
-
+ case 'A': /* Always backup a file */
+ stat = true;
+ break;
/* TODO: cleanup and factorise this function with verify.c */
case '5': /* compare MD5 */
case '1': /* compare SHA1 */
ff_pkt->flags & (FO_MD5|FO_SHA1|FO_SHA256|FO_SHA512)))
{
- if (!*elt.chksum && !jcr->incomplete) {
+ if (!*elt.chksum && !jcr->rerunning) {
Jmsg(jcr, M_WARNING, 0, _("Cannot verify checksum for %s\n"),
ff_pkt->fname);
stat = true;
bin_to_base64(digest_buf, BASE64_SIZE(size), md, size, true);
if (strcmp(digest_buf, elt.chksum)) {
- Dmsg3(dbglvl-1, "%s chksum diff. Cat: %s File: %s\n",
+ Dmsg4(dbglvl,"%s %s chksum diff. Cat: %s File: %s\n",
fname,
+ digest_name,
elt.chksum,
digest_buf);
stat = true;