1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
6 This file is part of systemd.
8 Copyright 2013 Lennart Poettering
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
26 #include <sys/socket.h>
31 #include "time-util.h"
33 struct bus_container {
37 unsigned index, saved_index;
53 struct bus_body_part {
60 struct bus_body_part *next;
63 struct sd_bus_message {
68 uint32_t reply_serial;
71 const char *interface;
73 const char *destination;
98 struct bus_header *header;
100 struct bus_body_part body;
101 struct bus_body_part *body_end;
102 unsigned n_body_parts;
107 struct bus_body_part *cached_rindex_part;
108 size_t cached_rindex_part_begin;
113 struct bus_container root_container, *containers;
114 unsigned n_containers;
117 struct iovec iovec_fixed[3];
120 struct kdbus_msg *kdbus;
122 char *peeked_signature;
126 char sender_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
127 char destination_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
131 const char *tid_comm;
135 size_t cmdline_length;
136 char **cmdline_array;
142 struct kdbus_audit *audit;
145 size_t capability_size;
148 #define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_NATIVE_ENDIAN)
150 static inline uint16_t BUS_MESSAGE_BSWAP16(sd_bus_message *m, uint16_t u) {
151 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_16(u) : u;
154 static inline uint32_t BUS_MESSAGE_BSWAP32(sd_bus_message *m, uint32_t u) {
155 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_32(u) : u;
158 static inline uint64_t BUS_MESSAGE_BSWAP64(sd_bus_message *m, uint64_t u) {
159 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_64(u) : u;
162 static inline uint32_t BUS_MESSAGE_SERIAL(sd_bus_message *m) {
163 return BUS_MESSAGE_BSWAP32(m, m->header->serial);
166 static inline uint32_t BUS_MESSAGE_BODY_SIZE(sd_bus_message *m) {
167 return BUS_MESSAGE_BSWAP32(m, m->header->body_size);
170 static inline uint32_t BUS_MESSAGE_FIELDS_SIZE(sd_bus_message *m) {
171 return BUS_MESSAGE_BSWAP32(m, m->header->fields_size);
174 static inline uint32_t BUS_MESSAGE_SIZE(sd_bus_message *m) {
176 sizeof(struct bus_header) +
177 ALIGN8(BUS_MESSAGE_FIELDS_SIZE(m)) +
178 BUS_MESSAGE_BODY_SIZE(m);
181 static inline void bus_message_unrefp(sd_bus_message **m) {
182 sd_bus_message_unref(*m);
185 #define _cleanup_bus_message_unref_ __attribute__((cleanup(bus_message_unrefp)))
187 int bus_message_seal(sd_bus_message *m, uint64_t serial);
188 int bus_message_dump(sd_bus_message *m);
189 int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz);
190 int bus_message_read_strv_extend(sd_bus_message *m, char ***l);
192 int bus_message_from_header(
197 const struct ucred *ucred,
200 sd_bus_message **ret);
202 int bus_message_from_malloc(
207 const struct ucred *ucred,
209 sd_bus_message **ret);
211 const char* bus_message_get_arg(sd_bus_message *m, unsigned i);
213 int bus_message_append_ap(sd_bus_message *m, const char *types, va_list ap);
215 int bus_message_parse_fields(sd_bus_message *m);
217 int bus_header_size(struct bus_header *h, size_t *sum);
219 struct bus_body_part *message_append_part(sd_bus_message *m);