X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=database-builder.cpp;h=89a06d6c59a52399a11c05a6513df780f4edb281;hb=04182a570c30c5bac97cbe52a51f8e7a174b5451;hp=1e3b442d1fb10af81d51ecdb99f8c527a942f36a;hpb=9980e72ff12857b862705979d2ff84820c2fc097;p=plocate 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);