]> git.sesse.net Git - plocate/blobdiff - updatedb.cpp
Increase hard file limit if possible.
[plocate] / updatedb.cpp
index 908f47758205dc662c4cfae9bf8e76051839f02a..17067b8d0d10e705048f7d76ab2cc0081a94027e 100644 (file)
@@ -49,10 +49,10 @@ any later version.
 #include <stdlib.h>
 #include <string.h>
 #include <string>
+#include <sys/resource.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/types.h>
-#include <sys/resource.h>
 #include <unistd.h>
 #include <utility>
 #include <vector>
@@ -598,6 +598,11 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
                // by reading from the database. (We still need to open and stat everything,
                // though, but that happens in a later step.)
                entries = move(db_entries);
+               if (conf_verbose) {
+                       for (const entry &e : entries) {
+                               printf("%s/%s\n", path.c_str(), e.name.c_str());
+                       }
+               }
        } else {
                dir = fdopendir(fd);  // Takes over ownership of fd.
                if (dir == nullptr) {
@@ -679,7 +684,7 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
                                        fprintf(stderr, "Hint: Try `ulimit -n 131072' or similar.\n");
                                } else {
                                        fprintf(stderr, "Hint: Try `ulimit -n %lu' or similar (current limit is %lu).\n",
-                                               rlim.rlim_cur * 2, rlim.rlim_cur);
+                                               rlim.rlim_cur * 2, rlim.rlim_cur);
                                }
                                exit(1);
                        }
@@ -737,6 +742,15 @@ int main(int argc, char **argv)
        // and can set whatever we want). 128k should be ample for most setups.
        rlimit rlim;
        if (getrlimit(RLIMIT_NOFILE, &rlim) != -1) {
+               // Even root cannot increase rlim_cur beyond rlim_max,
+               // so we need to try to increase rlim_max first.
+               // Ignore errors, though.
+               if (rlim.rlim_max < 131072) {
+                       rlim.rlim_max = 131072;
+                       setrlimit(RLIMIT_NOFILE, &rlim);
+                       getrlimit(RLIMIT_NOFILE, &rlim);
+               }
+
                rlim_t wanted = std::max<rlim_t>(rlim.rlim_cur, 131072);
                rlim.rlim_cur = std::min<rlim_t>(wanted, rlim.rlim_max);
                setrlimit(RLIMIT_NOFILE, &rlim);  // Ignore errors.
@@ -762,7 +776,8 @@ int main(int argc, char **argv)
                owner = grp->gr_gid;
        }
 
-       DatabaseBuilder db(conf_output.c_str(), owner, conf_block_size, existing_db.read_next_dictionary());
+       DatabaseBuilder db(conf_output.c_str(), owner, conf_block_size, existing_db.read_next_dictionary(), conf_check_visibility);
+       db.set_conf_block(conf_block);
        Corpus *corpus = db.start_corpus(/*store_dir_times=*/true);
 
        int root_fd = opendir_noatime(AT_FDCWD, conf_scan_root);