]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/systemctl/systemctl-set-property.c
license: LGPL-2.1+ -> LGPL-2.1-or-later
[thirdparty/systemd.git] / src / systemctl / systemctl-set-property.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "bus-error.h"
4 #include "bus-locator.h"
5 #include "systemctl-set-property.h"
6 #include "systemctl-util.h"
7 #include "systemctl.h"
8
9 int set_property(int argc, char *argv[], void *userdata) {
10 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
11 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
12 _cleanup_free_ char *n = NULL;
13 UnitType t;
14 sd_bus *bus;
15 int r;
16
17 r = acquire_bus(BUS_MANAGER, &bus);
18 if (r < 0)
19 return r;
20
21 polkit_agent_open_maybe();
22
23 r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, "SetUnitProperties");
24 if (r < 0)
25 return bus_log_create_error(r);
26
27 r = unit_name_mangle(argv[1], arg_quiet ? 0 : UNIT_NAME_MANGLE_WARN, &n);
28 if (r < 0)
29 return log_error_errno(r, "Failed to mangle unit name: %m");
30
31 t = unit_name_to_type(n);
32 if (t < 0)
33 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid unit type: %s", n);
34
35 r = sd_bus_message_append(m, "sb", n, arg_runtime);
36 if (r < 0)
37 return bus_log_create_error(r);
38
39 r = sd_bus_message_open_container(m, SD_BUS_TYPE_ARRAY, "(sv)");
40 if (r < 0)
41 return bus_log_create_error(r);
42
43 r = bus_append_unit_property_assignment_many(m, t, strv_skip(argv, 2));
44 if (r < 0)
45 return r;
46
47 r = sd_bus_message_close_container(m);
48 if (r < 0)
49 return bus_log_create_error(r);
50
51 r = sd_bus_call(bus, m, 0, &error, NULL);
52 if (r < 0)
53 return log_error_errno(r, "Failed to set unit properties on %s: %s", n, bus_error_message(&error, r));
54
55 return 0;
56 }