14 int make_tempfile(const std::string &contents)
16 char filename[] = "/tmp/cubemap.XXXXXX";
17 mode_t old_umask = umask(0600);
18 int fd = mkstemp(filename);
21 log_perror("mkstemp");
25 if (unlink(filename) == -1) {
27 // Can still continue;
30 const char *ptr = contents.data();
31 size_t to_write = contents.size();
32 while (to_write > 0) {
33 ssize_t ret = write(fd, ptr, to_write);
36 if (close(fd) == -1) {
49 bool read_tempfile_and_close(int fd, std::string *contents)
51 bool ok = read_tempfile(fd, contents);
55 ret = close(fd); // Implicitly deletes the file.
56 } while (ret == -1 && errno == EINTR);
60 // Can still continue.
66 bool read_tempfile(int fd, std::string *contents)
68 ssize_t ret, has_read;
70 off_t len = lseek(fd, 0, SEEK_END);
76 contents->resize(len);
78 if (lseek(fd, 0, SEEK_SET) == -1) {
84 while (has_read < len) {
85 ret = read(fd, &((*contents)[has_read]), len - has_read);
91 log(ERROR, "Unexpected EOF!");