]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/dbus-util.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 This file is part of systemd.
7 Copyright 2010 Lennart Poettering
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
26 #define BUS_DEFINE_SET_TRANSIENT(function, bus_type, type, cast_type, fmt) \
27 int bus_set_transient_##function( \
31 sd_bus_message *message, \
32 UnitWriteFlags flags, \
33 sd_bus_error *error) { \
40 r = sd_bus_message_read(message, bus_type, &v); \
44 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
46 unit_write_settingf(u, flags, name, \
47 "%s=" fmt, name, v); \
52 struct __useless_struct_to_allow_trailing_semicolon__
54 #define BUS_DEFINE_SET_TRANSIENT_IS_VALID(function, bus_type, type, cast_type, fmt, check) \
55 int bus_set_transient_##function( \
59 sd_bus_message *message, \
60 UnitWriteFlags flags, \
61 sd_bus_error *error) { \
68 r = sd_bus_message_read(message, bus_type, &v); \
73 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
74 "Invalid %s setting: " fmt, name, v); \
76 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
78 unit_write_settingf(u, flags, name, \
79 "%s=" fmt, name, v); \
84 struct __useless_struct_to_allow_trailing_semicolon__
86 #define BUS_DEFINE_SET_TRANSIENT_TO_STRING(function, bus_type, type, cast_type, fmt, to_string) \
87 int bus_set_transient_##function( \
91 sd_bus_message *message, \
92 UnitWriteFlags flags, \
93 sd_bus_error *error) { \
101 r = sd_bus_message_read(message, bus_type, &v); \
107 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
108 "Invalid %s setting: " fmt, name, v); \
110 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
111 *p = (cast_type) v; \
112 unit_write_settingf(u, flags, name, \
118 struct __useless_struct_to_allow_trailing_semicolon__
120 #define BUS_DEFINE_SET_TRANSIENT_TO_STRING_ALLOC(function, bus_type, type, cast_type, fmt, to_string) \
121 int bus_set_transient_##function( \
125 sd_bus_message *message, \
126 UnitWriteFlags flags, \
127 sd_bus_error *error) { \
129 _cleanup_free_ char *s = NULL; \
135 r = sd_bus_message_read(message, bus_type, &v); \
139 r = to_string(v, &s); \
141 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
142 "Invalid %s setting: " fmt, name, v); \
146 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
147 *p = (cast_type) v; \
148 unit_write_settingf(u, flags, name, \
154 struct __useless_struct_to_allow_trailing_semicolon__
156 #define BUS_DEFINE_SET_TRANSIENT_PARSE(function, type, parse) \
157 int bus_set_transient_##function( \
161 sd_bus_message *message, \
162 UnitWriteFlags flags, \
163 sd_bus_error *error) { \
171 r = sd_bus_message_read(message, "s", &s); \
177 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
178 "Invalid %s setting: %s", name, s); \
180 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
182 unit_write_settingf(u, flags, name, \
188 struct __useless_struct_to_allow_trailing_semicolon__
190 #define BUS_DEFINE_SET_TRANSIENT_PARSE_PTR(function, type, parse) \
191 int bus_set_transient_##function( \
195 sd_bus_message *message, \
196 UnitWriteFlags flags, \
197 sd_bus_error *error) { \
205 r = sd_bus_message_read(message, "s", &s); \
211 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
212 "Invalid %s setting: %s", name, s); \
214 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
216 unit_write_settingf(u, flags, name, \
217 "%s=%s", name, strempty(s)); \
222 struct __useless_struct_to_allow_trailing_semicolon__
224 #define BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(function, check) \
225 int bus_set_transient_##function( \
229 sd_bus_message *message, \
230 UnitWriteFlags flags, \
231 sd_bus_error *error) { \
238 r = sd_bus_message_read(message, "s", &v); \
242 if (!isempty(v) && !check(v)) \
243 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
244 "Invalid %s setting: %s", name, v); \
246 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
247 r = free_and_strdup(p, empty_to_null(v)); \
251 unit_write_settingf(u, flags|UNIT_ESCAPE_SPECIFIERS, name, \
252 "%s=%s", name, strempty(v)); \
257 struct __useless_struct_to_allow_trailing_semicolon__
259 #define BUS_DEFINE_SET_CGROUP_WEIGHT(function, mask, check, val, str) \
260 int bus_cgroup_set_##function( \
264 sd_bus_message *message, \
265 UnitWriteFlags flags, \
266 sd_bus_error *error) { \
273 r = sd_bus_message_read(message, "t", &v); \
278 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
279 "Value specified in %s is out of range", name); \
281 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
283 unit_invalidate_cgroup(u, (mask)); \
286 unit_write_settingf(u, flags, name, \
289 unit_write_settingf(u, flags, name, \
290 "%s=%" PRIu64, name, v); \
295 struct __useless_struct_to_allow_trailing_semicolon__
297 #define BUS_DEFINE_SET_CGROUP_SCALE(function, mask, scale) \
298 int bus_cgroup_set_##function##_scale( \
302 sd_bus_message *message, \
303 UnitWriteFlags flags, \
304 sd_bus_error *error) { \
312 r = sd_bus_message_read(message, "u", &raw); \
316 v = scale(raw, UINT32_MAX); \
317 if (v <= 0 || v >= UINT64_MAX) \
318 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
319 "Value specified in %s is out of range", name); \
321 if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
325 unit_invalidate_cgroup(u, (mask)); \
327 /* Chop off suffix */ \
328 assert_se(e = endswith(name, "Scale")); \
329 name = strndupa(name, e - name); \
331 unit_write_settingf(u, flags, name, "%s=%" PRIu32 "%%", name, \
332 (uint32_t) (DIV_ROUND_UP((uint64_t) raw * 100U, (uint64_t) UINT32_MAX))); \
337 struct __useless_struct_to_allow_trailing_semicolon__
339 int bus_set_transient_mode_t(Unit
*u
, const char *name
, mode_t
*p
, sd_bus_message
*message
, UnitWriteFlags flags
, sd_bus_error
*error
);
340 int bus_set_transient_unsigned(Unit
*u
, const char *name
, unsigned *p
, sd_bus_message
*message
, UnitWriteFlags flags
, sd_bus_error
*error
);
341 int bus_set_transient_user(Unit
*u
, const char *name
, char **p
, sd_bus_message
*message
, UnitWriteFlags flags
, sd_bus_error
*error
);
342 int bus_set_transient_path(Unit
*u
, const char *name
, char **p
, sd_bus_message
*message
, UnitWriteFlags flags
, sd_bus_error
*error
);
343 int bus_set_transient_string(Unit
*u
, const char *name
, char **p
, sd_bus_message
*message
, UnitWriteFlags flags
, sd_bus_error
*error
);
344 int bus_set_transient_bool(Unit
*u
, const char *name
, bool *p
, sd_bus_message
*message
, UnitWriteFlags flags
, sd_bus_error
*error
);
345 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
);
346 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
) {
347 return bus_set_transient_usec_internal(u
, name
, p
, false, message
, flags
, error
);
349 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
) {
350 return bus_set_transient_usec_internal(u
, name
, p
, true, message
, flags
, error
);