From: Vito Caputo Date: Tue, 31 Mar 2020 07:49:07 +0000 (-0700) Subject: fileio: introduce take_fdopen{_unlocked}() variant X-Git-Tag: v246-rc1~667^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ebbb6cb394f8a328a9bba782e3b1cbeac4d9a7b;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/basic/fileio.c b/src/basic/fileio.c index fe0c4f47071..c82a9d2c01d 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 e6fea2afd4b..525f6ac814a 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);