diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-05-15 02:56:45 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-05-15 02:56:45 +0200 |
commit | c91cb83c4dbc9a95a0a2a38e7028e0a7f4af3b35 (patch) | |
tree | 5bf44548260b437f5dc62549cc5a2ce33166dd20 /src/libsystemd-bus/bus-message.h | |
parent | 9b29bb6853987bf6fef21531f69864fdfb39eb9a (diff) |
bus: rework message struct to keep header with fields in same malloc() block
This allows us to guarantee that the first payload_vec we pass to the
kernel for each message is guaranteed to include the full header and all
its field.
Diffstat (limited to 'src/libsystemd-bus/bus-message.h')
-rw-r--r-- | src/libsystemd-bus/bus-message.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libsystemd-bus/bus-message.h b/src/libsystemd-bus/bus-message.h index 01a1e01230..2517514bac 100644 --- a/src/libsystemd-bus/bus-message.h +++ b/src/libsystemd-bus/bus-message.h @@ -89,14 +89,12 @@ struct sd_bus_message { bool uid_valid:1; bool gid_valid:1; bool free_header:1; - bool free_fields:1; bool free_kdbus:1; bool free_fds:1; bool release_kdbus:1; bool poisoned:1; struct bus_header *header; - void *fields; struct bus_body_part body; struct bus_body_part *body_end; unsigned n_body_parts; @@ -114,7 +112,7 @@ struct sd_bus_message { unsigned n_containers; struct iovec *iovec; - struct iovec iovec_fixed[3]; + struct iovec iovec_fixed[2]; unsigned n_iovec; struct kdbus_msg *kdbus; @@ -178,6 +176,16 @@ static inline uint32_t BUS_MESSAGE_SIZE(sd_bus_message *m) { BUS_MESSAGE_BODY_SIZE(m); } +static inline uint32_t BUS_MESSAGE_BODY_BEGIN(sd_bus_message *m) { + return + sizeof(struct bus_header) + + ALIGN8(BUS_MESSAGE_FIELDS_SIZE(m)); +} + +static inline void* BUS_MESSAGE_FIELDS(sd_bus_message *m) { + return (uint8_t*) m->header + sizeof(struct bus_header); +} + static inline void bus_message_unrefp(sd_bus_message **m) { sd_bus_message_unref(*m); } @@ -214,7 +222,8 @@ int bus_message_append_ap(sd_bus_message *m, const char *types, va_list ap); int bus_message_parse_fields(sd_bus_message *m); -int bus_header_size(struct bus_header *h, size_t *sum); +bool bus_header_is_complete(struct bus_header *h, size_t size); +int bus_header_message_size(struct bus_header *h, size_t *sum); struct bus_body_part *message_append_part(sd_bus_message *m); |