]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/shared/fdset.c
Define FOREACH_DIRENT through FOREACH_DIRENT_ALL
[thirdparty/systemd.git] / src / shared / fdset.c
index e97a52619dd339988b42813ec1222a9956017e30..183fa239b6d2cd1ba00d374374eb351ad7e6747b 100644 (file)
@@ -1,11 +1,5 @@
-/* SPDX-License-Identifier: LGPL-2.1+ */
-/***
-  This file is part of systemd.
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
 
-  Copyright 2010 Lennart Poettering
-***/
-
-#include <alloca.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stddef.h>
@@ -29,8 +23,8 @@ FDSet *fdset_new(void) {
         return MAKE_FDSET(set_new(NULL));
 }
 
-int fdset_new_array(FDSet **ret, const int *fds, unsigned n_fds) {
-        unsigned i;
+int fdset_new_array(FDSet **ret, const int *fds, size_t n_fds) {
+        size_t i;
         FDSet *s;
         int r;
 
@@ -53,25 +47,25 @@ int fdset_new_array(FDSet **ret, const int *fds, unsigned n_fds) {
         return 0;
 }
 
-FDSet* fdset_free(FDSet *s) {
+void fdset_close(FDSet *s) {
         void *p;
 
         while ((p = set_steal_first(MAKE_SET(s)))) {
-                /* Valgrind's fd might have ended up in this set here,
-                 * due to fdset_new_fill(). We'll ignore all failures
-                 * here, so that the EBADFD that valgrind will return
-                 * us on close() doesn't influence us */
-
-                /* When reloading duplicates of the private bus
-                 * connection fds and suchlike are closed here, which
-                 * has no effect at all, since they are only
-                 * duplicates. So don't be surprised about these log
-                 * messages. */
-
-                log_debug("Closing left-over fd %i", PTR_TO_FD(p));
-                close_nointr(PTR_TO_FD(p));
+                /* Valgrind's fd might have ended up in this set here, due to fdset_new_fill(). We'll ignore
+                 * all failures here, so that the EBADFD that valgrind will return us on close() doesn't
+                 * influence us */
+
+                /* When reloading duplicates of the private bus connection fds and suchlike are closed here,
+                 * which has no effect at all, since they are only duplicates. So don't be surprised about
+                 * these log messages. */
+
+                log_debug("Closing set fd %i", PTR_TO_FD(p));
+                (void) close_nointr(PTR_TO_FD(p));
         }
+}
 
+FDSet* fdset_free(FDSet *s) {
+        fdset_close(s);
         set_free(MAKE_SET(s));
         return NULL;
 }
@@ -118,7 +112,6 @@ int fdset_remove(FDSet *s, int fd) {
 
 int fdset_new_fill(FDSet **_s) {
         _cleanup_closedir_ DIR *d = NULL;
-        struct dirent *de;
         int r = 0;
         FDSet *s;
 
@@ -167,13 +160,12 @@ finish:
 }
 
 int fdset_cloexec(FDSet *fds, bool b) {
-        Iterator i;
         void *p;
         int r;
 
         assert(fds);
 
-        SET_FOREACH(p, MAKE_SET(fds), i) {
+        SET_FOREACH(p, MAKE_SET(fds)) {
                 r = fd_cloexec(PTR_TO_FD(p), b);
                 if (r < 0)
                         return r;
@@ -215,14 +207,16 @@ fail:
 
 int fdset_close_others(FDSet *fds) {
         void *e;
-        Iterator i;
-        int *a;
-        unsigned j, m;
-
-        j = 0, m = fdset_size(fds);
-        a = alloca(sizeof(int) * m);
-        SET_FOREACH(e, MAKE_SET(fds), i)
-                a[j++] = PTR_TO_FD(e);
+        int *a = NULL;
+        size_t j = 0, m;
+
+        m = fdset_size(fds);
+
+        if (m > 0) {
+                a = newa(int, m);
+                SET_FOREACH(e, MAKE_SET(fds))
+                        a[j++] = PTR_TO_FD(e);
+        }
 
         assert(j == m);