summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-01-25 20:48:01 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-01-27 23:17:02 -0500
commit8e33886ec582336564ae11b80023abe93d7599c0 (patch)
tree9d2c70e1a3ba876e78a16e0497a9908ace4f7781 /src/shared
parent847657c7690598f1c77d0ba9e86ef58916bc58a7 (diff)
Replace mkostemp+unlink with open(O_TMPFILE)
This will only work on Linux >= 3.11, and probably not on all filesystems. Fallback code is provided.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/util.c22
-rw-r--r--src/shared/util.h2
2 files changed, 24 insertions, 0 deletions
diff --git a/src/shared/util.c b/src/shared/util.c
index cdd9a48866..27fc9594cd 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -6108,3 +6108,25 @@ int getpeersec(int fd, char **ret) {
*ret = s;
return 0;
}
+
+int open_tmpfile(const char *path, int flags) {
+ int fd;
+ char *p;
+
+#ifdef O_TMPFILE
+ fd = open(path, flags|O_TMPFILE, S_IRUSR|S_IWUSR);
+ if (fd >= 0)
+ return fd;
+#endif
+ p = strappenda(path, "/systemd-tmp-XXXXXX");
+
+ RUN_WITH_UMASK(0077) {
+ fd = mkostemp(p, O_RDWR|O_CLOEXEC);
+ }
+
+ if (fd < 0)
+ return -errno;
+
+ unlink(p);
+ return fd;
+}
diff --git a/src/shared/util.h b/src/shared/util.h
index d6d746bc6a..630137a53a 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -849,3 +849,5 @@ bool pid_valid(pid_t pid);
int getpeercred(int fd, struct ucred *ucred);
int getpeersec(int fd, char **ret);
+
+int open_tmpfile(const char *path, int flags);