Compute checksums of segments and store them in the local database.
[cumulus.git] / scandir.cc
index 841dc91..82160a1 100644 (file)
@@ -305,6 +305,13 @@ void dump_inode(const string& path,         // Path within snapshot
         file_info["group"] += " (" + uri_encode(grp->gr_name) + ")";
     }
 
+    if (stat_buf.st_nlink > 1 && (stat_buf.st_mode & S_IFMT) != S_IFDIR) {
+        file_info["links"] = encode_int(stat_buf.st_nlink);
+        file_info["inode"] = encode_int(major(stat_buf.st_dev))
+            + "/" + encode_int(minor(stat_buf.st_dev))
+            + "/" + encode_int(stat_buf.st_ino);
+    }
+
     char inode_type;
 
     switch (stat_buf.st_mode & S_IFMT) {
@@ -344,7 +351,6 @@ void dump_inode(const string& path,         // Path within snapshot
 
         file_size = dumpfile(fd, file_info, path, stat_buf);
         file_info["size"] = encode_int(file_size);
-        close(fd);
 
         if (file_size < 0)
             return;             // error occurred; do not dump file
@@ -669,7 +675,6 @@ int main(int argc, char *argv[])
             printf("    %s\n", i->c_str());
     }
 
-    tss = new TarSegmentStore(backup_dest);
     block_buf = new char[LBS_BLOCK_SIZE];
 
     /* Store the time when the backup started, so it can be included in the
@@ -689,6 +694,8 @@ int main(int argc, char *argv[])
     db->Open(database_path.c_str(), desc_buf,
              backup_scheme.size() ? backup_scheme.c_str() : NULL);
 
+    tss = new TarSegmentStore(backup_dest, db);
+
     /* Initialize the stat cache, for skipping over unchanged files. */
     statcache = new StatCache;
     statcache->Open(localdb_dir.c_str(), desc_buf,
@@ -709,8 +716,6 @@ int main(int argc, char *argv[])
     string backup_root = root->get_ref().to_string();
     delete root;
 
-    db->Close();
-
     statcache->Close();
     delete statcache;
 
@@ -718,6 +723,8 @@ int main(int argc, char *argv[])
     tss->dump_stats();
     delete tss;
 
+    db->Close();
+
     /* Write a backup descriptor file, which says which segments are needed and
      * where to start to restore this snapshot.  The filename is based on the
      * current time. */