]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd-bus/bus-message.h
bus: add missing test-bus-server.c
[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"
30
31struct bus_container {
32 char enclosing;
33
34 char *signature;
35 unsigned index;
36
37 uint32_t *array_size;
9a17484d 38 size_t begin;
de1c301e
LP
39};
40
cb695f05 41struct bus_header {
de1c301e
LP
42 uint8_t endian;
43 uint8_t type;
44 uint8_t flags;
45 uint8_t version;
46 uint32_t body_size;
47 uint32_t serial;
48 uint32_t fields_size;
cb695f05 49} _packed_;
de1c301e
LP
50
51struct sd_bus_message {
52 unsigned n_ref;
53
54 uint32_t reply_serial;
55
56 const char *path;
57 const char *interface;
58 const char *member;
59 const char *destination;
60 const char *sender;
de1c301e
LP
61
62 sd_bus_error error;
63
64 uid_t uid;
65 gid_t gid;
66 pid_t pid;
67 pid_t tid;
68
69 bool sealed:1;
2c93b4ef
LP
70 bool dont_send:1;
71 bool allow_fds:1;
de1c301e
LP
72 bool uid_valid:1;
73 bool gid_valid:1;
74 bool free_header:1;
75 bool free_fields:1;
76 bool free_body:1;
2c93b4ef 77 bool free_fds:1;
de1c301e
LP
78
79 struct bus_header *header;
80 void *fields;
81 void *body;
82
2571ead1
LP
83 char *label;
84
9a17484d
LP
85 size_t rindex;
86
de1c301e
LP
87 uint32_t n_fds;
88 int *fds;
89
9a17484d 90 struct bus_container root_container, *containers;
de1c301e
LP
91 unsigned n_containers;
92
93 struct iovec iovec[4];
94 unsigned n_iovec;
e3017af9 95 size_t size;
9a17484d
LP
96
97 char *peeked_signature;
de1c301e
LP
98};
99
80a46c73 100#define BUS_MESSAGE_NEED_BSWAP(m) ((m)->header->endian != SD_BUS_NATIVE_ENDIAN)
de1c301e 101
9a17484d
LP
102static inline uint16_t BUS_MESSAGE_BSWAP16(sd_bus_message *m, uint16_t u) {
103 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_16(u) : u;
104}
105
106static inline uint32_t BUS_MESSAGE_BSWAP32(sd_bus_message *m, uint32_t u) {
de1c301e
LP
107 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_32(u) : u;
108}
109
9a17484d
LP
110static inline uint64_t BUS_MESSAGE_BSWAP64(sd_bus_message *m, uint64_t u) {
111 return BUS_MESSAGE_NEED_BSWAP(m) ? bswap_64(u) : u;
112}
113
de1c301e 114static inline uint32_t BUS_MESSAGE_SERIAL(sd_bus_message *m) {
9a17484d 115 return BUS_MESSAGE_BSWAP32(m, m->header->serial);
de1c301e
LP
116}
117
118static inline uint32_t BUS_MESSAGE_BODY_SIZE(sd_bus_message *m) {
9a17484d 119 return BUS_MESSAGE_BSWAP32(m, m->header->body_size);
de1c301e
LP
120}
121
122static inline uint32_t BUS_MESSAGE_FIELDS_SIZE(sd_bus_message *m) {
9a17484d 123 return BUS_MESSAGE_BSWAP32(m, m->header->fields_size);
de1c301e
LP
124}
125
126static inline void bus_message_unrefp(sd_bus_message **m) {
127 sd_bus_message_unref(*m);
128}
129
130#define _cleanup_bus_message_unref_ __attribute__((cleanup(bus_message_unrefp)))
131
9a17484d
LP
132int bus_message_seal(sd_bus_message *m, uint64_t serial);
133int bus_message_dump(sd_bus_message *m);
de1c301e 134int bus_message_get_blob(sd_bus_message *m, void **buffer, size_t *sz);
89ffcd2a 135int bus_message_read_strv_extend(sd_bus_message *m, char ***l);
2c93b4ef
LP
136
137int bus_message_from_malloc(
138 void *buffer,
139 size_t length,
140 int *fds,
141 unsigned n_fds,
142 const struct ucred *ucred,
143 const char *label,
144 sd_bus_message **ret);