From: Lennart Poettering Date: Tue, 24 May 2011 22:54:32 +0000 (+0200) Subject: util: add fopen_temporary() X-Git-Tag: v30~181 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5a3ab509b56bd79bf2be53cc259ce45c0be269e6;p=systemd util: add fopen_temporary() --- diff --git a/src/util.c b/src/util.c index ad1ca065..156d32a2 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 6076e69d..15dfe17d 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);