X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-socket.c;h=a449ce0eb3aa65d1877bac08336c6359169cb8ff;hb=041b85cf01ac2783d61b22da4eea8503cf8b0d5a;hp=6845f9d1bb6410e53c641cff4e71407224adb115;hpb=d21a7bb1a91ca4654287a69d0443629198e42e1b;p=elogind.git diff --git a/src/libsystemd-bus/bus-socket.c b/src/libsystemd-bus/bus-socket.c index 6845f9d1b..a449ce0eb 100644 --- a/src/libsystemd-bus/bus-socket.c +++ b/src/libsystemd-bus/bus-socket.c @@ -623,6 +623,9 @@ int bus_socket_setup(sd_bus *b) { if (getsockopt(b->input_fd, SOL_SOCKET, SO_PEERCRED, &b->ucred, &l) >= 0 && l >= sizeof(b->ucred)) b->ucred_valid = b->ucred.pid > 0; + b->is_kernel = false; + b->message_version = 1; + return 0; } @@ -765,6 +768,10 @@ int bus_socket_exec(sd_bus *b) { close_nointr_nofail(s[1]); b->output_fd = b->input_fd = s[0]; + r = bus_socket_setup(b); + if (r < 0) + return r; + return bus_socket_start_auth(b); } @@ -874,10 +881,10 @@ static int bus_socket_read_message_need(sd_bus *bus, size_t *need) { b = ((const uint32_t*) bus->rbuffer)[3]; e = ((const uint8_t*) bus->rbuffer)[0]; - if (e == SD_BUS_LITTLE_ENDIAN) { + if (e == BUS_LITTLE_ENDIAN) { a = le32toh(a); b = le32toh(b); - } else if (e == SD_BUS_BIG_ENDIAN) { + } else if (e == BUS_BIG_ENDIAN) { a = be32toh(a); b = be32toh(b); } else @@ -891,16 +898,19 @@ 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); + r = bus_rqueue_make_room(bus); + if (r < 0) + return r; + if (bus->rbuffer_size > size) { b = memdup((const uint8_t*) bus->rbuffer + size, bus->rbuffer_size - size); @@ -926,11 +936,12 @@ 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; + bus->rqueue[bus->rqueue_size++] = t; + 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; @@ -947,7 +958,6 @@ 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_socket_read_message_need(bus, &need); @@ -955,7 +965,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); b = realloc(bus->rbuffer, need); if (!b) @@ -1045,7 +1055,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; }