]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: simplify fd collection code, return number of fds as return value
authorLennart Poettering <lennart@poettering.net>
Sat, 3 Oct 2015 14:41:36 +0000 (16:41 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 6 Oct 2015 07:41:02 +0000 (09:41 +0200)
Let's simplify the fd collection code a bit, and return the number of
collected fds as positive integer, the way it's customary in our usual
code.

src/core/service.c
src/core/socket.c
src/core/socket.h

index cb0394f9303b46d42e9964ca58318c0fcef06add..2c78cb96c2f5036dac22221070072deb49633c5e 100644 (file)
@@ -957,57 +957,51 @@ static int service_coldplug(Unit *u) {
         return 0;
 }
 
-static int service_collect_fds(Service *s, int **fds, unsigned *n_fds) {
+static int service_collect_fds(Service *s, int **fds) {
         _cleanup_free_ int *rfds = NULL;
-        unsigned rn_fds = 0;
+        int rn_fds = 0;
         Iterator i;
-        int r;
         Unit *u;
 
         assert(s);
         assert(fds);
-        assert(n_fds);
 
         if (s->socket_fd >= 0)
-                return 0;
+                return -EINVAL;
 
         SET_FOREACH(u, UNIT(s)->dependencies[UNIT_TRIGGERED_BY], i) {
-                int *cfds;
-                unsigned cn_fds;
+                _cleanup_free_ int *cfds = NULL;
                 Socket *sock;
+                int cn_fds;
 
                 if (u->type != UNIT_SOCKET)
                         continue;
 
                 sock = SOCKET(u);
 
-                r = socket_collect_fds(sock, &cfds, &cn_fds);
-                if (r < 0)
-                        return r;
+                cn_fds = socket_collect_fds(sock, &cfds);
+                if (cn_fds < 0)
+                        return cn_fds;
 
-                if (cn_fds <= 0) {
-                        free(cfds);
+                if (cn_fds <= 0)
                         continue;
-                }
 
                 if (!rfds) {
                         rfds = cfds;
                         rn_fds = cn_fds;
+
+                        cfds = NULL;
                 } else {
                         int *t;
 
                         t = realloc(rfds, (rn_fds + cn_fds) * sizeof(int));
-                        if (!t) {
-                                free(cfds);
+                        if (!t)
                                 return -ENOMEM;
-                        }
 
                         memcpy(t + rn_fds, cfds, cn_fds * sizeof(int));
+
                         rfds = t;
                         rn_fds += cn_fds;
-
-                        free(cfds);
-
                 }
         }
 
@@ -1025,10 +1019,9 @@ static int service_collect_fds(Service *s, int **fds, unsigned *n_fds) {
         }
 
         *fds = rfds;
-        *n_fds = rn_fds;
-
         rfds = NULL;
-        return 0;
+
+        return rn_fds;
 }
 
 static int service_spawn(
@@ -1082,11 +1075,12 @@ static int service_spawn(
                         fds = &s->socket_fd;
                         n_fds = 1;
                 } else {
-                        r = service_collect_fds(s, &fdsbuf, &n_fds);
+                        r = service_collect_fds(s, &fdsbuf);
                         if (r < 0)
                                 goto fail;
 
                         fds = fdsbuf;
+                        n_fds = r;
                 }
         }
 
index f547d1ba7c5488fa7a27e19c4bfde44d968930fa..4462fbd72d4c0902583f6b6b1cb8389fe606a328 100644 (file)
@@ -2628,49 +2628,43 @@ static int socket_dispatch_timer(sd_event_source *source, usec_t usec, void *use
         return 0;
 }
 
-int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
-        int *rfds;
-        unsigned rn_fds, k;
-        int i;
+int socket_collect_fds(Socket *s, int **fds) {
+        int *rfds, k = 0, n = 0;
         SocketPort *p;
 
         assert(s);
         assert(fds);
-        assert(n_fds);
 
         /* Called from the service code for requesting our fds */
 
-        rn_fds = 0;
         LIST_FOREACH(port, p, s->ports) {
                 if (p->fd >= 0)
-                        rn_fds++;
-                rn_fds += p->n_auxiliary_fds;
+                        n++;
+                n += p->n_auxiliary_fds;
         }
 
-        if (rn_fds <= 0) {
+        if (n <= 0) {
                 *fds = NULL;
-                *n_fds = 0;
                 return 0;
         }
 
-        rfds = new(int, rn_fds);
+        rfds = new(int, n);
         if (!rfds)
                 return -ENOMEM;
 
-        k = 0;
         LIST_FOREACH(port, p, s->ports) {
+                int i;
+
                 if (p->fd >= 0)
                         rfds[k++] = p->fd;
                 for (i = 0; i < p->n_auxiliary_fds; ++i)
                         rfds[k++] = p->auxiliary_fds[i];
         }
 
-        assert(k == rn_fds);
+        assert(k == n);
 
         *fds = rfds;
-        *n_fds = rn_fds;
-
-        return 0;
+        return n;
 }
 
 static void socket_reset_failed(Unit *u) {
index d20dc8d81ac009b8637c2c3f61859ec196537315..96091b0609952016768ca68f5dbe0a6ddaf079f2 100644 (file)
@@ -157,7 +157,7 @@ struct Socket {
 };
 
 /* Called from the service code when collecting fds */
-int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
+int socket_collect_fds(Socket *s, int **fds);
 
 /* Called from the service code when a per-connection service ended */
 void socket_connection_unref(Socket *s);