chiark / gitweb /
bus: add the ability for backends to queue to input messages at the same time
[elogind.git] / src / libsystemd-bus / bus-socket.c
index b7e816ea80da636cffac775690050369f9fdc2b3..355f31c56251ddbec613dbaeb4b4e37b5c72e620 100644 (file)
@@ -611,7 +611,7 @@ int bus_socket_setup(sd_bus *b) {
         enable = !b->bus_client;
         setsockopt(b->input_fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable));
 
-        enable = !b->bus_client && (b->hello_flags & KDBUS_HELLO_ATTACH_SECLABEL);
+        enable = !b->bus_client && (b->attach_flags & KDBUS_ATTACH_SECLABEL);
         setsockopt(b->input_fd, SOL_SOCKET, SO_PASSSEC, &enable, sizeof(enable));
 
         /* Increase the buffers to a MB */
@@ -891,13 +891,12 @@ static int bus_socket_read_message_need(sd_bus *bus, size_t *need) {
         return 0;
 }
 
-static int bus_socket_make_message(sd_bus *bus, size_t size, sd_bus_message **m) {
+static int bus_socket_make_message(sd_bus *bus, size_t size) {
         sd_bus_message *t;
         void *b;
         int r;
 
         assert(bus);
-        assert(m);
         assert(bus->rbuffer_size >= size);
         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
 
@@ -909,7 +908,8 @@ static int bus_socket_make_message(sd_bus *bus, size_t size, sd_bus_message **m)
         } else
                 b = NULL;
 
-        r = bus_message_from_malloc(bus->rbuffer, size,
+        r = bus_message_from_malloc(bus,
+                                    bus->rbuffer, size,
                                     bus->fds, bus->n_fds,
                                     bus->ucred_valid ? &bus->ucred : NULL,
                                     bus->label[0] ? bus->label : NULL,
@@ -925,11 +925,16 @@ static int bus_socket_make_message(sd_bus *bus, size_t size, sd_bus_message **m)
         bus->fds = NULL;
         bus->n_fds = 0;
 
-        *m = t;
+        r = bus_rqueue_push(bus, t);
+        if (r < 0) {
+                sd_bus_message_unref(t);
+                return r;
+        }
+
         return 1;
 }
 
-int bus_socket_read_message(sd_bus *bus, sd_bus_message **m) {
+int bus_socket_read_message(sd_bus *bus) {
         struct msghdr mh;
         struct iovec iov;
         ssize_t k;
@@ -946,15 +951,18 @@ int bus_socket_read_message(sd_bus *bus, sd_bus_message **m) {
         bool handle_cmsg = false;
 
         assert(bus);
-        assert(m);
         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
 
+        r = bus_rqueue_make_room(bus, 1);
+        if (r < 0)
+                return r;
+
         r = bus_socket_read_message_need(bus, &need);
         if (r < 0)
                 return r;
 
         if (bus->rbuffer_size >= need)
-                return bus_socket_make_message(bus, need, m);
+                return bus_socket_make_message(bus, need);
 
         b = realloc(bus->rbuffer, need);
         if (!b)
@@ -1044,7 +1052,7 @@ int bus_socket_read_message(sd_bus *bus, sd_bus_message **m) {
                 return r;
 
         if (bus->rbuffer_size >= need)
-                return bus_socket_make_message(bus, need, m);
+                return bus_socket_make_message(bus, need);
 
         return 1;
 }