]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/dbus-mount.c
Merge pull request #179 from l10n-tw/master
[thirdparty/systemd.git] / src / core / dbus-mount.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4139c1b2
LP
2
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
4139c1b2
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
4139c1b2 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
4139c1b2
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
718db961
LP
22#include "unit.h"
23#include "mount.h"
4139c1b2 24#include "dbus-execute.h"
4ad49000
LP
25#include "dbus-kill.h"
26#include "dbus-cgroup.h"
4ad49000 27#include "dbus-mount.h"
718db961
LP
28#include "bus-util.h"
29
30static int property_get_what(
31 sd_bus *bus,
32 const char *path,
33 const char *interface,
34 const char *property,
35 sd_bus_message *reply,
ebcf1f97
LP
36 void *userdata,
37 sd_bus_error *error) {
718db961
LP
38
39 Mount *m = userdata;
4e85aff4
LP
40 const char *d;
41
718db961
LP
42 assert(bus);
43 assert(reply);
4e85aff4
LP
44 assert(m);
45
46 if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.what)
47 d = m->parameters_proc_self_mountinfo.what;
48 else if (m->from_fragment && m->parameters_fragment.what)
49 d = m->parameters_fragment.what;
4e85aff4
LP
50 else
51 d = "";
52
718db961 53 return sd_bus_message_append(reply, "s", d);
4e85aff4
LP
54}
55
718db961
LP
56static int property_get_options(
57 sd_bus *bus,
58 const char *path,
59 const char *interface,
60 const char *property,
61 sd_bus_message *reply,
ebcf1f97
LP
62 void *userdata,
63 sd_bus_error *error) {
718db961
LP
64
65 Mount *m = userdata;
4e85aff4
LP
66 const char *d;
67
718db961
LP
68 assert(bus);
69 assert(reply);
4e85aff4
LP
70 assert(m);
71
72 if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.options)
73 d = m->parameters_proc_self_mountinfo.options;
74 else if (m->from_fragment && m->parameters_fragment.options)
75 d = m->parameters_fragment.options;
4e85aff4
LP
76 else
77 d = "";
78
718db961 79 return sd_bus_message_append(reply, "s", d);
4e85aff4
LP
80}
81
718db961
LP
82static int property_get_type(
83 sd_bus *bus,
84 const char *path,
85 const char *interface,
86 const char *property,
87 sd_bus_message *reply,
ebcf1f97
LP
88 void *userdata,
89 sd_bus_error *error) {
718db961
LP
90
91 Mount *m = userdata;
4e85aff4
LP
92 const char *d;
93
718db961
LP
94 assert(bus);
95 assert(reply);
4e85aff4
LP
96 assert(m);
97
98 if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype)
99 d = m->parameters_proc_self_mountinfo.fstype;
100 else if (m->from_fragment && m->parameters_fragment.fstype)
101 d = m->parameters_fragment.fstype;
4e85aff4
LP
102 else
103 d = "";
104
718db961 105 return sd_bus_message_append(reply, "s", d);
4e85aff4
LP
106}
107
718db961
LP
108static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, mount_result, MountResult);
109
110const sd_bus_vtable bus_mount_vtable[] = {
111 SD_BUS_VTABLE_START(0),
556089dc 112 SD_BUS_PROPERTY("Where", "s", NULL, offsetof(Mount, where), SD_BUS_VTABLE_PROPERTY_CONST),
718db961
LP
113 SD_BUS_PROPERTY("What", "s", property_get_what, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
114 SD_BUS_PROPERTY("Options","s", property_get_options, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
115 SD_BUS_PROPERTY("Type", "s", property_get_type, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
556089dc 116 SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec, offsetof(Mount, timeout_usec), SD_BUS_VTABLE_PROPERTY_CONST),
718db961 117 SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Mount, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
556089dc 118 SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Mount, directory_mode), SD_BUS_VTABLE_PROPERTY_CONST),
2dbd4a94 119 SD_BUS_PROPERTY("SloppyOptions", "b", bus_property_get_bool, offsetof(Mount, sloppy_options), SD_BUS_VTABLE_PROPERTY_CONST),
718db961 120 SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Mount, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
556089dc
LP
121 BUS_EXEC_COMMAND_VTABLE("ExecMount", offsetof(Mount, exec_command[MOUNT_EXEC_MOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
122 BUS_EXEC_COMMAND_VTABLE("ExecUnmount", offsetof(Mount, exec_command[MOUNT_EXEC_UNMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
123 BUS_EXEC_COMMAND_VTABLE("ExecRemount", offsetof(Mount, exec_command[MOUNT_EXEC_REMOUNT]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
718db961 124 SD_BUS_VTABLE_END
d200735e
MS
125};
126
0e252f6b
TG
127static int bus_mount_set_transient_property(
128 Mount *m,
129 const char *name,
130 sd_bus_message *message,
131 UnitSetPropertiesMode mode,
132 sd_bus_error *error) {
133
134 const char *new_property;
135 char **property;
136 char *p;
137 int r;
138
139 assert(m);
140 assert(name);
141 assert(message);
142
143 if (streq(name, "What"))
144 property = &m->parameters_fragment.what;
145 else if (streq(name, "Options"))
146 property = &m->parameters_fragment.options;
147 else if (streq(name, "Type"))
148 property = &m->parameters_fragment.fstype;
149 else
150 return 0;
151
152 r = sd_bus_message_read(message, "s", &new_property);
153 if (r < 0)
154 return r;
155
156 if (mode != UNIT_CHECK) {
157 p = strdup(new_property);
158 if (!p)
159 return -ENOMEM;
160
161 free(*property);
162 *property = p;
163 }
164
165 return 1;
166}
167
74c964d3
LP
168int bus_mount_set_property(
169 Unit *u,
170 const char *name,
718db961 171 sd_bus_message *message,
74c964d3 172 UnitSetPropertiesMode mode,
718db961 173 sd_bus_error *error) {
74c964d3
LP
174
175 Mount *m = MOUNT(u);
0e252f6b 176 int r;
74c964d3 177
718db961 178 assert(m);
74c964d3 179 assert(name);
718db961 180 assert(message);
74c964d3 181
0e252f6b
TG
182 r = bus_cgroup_set_property(u, &m->cgroup_context, name, message, mode, error);
183 if (r != 0)
184 return r;
185
186 if (u->transient && u->load_state == UNIT_STUB) {
187 /* This is a transient unit, let's load a little more */
188
189 r = bus_mount_set_transient_property(m, name, message, mode, error);
190 if (r != 0)
191 return r;
192
193 r = bus_exec_context_set_transient_property(u, &m->exec_context, name, message, mode, error);
194 if (r != 0)
195 return r;
196
197 r = bus_kill_context_set_transient_property(u, &m->kill_context, name, message, mode, error);
198 if (r != 0)
199 return r;
200 }
201
202 return 0;
74c964d3
LP
203}
204
205int bus_mount_commit_properties(Unit *u) {
206 assert(u);
207
bc432dc7 208 unit_update_cgroup_members_masks(u);
74c964d3 209 unit_realize_cgroup(u);
bc432dc7 210
74c964d3
LP
211 return 0;
212}