Branch data Line data Source code
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", name, s); \
131 : : } \
132 : : \
133 : : return 1; \
134 : : }
135 : :
136 : : #define BUS_DEFINE_SET_TRANSIENT_PARSE(function, type, parse) \
137 : : int bus_set_transient_##function( \
138 : : Unit *u, \
139 : : const char *name, \
140 : : type *p, \
141 : : sd_bus_message *message, \
142 : : UnitWriteFlags flags, \
143 : : sd_bus_error *error) { \
144 : : \
145 : : const char *s; \
146 : : type v; \
147 : : int r; \
148 : : \
149 : : assert(p); \
150 : : \
151 : : r = sd_bus_message_read(message, "s", &s); \
152 : : if (r < 0) \
153 : : return r; \
154 : : \
155 : : v = parse(s); \
156 : : if (v < 0) \
157 : : return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
158 : : "Invalid %s setting: %s", name, s); \
159 : : \
160 : : if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
161 : : *p = v; \
162 : : unit_write_settingf(u, flags, name, \
163 : : "%s=%s", name, s); \
164 : : } \
165 : : \
166 : : return 1; \
167 : : }
168 : :
169 : : #define BUS_DEFINE_SET_TRANSIENT_PARSE_PTR(function, type, parse) \
170 : : int bus_set_transient_##function( \
171 : : Unit *u, \
172 : : const char *name, \
173 : : type *p, \
174 : : sd_bus_message *message, \
175 : : UnitWriteFlags flags, \
176 : : sd_bus_error *error) { \
177 : : \
178 : : const char *s; \
179 : : type v; \
180 : : int r; \
181 : : \
182 : : assert(p); \
183 : : \
184 : : r = sd_bus_message_read(message, "s", &s); \
185 : : if (r < 0) \
186 : : return r; \
187 : : \
188 : : r = parse(s, &v); \
189 : : if (r < 0) \
190 : : return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
191 : : "Invalid %s setting: %s", name, s); \
192 : : \
193 : : if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
194 : : *p = v; \
195 : : unit_write_settingf(u, flags, name, \
196 : : "%s=%s", name, strempty(s)); \
197 : : } \
198 : : \
199 : : return 1; \
200 : : }
201 : :
202 : : #define BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(function, check) \
203 : : int bus_set_transient_##function( \
204 : : Unit *u, \
205 : : const char *name, \
206 : : char **p, \
207 : : sd_bus_message *message, \
208 : : UnitWriteFlags flags, \
209 : : sd_bus_error *error) { \
210 : : \
211 : : const char *v; \
212 : : int r; \
213 : : \
214 : : assert(p); \
215 : : \
216 : : r = sd_bus_message_read(message, "s", &v); \
217 : : if (r < 0) \
218 : : return r; \
219 : : \
220 : : if (!isempty(v) && !check(v)) \
221 : : return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, \
222 : : "Invalid %s setting: %s", name, v); \
223 : : \
224 : : if (!UNIT_WRITE_FLAGS_NOOP(flags)) { \
225 : : r = free_and_strdup(p, empty_to_null(v)); \
226 : : if (r < 0) \
227 : : return r; \
228 : : \
229 : : unit_write_settingf(u, flags|UNIT_ESCAPE_SPECIFIERS, name, \
230 : : "%s=%s", name, strempty(v)); \
231 : : } \
232 : : \
233 : : return 1; \
234 : : }
235 : :
236 : : int bus_set_transient_mode_t(Unit *u, const char *name, mode_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
237 : : int bus_set_transient_unsigned(Unit *u, const char *name, unsigned *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
238 : : int bus_set_transient_user(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
239 : : int bus_set_transient_path(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
240 : : int bus_set_transient_string(Unit *u, const char *name, char **p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
241 : : int bus_set_transient_bool(Unit *u, const char *name, bool *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error);
242 : : 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);
243 : 0 : 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) {
244 : 0 : return bus_set_transient_usec_internal(u, name, p, false, message, flags, error);
245 : : }
246 : 0 : 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) {
247 : 0 : return bus_set_transient_usec_internal(u, name, p, true, message, flags, error);
248 : : }
|