From 04182a570c30c5bac97cbe52a51f8e7a174b5451 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 12 Dec 2020 12:56:46 +0100 Subject: [PATCH] Compile on systems without O_TMPFILE. This is a last-resort solution; we don't do unlink-on-signal or similar, so if updatedb or plocate-build is aborted on such platforms, there will be an orphan temporary file. --- database-builder.cpp | 20 ++++++++++++++++++++ database-builder.h | 4 ++++ 2 files changed, 24 insertions(+) diff --git a/database-builder.cpp b/database-builder.cpp index 1e3b442..89a06d6 100644 --- a/database-builder.cpp +++ b/database-builder.cpp @@ -427,11 +427,24 @@ DatabaseBuilder::DatabaseBuilder(const char *outfile, gid_t owner, int block_siz if (path.empty()) { path = "."; } +#ifdef O_TMPFILE int fd = open(path.c_str(), O_WRONLY | O_TMPFILE, 0640); if (fd == -1) { perror(path.c_str()); exit(1); } +#else + temp_filename = string(outfile) + ".XXXXXX"; + int 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) { @@ -608,6 +621,7 @@ void DatabaseBuilder::finish_corpus() fseek(outfp, 0, SEEK_SET); fwrite(&hdr, sizeof(hdr), 1, outfp); +#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()); @@ -617,6 +631,12 @@ void DatabaseBuilder::finish_corpus() perror("linkat"); exit(1); } +#else + if (rename(temp_filename.c_str(), outfile.c_str()) == -1) { + perror("rename"); + exit(1); + } +#endif fclose(outfp); diff --git a/database-builder.h b/database-builder.h index 97188e1..2a56e11 100644 --- a/database-builder.h +++ b/database-builder.h @@ -4,6 +4,7 @@ #include "db.h" #include +#include #include #include #include @@ -110,6 +111,9 @@ public: 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; -- 2.39.2