diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-05-25 00:54:32 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-06-21 19:29:44 +0200 |
commit | 5a3ab509b56bd79bf2be53cc259ce45c0be269e6 (patch) | |
tree | a10d9ac0e147efae9b3093eb51a8a2048e692e72 | |
parent | 5eda94dda25bccda928c4b33c790dbe748573a22 (diff) |
util: add fopen_temporary()
-rw-r--r-- | src/util.c | 42 | ||||
-rw-r--r-- | src/util.h | 1 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/util.c b/src/util.c index ad1ca06534..156d32a2e0 100644 --- a/src/util.c +++ b/src/util.c @@ -4455,7 +4455,49 @@ int pipe_eof(int fd) { return pollfd.revents & POLLHUP; } +int fopen_temporary(const char *path, FILE **_f, char **_temp_path) { + FILE *f; + char *t; + const char *fn; + size_t k; + int fd; + + assert(path); + assert(_f); + assert(_temp_path); + + t = new(char, strlen(path) + 1 + 6 + 1); + if (!t) + return -ENOMEM; + + fn = file_name_from_path(path); + k = fn-path; + memcpy(t, path, k); + t[k] = '.'; + stpcpy(stpcpy(t+k+1, fn), "XXXXXX"); + + fd = mkostemp(t, O_WRONLY|O_CLOEXEC); + if (fd < 0) { + free(t); + return -errno; + } + + f = fdopen(fd, "we"); + if (!f) { + unlink(t); + free(t); + return -errno; + } + + *_f = f; + *_temp_path = t; + + return 0; +} + int terminal_vhangup_fd(int fd) { + assert(fd >= 0); + if (ioctl(fd, TIOCVHANGUP) < 0) return -errno; diff --git a/src/util.h b/src/util.h index 6076e69dbb..15dfe17d3b 100644 --- a/src/util.h +++ b/src/util.h @@ -330,6 +330,7 @@ int default_signals(int sig, ...); int sigaction_many(const struct sigaction *sa, ...); int close_pipe(int p[]); +int fopen_temporary(const char *path, FILE **_f, char **_temp_path); ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll); ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll); |