]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
01f78473 | 2 | |
5b9fbf89 | 3 | #include "alloc-util.h" |
40af3d02 | 4 | #include "bus-get-properties.h" |
cf0fbc49 | 5 | #include "dbus-path.h" |
f76e92af | 6 | #include "dbus-util.h" |
5b9fbf89 | 7 | #include "list.h" |
718db961 | 8 | #include "path.h" |
5b9fbf89 | 9 | #include "path-util.h" |
07630cea LP |
10 | #include "string-util.h" |
11 | #include "unit.h" | |
718db961 LP |
12 | |
13 | static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, path_result, PathResult); | |
14 | ||
15 | static int property_get_paths( | |
16 | sd_bus *bus, | |
17 | const char *path, | |
18 | const char *interface, | |
19 | const char *property, | |
20 | sd_bus_message *reply, | |
ebcf1f97 LP |
21 | void *userdata, |
22 | sd_bus_error *error) { | |
718db961 | 23 | |
99534007 | 24 | Path *p = ASSERT_PTR(userdata); |
718db961 | 25 | int r; |
ebf57b80 | 26 | |
718db961 LP |
27 | assert(bus); |
28 | assert(reply); | |
ebf57b80 | 29 | |
718db961 LP |
30 | r = sd_bus_message_open_container(reply, 'a', "(ss)"); |
31 | if (r < 0) | |
32 | return r; | |
ebf57b80 LP |
33 | |
34 | LIST_FOREACH(spec, k, p->specs) { | |
718db961 LP |
35 | r = sd_bus_message_append(reply, "(ss)", path_type_to_string(k->type), k->path); |
36 | if (r < 0) | |
37 | return r; | |
ebf57b80 LP |
38 | } |
39 | ||
718db961 | 40 | return sd_bus_message_close_container(reply); |
ebf57b80 LP |
41 | } |
42 | ||
718db961 LP |
43 | const sd_bus_vtable bus_path_vtable[] = { |
44 | SD_BUS_VTABLE_START(0), | |
54138a8d | 45 | SD_BUS_PROPERTY("Unit", "s", bus_property_get_triggered_unit, 0, SD_BUS_VTABLE_PROPERTY_CONST), |
556089dc LP |
46 | SD_BUS_PROPERTY("Paths", "a(ss)", property_get_paths, 0, SD_BUS_VTABLE_PROPERTY_CONST), |
47 | SD_BUS_PROPERTY("MakeDirectory", "b", bus_property_get_bool, offsetof(Path, make_directory), SD_BUS_VTABLE_PROPERTY_CONST), | |
48 | SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Path, directory_mode), SD_BUS_VTABLE_PROPERTY_CONST), | |
718db961 | 49 | SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Path, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
47dba9fb LB |
50 | SD_BUS_PROPERTY("TriggerLimitIntervalUSec", "t", bus_property_get_usec, offsetof(Path, trigger_limit.interval), SD_BUS_VTABLE_PROPERTY_CONST), |
51 | SD_BUS_PROPERTY("TriggerLimitBurst", "u", bus_property_get_unsigned, offsetof(Path, trigger_limit.burst), SD_BUS_VTABLE_PROPERTY_CONST), | |
718db961 | 52 | SD_BUS_VTABLE_END |
d200735e | 53 | }; |
5b9fbf89 YW |
54 | |
55 | static int bus_path_set_transient_property( | |
56 | Path *p, | |
57 | const char *name, | |
58 | sd_bus_message *message, | |
59 | UnitWriteFlags flags, | |
60 | sd_bus_error *error) { | |
61 | ||
62 | Unit *u = UNIT(p); | |
63 | int r; | |
64 | ||
65 | assert(p); | |
66 | assert(name); | |
67 | assert(message); | |
68 | ||
69 | flags |= UNIT_PRIVATE; | |
70 | ||
f76e92af YW |
71 | if (streq(name, "MakeDirectory")) |
72 | return bus_set_transient_bool(u, name, &p->make_directory, message, flags, error); | |
5b9fbf89 | 73 | |
f76e92af YW |
74 | if (streq(name, "DirectoryMode")) |
75 | return bus_set_transient_mode_t(u, name, &p->directory_mode, message, flags, error); | |
5b9fbf89 | 76 | |
f76e92af YW |
77 | if (streq(name, "Paths")) { |
78 | const char *type_name, *path; | |
79 | bool empty = true; | |
80 | ||
81 | r = sd_bus_message_enter_container(message, 'a', "(ss)"); | |
5b9fbf89 YW |
82 | if (r < 0) |
83 | return r; | |
84 | ||
f76e92af YW |
85 | while ((r = sd_bus_message_read(message, "(ss)", &type_name, &path)) > 0) { |
86 | PathType t; | |
87 | ||
88 | t = path_type_from_string(type_name); | |
89 | if (t < 0) | |
90 | return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown path type: %s", type_name); | |
91 | ||
92 | if (isempty(path)) | |
93 | return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Path in %s is empty", type_name); | |
94 | ||
95 | if (!path_is_absolute(path)) | |
96 | return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Path in %s is not absolute: %s", type_name, path); | |
5b9fbf89 | 97 | |
f76e92af | 98 | if (!UNIT_WRITE_FLAGS_NOOP(flags)) { |
c2b2df60 | 99 | _cleanup_free_ char *k = NULL; |
5b9fbf89 YW |
100 | PathSpec *s; |
101 | ||
f76e92af | 102 | k = strdup(path); |
5b9fbf89 YW |
103 | if (!k) |
104 | return -ENOMEM; | |
105 | ||
4ff361cc | 106 | path_simplify(k); |
858d36c1 | 107 | |
5b9fbf89 YW |
108 | s = new0(PathSpec, 1); |
109 | if (!s) | |
110 | return -ENOMEM; | |
111 | ||
112 | s->unit = u; | |
858d36c1 | 113 | s->path = TAKE_PTR(k); |
f76e92af | 114 | s->type = t; |
254d1313 | 115 | s->inotify_fd = -EBADF; |
5b9fbf89 YW |
116 | |
117 | LIST_PREPEND(spec, p->specs, s); | |
118 | ||
f76e92af | 119 | unit_write_settingf(u, flags|UNIT_ESCAPE_SPECIFIERS, name, "%s=%s", type_name, path); |
5b9fbf89 | 120 | } |
5b9fbf89 | 121 | |
f76e92af YW |
122 | empty = false; |
123 | } | |
5b9fbf89 YW |
124 | if (r < 0) |
125 | return r; | |
126 | ||
f76e92af | 127 | r = sd_bus_message_exit_container(message); |
5b9fbf89 YW |
128 | if (r < 0) |
129 | return r; | |
130 | ||
f76e92af YW |
131 | if (!UNIT_WRITE_FLAGS_NOOP(flags) && empty) { |
132 | path_free_specs(p); | |
133 | unit_write_settingf(u, flags, name, "PathExists="); | |
5b9fbf89 YW |
134 | } |
135 | ||
136 | return 1; | |
5b9fbf89 YW |
137 | } |
138 | ||
47dba9fb LB |
139 | if (streq(name, "TriggerLimitBurst")) |
140 | return bus_set_transient_unsigned(u, name, &p->trigger_limit.burst, message, flags, error); | |
141 | ||
142 | if (streq(name, "TriggerLimitIntervalUSec")) | |
143 | return bus_set_transient_usec(u, name, &p->trigger_limit.interval, message, flags, error); | |
144 | ||
5b9fbf89 YW |
145 | return 0; |
146 | } | |
147 | ||
148 | int bus_path_set_property( | |
149 | Unit *u, | |
150 | const char *name, | |
151 | sd_bus_message *message, | |
152 | UnitWriteFlags mode, | |
153 | sd_bus_error *error) { | |
154 | ||
155 | Path *p = PATH(u); | |
156 | ||
157 | assert(p); | |
158 | assert(name); | |
159 | assert(message); | |
160 | ||
161 | if (u->transient && u->load_state == UNIT_STUB) | |
162 | return bus_path_set_transient_property(p, name, message, mode, error); | |
163 | ||
164 | return 0; | |
165 | } |