diff -Nru plocate-1.1.4/database-builder.cpp plocate-1.1.5/database-builder.cpp --- plocate-1.1.4/database-builder.cpp 2021-02-14 09:56:16.000000000 +0000 +++ plocate-1.1.5/database-builder.cpp 2021-02-24 18:14:11.000000000 +0000 @@ -208,6 +208,7 @@ std::unique_ptr invindex; FILE *outfp; + off_t outfp_pos; // Cheaper than calling ftell(outfp) all the time. std::string current_block; std::string tempbuf; const size_t block_size; @@ -221,7 +222,7 @@ EncodingCorpus::EncodingCorpus(FILE *outfp, size_t block_size, ZSTD_CDict *cdict, bool store_dir_times) - : invindex(new PostingListBuilder *[NUM_TRIGRAMS]), outfp(outfp), block_size(block_size), store_dir_times(store_dir_times), cdict(cdict) + : invindex(new PostingListBuilder *[NUM_TRIGRAMS]), outfp(outfp), outfp_pos(ftell(outfp)), block_size(block_size), store_dir_times(store_dir_times), cdict(cdict) { fill(invindex.get(), invindex.get() + NUM_TRIGRAMS, nullptr); if (store_dir_times) { @@ -336,12 +337,13 @@ } // Compress and add the filename block. - filename_blocks.push_back(ftell(outfp)); + filename_blocks.push_back(outfp_pos); string compressed = zstd_compress(current_block, cdict, &tempbuf); if (fwrite(compressed.data(), compressed.size(), 1, outfp) != 1) { perror("fwrite()"); exit(1); } + outfp_pos += compressed.size(); current_block.clear(); num_files_in_block = 0; @@ -485,24 +487,26 @@ if (path.empty()) { path = "."; } + int fd = -1; #ifdef O_TMPFILE - int fd = open(path.c_str(), O_WRONLY | O_TMPFILE, 0640); - if (fd == -1) { + fd = open(path.c_str(), O_WRONLY | O_TMPFILE, 0640); + if (fd == -1 && errno != EOPNOTSUPP) { perror(path.c_str()); exit(1); } -#else - temp_filename = string(outfile) + ".XXXXXX"; - int fd = mkstemp(&temp_filename[0]); +#endif if (fd == -1) { - perror(temp_filename.c_str()); - exit(1); - } - if (fchmod(fd, 0640) == -1) { - perror("fchmod"); - exit(1); + temp_filename = string(outfile) + ".XXXXXX"; + fd = mkstemp(&temp_filename[0]); + if (fd == -1) { + perror(temp_filename.c_str()); + exit(1); + } + if (fchmod(fd, 0640) == -1) { + perror("fchmod"); + exit(1); + } } -#endif if (owner != (gid_t)-1) { if (fchown(fd, (uid_t)-1, owner) == -1) { @@ -679,22 +683,24 @@ fseek(outfp, 0, SEEK_SET); fwrite(&hdr, sizeof(hdr), 1, outfp); + if (!temp_filename.empty()) { + if (rename(temp_filename.c_str(), outfile.c_str()) == -1) { + perror("rename"); + exit(1); + } + } else { #ifdef O_TMPFILE - // Give the file a proper name, making it visible in the file system. - // TODO: It would be nice to be able to do this atomically, like with rename. - unlink(outfile.c_str()); - char procpath[256]; - snprintf(procpath, sizeof(procpath), "/proc/self/fd/%d", fileno(outfp)); - if (linkat(AT_FDCWD, procpath, AT_FDCWD, outfile.c_str(), AT_SYMLINK_FOLLOW) == -1) { - perror("linkat"); - exit(1); - } -#else - if (rename(temp_filename.c_str(), outfile.c_str()) == -1) { - perror("rename"); - exit(1); - } + // Give the file a proper name, making it visible in the file system. + // TODO: It would be nice to be able to do this atomically, like with rename. + unlink(outfile.c_str()); + char procpath[256]; + snprintf(procpath, sizeof(procpath), "/proc/self/fd/%d", fileno(outfp)); + if (linkat(AT_FDCWD, procpath, AT_FDCWD, outfile.c_str(), AT_SYMLINK_FOLLOW) == -1) { + perror("linkat"); + exit(1); + } #endif + } fclose(outfp); diff -Nru plocate-1.1.4/database-builder.h plocate-1.1.5/database-builder.h --- plocate-1.1.4/database-builder.h 2021-02-14 09:56:16.000000000 +0000 +++ plocate-1.1.5/database-builder.h 2021-02-24 18:14:11.000000000 +0000 @@ -81,9 +81,7 @@ private: FILE *outfp; std::string outfile; -#ifndef O_TMPFILE std::string temp_filename; -#endif Header hdr; const int block_size; std::chrono::steady_clock::time_point corpus_start; diff -Nru plocate-1.1.4/debian/changelog plocate-1.1.5/debian/changelog --- plocate-1.1.4/debian/changelog 2021-02-14 09:58:26.000000000 +0000 +++ plocate-1.1.5/debian/changelog 2021-02-24 18:15:32.000000000 +0000 @@ -1,3 +1,14 @@ +plocate (1.1.5-1) unstable; urgency=medium + + * New upstream release. + * updatedb now works if /var is on a system that does not support O_TMPFILE, + such as overlayfs. (Closes: #983002) + * Suggest powermgmt-base and nocache for non-systemd systems, since the cron job + is capable of using on_ac_power and nocache if they are installed. + (Closes: #983426) + + -- Steinar H. Gunderson Wed, 24 Feb 2021 19:15:32 +0100 + plocate (1.1.4-1) unstable; urgency=medium * New upstream release. diff -Nru plocate-1.1.4/debian/control plocate-1.1.5/debian/control --- plocate-1.1.4/debian/control 2020-12-10 18:35:35.000000000 +0000 +++ plocate-1.1.5/debian/control 2021-02-24 18:15:32.000000000 +0000 @@ -11,6 +11,7 @@ Package: plocate Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} +Suggests: systemd-sysv | powermgmt-base, systemd-sysv | nocache Replaces: mlocate Description: much faster locate plocate is a locate(1) based on posting lists, giving much faster searches diff -Nru plocate-1.1.4/meson.build plocate-1.1.5/meson.build --- plocate-1.1.4/meson.build 2021-02-14 09:56:16.000000000 +0000 +++ plocate-1.1.5/meson.build 2021-02-24 18:14:11.000000000 +0000 @@ -1,4 +1,4 @@ -project('plocate', 'cpp', default_options: ['buildtype=debugoptimized','cpp_std=c++17'], version: '1.1.4') +project('plocate', 'cpp', default_options: ['buildtype=debugoptimized','cpp_std=c++17'], version: '1.1.5') add_project_arguments('-DGROUPNAME="' + get_option('locategroup') + '"', language: 'cpp') add_project_arguments('-DUPDATEDB_CONF="/etc/updatedb.conf"', language: 'cpp') diff -Nru plocate-1.1.4/NEWS plocate-1.1.5/NEWS --- plocate-1.1.4/NEWS 2021-02-14 09:56:16.000000000 +0000 +++ plocate-1.1.5/NEWS 2021-02-24 18:14:11.000000000 +0000 @@ -1,3 +1,8 @@ +plocate 1.1.5, February 24th, 2021 + + - Various bugfixes. + + plocate 1.1.4, February 14th, 2021 - updatedb now uses ~15% less CPU time.