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