]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/filed/accurate.c
Move libz out of FDLIBS into a seperate variable as we need it for libbac.so now...
[bacula/bacula] / bacula / src / filed / accurate.c
index 6def5178c8a21dc48672419e9b268180aed4769e..9b8d06a0599371a5ee1c8078270597da57024e2a 100644 (file)
@@ -100,7 +100,7 @@ static bool accurate_send_base_file_list(JCR *jcr)
    FF_PKT *ff_pkt;
    int stream = STREAM_UNIX_ATTRIBUTES;
 
-   if (!jcr->accurate || jcr->get_JobLevel() != L_FULL) {
+   if (!jcr->accurate || jcr->getJobLevel() != L_FULL) {
       return true;
    }
 
@@ -183,16 +183,16 @@ bool accurate_finish(JCR *jcr)
 {
    bool ret=true;
    if (jcr->accurate) {
-      if (jcr->get_JobLevel() == L_FULL) {
+      if (jcr->getJobLevel() == L_FULL) {
          ret = accurate_send_base_file_list(jcr);
       } else {
          ret = accurate_send_deleted_list(jcr);
       }
       
       accurate_free(jcr);
-      if (jcr->get_JobLevel() == L_FULL) {
-         Dmsg1(0, "Space saved with Base jobs: %lld MB\n"
-               jcr->base_size/(1024*1024));
+      if (jcr->getJobLevel() == L_FULL) {
+         Jmsg(jcr, M_INFO, 0, _("Space saved with Base jobs: %lld MB\n")
+              jcr->base_size/(1024*1024));
       }
    }
    return ret;
@@ -242,6 +242,7 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
    struct stat statc;
    int32_t LinkFIc;
    bool stat = false;
+   char *opts;
    char *fname;
    CurFile elt;
 
@@ -270,11 +271,17 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
 
    decode_stat(elt.lstat, &statc, &LinkFIc); /* decode catalog stat */
 
+   if (jcr->getJobLevel() == L_FULL) {
+      opts = ff_pkt->BaseJobOpts;
+   } else {
+      opts = ff_pkt->AccurateOpts;
+   }
+
    /*
     * Loop over options supplied by user and verify the
     * fields he requests.
     */
-   for (char *p=ff_pkt->AccurateOpts; !stat && *p; p++) {
+   for (char *p=opts; !stat && *p; p++) {
       char ed1[30], ed2[30];
       switch (*p) {
       case 'i':                /* compare INODEs */
@@ -287,6 +294,9 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
          }
          break;
       case 'p':                /* permissions bits */
+         /* TODO: If something change only in perm, user, group
+          * Backup only the attribute stream
+          */
          if (statc.st_mode != ff_pkt->statp.st_mode) {
             Dmsg3(dbglvl-1, "%s     st_mode  differ. Cat: %x File: %x\n",
                   fname,
@@ -362,13 +372,21 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
           * The remainder of the function is all about getting the checksum.
           * First we initialise, then we read files, other streams and Finder Info.
           */
-         if (!stat && *elt.chksum && ff_pkt->type != FT_LNKSAVED && 
+         if (!stat && ff_pkt->type != FT_LNKSAVED && 
              (S_ISREG(ff_pkt->statp.st_mode) && 
               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"),
+                    ff_pkt->fname);
+               stat = true;
+               break;
+            }
+
             /*
-             * Create our digest context. If this fails, the digest will be set to NULL
-             * and not used.
+             * Create our digest context. If this fails, the digest will be set
+             * to NULL and not used.
              */
             if (ff_pkt->flags & FO_MD5) {
                digest = crypto_digest_new(jcr, CRYPTO_DIGEST_MD5);
@@ -428,6 +446,7 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
 
          break;
       case ':':
+      case 'J':
       case 'C':
       default:
          break;
@@ -437,7 +456,7 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
    /* In Incr/Diff accurate mode, we mark all files as seen
     * When in Full+Base mode, we mark only if the file match exactly
     */
-   if (jcr->get_JobLevel() == L_FULL) {
+   if (jcr->getJobLevel() == L_FULL) {
       if (!stat) {               
          /* compute space saved with basefile */
          jcr->base_size += ff_pkt->statp.st_size;
@@ -483,12 +502,8 @@ int accurate_cmd(JCR *jcr)
       if (lstat_pos < dir->msglen) {
          chksum_pos = lstat_pos + strlen(dir->msg + lstat_pos) + 1;
 
-         Dmsg3(dbglvl, "len=%i lstat_pos=%i chksum_pos=%i\n", 
-               (uint32_t) dir->msglen,
-               (uint32_t) lstat_pos, (uint32_t) chksum_pos);
-
          if (chksum_pos >= dir->msglen) {
-            chksum_pos = lstat_pos - 1;       /* no checksum, point to the last \0 */
+            chksum_pos = lstat_pos - 1;    /* tweak: no checksum, point to the last \0 */
          } 
 
          accurate_add_file(jcr, dir->msglen,