1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include <sys/socket.h>
10 #include "bus-creds.h"
11 #include "bus-protocol.h"
13 #include "time-util.h"
15 struct bus_container
{
19 /* Indexes into the signature string */
20 unsigned index
, saved_index
;
23 size_t before
, begin
, end
;
25 /* dbus1: pointer to the array size value, if this is a value */
28 /* gvariant: list of offsets to end of children if this is struct/dict entry/array */
29 size_t *offsets
, n_offsets
, offsets_allocated
, offset_index
;
32 char *peeked_signature
;
35 struct bus_body_part
{
36 struct bus_body_part
*next
;
42 uint64_t memfd_offset
;
50 struct sd_bus_message
{
51 /* Caveat: a message can be referenced in two different ways: the main (user-facing) way will also
52 * pin the bus connection object the message is associated with. The secondary way ("queued") is used
53 * when a message is in the read or write queues of the bus connection object, which will not pin the
54 * bus connection object. This is necessary so that we don't have to have a pair of cyclic references
55 * between a message that is queued and its connection: as soon as a message is only referenced by
56 * the connection (by means of being queued) and the connection itself has no other references it
59 unsigned n_ref
; /* Counter of references that pin the connection */
60 unsigned n_queued
; /* Counter of references that do not pin the connection */
64 uint64_t reply_cookie
;
67 const char *interface
;
69 const char *destination
;
79 uint64_t verify_destination_id
;
89 /* The first and last bytes of the message */
90 struct bus_header
*header
;
93 /* How many bytes are accessible in the above pointers */
94 size_t header_accessible
;
95 size_t footer_accessible
;
99 size_t user_body_size
;
101 struct bus_body_part body
;
102 struct bus_body_part
*body_end
;
103 unsigned n_body_parts
;
106 struct bus_body_part
*cached_rindex_part
;
107 size_t cached_rindex_part_begin
;
112 struct bus_container root_container
, *containers
;
114 size_t containers_allocated
;
117 struct iovec iovec_fixed
[2];
120 char *peeked_signature
;
122 /* If set replies to this message must carry the signature
123 * specified here to successfully seal. This is initialized
124 * from the vtable data */
125 const char *enforced_reply_signature
;
129 size_t header_offsets
[_BUS_MESSAGE_HEADER_MAX
];
130 unsigned n_header_offsets
;
132 uint64_t read_counter
;
135 static inline bool BUS_MESSAGE_NEED_BSWAP(sd_bus_message
*m
) {
136 return m
->header
->endian
!= BUS_NATIVE_ENDIAN
;
139 static inline uint16_t BUS_MESSAGE_BSWAP16(sd_bus_message
*m
, uint16_t u
) {
140 return BUS_MESSAGE_NEED_BSWAP(m
) ? bswap_16(u
) : u
;
143 static inline uint32_t BUS_MESSAGE_BSWAP32(sd_bus_message
*m
, uint32_t u
) {
144 return BUS_MESSAGE_NEED_BSWAP(m
) ? bswap_32(u
) : u
;
147 static inline uint64_t BUS_MESSAGE_BSWAP64(sd_bus_message
*m
, uint64_t u
) {
148 return BUS_MESSAGE_NEED_BSWAP(m
) ? bswap_64(u
) : u
;
151 static inline uint64_t BUS_MESSAGE_COOKIE(sd_bus_message
*m
) {
152 if (m
->header
->version
== 2)
153 return BUS_MESSAGE_BSWAP64(m
, m
->header
->dbus2
.cookie
);
155 return BUS_MESSAGE_BSWAP32(m
, m
->header
->dbus1
.serial
);
158 static inline size_t BUS_MESSAGE_SIZE(sd_bus_message
*m
) {
160 sizeof(struct bus_header
) +
161 ALIGN8(m
->fields_size
) +
165 static inline size_t BUS_MESSAGE_BODY_BEGIN(sd_bus_message
*m
) {
167 sizeof(struct bus_header
) +
168 ALIGN8(m
->fields_size
);
171 static inline void* BUS_MESSAGE_FIELDS(sd_bus_message
*m
) {
172 return (uint8_t*) m
->header
+ sizeof(struct bus_header
);
175 static inline bool BUS_MESSAGE_IS_GVARIANT(sd_bus_message
*m
) {
176 return m
->header
->version
== 2;
179 int bus_message_get_blob(sd_bus_message
*m
, void **buffer
, size_t *sz
);
180 int bus_message_read_strv_extend(sd_bus_message
*m
, char ***l
);
182 int bus_message_from_header(
185 size_t header_accessible
,
187 size_t footer_accessible
,
193 sd_bus_message
**ret
);
195 int bus_message_from_malloc(
202 sd_bus_message
**ret
);
204 int bus_message_get_arg(sd_bus_message
*m
, unsigned i
, const char **str
);
205 int bus_message_get_arg_strv(sd_bus_message
*m
, unsigned i
, char ***strv
);
207 int bus_message_parse_fields(sd_bus_message
*m
);
209 struct bus_body_part
*message_append_part(sd_bus_message
*m
);
211 #define MESSAGE_FOREACH_PART(part, i, m) \
212 for ((i) = 0, (part) = &(m)->body; (i) < (m)->n_body_parts; (i)++, (part) = (part)->next)
214 int bus_body_part_map(struct bus_body_part
*part
);
215 void bus_body_part_unmap(struct bus_body_part
*part
);
217 int bus_message_to_errno(sd_bus_message
*m
);
219 int bus_message_new_synthetic_error(sd_bus
*bus
, uint64_t serial
, const sd_bus_error
*e
, sd_bus_message
**m
);
221 int bus_message_remarshal(sd_bus
*bus
, sd_bus_message
**m
);
223 void bus_message_set_sender_driver(sd_bus
*bus
, sd_bus_message
*m
);
224 void bus_message_set_sender_local(sd_bus
*bus
, sd_bus_message
*m
);
226 sd_bus_message
* bus_message_ref_queued(sd_bus_message
*m
, sd_bus
*bus
);
227 sd_bus_message
* bus_message_unref_queued(sd_bus_message
*m
, sd_bus
*bus
);