]> git.sesse.net Git - plocate/blobdiff - updatedb.cpp
Release plocate 1.1.22.
[plocate] / updatedb.cpp
index 812304bb6b8439cc835dc1ddd1bf7cb709e48445..cfdd3afff0c8f0773f865065d8202ecea2d3f296 100644 (file)
@@ -159,11 +159,10 @@ struct entry {
        dev_t dev;
 };
 
-bool filesystem_is_excluded(const char *path)
+bool filesystem_is_excluded(const string &path)
 {
        if (conf_debug_pruning) {
-               /* This is debugging output, don't mark anything for translation */
-               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) {
@@ -173,34 +172,24 @@ bool filesystem_is_excluded(const char *path)
        struct mntent *me;
        while ((me = getmntent(f)) != nullptr) {
                if (conf_debug_pruning) {
-                       /* This is debugging output, don't mark anything for translation */
                        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) {
-                               /* This is debugging output, don't mark anything for translation */
-                               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) {
-               /* This is debugging output, don't mark anything for translation */
-               fprintf(stderr, "...done\n");
+               fprintf(stderr, "...not found in mount list\n");
        }
        endmntent(f);
        return false;
@@ -535,7 +524,6 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
 {
        if (string_list_contains_dir_path(&conf_prunepaths, &conf_prunepaths_index, path)) {
                if (conf_debug_pruning) {
-                       /* This is debugging output, don't mark anything for translation */
                        fprintf(stderr, "Skipping `%s': in prunepaths\n", path.c_str());
                }
                close(fd);
@@ -543,7 +531,6 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
        }
        if (conf_prune_bind_mounts && is_bind_mount(path.c_str())) {
                if (conf_debug_pruning) {
-                       /* This is debugging output, don't mark anything for translation */
                        fprintf(stderr, "Skipping `%s': bind mount\n", path.c_str());
                }
                close(fd);
@@ -692,7 +679,6 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
 
                if (find(conf_prunenames.begin(), conf_prunenames.end(), e.name) != conf_prunenames.end()) {
                        if (conf_debug_pruning) {
-                               /* This is debugging output, don't mark anything for translation */
                                fprintf(stderr, "Skipping `%s': in prunenames\n", e.name.c_str());
                        }
                        continue;
@@ -726,7 +712,7 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
                        // 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;
@@ -738,7 +724,7 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
 
                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;
@@ -797,7 +783,7 @@ int main(int argc, char **argv)
 
        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);