/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
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->getJobLevel() == L_FULL) {
- ret = accurate_send_base_file_list(jcr);
+ if (jcr->is_JobLevel(L_FULL)) {
+ if (!jcr->rerunning) {
+ ret = accurate_send_base_file_list(jcr);
+ }
} else {
ret = accurate_send_deleted_list(jcr);
}
-
accurate_free(jcr);
- if (jcr->getJobLevel() == L_FULL) {
+ if (jcr->is_JobLevel(L_FULL)) {
Jmsg(jcr, M_INFO, 0, _("Space saved with Base jobs: %lld MB\n"),
jcr->base_size/(1024*1024));
}
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) {
+ 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->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 */
+ case '1': /* compare SHA1 */
/*
* The remainder of the function is all about getting the checksum.
* First we initialise, then we read files, other streams and Finder Info.
ff_pkt->flags & (FO_MD5|FO_SHA1|FO_SHA256|FO_SHA512)))
{
- if (!*elt.chksum) {
- Jmsg(jcr, M_WARNING, 0, _("Can't verify checksum for %s\n"),
+ if (!*elt.chksum && !jcr->rerunning) {
+ Jmsg(jcr, M_WARNING, 0, _("Cannot verify checksum for %s\n"),
ff_pkt->fname);
stat = true;
break;
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;