]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-bus/bus-message.h
Add SPDX license identifiers to source files under the LGPL
[thirdparty/systemd.git] / src / libsystemd / sd-bus / bus-message.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
de1c301e
LP
2#pragma once
3
4/***
5 This file is part of systemd.
6
7 Copyright 2013 Lennart Poettering
8
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
de1c301e 23#include <byteswap.h>
07630cea 24#include <stdbool.h>
2c35d880 25#include <sys/socket.h>
de1c301e 26
de1c301e 27#include "sd-bus.h"
07630cea 28
5b12334d 29#include "bus-creds.h"
0461f8cd 30#include "bus-protocol.h"
07630cea
LP
31#include "macro.h"
32#include "time-util.h"
de1c301e
LP
33
34struct bus_container {
35 char enclosing;
6647dc66 36 bool need_offsets:1;
de1c301e 37
6647dc66 38 /* Indexes into the signature string */
b3af9646 39 unsigned index, saved_index;
453a0c29
LP
40 char *signature;
41
6647dc66 42 size_t before, begin, end;
c1b9d935 43
6647dc66
LP
44 /* dbus1: pointer to the array size value, if this is a value */
45 uint32_t *array_size;
c1b9d935 46
6647dc66 47 /* gvariant: list of offsets to end of children if this is struct/dict entry/array */
306f07be 48 size_t *offsets, n_offsets, offsets_allocated, offset_index;
6647dc66 49 size_t item_size;
3798fd4c
LP
50
51 char *peeked_signature;
de1c301e
LP
52};
53
bc7fd8cd 54struct bus_body_part {
453a0c29 55 struct bus_body_part *next;
bc7fd8cd 56 void *data;
7dcd79c2 57 void *mmap_begin;
bc7fd8cd
LP
58 size_t size;
59 size_t mapped;
8e959fbf 60 size_t allocated;
7dcd79c2 61 uint64_t memfd_offset;
bc7fd8cd
LP
62 int memfd;
63 bool free_this:1;
453a0c29 64 bool munmap_this:1;
bc7fd8cd 65 bool sealed:1;
453a0c29 66 bool is_zero:1;
bc7fd8cd
LP
67};
68
de1c301e
LP
69struct sd_bus_message {
70 unsigned n_ref;
71
fd8d62d9
LP
72 sd_bus *bus;
73
42c4ebcb 74 uint64_t reply_cookie;
de1c301e
LP
75
76 const char *path;
77 const char *interface;
78 const char *member;
79 const char *destination;
80 const char *sender;
de1c301e
LP
81
82 sd_bus_error error;
83
5b12334d
LP
84 sd_bus_creds creds;
85
69aec65c
LP
86 usec_t monotonic;
87 usec_t realtime;
6a0e376c 88 uint64_t seqnum;
ca7b42c8 89 int64_t priority;
022fb855 90 uint64_t verify_destination_id;
de1c301e
LP
91
92 bool sealed:1;
2c93b4ef
LP
93 bool dont_send:1;
94 bool allow_fds:1;
de1c301e 95 bool free_header:1;
2c93b4ef 96 bool free_fds:1;
bc7fd8cd 97 bool poisoned:1;
de1c301e 98
2ac7c17f 99 /* The first and last bytes of the message */
de1c301e 100 struct bus_header *header;
2ac7c17f
LP
101 void *footer;
102
103 /* How many bytes are accessible in the above pointers */
104 size_t header_accessible;
105 size_t footer_accessible;
106
107 size_t fields_size;
108 size_t body_size;
109 size_t user_body_size;
110
bc7fd8cd
LP
111 struct bus_body_part body;
112 struct bus_body_part *body_end;
113 unsigned n_body_parts;
de1c301e 114
9a17484d 115 size_t rindex;
bc7fd8cd
LP
116 struct bus_body_part *cached_rindex_part;
117 size_t cached_rindex_part_begin;
9a17484d 118
de1c301e
LP
119 uint32_t n_fds;
120 int *fds;
121
9a17484d 122 struct bus_container root_container, *containers;
2ac7c17f 123 size_t n_containers;
306f07be 124 size_t containers_allocated;
de1c301e 125
bc7fd8cd 126 struct iovec *iovec;
c91cb83c 127 struct iovec iovec_fixed[2];
de1c301e 128 unsigned n_iovec;
9a17484d
LP
129
130 char *peeked_signature;
6629161f 131
6717d473
LP
132 /* If set replies to this message must carry the signature
133 * specified here to successfully seal. This is initialized
134 * from the vtable data */
135 const char *enforced_reply_signature;
136
6629161f 137 usec_t timeout;
51038c03
LP
138
139 char sender_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
140 char destination_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
022fb855 141 char *destination_ptr;
c1b9d935
LP
142
143 size_t header_offsets[_BUS_MESSAGE_HEADER_MAX];
144 unsigned n_header_offsets;
de1c301e
LP
145};
146
2ac7c17f
LP
147static inline bool BUS_MESSAGE_NEED_BSWAP(sd_bus_message *m) {
148 return m->header->endian != BUS_NATIVE_ENDIAN;
149}
de1c301e 150
9a17484d
LP
151static inline uint16_t BUS_MESSAGE_BSWAP16(sd_bus_message *m, uint16_t u) {
152 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_16(u) : u;
153}
154
155static inline uint32_t BUS_MESSAGE_BSWAP32(sd_bus_message *m, uint32_t u) {
de1c301e
LP
156 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_32(u) : u;
157}
158
9a17484d
LP
159static inline uint64_t BUS_MESSAGE_BSWAP64(sd_bus_message *m, uint64_t u) {
160 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_64(u) : u;
161}
162
42c4ebcb 163static inline uint64_t BUS_MESSAGE_COOKIE(sd_bus_message *m) {
2ac7c17f
LP
164 if (m->header->version == 2)
165 return BUS_MESSAGE_BSWAP64(m, m->header->dbus2.cookie);
de1c301e 166
2ac7c17f 167 return BUS_MESSAGE_BSWAP32(m, m->header->dbus1.serial);
de1c301e
LP
168}
169
2ac7c17f 170static inline size_t BUS_MESSAGE_SIZE(sd_bus_message *m) {
6629161f
LP
171 return
172 sizeof(struct bus_header) +
2ac7c17f
LP
173 ALIGN8(m->fields_size) +
174 m->body_size;
6629161f
LP
175}
176
2ac7c17f 177static inline size_t BUS_MESSAGE_BODY_BEGIN(sd_bus_message *m) {
c91cb83c
LP
178 return
179 sizeof(struct bus_header) +
2ac7c17f 180 ALIGN8(m->fields_size);
c91cb83c
LP
181}
182
183static inline void* BUS_MESSAGE_FIELDS(sd_bus_message *m) {
184 return (uint8_t*) m->header + sizeof(struct bus_header);
185}
186
6647dc66
LP
187static inline bool BUS_MESSAGE_IS_GVARIANT(sd_bus_message *m) {
188 return m->header->version == 2;
189}
190
de1c301e 191int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz);
89ffcd2a 192int bus_message_read_strv_extend(sd_bus_message *m, char ***l);
2c93b4ef 193
6629161f 194int bus_message_from_header(
df2d202e 195 sd_bus *bus,
6629161f 196 void *header,
2ac7c17f
LP
197 size_t header_accessible,
198 void *footer,
199 size_t footer_accessible,
200 size_t message_size,
6629161f
LP
201 int *fds,
202 unsigned n_fds,
6629161f
LP
203 const char *label,
204 size_t extra,
205 sd_bus_message **ret);
206
2c93b4ef 207int bus_message_from_malloc(
df2d202e 208 sd_bus *bus,
2c93b4ef
LP
209 void *buffer,
210 size_t length,
211 int *fds,
212 unsigned n_fds,
2c93b4ef
LP
213 const char *label,
214 sd_bus_message **ret);
392d5b37 215
eccd47c5
LP
216int bus_message_get_arg(sd_bus_message *m, unsigned i, const char **str);
217int bus_message_get_arg_strv(sd_bus_message *m, unsigned i, char ***strv);
917b5dc7 218
6629161f
LP
219int bus_message_parse_fields(sd_bus_message *m);
220
bc7fd8cd 221struct bus_body_part *message_append_part(sd_bus_message *m);
9b29bb68
LP
222
223#define MESSAGE_FOREACH_PART(part, i, m) \
224 for ((i) = 0, (part) = &(m)->body; (i) < (m)->n_body_parts; (i)++, (part) = (part)->next)
a392d361
LP
225
226int bus_body_part_map(struct bus_body_part *part);
227void bus_body_part_unmap(struct bus_body_part *part);
eb01ba5d
LP
228
229int bus_message_to_errno(sd_bus_message *m);
230
231int bus_message_new_synthetic_error(sd_bus *bus, uint64_t serial, const sd_bus_error *e, sd_bus_message **m);
e1c433c6
LP
232
233int bus_message_remarshal(sd_bus *bus, sd_bus_message **m);
a7639e37
LP
234
235int bus_message_append_sender(sd_bus_message *m, const char *sender);
d29ae291
LP
236
237void bus_message_set_sender_driver(sd_bus *bus, sd_bus_message *m);
238void bus_message_set_sender_local(sd_bus *bus, sd_bus_message *m);