diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2017-02-11 18:33:16 -0500 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2017-02-20 18:49:09 -0500 |
commit | 504afd7c34e00eb84589e94e59cd14f2fffa2807 (patch) | |
tree | ce9cbf783c00d118a1d528bb67a564ab81379696 /src/basic | |
parent | 18f71a3c8174774c5386c4aba94d54f3b5c36a84 (diff) |
core/manager: split out creation of serialization fd out to a helper
There is a slight change in behaviour: the user manager for root will create a
temporary file in /run/systemd, not /tmp. I don't think this matters, but
simplifies implementation.
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/fileio.c | 19 | ||||
-rw-r--r-- | src/basic/fileio.h | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c index c43b0583a4..ac65fada35 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -1342,6 +1342,25 @@ int open_tmpfile_linkable(const char *target, int flags, char **ret_path) { return fd; } +int open_serialization_fd(const char *ident) { + int fd = -1; + + fd = memfd_create(ident, MFD_CLOEXEC); + if (fd < 0) { + const char *path; + + path = getpid() == 1 ? "/run/systemd" : "/tmp"; + fd = open_tmpfile_unlinkable(path, O_RDWR|O_CLOEXEC); + if (fd < 0) + return fd; + + log_debug("Serializing %s to %s.", ident, path); + } else + log_debug("Serializing %s to memfd.", ident); + + return fd; +} + int link_tmpfile(int fd, const char *path, const char *target) { assert(fd >= 0); diff --git a/src/basic/fileio.h b/src/basic/fileio.h index 17b38a5d60..64852b15a8 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -84,6 +84,7 @@ int fputs_with_space(FILE *f, const char *s, const char *separator, bool *space) int open_tmpfile_unlinkable(const char *directory, int flags); int open_tmpfile_linkable(const char *target, int flags, char **ret_path); +int open_serialization_fd(const char *ident); int link_tmpfile(int fd, const char *path, const char *target); |