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 : }
|