]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd-bus/bus-message.h
kdbus: parse cgroup meta data, too
[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
36 char *signature;
37 unsigned index;
38
39 uint32_t *array_size;
9a17484d 40 size_t begin;
de1c301e
LP
41};
42
cb695f05 43struct bus_header {
de1c301e
LP
44 uint8_t endian;
45 uint8_t type;
46 uint8_t flags;
47 uint8_t version;
48 uint32_t body_size;
49 uint32_t serial;
50 uint32_t fields_size;
cb695f05 51} _packed_;
de1c301e
LP
52
53struct sd_bus_message {
54 unsigned n_ref;
55
56 uint32_t reply_serial;
57
58 const char *path;
59 const char *interface;
60 const char *member;
61 const char *destination;
62 const char *sender;
de1c301e
LP
63
64 sd_bus_error error;
65
66 uid_t uid;
67 gid_t gid;
68 pid_t pid;
69 pid_t tid;
8323bc1f 70 usec_t pid_starttime;
69aec65c
LP
71 usec_t monotonic;
72 usec_t realtime;
de1c301e
LP
73
74 bool sealed:1;
2c93b4ef
LP
75 bool dont_send:1;
76 bool allow_fds:1;
de1c301e
LP
77 bool uid_valid:1;
78 bool gid_valid:1;
79 bool free_header:1;
80 bool free_fields:1;
81 bool free_body:1;
6629161f 82 bool free_kdbus:1;
2c93b4ef 83 bool free_fds:1;
de1c301e
LP
84
85 struct bus_header *header;
86 void *fields;
87 void *body;
6629161f 88 struct kdbus_msg *kdbus;
de1c301e 89
2571ead1
LP
90 char *label;
91
9a17484d
LP
92 size_t rindex;
93
de1c301e
LP
94 uint32_t n_fds;
95 int *fds;
96
9a17484d 97 struct bus_container root_container, *containers;
de1c301e
LP
98 unsigned n_containers;
99
69aec65c 100 struct iovec iovec[3];
de1c301e 101 unsigned n_iovec;
9a17484d
LP
102
103 char *peeked_signature;
6629161f
LP
104
105 usec_t timeout;
51038c03
LP
106
107 char sender_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
108 char destination_buffer[3 + DECIMAL_STR_MAX(uint64_t) + 1];
69aec65c
LP
109
110 const char *exe;
111 const char *comm;
112 const char *tid_comm;
4a875b61 113 const char *cgroup;
77930f11
LP
114
115 const char *cmdline;
116 size_t cmdline_length;
77930f11 117 char **cmdline_array;
de1c301e
LP
118};
119
80a46c73 120#define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_NATIVE_ENDIAN)
de1c301e 121
9a17484d
LP
122static inline uint16_t BUS_MESSAGE_BSWAP16(sd_bus_message *m, uint16_t u) {
123 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_16(u) : u;
124}
125
126static inline uint32_t BUS_MESSAGE_BSWAP32(sd_bus_message *m, uint32_t u) {
de1c301e
LP
127 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_32(u) : u;
128}
129
9a17484d
LP
130static inline uint64_t BUS_MESSAGE_BSWAP64(sd_bus_message *m, uint64_t u) {
131 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_64(u) : u;
132}
133
de1c301e 134static inline uint32_t BUS_MESSAGE_SERIAL(sd_bus_message *m) {
9a17484d 135 return BUS_MESSAGE_BSWAP32(m, m->header->serial);
de1c301e
LP
136}
137
138static inline uint32_t BUS_MESSAGE_BODY_SIZE(sd_bus_message *m) {
9a17484d 139 return BUS_MESSAGE_BSWAP32(m, m->header->body_size);
de1c301e
LP
140}
141
142static inline uint32_t BUS_MESSAGE_FIELDS_SIZE(sd_bus_message *m) {
9a17484d 143 return BUS_MESSAGE_BSWAP32(m, m->header->fields_size);
de1c301e
LP
144}
145
6629161f
LP
146static inline uint32_t BUS_MESSAGE_SIZE(sd_bus_message *m) {
147 return
148 sizeof(struct bus_header) +
149 ALIGN8(BUS_MESSAGE_FIELDS_SIZE(m)) +
150 BUS_MESSAGE_BODY_SIZE(m);
151}
152
de1c301e
LP
153static inline void bus_message_unrefp(sd_bus_message **m) {
154 sd_bus_message_unref(*m);
155}
156
157#define _cleanup_bus_message_unref_ __attribute__((cleanup(bus_message_unrefp)))
158
9a17484d
LP
159int bus_message_seal(sd_bus_message *m, uint64_t serial);
160int bus_message_dump(sd_bus_message *m);
de1c301e 161int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz);
89ffcd2a 162int bus_message_read_strv_extend(sd_bus_message *m, char ***l);
2c93b4ef 163
6629161f
LP
164int bus_message_from_header(
165 void *header,
166 size_t length,
167 int *fds,
168 unsigned n_fds,
169 const struct ucred *ucred,
170 const char *label,
171 size_t extra,
172 sd_bus_message **ret);
173
2c93b4ef
LP
174int bus_message_from_malloc(
175 void *buffer,
176 size_t length,
177 int *fds,
178 unsigned n_fds,
179 const struct ucred *ucred,
180 const char *label,
181 sd_bus_message **ret);
392d5b37
LP
182
183const char* bus_message_get_arg(sd_bus_message *m, unsigned i);
917b5dc7
LP
184
185int bus_message_append_ap(sd_bus_message *m, const char *types, va_list ap);
2100fa10 186
6629161f
LP
187int bus_message_parse_fields(sd_bus_message *m);
188
189int bus_header_size(struct bus_header *h, size_t *sum);