chiark / gitweb /
macro: introduce new TAKE_FD() macro
authorLennart Poettering <lennart@poettering.net>
Thu, 22 Mar 2018 16:04:29 +0000 (17:04 +0100)
committerSven Eden <yamakuzure@gmx.net>
Fri, 24 Aug 2018 14:47:08 +0000 (16:47 +0200)
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
src/basic/fd-util.h
src/basic/fs-util.c
src/basic/memfd-util.c
src/basic/terminal-util.c
src/login/logind-session.c

index e932f33c4ba39e1563738e2d0984fdf0ffe33396..8ae79fb6948f0929c28155b8fa30407dcd3a5a6a 100644 (file)
@@ -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:
index 4cdd01bee18b9530d470ad12044d9fa52934123c..cb4677ec403686cc87a98d1abdc99313b21bc6e8 100644 (file)
@@ -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_;                           \
+        })
index f5764454fb5ed77b6419226ed83bccf61aa7d970..12255fe0c71bdffaa62c1c4ab5b431d33bd5ce23 100644 (file)
@@ -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;
index 65b873ae0cd616b876f684c2cc721cea83b7067a..75141c0a24791a76fd2a650a3e39a300297c9ecc 100644 (file)
@@ -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
index 3ae079a2b8b1f3eb0d185d684c822573e999457e..cbc903aafb5c05327a33111bddf45390cce71c1d 100644 (file)
@@ -502,10 +502,7 @@ int acquire_terminal(
                 fd = safe_close(fd);
         }
 
-        r = fd;
-        fd = -1;
-
-        return r;
+        return TAKE_FD(fd);
 }
 #endif // 0
 
index de5ec47e452a06ea94aeb75192300d4b2156d9cf..b03a89bbaf425f66d412e68797ee517f705d3d81 100644 (file)
@@ -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);