]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd-bus/bus-message.h
util: fix handling of trailing whitespace in split_quoted()
[thirdparty/systemd.git] / src / libsystemd-bus / bus-message.h
CommitLineData
de1c301e
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3#pragma once
4
5/***
6 This file is part of systemd.
7
8 Copyright 2013 Lennart Poettering
9
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.
14
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.
19
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/>.
22***/
23
24#include <stdbool.h>
25#include <byteswap.h>
2571ead1 26#include <sys/socket.h>
de1c301e
LP
27
28#include "macro.h"
29#include "sd-bus.h"
6629161f 30#include "kdbus.h"
dd418b9a 31#include "time-util.h"
de1c301e
LP
32
33struct bus_container {
34 char enclosing;
35
b3af9646 36 unsigned index, saved_index;
de1c301e 37
453a0c29
LP
38 char *signature;
39
de1c301e 40 uint32_t *array_size;
b3af9646 41 size_t before, begin;
de1c301e
LP
42};
43
cb695f05 44struct bus_header {
de1c301e
LP
45 uint8_t endian;
46 uint8_t type;
47 uint8_t flags;
48 uint8_t version;
49 uint32_t body_size;
50 uint32_t serial;
51 uint32_t fields_size;
cb695f05 52} _packed_;
de1c301e 53
bc7fd8cd 54struct bus_body_part {
453a0c29 55 struct bus_body_part *next;
bc7fd8cd
LP
56 void *data;
57 size_t size;
58 size_t mapped;
59 int memfd;
60 bool free_this:1;
453a0c29 61 bool munmap_this:1;
bc7fd8cd 62 bool sealed:1;
453a0c29 63 bool is_zero:1;
bc7fd8cd
LP
64};
65
de1c301e
LP
66struct sd_bus_message {
67 unsigned n_ref;
68
fd8d62d9
LP
69 sd_bus *bus;
70
de1c301e
LP
71 uint32_t reply_serial;
72
73 const char *path;
74 const char *interface;
75 const char *member;
76 const char *destination;
77 const char *sender;
de1c301e
LP
78
79 sd_bus_error error;
80
81 uid_t uid;
82 gid_t gid;
83 pid_t pid;
84 pid_t tid;
8323bc1f 85 usec_t pid_starttime;
69aec65c
LP
86 usec_t monotonic;
87 usec_t realtime;
de1c301e
LP
88
89 bool sealed:1;
2c93b4ef
LP
90 bool dont_send:1;
91 bool allow_fds:1;
de1c301e
LP
92 bool uid_valid:1;
93 bool gid_valid:1;
94 bool free_header:1;
6629161f 95 bool free_kdbus:1;
2c93b4ef 96 bool free_fds:1;
fd8d62d9 97 bool release_kdbus:1;
bc7fd8cd 98 bool poisoned:1;
de1c301e
LP
99
100 struct bus_header *header;
bc7fd8cd
LP
101 struct bus_body_part body;
102 struct bus_body_part *body_end;
103 unsigned n_body_parts;
de1c301e 104
2571ead1
LP
105 char *label;
106
9a17484d 107 size_t rindex;
bc7fd8cd
LP
108 struct bus_body_part *cached_rindex_part;
109 size_t cached_rindex_part_begin;
9a17484d 110
de1c301e
LP
111 uint32_t n_fds;
112 int *fds;
113
9a17484d 114 struct bus_container root_container, *containers;
de1c301e
LP
115 unsigned n_containers;
116
bc7fd8cd 117 struct iovec *iovec;
c91cb83c 118 struct iovec iovec_fixed[2];
de1c301e 119 unsigned n_iovec;
9a17484d 120
bc7fd8cd
LP
121 struct kdbus_msg *kdbus;
122
9a17484d 123 char *peeked_signature;
6629161f
LP
124
125 usec_t timeout;
51038c03
LP
126
127 char sender_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
128 char destination_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
69aec65c
LP
129
130 const char *exe;
131 const char *comm;
132 const char *tid_comm;
4a875b61 133 const char *cgroup;
77930f11
LP
134
135 const char *cmdline;
136 size_t cmdline_length;
77930f11 137 char **cmdline_array;
d8d3d8a7
LP
138
139 char *session;
140 char *unit;
141 char *user_unit;
120f919e
LP
142
143 struct kdbus_audit *audit;
102ea8e4
LP
144
145 uint8_t *capability;
146 size_t capability_size;
de1c301e
LP
147};
148
80a46c73 149#define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_NATIVE_ENDIAN)
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
de1c301e 163static inline uint32_t BUS_MESSAGE_SERIAL(sd_bus_message *m) {
9a17484d 164 return BUS_MESSAGE_BSWAP32(m, m->header->serial);
de1c301e
LP
165}
166
167static inline uint32_t BUS_MESSAGE_BODY_SIZE(sd_bus_message *m) {
9a17484d 168 return BUS_MESSAGE_BSWAP32(m, m->header->body_size);
de1c301e
LP
169}
170
171static inline uint32_t BUS_MESSAGE_FIELDS_SIZE(sd_bus_message *m) {
9a17484d 172 return BUS_MESSAGE_BSWAP32(m, m->header->fields_size);
de1c301e
LP
173}
174
6629161f
LP
175static inline uint32_t BUS_MESSAGE_SIZE(sd_bus_message *m) {
176 return
177 sizeof(struct bus_header) +
178 ALIGN8(BUS_MESSAGE_FIELDS_SIZE(m)) +
179 BUS_MESSAGE_BODY_SIZE(m);
180}
181
c91cb83c
LP
182static inline uint32_t BUS_MESSAGE_BODY_BEGIN(sd_bus_message *m) {
183 return
184 sizeof(struct bus_header) +
185 ALIGN8(BUS_MESSAGE_FIELDS_SIZE(m));
186}
187
188static inline void* BUS_MESSAGE_FIELDS(sd_bus_message *m) {
189 return (uint8_t*) m->header + sizeof(struct bus_header);
190}
191
9a17484d 192int bus_message_seal(sd_bus_message *m, uint64_t serial);
de1c301e 193int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz);
89ffcd2a 194int bus_message_read_strv_extend(sd_bus_message *m, char ***l);
2c93b4ef 195
6629161f 196int bus_message_from_header(
df2d202e 197 sd_bus *bus,
6629161f
LP
198 void *header,
199 size_t length,
200 int *fds,
201 unsigned n_fds,
202 const struct ucred *ucred,
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,
213 const struct ucred *ucred,
214 const char *label,
215 sd_bus_message **ret);
392d5b37
LP
216
217const char* bus_message_get_arg(sd_bus_message *m, unsigned i);
917b5dc7
LP
218
219int bus_message_append_ap(sd_bus_message *m, const char *types, va_list ap);
2100fa10 220
6629161f
LP
221int bus_message_parse_fields(sd_bus_message *m);
222
c91cb83c
LP
223bool bus_header_is_complete(struct bus_header *h, size_t size);
224int bus_header_message_size(struct bus_header *h, size_t *sum);
bc7fd8cd
LP
225
226struct bus_body_part *message_append_part(sd_bus_message *m);
9b29bb68
LP
227
228#define MESSAGE_FOREACH_PART(part, i, m) \
229 for ((i) = 0, (part) = &(m)->body; (i) < (m)->n_body_parts; (i)++, (part) = (part)->next)
a392d361
LP
230
231int bus_body_part_map(struct bus_body_part *part);
232void bus_body_part_unmap(struct bus_body_part *part);
eb01ba5d
LP
233
234int bus_message_to_errno(sd_bus_message *m);
235
236int bus_message_new_synthetic_error(sd_bus *bus, uint64_t serial, const sd_bus_error *e, sd_bus_message **m);