dev_t dev;
};
-bool filesystem_is_excluded(const char *path)
+bool filesystem_is_excluded(const string &path)
{
if (conf_debug_pruning) {
- fprintf(stderr, "Checking whether filesystem `%s' is excluded:\n", path);
+ fprintf(stderr, "Checking whether filesystem `%s' is excluded:\n", path.c_str());
}
FILE *f = setmntent("/proc/mounts", "r");
if (f == nullptr) {
if (conf_debug_pruning) {
fprintf(stderr, " `%s', type `%s'\n", me->mnt_dir, me->mnt_type);
}
+ if (path != me->mnt_dir) {
+ continue;
+ }
string type(me->mnt_type);
for (char &p : type) {
p = toupper(p);
}
- if (find(conf_prunefs.begin(), conf_prunefs.end(), type) != conf_prunefs.end()) {
- /* Paths in /proc/self/mounts contain no symbolic links. Besides
- avoiding a few system calls, avoiding the realpath () avoids hangs
- if the filesystem is unavailable hard-mounted NFS. */
- char *dir = me->mnt_dir;
- if (conf_debug_pruning) {
- fprintf(stderr, " => type matches, dir `%s'\n", dir);
- }
- bool res = (strcmp(path, dir) == 0);
- if (dir != me->mnt_dir)
- free(dir);
- if (res) {
- endmntent(f);
- return true;
- }
+ bool exclude = (find(conf_prunefs.begin(), conf_prunefs.end(), type) != conf_prunefs.end());
+ if (exclude && conf_debug_pruning) {
+ fprintf(stderr, " => excluded due to filesystem type\n");
}
+ endmntent(f);
+ return exclude;
}
if (conf_debug_pruning) {
- fprintf(stderr, "...done\n");
+ fprintf(stderr, "...not found in mount list\n");
}
endmntent(f);
return false;
// Takes ownership of fd.
int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_time db_modified, ExistingDB *existing_db, DatabaseReceiver *corpus, DictionaryBuilder *dict_builder)
{
+ if (string_list_contains_dir_path(&conf_prunepaths, &conf_prunepaths_index, path)) {
+ if (conf_debug_pruning) {
+ fprintf(stderr, "Skipping `%s': in prunepaths\n", path.c_str());
+ }
+ close(fd);
+ return 0;
+ }
if (conf_prune_bind_mounts && is_bind_mount(path.c_str())) {
if (conf_debug_pruning) {
fprintf(stderr, "Skipping `%s': bind mount\n", path.c_str());
}
continue;
}
- if (string_list_contains_dir_path(&conf_prunepaths, &conf_prunepaths_index, (path_plus_slash + e.name).c_str())) {
- if (conf_debug_pruning) {
- fprintf(stderr, "Skipping `%s/%s': in prunepaths\n", path.c_str(), e.name.c_str());
- }
- continue;
- }
e.fd = opendir_noatime(fd, e.name.c_str());
if (e.fd == -1) {
// It would be better to be able to run filesystem_is_excluded()
// for cheap on everything and just avoid the stat, but it seems
// hard to do that without any kind of raciness.
- if (filesystem_is_excluded((path_plus_slash + e.name).c_str())) {
+ if (filesystem_is_excluded(path_plus_slash + e.name)) {
close(e.fd);
e.fd = -1;
continue;
e.dev = buf.st_dev;
if (buf.st_dev != parent_dev) {
- if (filesystem_is_excluded((path_plus_slash + e.name).c_str())) {
+ if (filesystem_is_excluded(path_plus_slash + e.name)) {
close(e.fd);
e.fd = -1;
continue;
conf_prepare(argc, argv);
if (conf_prune_bind_mounts) {
- bind_mount_init(MOUNTINFO_PATH);
+ bind_mount_init();
}
int fd = open(conf_output.c_str(), O_RDONLY);