chiark / gitweb /
core: fix detection of dead processes
[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 int bus_mount_set_property(
128                 Unit *u,
129                 const char *name,
130                 sd_bus_message *message,
131                 UnitSetPropertiesMode mode,
132                 sd_bus_error *error) {
133
134         Mount *m = MOUNT(u);
135
136         assert(m);
137         assert(name);
138         assert(message);
139
140         return bus_cgroup_set_property(u, &m->cgroup_context, name, message, mode, error);
141 }
142
143 int bus_mount_commit_properties(Unit *u) {
144         assert(u);
145
146         unit_realize_cgroup(u);
147         return 0;
148 }