]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd-bus/bus-util.h
bus: fix make check
[thirdparty/systemd.git] / src / libsystemd-bus / bus-util.h
CommitLineData
40ca29a1
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 "sd-event.h"
25#include "sd-bus.h"
26#include "hashmap.h"
27#include "time-util.h"
28#include "util.h"
29
d21ed1ea
LP
30typedef enum BusTransport {
31 BUS_TRANSPORT_LOCAL,
32 BUS_TRANSPORT_REMOTE,
33 BUS_TRANSPORT_CONTAINER,
34 _BUS_TRANSPORT_MAX,
35 _BUS_TRANSPORT_INVALID = -1
36} BusTransport;
37
9f6eb1cd
KS
38typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
39
ffc06c35 40struct bus_properties_map {
9f6eb1cd
KS
41 const char *member;
42 const char *signature;
43 bus_property_set_t set;
44 size_t offset;
ffc06c35
KS
45};
46
9f6eb1cd
KS
47int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
48
ffc06c35
KS
49int bus_map_all_properties(sd_bus *bus,
50 const char *destination,
51 const char *path,
9f6eb1cd
KS
52 const struct bus_properties_map *map,
53 void *userdata);
ffc06c35 54
40ca29a1
LP
55int bus_async_unregister_and_quit(sd_event *e, sd_bus *bus, const char *name);
56
57int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout);
718db961 58
5fd38859
DH
59int bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error);
60
718db961 61int bus_check_peercred(sd_bus *c);
40ca29a1
LP
62
63int bus_verify_polkit(sd_bus *bus, sd_bus_message *m, const char *action, bool interactive, bool *_challenge, sd_bus_error *e);
64
65int bus_verify_polkit_async(sd_bus *bus, Hashmap **registry, sd_bus_message *m, const char *action, bool interactive, sd_bus_error *error, sd_bus_message_handler_t callback, void *userdata);
66void bus_verify_polkit_async_registry_free(sd_bus *bus, Hashmap *registry);
67
0f8bd8de 68int bus_open_system_systemd(sd_bus **_bus);
41dd15e4 69int bus_open_user_systemd(sd_bus **_bus);
a1da8583 70
d21ed1ea 71int bus_open_transport(BusTransport transport, const char *host, bool user, sd_bus **bus);
41dd15e4 72int bus_open_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus);
d21ed1ea 73
9f6eb1cd 74int bus_print_property(const char *name, sd_bus_message *property, bool all);
27e72d6b 75int bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, char **filter, bool all);
0c842e0a 76
ebcf1f97
LP
77int bus_property_get_tristate(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
78int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
e6504030 79
718db961
LP
80#define bus_property_get_usec ((sd_bus_property_get_t) NULL)
81#define bus_property_set_usec ((sd_bus_property_set_t) NULL)
82
83assert_cc(sizeof(int) == sizeof(int32_t));
84#define bus_property_get_int ((sd_bus_property_get_t) NULL)
85
86assert_cc(sizeof(unsigned) == sizeof(unsigned));
87#define bus_property_get_unsigned ((sd_bus_property_get_t) NULL)
88
89/* On 64bit machines we can use the default serializer for size_t and
90 * friends, otherwise we need to cast this manually */
91#if __SIZEOF_SIZE_T__ == 8
92#define bus_property_get_size ((sd_bus_property_get_t) NULL)
93#else
ebcf1f97 94int bus_property_get_size(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
718db961
LP
95#endif
96
97#if __SIZEOF_LONG__ == 8
98#define bus_property_get_long ((sd_bus_property_get_t) NULL)
99#define bus_property_get_ulong ((sd_bus_property_get_t) NULL)
100#else
ebcf1f97
LP
101int bus_property_get_long(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
102int bus_property_get_ulong(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
718db961
LP
103#endif
104
105/* uid_t and friends on Linux 32 bit. This means we can just use the
106 * default serializer for 32bit unsigned, for serializing it, and map
107 * it to NULL here */
108assert_cc(sizeof(uid_t) == sizeof(uint32_t));
109#define bus_property_get_uid ((sd_bus_property_get_t) NULL)
110
111assert_cc(sizeof(gid_t) == sizeof(uint32_t));
112#define bus_property_get_gid ((sd_bus_property_get_t) NULL)
113
114assert_cc(sizeof(pid_t) == sizeof(uint32_t));
115#define bus_property_get_pid ((sd_bus_property_get_t) NULL)
116
117assert_cc(sizeof(mode_t) == sizeof(uint32_t));
118#define bus_property_get_mode ((sd_bus_property_get_t) NULL)
e6504030 119
5b30bef8 120int bus_log_parse_error(int r);
f459b602
MAP
121int bus_log_create_error(int r);
122
123typedef struct UnitInfo {
124 const char *id;
125 const char *description;
126 const char *load_state;
127 const char *active_state;
128 const char *sub_state;
129 const char *following;
130 const char *unit_path;
131 uint32_t job_id;
132 const char *job_type;
133 const char *job_path;
134} UnitInfo;
135
136int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u);
5b30bef8 137
40ca29a1
LP
138DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_unref);
139DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_message*, sd_bus_message_unref);
5b12334d 140DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_creds*, sd_bus_creds_unref);
40ca29a1
LP
141
142#define _cleanup_bus_unref_ _cleanup_(sd_bus_unrefp)
40ca29a1 143#define _cleanup_bus_message_unref_ _cleanup_(sd_bus_message_unrefp)
5b12334d 144#define _cleanup_bus_creds_unref_ _cleanup_(sd_bus_creds_unrefp)
c3350683
LP
145#define _cleanup_bus_error_free_ _cleanup_(sd_bus_error_free)
146
147#define BUS_DEFINE_PROPERTY_GET_ENUM(function, name, type) \
148 int function(sd_bus *bus, \
149 const char *path, \
150 const char *interface, \
151 const char *property, \
152 sd_bus_message *reply, \
ebcf1f97
LP
153 void *userdata, \
154 sd_bus_error *error) { \
c3350683
LP
155 \
156 const char *value; \
157 type *field = userdata; \
158 int r; \
159 \
160 assert(bus); \
161 assert(reply); \
162 assert(field); \
163 \
164 value = strempty(name##_to_string(*field)); \
165 \
166 r = sd_bus_message_append_basic(reply, 's', value); \
167 if (r < 0) \
168 return r; \
169 \
170 return 1; \
171 } \
172 struct __useless_struct_to_allow_trailing_semicolon__
173
718db961 174#define BUS_PROPERTY_DUAL_TIMESTAMP(name, offset, flags) \
edb5dd18
LP
175 SD_BUS_PROPERTY(name, "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, realtime), (flags)), \
176 SD_BUS_PROPERTY(name "Monotonic", "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, monotonic), (flags))
ebcf1f97
LP
177
178int bus_maybe_reply_error(sd_bus_message *m, int r, sd_bus_error *error);