]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/dbus-mount.c
service: introduce a proper service result if the start limit is hit
[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
4e85aff4
LP
22#include <errno.h>
23
4139c1b2
LP
24#include "dbus-unit.h"
25#include "dbus-mount.h"
4819ff03 26#include "dbus-kill.h"
4139c1b2 27#include "dbus-execute.h"
bfebab7f 28#include "dbus-common.h"
4139c1b2 29
4288f619
LP
30#define BUS_MOUNT_INTERFACE \
31 " <interface name=\"org.freedesktop.systemd1.Mount\">\n" \
32 " <property name=\"Where\" type=\"s\" access=\"read\"/>\n" \
33 " <property name=\"What\" type=\"s\" access=\"read\"/>\n" \
34 " <property name=\"Options\" type=\"s\" access=\"read\"/>\n" \
35 " <property name=\"Type\" type=\"s\" access=\"read\"/>\n" \
36 " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>\n" \
fe68089d
LP
37 BUS_EXEC_COMMAND_INTERFACE("ExecMount") \
38 BUS_EXEC_COMMAND_INTERFACE("ExecUnmount") \
39 BUS_EXEC_COMMAND_INTERFACE("ExecRemount") \
4288f619 40 BUS_EXEC_CONTEXT_INTERFACE \
4819ff03 41 BUS_KILL_CONTEXT_INTERFACE \
4288f619 42 " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
5bd07073 43 " <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \
9d2f5178 44 " <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
4288f619
LP
45 " </interface>\n"
46
47#define INTROSPECTION \
48 DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \
49 "<node>\n" \
50 BUS_UNIT_INTERFACE \
51 BUS_MOUNT_INTERFACE \
52 BUS_PROPERTIES_INTERFACE \
c4e2ceae 53 BUS_PEER_INTERFACE \
4288f619
LP
54 BUS_INTROSPECTABLE_INTERFACE \
55 "</node>\n"
56
05feefe0
LP
57#define INTERFACES_LIST \
58 BUS_UNIT_INTERFACES_LIST \
59 "org.freedesktop.systemd1.Mount\0"
60
9a60da28 61const char bus_mount_interface[] _introspect_("Mount") = BUS_MOUNT_INTERFACE;
4139c1b2 62
c4e2ceae
LP
63const char bus_mount_invalidating_properties[] =
64 "What\0"
65 "Options\0"
66 "Type\0"
67 "ExecMount\0"
68 "ExecUnmount\0"
69 "ExecRemount\0"
9d2f5178
LP
70 "ControlPID\0"
71 "Result\0";
c4e2ceae 72
bfebab7f 73static int bus_mount_append_what(DBusMessageIter *i, const char *property, void *data) {
4e85aff4
LP
74 Mount *m = data;
75 const char *d;
76
4e85aff4
LP
77 assert(i);
78 assert(property);
79 assert(m);
80
81 if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.what)
82 d = m->parameters_proc_self_mountinfo.what;
83 else if (m->from_fragment && m->parameters_fragment.what)
84 d = m->parameters_fragment.what;
4e85aff4
LP
85 else
86 d = "";
87
88 if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &d))
89 return -ENOMEM;
90
91 return 0;
92}
93
bfebab7f 94static int bus_mount_append_options(DBusMessageIter *i, const char *property, void *data) {
4e85aff4
LP
95 Mount *m = data;
96 const char *d;
97
4e85aff4
LP
98 assert(i);
99 assert(property);
100 assert(m);
101
102 if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.options)
103 d = m->parameters_proc_self_mountinfo.options;
104 else if (m->from_fragment && m->parameters_fragment.options)
105 d = m->parameters_fragment.options;
4e85aff4
LP
106 else
107 d = "";
108
109 if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &d))
110 return -ENOMEM;
111
112 return 0;
113}
114
bfebab7f 115static int bus_mount_append_type(DBusMessageIter *i, const char *property, void *data) {
4e85aff4
LP
116 Mount *m = data;
117 const char *d;
118
4e85aff4
LP
119 assert(i);
120 assert(property);
121 assert(m);
122
123 if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype)
124 d = m->parameters_proc_self_mountinfo.fstype;
125 else if (m->from_fragment && m->parameters_fragment.fstype)
126 d = m->parameters_fragment.fstype;
4e85aff4
LP
127 else
128 d = "";
129
130 if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &d))
131 return -ENOMEM;
132
133 return 0;
134}
135
9d2f5178
LP
136static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_mount_append_mount_result, mount_result, MountResult);
137
d200735e
MS
138static const BusProperty bus_mount_properties[] = {
139 { "Where", bus_property_append_string, "s", offsetof(Mount, where), true },
140 { "What", bus_mount_append_what, "s", 0 },
141 { "Options", bus_mount_append_options, "s", 0 },
142 { "Type", bus_mount_append_type, "s", 0 },
143 { "TimeoutUSec", bus_property_append_usec, "t", offsetof(Mount, timeout_usec) },
144 BUS_EXEC_COMMAND_PROPERTY("ExecMount", offsetof(Mount, exec_command[MOUNT_EXEC_MOUNT]), false),
145 BUS_EXEC_COMMAND_PROPERTY("ExecUnmount", offsetof(Mount, exec_command[MOUNT_EXEC_UNMOUNT]), false),
146 BUS_EXEC_COMMAND_PROPERTY("ExecRemount", offsetof(Mount, exec_command[MOUNT_EXEC_REMOUNT]), false),
147 { "ControlPID", bus_property_append_pid, "u", offsetof(Mount, control_pid) },
148 { "DirectoryMode", bus_property_append_mode, "u", offsetof(Mount, directory_mode) },
9d2f5178 149 { "Result", bus_mount_append_mount_result, "s", offsetof(Mount, result) },
d200735e
MS
150 { NULL, }
151};
152
5e8d1c9a 153DBusHandlerResult bus_mount_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) {
ac155bb8 154 Mount *m = MOUNT(u);
d200735e
MS
155
156 const BusBoundProperties bps[] = {
157 { "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
158 { "org.freedesktop.systemd1.Mount", bus_mount_properties, m },
159 { "org.freedesktop.systemd1.Mount", bus_exec_context_properties, &m->exec_context },
4819ff03 160 { "org.freedesktop.systemd1.Mount", bus_kill_context_properties, &m->kill_context },
d200735e 161 { NULL, }
4139c1b2
LP
162 };
163
d200735e 164 return bus_default_message_handler(c, message, INTROSPECTION, INTERFACES_LIST, bps );
4139c1b2 165}