summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2020-03-31 09:49:07 +0200
committerVito Caputo <vcaputo@pengaru.com>2020-03-31 15:48:00 +0200
commit3ebbb6cb394f8a328a9bba782e3b1cbeac4d9a7b (patch)
tree6dbf669b9ba1637652f35bfeb088286f7237124b
parenthome: narrow scope of 'size_t n' (diff)
downloadsystemd-3ebbb6cb394f8a328a9bba782e3b1cbeac4d9a7b.tar.xz
systemd-3ebbb6cb394f8a328a9bba782e3b1cbeac4d9a7b.zip
fileio: introduce take_fdopen{_unlocked}() variant
With the addition of _cleanup_close_ there's a repetitious pattern of assigning -1 to the fd after a successful fdopen to prevent its close on cleanup now that the FILE * owns the fd. This introduces a wrapper that instead takes a pointer to the fd being opened, and always overwrites the fd with -1 on success. A future commit will cleanup all the fdopen call sites to use the wrapper and elide the manual -1 fd assignment.
-rw-r--r--src/basic/fileio.c26
-rw-r--r--src/basic/fileio.h2
2 files changed, 28 insertions, 0 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c
index fe0c4f4707..c82a9d2c01 100644
--- a/src/basic/fileio.c
+++ b/src/basic/fileio.c
@@ -54,6 +54,32 @@ int fdopen_unlocked(int fd, const char *options, FILE **ret) {
return 0;
}
+int take_fdopen_unlocked(int *fd, const char *options, FILE **ret) {
+ int r;
+
+ assert(fd);
+
+ r = fdopen_unlocked(*fd, options, ret);
+ if (r < 0)
+ return r;
+
+ *fd = -1;
+
+ return 0;
+}
+
+FILE* take_fdopen(int *fd, const char *options) {
+ assert(fd);
+
+ FILE *f = fdopen(*fd, options);
+ if (!f)
+ return NULL;
+
+ *fd = -1;
+
+ return f;
+}
+
FILE* open_memstream_unlocked(char **ptr, size_t *sizeloc) {
FILE *f = open_memstream(ptr, sizeloc);
if (!f)
diff --git a/src/basic/fileio.h b/src/basic/fileio.h
index e6fea2afd4..525f6ac814 100644
--- a/src/basic/fileio.h
+++ b/src/basic/fileio.h
@@ -39,6 +39,8 @@ typedef enum {
int fopen_unlocked(const char *path, const char *options, FILE **ret);
int fdopen_unlocked(int fd, const char *options, FILE **ret);
+int take_fdopen_unlocked(int *fd, const char *options, FILE **ret);
+FILE* take_fdopen(int *fd, const char *options);
FILE* open_memstream_unlocked(char **ptr, size_t *sizeloc);
FILE* fmemopen_unlocked(void *buf, size_t size, const char *mode);