From f2e5755be31573b10852c9e8bd97a9881e925758 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 22 Mar 2018 17:04:29 +0100 Subject: [PATCH] macro: introduce new TAKE_FD() macro This is similar to TAKE_PTR() but operates on file descriptors, and thus assigns -1 to the fd parameter after returning it. Removes 60 lines from our codebase. Pretty good too I think. --- src/basic/fd-util.c | 10 ++-------- src/basic/fd-util.h | 12 ++++++++---- src/basic/fs-util.c | 13 +++---------- src/basic/memfd-util.c | 5 +---- src/basic/terminal-util.c | 5 +---- src/login/logind-session.c | 1 + 6 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index e932f33c4..8ae79fb69 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -488,10 +488,7 @@ int acquire_data_fd(const void *data, size_t size, unsigned flags) { if (r < 0) return r; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } try_pipe: @@ -528,10 +525,7 @@ try_pipe: (void) fd_nonblock(pipefds[0], false); - r = pipefds[0]; - pipefds[0] = -1; - - return r; + return TAKE_FD(pipefds[0]); } try_dev_shm: diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h index 4cdd01bee..cb4677ec4 100644 --- a/src/basic/fd-util.h +++ b/src/basic/fd-util.h @@ -102,10 +102,6 @@ int acquire_data_fd(const void *data, size_t size, unsigned flags); #define ERRNO_IS_DISCONNECT(r) \ IN_SET(r, ENOTCONN, ECONNRESET, ECONNREFUSED, ECONNABORTED, EPIPE, ENETUNREACH) -/* Resource exhaustion, could be our fault or general system trouble */ -#define ERRNO_IS_RESOURCE(r) \ - IN_SET(r, ENOMEM, EMFILE, ENFILE) - int fd_move_above_stdio(int fd); int rearrange_stdio(int original_input_fd, int original_output_fd, int original_error_fd); @@ -113,3 +109,11 @@ int rearrange_stdio(int original_input_fd, int original_output_fd, int original_ static inline int make_null_stdio(void) { return rearrange_stdio(-1, -1, -1); } + +/* Like TAKE_PTR() but for file descriptors, resetting them to -1 */ +#define TAKE_FD(fd) \ + ({ \ + int _fd_ = (fd); \ + (fd) = -1; \ + _fd_; \ + }) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index f5764454f..12255fe0c 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -745,8 +745,7 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags, } safe_close(fd); - fd = fd_parent; - fd_parent = -1; + fd = TAKE_FD(fd_parent); continue; } @@ -864,8 +863,7 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags, /* And iterate again, but go one directory further down. */ safe_close(fd); - fd = child; - child = -1; + fd = TAKE_FD(child); } if (!done) { @@ -879,16 +877,11 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags, *ret = TAKE_PTR(done); if (flags & CHASE_OPEN) { - int q; - /* Return the O_PATH fd we currently are looking to the caller. It can translate it to a proper fd by * opening /proc/self/fd/xyz. */ assert(fd >= 0); - q = fd; - fd = -1; - - return q; + return TAKE_FD(fd); } return exists; diff --git a/src/basic/memfd-util.c b/src/basic/memfd-util.c index 65b873ae0..75141c0a2 100644 --- a/src/basic/memfd-util.c +++ b/src/basic/memfd-util.c @@ -173,9 +173,6 @@ int memfd_new_and_map(const char *name, size_t sz, void **p) { if (r < 0) return r; - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } #endif // 0 diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 3ae079a2b..cbc903aaf 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -502,10 +502,7 @@ int acquire_terminal( fd = safe_close(fd); } - r = fd; - fd = -1; - - return r; + return TAKE_FD(fd); } #endif // 0 diff --git a/src/login/logind-session.c b/src/login/logind-session.c index de5ec47e4..b03a89bba 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -1189,6 +1189,7 @@ void session_restore_vt(Session *s) { */ old_fd = s->vtfd; s->vtfd = -1; + old_fd = TAKE_FD(s->vtfd); vt = session_open_vt(s); safe_close(old_fd); -- 2.30.2