]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
4139c1b2 | 2 | |
07630cea LP |
3 | #include "bus-util.h" |
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), |
718db961 | 54 | SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Mount, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
05156503 YW |
55 | SD_BUS_PROPERTY("UID", "u", bus_property_get_uid, offsetof(Unit, ref_uid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), |
56 | SD_BUS_PROPERTY("GID", "u", bus_property_get_gid, offsetof(Unit, ref_gid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), | |
556089dc LP |
57 | BUS_EXEC_COMMAND_VTABLE("ExecMount", offsetof(Mount, exec_command[MOUNT_EXEC_MOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), |
58 | BUS_EXEC_COMMAND_VTABLE("ExecUnmount", offsetof(Mount, exec_command[MOUNT_EXEC_UNMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), | |
59 | BUS_EXEC_COMMAND_VTABLE("ExecRemount", offsetof(Mount, exec_command[MOUNT_EXEC_REMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION), | |
718db961 | 60 | SD_BUS_VTABLE_END |
d200735e MS |
61 | }; |
62 | ||
0e252f6b TG |
63 | static int bus_mount_set_transient_property( |
64 | Mount *m, | |
65 | const char *name, | |
66 | sd_bus_message *message, | |
2e59b241 | 67 | UnitWriteFlags flags, |
0e252f6b TG |
68 | sd_bus_error *error) { |
69 | ||
b3f1d540 | 70 | Unit *u = UNIT(m); |
0e252f6b TG |
71 | |
72 | assert(m); | |
73 | assert(name); | |
74 | assert(message); | |
75 | ||
2e59b241 LP |
76 | flags |= UNIT_PRIVATE; |
77 | ||
b3f1d540 YW |
78 | if (streq(name, "Where")) |
79 | return bus_set_transient_path(u, name, &m->where, message, flags, error); | |
80 | ||
0e252f6b | 81 | if (streq(name, "What")) |
b3f1d540 YW |
82 | return bus_set_transient_string(u, name, &m->parameters_fragment.what, message, flags, error); |
83 | ||
84 | if (streq(name, "Options")) | |
85 | return bus_set_transient_string(u, name, &m->parameters_fragment.options, message, flags, error); | |
86 | ||
87 | if (streq(name, "Type")) | |
88 | return bus_set_transient_string(u, name, &m->parameters_fragment.fstype, message, flags, error); | |
89 | ||
90 | if (streq(name, "TimeoutUSec")) | |
91 | return bus_set_transient_usec_fix_0(u, name, &m->timeout_usec, message, flags, error); | |
0e252f6b | 92 | |
b3f1d540 YW |
93 | if (streq(name, "DirectoryMode")) |
94 | return bus_set_transient_mode_t(u, name, &m->directory_mode, message, flags, error); | |
0e252f6b | 95 | |
b3f1d540 YW |
96 | if (streq(name, "SloppyOptions")) |
97 | return bus_set_transient_bool(u, name, &m->sloppy_options, message, flags, error); | |
0e252f6b | 98 | |
b3f1d540 YW |
99 | if (streq(name, "LazyUnmount")) |
100 | return bus_set_transient_bool(u, name, &m->lazy_unmount, message, flags, error); | |
96f5957f | 101 | |
b3f1d540 YW |
102 | if (streq(name, "ForceUnmount")) |
103 | return bus_set_transient_bool(u, name, &m->force_unmount, message, flags, error); | |
0e252f6b | 104 | |
b3f1d540 | 105 | return 0; |
0e252f6b TG |
106 | } |
107 | ||
74c964d3 LP |
108 | int bus_mount_set_property( |
109 | Unit *u, | |
110 | const char *name, | |
718db961 | 111 | sd_bus_message *message, |
2e59b241 | 112 | UnitWriteFlags flags, |
718db961 | 113 | sd_bus_error *error) { |
74c964d3 LP |
114 | |
115 | Mount *m = MOUNT(u); | |
0e252f6b | 116 | int r; |
74c964d3 | 117 | |
718db961 | 118 | assert(m); |
74c964d3 | 119 | assert(name); |
718db961 | 120 | assert(message); |
74c964d3 | 121 | |
2e59b241 | 122 | r = bus_cgroup_set_property(u, &m->cgroup_context, name, message, flags, error); |
0e252f6b TG |
123 | if (r != 0) |
124 | return r; | |
125 | ||
126 | if (u->transient && u->load_state == UNIT_STUB) { | |
127 | /* This is a transient unit, let's load a little more */ | |
128 | ||
2e59b241 | 129 | r = bus_mount_set_transient_property(m, name, message, flags, error); |
0e252f6b TG |
130 | if (r != 0) |
131 | return r; | |
132 | ||
2e59b241 | 133 | r = bus_exec_context_set_transient_property(u, &m->exec_context, name, message, flags, error); |
0e252f6b TG |
134 | if (r != 0) |
135 | return r; | |
136 | ||
2e59b241 | 137 | r = bus_kill_context_set_transient_property(u, &m->kill_context, name, message, flags, error); |
0e252f6b TG |
138 | if (r != 0) |
139 | return r; | |
140 | } | |
141 | ||
142 | return 0; | |
74c964d3 LP |
143 | } |
144 | ||
145 | int bus_mount_commit_properties(Unit *u) { | |
146 | assert(u); | |
147 | ||
bc432dc7 | 148 | unit_update_cgroup_members_masks(u); |
74c964d3 | 149 | unit_realize_cgroup(u); |
bc432dc7 | 150 | |
74c964d3 LP |
151 | return 0; |
152 | } |