X-Git-Url: http://git.vrable.net/?p=cumulus.git;a=blobdiff_plain;f=scandir.cc;h=8af3175b64c3b6007a5497f4c4ac8d81e5d9ff7c;hp=176cb21e927d8f90e0e10f72640ebf9b36e70ab9;hb=f38dd9bcb0caffd3fc9126b05788c936690e8288;hpb=590f3e98bfa5862d77037c2d13f373f50166a47e diff --git a/scandir.cc b/scandir.cc index 176cb21..8af3175 100644 --- a/scandir.cc +++ b/scandir.cc @@ -90,6 +90,7 @@ double snapshot_intent = 1.0; /* Selection of files to include/exclude in the snapshot. */ std::list includes; // Paths in which files should be saved std::list excludes; // Paths which will not be saved +std::list excluded_names; // Directories which will not be saved std::list searches; // Directories we don't want to save, but // do want to descend searching for data // in included paths @@ -270,6 +271,10 @@ int64_t dumpfile(int fd, dictionary &file_info, const string &path, subfile.analyze_new_block(block_buf, bytes); refs = subfile.create_incremental(tss, o, block_age); } else { + if (flag_rebuild_statcache && ref.is_normal()) { + subfile.analyze_new_block(block_buf, bytes); + subfile.store_analyzed_signatures(ref); + } refs.push_back(ref); } @@ -352,12 +357,12 @@ void dump_inode(const string& path, // Path within snapshot file_info["volatile"] = "1"; struct passwd *pwd = getpwuid(stat_buf.st_uid); - if (pwd != NULL) { + if (pwd != NULL && pwd->pw_name != NULL) { file_info["user"] += " (" + uri_encode(pwd->pw_name) + ")"; } struct group *grp = getgrgid(stat_buf.st_gid); - if (pwd != NULL) { + if (grp != NULL && grp->gr_name != NULL) { file_info["group"] += " (" + uri_encode(grp->gr_name) + ")"; } @@ -466,6 +471,21 @@ void scanfile(const string& path, bool include) } } + if (excluded_names.size() > 0) { + std::string name = path; + std::string::size_type last_slash = name.rfind('/'); + if (last_slash != std::string::npos) { + name.replace(0, last_slash + 1, ""); + } + + for (list::iterator i = excluded_names.begin(); + i != excluded_names.end(); ++i) { + if (name == *i) { + include = false; + } + } + } + for (list::iterator i = searches.begin(); i != searches.end(); ++i) { if (path == *i) { @@ -616,6 +636,7 @@ void usage(const char *program) " --upload-script=COMMAND\n" " program to invoke for each backup file generated\n" " --exclude=PATH exclude files in PATH from snapshot\n" + " --exclude-name=NAME exclude files called NAME from snapshot\n" " --localdb=PATH local backup metadata is stored in PATH\n" " --tmpdir=PATH path for temporarily storing backup files\n" " (defaults to TMPDIR environment variable or /tmp)\n" @@ -663,6 +684,7 @@ int main(int argc, char *argv[]) {"tmpdir", 1, 0, 0}, // 9 {"upload-script", 1, 0, 0}, // 10 {"rebuild-statcache", 0, 0, 0}, // 11 + {"exclude-name", 1, 0, 0}, // 12 // Aliases for short options {"verbose", 0, 0, 'v'}, {NULL, 0, 0, 0}, @@ -717,6 +739,9 @@ int main(int argc, char *argv[]) case 11: // --rebuild-statcache flag_rebuild_statcache = true; break; + case 12: // --exclude-name + excluded_names.push_back(optarg); + break; default: fprintf(stderr, "Unhandled long option!\n"); return 1; @@ -779,8 +804,7 @@ int main(int argc, char *argv[]) tmp_dir.c_str()); return 1; } - remote = new RemoteStore(tmp_dir); - remote->set_script(backup_script); + remote = new RemoteStore(tmp_dir, backup_script=backup_script); } else { remote = new RemoteStore(backup_dest); } @@ -921,7 +945,7 @@ int main(int argc, char *argv[]) waitpid(signature_pid, &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { - throw IOException("Signature filter process error"); + fatal("Signature filter process error"); } }