]> git.sesse.net Git - plocate/commitdiff
Compile on systems without O_TMPFILE.
authorSteinar H. Gunderson <steinar+git@gunderson.no>
Sat, 12 Dec 2020 11:56:46 +0000 (12:56 +0100)
committerSteinar H. Gunderson <steinar+git@gunderson.no>
Sat, 12 Dec 2020 11:58:21 +0000 (12:58 +0100)
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
database-builder.h

index 1e3b442d1fb10af81d51ecdb99f8c527a942f36a..89a06d6c59a52399a11c05a6513df780f4edb281 100644 (file)
@@ -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);
 
index 97188e131e3c800b16585396c9d9cdae9e2493b5..2a56e11093cbe26c4823c82642ebb59ddb4386cc 100644 (file)
@@ -4,6 +4,7 @@
 #include "db.h"
 
 #include <chrono>
+#include <fcntl.h>
 #include <memory>
 #include <random>
 #include <stddef.h>
@@ -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;