/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2009 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.
db_strerror(jcr->db));
return false;
}
- if (jcr->previous_jr.JobStatus != 'T') {
+ if (!(jcr->previous_jr.JobStatus == JS_Terminated ||
+ jcr->previous_jr.JobStatus == JS_Warnings)) {
Jmsg(jcr, M_FATAL, 0, _("Last Job %d did not terminate normally. JobStatus=%c\n"),
verify_jobid, jcr->previous_jr.JobStatus);
return false;
TermCode = JS_ErrorTerminated;
}
- /* If no files were expected, there can be no error */
- if (jcr->get_JobLevel() == L_VERIFY_VOLUME_TO_CATALOG &&
- jcr->ExpectedFiles == 0) {
- TermCode = JS_Terminated;
- }
-
JobId = jcr->jr.JobId;
update_job_end(jcr, TermCode);
edt,
edit_uint64_with_commas(jcr->ExpectedFiles, ec1),
edit_uint64_with_commas(jcr->JobFiles, ec2),
- jcr->Errors,
+ jcr->JobErrors,
fd_term_msg,
sd_term_msg,
term_msg);
sdt,
edt,
edit_uint64_with_commas(jcr->JobFiles, ec1),
- jcr->Errors,
+ jcr->JobErrors,
fd_term_msg,
term_msg);
}
/*
* This routine is called only during a Verify
*/
-int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
+void get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId)
{
BSOCK *fd;
int n, len;
FILE_DBR fdbr;
struct stat statf; /* file stat */
struct stat statc; /* catalog stat */
- int stat = JS_Terminated;
char buf[MAXSTRING];
POOLMEM *fname = get_pool_memory(PM_MESSAGE);
int do_Digest = CRYPTO_DIGEST_NONE;
char Opts_Digest[MAXSTRING]; /* Verify Opts or MD5/SHA1 digest */
if (job_canceled(jcr)) {
- return false;
+ return;
}
fname = check_pool_memory_size(fname, fd->msglen);
jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
fname)) != 3) {
Jmsg3(jcr, M_FATAL, 0, _("bird<filed: bad attributes, expected 3 fields got %d\n"
" mslen=%d msg=%s\n"), len, fd->msglen, fd->msg);
- return false;
+ return;
}
/*
* We read the Options or Signature into fname
Dmsg2(400, "file_index=%d attr=%s\n", file_index, attr);
jcr->JobFiles++;
jcr->FileIndex = file_index; /* remember attribute file_index */
+ jcr->previous_jr.FileIndex = file_index;
decode_stat(attr, &statf, &LinkFIf); /* decode file stat packet */
do_Digest = CRYPTO_DIGEST_NONE;
jcr->fn_printed = false;
&jcr->previous_jr, &fdbr)) {
Jmsg(jcr, M_INFO, 0, _("New file: %s\n"), jcr->fname);
Dmsg1(020, _("File not in catalog: %s\n"), jcr->fname);
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
continue;
} else {
/*
Jmsg(jcr, M_INFO, 0, _(" st_ino differ. Cat: %s File: %s\n"),
edit_uint64((uint64_t)statc.st_ino, ed1),
edit_uint64((uint64_t)statf.st_ino, ed2));
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'p': /* permissions bits */
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" st_mode differ. Cat: %x File: %x\n"),
(uint32_t)statc.st_mode, (uint32_t)statf.st_mode);
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'n': /* number of links */
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" st_nlink differ. Cat: %d File: %d\n"),
(uint32_t)statc.st_nlink, (uint32_t)statf.st_nlink);
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'u': /* user id */
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" st_uid differ. Cat: %u File: %u\n"),
(uint32_t)statc.st_uid, (uint32_t)statf.st_uid);
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'g': /* group id */
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" st_gid differ. Cat: %u File: %u\n"),
(uint32_t)statc.st_gid, (uint32_t)statf.st_gid);
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 's': /* size */
Jmsg(jcr, M_INFO, 0, _(" st_size differ. Cat: %s File: %s\n"),
edit_uint64((uint64_t)statc.st_size, ed1),
edit_uint64((uint64_t)statf.st_size, ed2));
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'a': /* access time */
if (statc.st_atime != statf.st_atime) {
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" st_atime differs\n"));
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'm':
if (statc.st_mtime != statf.st_mtime) {
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" st_mtime differs\n"));
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'c': /* ctime */
if (statc.st_ctime != statf.st_ctime) {
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" st_ctime differs\n"));
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case 'd': /* file size decrease */
Jmsg(jcr, M_INFO, 0, _(" st_size decrease. Cat: %s File: %s\n"),
edit_uint64((uint64_t)statc.st_size, ed1),
edit_uint64((uint64_t)statf.st_size, ed2));
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
break;
case '5': /* compare MD5 */
if (jcr->FileIndex != (uint32_t)file_index) {
Jmsg2(jcr, M_FATAL, 0, _("MD5/SHA1 index %d not same as attributes %d\n"),
file_index, jcr->FileIndex);
- return false;
+ return;
}
if (do_Digest != CRYPTO_DIGEST_NONE) {
db_escape_string(jcr, jcr->db, buf, Opts_Digest, strlen(Opts_Digest));
prt_fname(jcr);
Jmsg(jcr, M_INFO, 0, _(" %s differs. File=%s Cat=%s\n"),
stream_to_ascii(stream), buf, fdbr.Digest);
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
do_Digest = CRYPTO_DIGEST_NONE;
}
berrno be;
Jmsg2(jcr, M_FATAL, 0, _("bdird<filed: bad attributes from filed n=%d : %s\n"),
n, be.bstrerror());
- return false;
+ return;
}
/* Now find all the files that are missing -- i.e. all files in
/* missing_handler is called for each file found */
db_sql_query(jcr->db, buf, missing_handler, (void *)jcr);
if (jcr->fn_printed) {
- stat = JS_Differences;
+ set_jcr_job_status(jcr, JS_Differences);
}
free_pool_memory(fname);
- if (!job_canceled(jcr)) {
- jcr->JobStatus = stat;
- }
- return stat == JS_Terminated;
}
/*
return 1;
}
if (!jcr->fn_printed) {
- Qmsg(jcr, M_INFO, 0, _("\nThe following files are in the Catalog but not on %s:\n"),
- jcr->get_JobLevel() == L_VERIFY_VOLUME_TO_CATALOG ? "the Volume(s)" : "disk");
+ Qmsg(jcr, M_WARNING, 0, _("The following files are in the Catalog but not on %s:\n"),
+ jcr->get_JobLevel() == L_VERIFY_VOLUME_TO_CATALOG ? "the Volume(s)" : "disk");
jcr->fn_printed = true;
}
Qmsg(jcr, M_INFO, 0, " %s%s\n", row[0]?row[0]:"", row[1]?row[1]:"");