#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/stat.h>
#include <unistd.h>
#include "log.h"
#include "util.h"
+#ifndef O_TMPFILE
+#define __O_TMPFILE 020000000
+#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
+#endif
+
using namespace std;
int make_tempfile(const std::string &contents)
{
char filename[] = "/tmp/cubemap.XXXXXX";
- int fd = mkstemp(filename);
+ int fd = open(filename, O_RDWR | O_TMPFILE, 0600);
if (fd == -1) {
- log_perror("mkstemp");
- return -1;
- }
+ fd = mkstemp(filename);
+ if (fd == -1) {
+ log_perror("mkstemp");
+ return -1;
+ }
- if (unlink(filename) == -1) {
- log_perror("unlink");
- // Can still continue;
+ if (unlink(filename) == -1) {
+ log_perror("unlink");
+ // Can still continue.
+ }
}
const char *ptr = contents.data();
ssize_t ret = write(fd, ptr, to_write);
if (ret == -1) {
log_perror("write");
- close(fd);
+ safe_close(fd);
return -1;
}
bool read_tempfile_and_close(int fd, std::string *contents)
{
bool ok = read_tempfile(fd, contents);
-
- int ret;
- do {
- ret = close(fd); // Implicitly deletes the file.
- } while (ret == -1 && errno == EINTR);
-
- if (ret == -1) {
- log_perror("close");
- // Can still continue.
- }
-
+ safe_close(fd); // Implicitly deletes the file.
return ok;
}
return true;
}
+
+int safe_close(int fd)
+{
+ int ret;
+ do {
+ ret = close(fd);
+ } while (ret == -1 && errno == EINTR);
+
+ if (ret == -1) {
+ log_perror("close()");
+ }
+
+ return ret;
+}