]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
4139c1b2 | 2 | |
40af3d02 | 3 | #include "bus-get-properties.h" |
07630cea | 4 | #include "dbus-cgroup.h" |
4139c1b2 | 5 | #include "dbus-execute.h" |
4ad49000 | 6 | #include "dbus-kill.h" |
cf0fbc49 | 7 | #include "dbus-mount.h" |
b3f1d540 | 8 | #include "dbus-util.h" |
07630cea LP |
9 | #include "mount.h" |
10 | #include "string-util.h" | |
11 | #include "unit.h" | |
718db961 | 12 | |
f724fd4c | 13 | static const char *mount_get_what(const Mount *m) { |
4e85aff4 | 14 | if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.what) |
f724fd4c YW |
15 | return m->parameters_proc_self_mountinfo.what; |
16 | if (m->from_fragment && m->parameters_fragment.what) | |
17 | return m->parameters_fragment.what; | |
18 | return NULL; | |
4e85aff4 LP |
19 | } |
20 | ||
f724fd4c | 21 | static const char *mount_get_options(const Mount *m) { |
4e85aff4 | 22 | if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.options) |
f724fd4c YW |
23 | return m->parameters_proc_self_mountinfo.options; |
24 | if (m->from_fragment && m->parameters_fragment.options) | |
25 | return m->parameters_fragment.options; | |
26 | return NULL; | |
4e85aff4 LP |
27 | } |
28 | ||
f724fd4c | 29 | static const char *mount_get_fstype(const Mount *m) { |
3e3852b3 | 30 | if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype) |
f724fd4c | 31 | return m->parameters_proc_self_mountinfo.fstype; |
3e3852b3 | 32 | else if (m->from_fragment && m->parameters_fragment.fstype) |
f724fd4c YW |
33 | return m->parameters_fragment.fstype; |
34 | return NULL; | |
4e85aff4 LP |
35 | } |
36 | ||
f724fd4c YW |
37 | static BUS_DEFINE_PROPERTY_GET(property_get_what, "s", Mount, mount_get_what); |
38 | static BUS_DEFINE_PROPERTY_GET(property_get_options, "s", Mount, mount_get_options); | |
39 | static BUS_DEFINE_PROPERTY_GET(property_get_type, "s", Mount, mount_get_fstype); | |
718db961 LP |
40 | static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, mount_result, MountResult); |
41 | ||
42 | const sd_bus_vtable bus_mount_vtable[] = { | |
43 | SD_BUS_VTABLE_START(0), | |
556089dc | 44 | SD_BUS_PROPERTY("Where", "s", NULL, offsetof(Mount, where), SD_BUS_VTABLE_PROPERTY_CONST), |
718db961 LP |
45 | SD_BUS_PROPERTY("What", "s", property_get_what, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
46 | SD_BUS_PROPERTY("Options","s", property_get_options, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), | |
47 | SD_BUS_PROPERTY("Type", "s", property_get_type, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), | |
556089dc | 48 | SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec, offsetof(Mount, timeout_usec), SD_BUS_VTABLE_PROPERTY_CONST), |
718db961 | 49 | SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Mount, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
556089dc | 50 | SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Mount, directory_mode), SD_BUS_VTABLE_PROPERTY_CONST), |
2dbd4a94 | 51 | SD_BUS_PROPERTY("SloppyOptions", "b", bus_property_get_bool, offsetof(Mount, sloppy_options), SD_BUS_VTABLE_PROPERTY_CONST), |
e520950a | 52 | SD_BUS_PROPERTY("LazyUnmount", "b", bus_property_get_bool, offsetof(Mount, lazy_unmount), SD_BUS_VTABLE_PROPERTY_CONST), |
4f8d40a9 | 53 | SD_BUS_PROPERTY("ForceUnmount", "b", bus_property_get_bool, offsetof(Mount, force_unmount), SD_BUS_VTABLE_PROPERTY_CONST), |
c600357b | 54 | SD_BUS_PROPERTY("ReadWriteOnly", "b", bus_property_get_bool, offsetof(Mount, read_write_only), SD_BUS_VTABLE_PROPERTY_CONST), |
718db961 | 55 | SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Mount, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
05156503 YW |
56 | SD_BUS_PROPERTY("UID", "u", bus_property_get_uid, offsetof(Unit, ref_uid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
57 | SD_BUS_PROPERTY("GID", "u", bus_property_get_gid, offsetof(Unit, ref_gid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), | |
556089dc LP |
58 | BUS_EXEC_COMMAND_VTABLE("ExecMount", offsetof(Mount, exec_command[MOUNT_EXEC_MOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), |
59 | BUS_EXEC_COMMAND_VTABLE("ExecUnmount", offsetof(Mount, exec_command[MOUNT_EXEC_UNMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), | |
60 | BUS_EXEC_COMMAND_VTABLE("ExecRemount", offsetof(Mount, exec_command[MOUNT_EXEC_REMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), | |
718db961 | 61 | SD_BUS_VTABLE_END |
d200735e MS |
62 | }; |
63 | ||
0e252f6b TG |
64 | static int bus_mount_set_transient_property( |
65 | Mount *m, | |
66 | const char *name, | |
67 | sd_bus_message *message, | |
2e59b241 | 68 | UnitWriteFlags flags, |
0e252f6b TG |
69 | sd_bus_error *error) { |
70 | ||
b3f1d540 | 71 | Unit *u = UNIT(m); |
0e252f6b TG |
72 | |
73 | assert(m); | |
74 | assert(name); | |
75 | assert(message); | |
76 | ||
2e59b241 LP |
77 | flags |= UNIT_PRIVATE; |
78 | ||
b3f1d540 YW |
79 | if (streq(name, "Where")) |
80 | return bus_set_transient_path(u, name, &m->where, message, flags, error); | |
81 | ||
0e252f6b | 82 | if (streq(name, "What")) |
b3f1d540 YW |
83 | return bus_set_transient_string(u, name, &m->parameters_fragment.what, message, flags, error); |
84 | ||
85 | if (streq(name, "Options")) | |
86 | return bus_set_transient_string(u, name, &m->parameters_fragment.options, message, flags, error); | |
87 | ||
88 | if (streq(name, "Type")) | |
89 | return bus_set_transient_string(u, name, &m->parameters_fragment.fstype, message, flags, error); | |
90 | ||
91 | if (streq(name, "TimeoutUSec")) | |
92 | return bus_set_transient_usec_fix_0(u, name, &m->timeout_usec, message, flags, error); | |
0e252f6b | 93 | |
b3f1d540 YW |
94 | if (streq(name, "DirectoryMode")) |
95 | return bus_set_transient_mode_t(u, name, &m->directory_mode, message, flags, error); | |
0e252f6b | 96 | |
b3f1d540 YW |
97 | if (streq(name, "SloppyOptions")) |
98 | return bus_set_transient_bool(u, name, &m->sloppy_options, message, flags, error); | |
0e252f6b | 99 | |
b3f1d540 YW |
100 | if (streq(name, "LazyUnmount")) |
101 | return bus_set_transient_bool(u, name, &m->lazy_unmount, message, flags, error); | |
96f5957f | 102 | |
b3f1d540 YW |
103 | if (streq(name, "ForceUnmount")) |
104 | return bus_set_transient_bool(u, name, &m->force_unmount, message, flags, error); | |
0e252f6b | 105 | |
c600357b MH |
106 | if (streq(name, "ReadWriteOnly")) |
107 | return bus_set_transient_bool(u, name, &m->read_write_only, message, flags, error); | |
108 | ||
b3f1d540 | 109 | return 0; |
0e252f6b TG |
110 | } |
111 | ||
74c964d3 LP |
112 | int bus_mount_set_property( |
113 | Unit *u, | |
114 | const char *name, | |
718db961 | 115 | sd_bus_message *message, |
2e59b241 | 116 | UnitWriteFlags flags, |
718db961 | 117 | sd_bus_error *error) { |
74c964d3 LP |
118 | |
119 | Mount *m = MOUNT(u); | |
0e252f6b | 120 | int r; |
74c964d3 | 121 | |
718db961 | 122 | assert(m); |
74c964d3 | 123 | assert(name); |
718db961 | 124 | assert(message); |
74c964d3 | 125 | |
2e59b241 | 126 | r = bus_cgroup_set_property(u, &m->cgroup_context, name, message, flags, error); |
0e252f6b TG |
127 | if (r != 0) |
128 | return r; | |
129 | ||
130 | if (u->transient && u->load_state == UNIT_STUB) { | |
131 | /* This is a transient unit, let's load a little more */ | |
132 | ||
2e59b241 | 133 | r = bus_mount_set_transient_property(m, name, message, flags, error); |
0e252f6b TG |
134 | if (r != 0) |
135 | return r; | |
136 | ||
2e59b241 | 137 | r = bus_exec_context_set_transient_property(u, &m->exec_context, name, message, flags, error); |
0e252f6b TG |
138 | if (r != 0) |
139 | return r; | |
140 | ||
2e59b241 | 141 | r = bus_kill_context_set_transient_property(u, &m->kill_context, name, message, flags, error); |
0e252f6b TG |
142 | if (r != 0) |
143 | return r; | |
144 | } | |
145 | ||
146 | return 0; | |
74c964d3 LP |
147 | } |
148 | ||
149 | int bus_mount_commit_properties(Unit *u) { | |
150 | assert(u); | |
151 | ||
152 | unit_realize_cgroup(u); | |
bc432dc7 | 153 | |
74c964d3 LP |
154 | return 0; |
155 | } |