]> git.sesse.net Git - plocate/blobdiff - updatedb.cpp
Release plocate 1.1.7.
[plocate] / updatedb.cpp
index 8435a48b56f40ccaecf510913e15291050f336a9..8d524c6872038b4c72829de3d12cbb354f6fc760 100644 (file)
@@ -92,7 +92,11 @@ int opendir_noatime(int dirfd, const char *path)
        static bool noatime_failed = false;
 
        if (!noatime_failed) {
+#ifdef O_NOATIME
                int fd = openat(dirfd, path, O_RDONLY | O_DIRECTORY | O_NOATIME);
+#else
+               int fd = openat(dirfd, path, O_RDONLY | O_DIRECTORY);
+#endif
                if (fd != -1) {
                        return fd;
                } else if (errno == EPERM) {
@@ -526,7 +530,7 @@ string ExistingDB::read_next_dictionary() const
 // “parent_dev” must be the device of the parent directory of “path”.
 //
 // 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, Corpus *corpus, DictionaryBuilder *dict_builder)
+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) {
@@ -624,7 +628,23 @@ int scan(const string &path, int fd, dev_t parent_dev, dir_time modified, dir_ti
 
                        entry e;
                        e.name = de->d_name;
-                       e.is_directory = (de->d_type == DT_DIR);
+                       if (de->d_type == DT_UNKNOWN) {
+                               // Evidently some file systems, like older versions of XFS
+                               // (mkfs.xfs -m crc=0 -n ftype=0), can return this,
+                               // and we need a stat(). If we wanted to optimize for this,
+                               // we could probably defer it to later (we're stat-ing directories
+                               // when recursing), but this is rare, and not really worth it --
+                               // the second stat() will be cached anyway.
+                               struct stat buf;
+                               if (fstatat(fd, de->d_name, &buf, AT_SYMLINK_NOFOLLOW) == 0 &&
+                                   S_ISDIR(buf.st_mode)) {
+                                       e.is_directory = true;
+                               } else {
+                                       e.is_directory = false;
+                               }
+                       } else {
+                               e.is_directory = (de->d_type == DT_DIR);
+                       }
 
                        if (conf_verbose) {
                                printf("%s/%s\n", path.c_str(), de->d_name);
@@ -742,6 +762,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.
@@ -769,7 +798,7 @@ int main(int argc, char **argv)
 
        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);
+       DatabaseReceiver *corpus = db.start_corpus(/*store_dir_times=*/true);
 
        int root_fd = opendir_noatime(AT_FDCWD, conf_scan_root);
        if (root_fd == -1) {