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) {
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());
perror("linkat");
exit(1);
}
+#else
+ if (rename(temp_filename.c_str(), outfile.c_str()) == -1) {
+ perror("rename");
+ exit(1);
+ }
+#endif
fclose(outfp);