X-Git-Url: http://git.vrable.net/?p=cumulus.git;a=blobdiff_plain;f=scandir.cc;h=8af3175b64c3b6007a5497f4c4ac8d81e5d9ff7c;hp=f119197ff6b1ec8cb0f5547094c1e155791425e5;hb=f38dd9bcb0caffd3fc9126b05788c936690e8288;hpb=974240b635af9cf2b94e2f1f3c02beab662a189d diff --git a/scandir.cc b/scandir.cc index f119197..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 @@ -356,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) + ")"; } @@ -470,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) { @@ -620,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" @@ -667,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}, @@ -721,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; @@ -783,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); }