Line data Source code
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 "install.h"
28 : #include "time-util.h"
29 :
30 : typedef enum BusTransport {
31 : BUS_TRANSPORT_LOCAL,
32 : BUS_TRANSPORT_REMOTE,
33 : BUS_TRANSPORT_MACHINE,
34 : _BUS_TRANSPORT_MAX,
35 : _BUS_TRANSPORT_INVALID = -1
36 : } BusTransport;
37 :
38 : typedef int (*bus_property_set_t) (sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
39 :
40 : struct bus_properties_map {
41 : const char *member;
42 : const char *signature;
43 : bus_property_set_t set;
44 : size_t offset;
45 : };
46 :
47 : int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata);
48 :
49 : int bus_message_map_all_properties(sd_bus_message *m, const struct bus_properties_map *map, void *userdata);
50 : int bus_message_map_properties_changed(sd_bus_message *m, const struct bus_properties_map *map, void *userdata);
51 : int bus_map_all_properties(sd_bus *bus, const char *destination, const char *path, const struct bus_properties_map *map, void *userdata);
52 :
53 : int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);
54 :
55 : typedef bool (*check_idle_t)(void *userdata);
56 :
57 : int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout, check_idle_t check_idle, void *userdata);
58 :
59 : int bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error);
60 :
61 : int bus_check_peercred(sd_bus *c);
62 :
63 : int bus_test_polkit(sd_bus_message *call, int capability, const char *action, uid_t good_user, bool *_challenge, sd_bus_error *e);
64 :
65 : int bus_verify_polkit_async(sd_bus_message *call, int capability, const char *action, bool interactive, uid_t good_user, Hashmap **registry, sd_bus_error *error);
66 : void bus_verify_polkit_async_registry_free(Hashmap *registry);
67 :
68 : int bus_open_system_systemd(sd_bus **_bus);
69 : int bus_open_user_systemd(sd_bus **_bus);
70 :
71 : int bus_open_transport(BusTransport transport, const char *host, bool user, sd_bus **bus);
72 : int bus_open_transport_systemd(BusTransport transport, const char *host, bool user, sd_bus **bus);
73 :
74 : int bus_print_property(const char *name, sd_bus_message *property, bool all);
75 : int bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, char **filter, bool all);
76 :
77 : int 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);
78 :
79 : #define bus_property_get_usec ((sd_bus_property_get_t) NULL)
80 : #define bus_property_set_usec ((sd_bus_property_set_t) NULL)
81 :
82 : assert_cc(sizeof(int) == sizeof(int32_t));
83 : #define bus_property_get_int ((sd_bus_property_get_t) NULL)
84 :
85 : assert_cc(sizeof(unsigned) == sizeof(unsigned));
86 : #define bus_property_get_unsigned ((sd_bus_property_get_t) NULL)
87 :
88 : /* On 64bit machines we can use the default serializer for size_t and
89 : * friends, otherwise we need to cast this manually */
90 : #if __SIZEOF_SIZE_T__ == 8
91 : #define bus_property_get_size ((sd_bus_property_get_t) NULL)
92 : #else
93 : int 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);
94 : #endif
95 :
96 : #if __SIZEOF_LONG__ == 8
97 : #define bus_property_get_long ((sd_bus_property_get_t) NULL)
98 : #define bus_property_get_ulong ((sd_bus_property_get_t) NULL)
99 : #else
100 : int 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);
101 : int 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);
102 : #endif
103 :
104 : /* uid_t and friends on Linux 32 bit. This means we can just use the
105 : * default serializer for 32bit unsigned, for serializing it, and map
106 : * it to NULL here */
107 : assert_cc(sizeof(uid_t) == sizeof(uint32_t));
108 : #define bus_property_get_uid ((sd_bus_property_get_t) NULL)
109 :
110 : assert_cc(sizeof(gid_t) == sizeof(uint32_t));
111 : #define bus_property_get_gid ((sd_bus_property_get_t) NULL)
112 :
113 : assert_cc(sizeof(pid_t) == sizeof(uint32_t));
114 : #define bus_property_get_pid ((sd_bus_property_get_t) NULL)
115 :
116 : assert_cc(sizeof(mode_t) == sizeof(uint32_t));
117 : #define bus_property_get_mode ((sd_bus_property_get_t) NULL)
118 :
119 : int bus_log_parse_error(int r);
120 : int bus_log_create_error(int r);
121 :
122 : typedef struct UnitInfo {
123 : const char *machine;
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 :
136 : int bus_parse_unit_info(sd_bus_message *message, UnitInfo *u);
137 :
138 31146 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_unref);
139 5 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus*, sd_bus_flush_close_unref);
140 2 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_slot*, sd_bus_slot_unref);
141 155723 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_message*, sd_bus_message_unref);
142 27 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_creds*, sd_bus_creds_unref);
143 : DEFINE_TRIVIAL_CLEANUP_FUNC(sd_bus_track*, sd_bus_track_unref);
144 :
145 : #define _cleanup_bus_unref_ _cleanup_(sd_bus_unrefp)
146 : #define _cleanup_bus_flush_close_unref_ _cleanup_(sd_bus_flush_close_unrefp)
147 : #define _cleanup_bus_slot_unref_ _cleanup_(sd_bus_slot_unrefp)
148 : #define _cleanup_bus_message_unref_ _cleanup_(sd_bus_message_unrefp)
149 : #define _cleanup_bus_creds_unref_ _cleanup_(sd_bus_creds_unrefp)
150 : #define _cleanup_bus_track_unref_ _cleanup_(sd_bus_slot_unrefp)
151 : #define _cleanup_bus_error_free_ _cleanup_(sd_bus_error_free)
152 :
153 : #define BUS_DEFINE_PROPERTY_GET_ENUM(function, name, type) \
154 : int function(sd_bus *bus, \
155 : const char *path, \
156 : const char *interface, \
157 : const char *property, \
158 : sd_bus_message *reply, \
159 : void *userdata, \
160 : sd_bus_error *error) { \
161 : \
162 : const char *value; \
163 : type *field = userdata; \
164 : int r; \
165 : \
166 : assert(bus); \
167 : assert(reply); \
168 : assert(field); \
169 : \
170 : value = strempty(name##_to_string(*field)); \
171 : \
172 : r = sd_bus_message_append_basic(reply, 's', value); \
173 : if (r < 0) \
174 : return r; \
175 : \
176 : return 1; \
177 : } \
178 : struct __useless_struct_to_allow_trailing_semicolon__
179 :
180 : #define BUS_PROPERTY_DUAL_TIMESTAMP(name, offset, flags) \
181 : SD_BUS_PROPERTY(name, "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, realtime), (flags)), \
182 : SD_BUS_PROPERTY(name "Monotonic", "t", bus_property_get_usec, (offset) + offsetof(struct dual_timestamp, monotonic), (flags))
183 :
184 : int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignment);
185 :
186 : typedef struct BusWaitForJobs BusWaitForJobs;
187 :
188 : int bus_wait_for_jobs_new(sd_bus *bus, BusWaitForJobs **ret);
189 : void bus_wait_for_jobs_free(BusWaitForJobs *d);
190 : int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path);
191 : int bus_wait_for_jobs(BusWaitForJobs *d, bool quiet);
192 : int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet);
193 :
194 0 : DEFINE_TRIVIAL_CLEANUP_FUNC(BusWaitForJobs*, bus_wait_for_jobs_free);
195 :
196 : int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, UnitFileChange **changes, unsigned *n_changes);
197 :
198 : int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path);
199 : int bus_path_decode_unique(const char *path, const char *prefix, char **ret_sender, char **ret_external);
200 :
201 : bool is_kdbus_wanted(void);
202 : bool is_kdbus_available(void);
|