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