summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
9980e72)
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.
if (path.empty()) {
path = ".";
}
if (path.empty()) {
path = ".";
}
int fd = open(path.c_str(), O_WRONLY | O_TMPFILE, 0640);
if (fd == -1) {
perror(path.c_str());
exit(1);
}
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) {
if (owner != (gid_t)-1) {
if (fchown(fd, (uid_t)-1, owner) == -1) {
fseek(outfp, 0, SEEK_SET);
fwrite(&hdr, sizeof(hdr), 1, outfp);
fseek(outfp, 0, SEEK_SET);
fwrite(&hdr, sizeof(hdr), 1, outfp);
// 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());
// 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());
perror("linkat");
exit(1);
}
perror("linkat");
exit(1);
}
+#else
+ if (rename(temp_filename.c_str(), outfile.c_str()) == -1) {
+ perror("rename");
+ exit(1);
+ }
+#endif
#include "db.h"
#include <chrono>
#include "db.h"
#include <chrono>
#include <memory>
#include <random>
#include <stddef.h>
#include <memory>
#include <random>
#include <stddef.h>
private:
FILE *outfp;
std::string outfile;
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;
Header hdr;
const int block_size;
std::chrono::steady_clock::time_point corpus_start;