]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/dbus-util.h
core: reduce scope of variants
[thirdparty/systemd.git] / src / core / dbus-util.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 #include "sd-bus.h"
5
6 #include "unit.h"
7
8 int bus_property_get_triggered_unit(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error);
9
10 #define BUS_DEFINE_SET_TRANSIENT(function, bus_type, type, cast_type, fmt) \
11 int bus_set_transient_##function( \
12 Unit *u, \
13 const char *name, \
14 cast_type *p, \
15 sd_bus_message *message, \
16 UnitWriteFlags flags, \
17 sd_bus_error *error) { \
18 \
19 type v; \
20 int r; \
21 \
22 assert(p); \
23 \
24 r = sd_bus_message_read(message, bus_type, &v); \
25 if (r < 0) \
26 return r; \
27 \
28 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
29 *p = (cast_type) v; \
30 unit_write_settingf(u, flags, name, \
31 "%s=" fmt, name, v); \
32 } \
33 \
34 return 1; \
35 }
36
37 #define BUS_DEFINE_SET_TRANSIENT_IS_VALID(function, bus_type, type, cast_type, fmt, check) \
38 int bus_set_transient_##function( \
39 Unit *u, \
40 const char *name, \
41 cast_type *p, \
42 sd_bus_message *message, \
43 UnitWriteFlags flags, \
44 sd_bus_error *error) { \
45 \
46 type v; \
47 int r; \
48 \
49 assert(p); \
50 \
51 r = sd_bus_message_read(message, bus_type, &v); \
52 if (r < 0) \
53 return r; \
54 \
55 if (!check(v)) \
56 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
57 "Invalid %s setting: " fmt, name, v); \
58 \
59 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
60 *p = (cast_type) v; \
61 unit_write_settingf(u, flags, name, \
62 "%s=" fmt, name, v); \
63 } \
64 \
65 return 1; \
66 }
67
68 #define BUS_DEFINE_SET_TRANSIENT_TO_STRING(function, bus_type, type, cast_type, fmt, to_string) \
69 int bus_set_transient_##function( \
70 Unit *u, \
71 const char *name, \
72 cast_type *p, \
73 sd_bus_message *message, \
74 UnitWriteFlags flags, \
75 sd_bus_error *error) { \
76 \
77 const char *s; \
78 type v; \
79 int r; \
80 \
81 assert(p); \
82 \
83 r = sd_bus_message_read(message, bus_type, &v); \
84 if (r < 0) \
85 return r; \
86 \
87 s = to_string(v); \
88 if (!s) \
89 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
90 "Invalid %s setting: " fmt, name, v); \
91 \
92 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
93 *p = (cast_type) v; \
94 unit_write_settingf(u, flags, name, \
95 "%s=%s", name, s); \
96 } \
97 \
98 return 1; \
99 }
100
101 #define BUS_DEFINE_SET_TRANSIENT_TO_STRING_ALLOC(function, bus_type, type, cast_type, fmt, to_string) \
102 int bus_set_transient_##function( \
103 Unit *u, \
104 const char *name, \
105 cast_type *p, \
106 sd_bus_message *message, \
107 UnitWriteFlags flags, \
108 sd_bus_error *error) { \
109 \
110 _cleanup_free_ char *s = NULL; \
111 type v; \
112 int r; \
113 \
114 assert(p); \
115 \
116 r = sd_bus_message_read(message, bus_type, &v); \
117 if (r < 0) \
118 return r; \
119 \
120 r = to_string(v, &s); \
121 if (r == -EINVAL) \
122 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
123 "Invalid %s setting: " fmt, name, v); \
124 if (r < 0) \
125 return r; \
126 \
127 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
128 *p = (cast_type) v; \
129 unit_write_settingf(u, flags, name, \
130 "%s=%s", \
131 name, strempty(s)); \
132 } \
133 \
134 return 1; \
135 }
136
137 #define BUS_DEFINE_SET_TRANSIENT_PARSE(function, type, parse) \
138 int bus_set_transient_##function( \
139 Unit *u, \
140 const char *name, \
141 type *p, \
142 sd_bus_message *message, \
143 UnitWriteFlags flags, \
144 sd_bus_error *error) { \
145 \
146 const char *s; \
147 type v; \
148 int r; \
149 \
150 assert(p); \
151 \
152 r = sd_bus_message_read(message, "s", &s); \
153 if (r < 0) \
154 return r; \
155 \
156 v = parse(s); \
157 if (v < 0) \
158 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
159 "Invalid %s setting: %s", name, s); \
160 \
161 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
162 *p = v; \
163 unit_write_settingf(u, flags, name, \
164 "%s=%s", name, s); \
165 } \
166 \
167 return 1; \
168 }
169
170 #define BUS_DEFINE_SET_TRANSIENT_PARSE_PTR(function, type, parse) \
171 int bus_set_transient_##function( \
172 Unit *u, \
173 const char *name, \
174 type *p, \
175 sd_bus_message *message, \
176 UnitWriteFlags flags, \
177 sd_bus_error *error) { \
178 \
179 const char *s; \
180 type v; \
181 int r; \
182 \
183 assert(p); \
184 \
185 r = sd_bus_message_read(message, "s", &s); \
186 if (r < 0) \
187 return r; \
188 \
189 r = parse(s, &v); \
190 if (r < 0) \
191 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
192 "Invalid %s setting: %s", name, s); \
193 \
194 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
195 *p = v; \
196 unit_write_settingf(u, flags, name, \
197 "%s=%s", name, strempty(s)); \
198 } \
199 \
200 return 1; \
201 }
202
203 #define BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(function, check) \
204 int bus_set_transient_##function( \
205 Unit *u, \
206 const char *name, \
207 char **p, \
208 sd_bus_message *message, \
209 UnitWriteFlags flags, \
210 sd_bus_error *error) { \
211 \
212 const char *v; \
213 int r; \
214 \
215 assert(p); \
216 \
217 r = sd_bus_message_read(message, "s", &v); \
218 if (r < 0) \
219 return r; \
220 \
221 if (!isempty(v) && !check(v)) \
222 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
223 "Invalid %s setting: %s", name, v); \
224 \
225 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
226 r = free_and_strdup(p, empty_to_null(v)); \
227 if (r < 0) \
228 return r; \
229 \
230 unit_write_settingf(u, flags|UNIT_ESCAPE_SPECIFIERS, name, \
231 "%s=%s", name, strempty(v)); \
232 } \
233 \
234 return 1; \
235 }
236
237 int bus_set_transient_mode_t(Unit *u, const char *name, mode_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
238 int bus_set_transient_unsigned(Unit *u, const char *name, unsigned *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
239 int bus_set_transient_user_relaxed(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
240 int bus_set_transient_path(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
241 int bus_set_transient_string(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
242 int bus_set_transient_bool(Unit *u, const char *name, bool *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
243 int bus_set_transient_percent(Unit *u, const char *name, int *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
244 int bus_set_transient_usec_internal(Unit *u, const char *name, usec_t *p, bool fix_0, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
245 static inline int bus_set_transient_usec(Unit *u, const char *name, usec_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error) {
246 return bus_set_transient_usec_internal(u, name, p, false, message, flags, error);
247 }
248 static inline int bus_set_transient_usec_fix_0(Unit *u, const char *name, usec_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error) {
249 return bus_set_transient_usec_internal(u, name, p, true, message, flags, error);
250 }