chiark / gitweb /
bus: decorate the various object vtables with SD_BUS_VTABLE_PROPERTY_CONST where...
[elogind.git] / src / core / dbus-mount.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
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
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
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
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include "unit.h"
23 #include "mount.h"
24 #include "dbus-unit.h"
25 #include "dbus-execute.h"
26 #include "dbus-kill.h"
27 #include "dbus-cgroup.h"
28 #include "dbus-mount.h"
29 #include "bus-util.h"
30
31 static int property_get_what(
32                 sd_bus *bus,
33                 const char *path,
34                 const char *interface,
35                 const char *property,
36                 sd_bus_message *reply,
37                 void *userdata,
38                 sd_bus_error *error) {
39
40         Mount *m = userdata;
41         const char *d;
42
43         assert(bus);
44         assert(reply);
45         assert(m);
46
47         if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.what)
48                 d = m->parameters_proc_self_mountinfo.what;
49         else if (m->from_fragment && m->parameters_fragment.what)
50                 d = m->parameters_fragment.what;
51         else
52                 d = "";
53
54         return sd_bus_message_append(reply, "s", d);
55 }
56
57 static int property_get_options(
58                 sd_bus *bus,
59                 const char *path,
60                 const char *interface,
61                 const char *property,
62                 sd_bus_message *reply,
63                 void *userdata,
64                 sd_bus_error *error) {
65
66         Mount *m = userdata;
67         const char *d;
68
69         assert(bus);
70         assert(reply);
71         assert(m);
72
73         if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.options)
74                 d = m->parameters_proc_self_mountinfo.options;
75         else if (m->from_fragment && m->parameters_fragment.options)
76                 d = m->parameters_fragment.options;
77         else
78                 d = "";
79
80         return sd_bus_message_append(reply, "s", d);
81 }
82
83 static int property_get_type(
84                 sd_bus *bus,
85                 const char *path,
86                 const char *interface,
87                 const char *property,
88                 sd_bus_message *reply,
89                 void *userdata,
90                 sd_bus_error *error) {
91
92         Mount *m = userdata;
93         const char *d;
94
95         assert(bus);
96         assert(reply);
97         assert(m);
98
99         if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype)
100                 d = m->parameters_proc_self_mountinfo.fstype;
101         else if (m->from_fragment && m->parameters_fragment.fstype)
102                 d = m->parameters_fragment.fstype;
103         else
104                 d = "";
105
106         return sd_bus_message_append(reply, "s", d);
107 }
108
109 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, mount_result, MountResult);
110
111 const sd_bus_vtable bus_mount_vtable[] = {
112         SD_BUS_VTABLE_START(0),
113         SD_BUS_PROPERTY("Where", "s", NULL, offsetof(Mount, where), SD_BUS_VTABLE_PROPERTY_CONST),
114         SD_BUS_PROPERTY("What", "s", property_get_what, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
115         SD_BUS_PROPERTY("Options","s", property_get_options, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
116         SD_BUS_PROPERTY("Type", "s", property_get_type, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
117         SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec, offsetof(Mount, timeout_usec), SD_BUS_VTABLE_PROPERTY_CONST),
118         SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Mount, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
119         SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode, offsetof(Mount, directory_mode), SD_BUS_VTABLE_PROPERTY_CONST),
120         SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Mount, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
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),
124         SD_BUS_VTABLE_END
125 };
126
127 const char * const bus_mount_changing_properties[] = {
128         "What",
129         "Options",
130         "Type",
131         "ControlPID",
132         "Result",
133         NULL
134 };
135
136 int bus_mount_set_property(
137                 Unit *u,
138                 const char *name,
139                 sd_bus_message *message,
140                 UnitSetPropertiesMode mode,
141                 sd_bus_error *error) {
142
143         Mount *m = MOUNT(u);
144
145         assert(m);
146         assert(name);
147         assert(message);
148
149         return bus_cgroup_set_property(u, &m->cgroup_context, name, message, mode, error);
150 }
151
152 int bus_mount_commit_properties(Unit *u) {
153         assert(u);
154
155         unit_realize_cgroup(u);
156         return 0;
157 }