]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/dbus-path.c
service: introduce a proper service result if the start limit is hit
[thirdparty/systemd.git] / src / core / dbus-path.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
01f78473
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
01f78473
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.
01f78473 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
01f78473
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
22#include <errno.h>
23
24#include "dbus-unit.h"
25#include "dbus-path.h"
26#include "dbus-execute.h"
bfebab7f 27#include "dbus-common.h"
01f78473 28
ebf57b80
LP
29#define BUS_PATH_INTERFACE \
30 " <interface name=\"org.freedesktop.systemd1.Path\">\n" \
31 " <property name=\"Unit\" type=\"s\" access=\"read\"/>\n" \
32 " <property name=\"Paths\" type=\"a(ss)\" access=\"read\"/>\n" \
0e456f97
LP
33 " <property name=\"MakeDirectory\" type=\"b\" access=\"read\"/>\n" \
34 " <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \
cd43ca73 35 " <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
ebf57b80 36 " </interface>\n"
01f78473
LP
37
38#define INTROSPECTION \
39 DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \
40 "<node>\n" \
41 BUS_UNIT_INTERFACE \
ebf57b80 42 BUS_PATH_INTERFACE \
01f78473 43 BUS_PROPERTIES_INTERFACE \
c4e2ceae 44 BUS_PEER_INTERFACE \
01f78473
LP
45 BUS_INTROSPECTABLE_INTERFACE \
46 "</node>\n"
47
05feefe0
LP
48#define INTERFACES_LIST \
49 BUS_UNIT_INTERFACES_LIST \
50 "org.freedesktop.systemd1.Path\0"
51
9a60da28 52const char bus_path_interface[] _introspect_("Path") = BUS_PATH_INTERFACE;
01f78473 53
cd43ca73
LP
54const char bus_path_invalidating_properties[] =
55 "Result\0";
56
bfebab7f 57static int bus_path_append_paths(DBusMessageIter *i, const char *property, void *data) {
ebf57b80
LP
58 Path *p = data;
59 DBusMessageIter sub, sub2;
60 PathSpec *k;
61
ebf57b80
LP
62 assert(i);
63 assert(property);
64 assert(p);
65
66 if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "(ss)", &sub))
67 return -ENOMEM;
68
69 LIST_FOREACH(spec, k, p->specs) {
70 const char *t = path_type_to_string(k->type);
71
72 if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2) ||
73 !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &t) ||
74 !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &k->path) ||
75 !dbus_message_iter_close_container(&sub, &sub2))
76 return -ENOMEM;
77 }
78
79 if (!dbus_message_iter_close_container(i, &sub))
80 return -ENOMEM;
81
82 return 0;
83}
84
bfebab7f 85static int bus_path_append_unit(DBusMessageIter *i, const char *property, void *data) {
b284eabd 86 Unit *u = data;
ac155bb8 87 Path *p = PATH(u);
b284eabd
LP
88 const char *t;
89
b284eabd
LP
90 assert(i);
91 assert(property);
92 assert(u);
93
ac155bb8 94 t = UNIT_DEREF(p->unit) ? UNIT_DEREF(p->unit)->id : "";
b284eabd
LP
95
96 return dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t) ? 0 : -ENOMEM;
97}
98
cd43ca73
LP
99static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_path_append_path_result, path_result, PathResult);
100
d200735e
MS
101static const BusProperty bus_path_properties[] = {
102 { "Unit", bus_path_append_unit, "s", 0 },
103 { "Paths", bus_path_append_paths, "a(ss)", 0 },
104 { "MakeDirectory", bus_property_append_bool, "b", offsetof(Path, make_directory) },
105 { "DirectoryMode", bus_property_append_mode, "u", offsetof(Path, directory_mode) },
cd43ca73 106 { "Result", bus_path_append_path_result, "s", offsetof(Path, result) },
d200735e
MS
107 { NULL, }
108};
109
5e8d1c9a 110DBusHandlerResult bus_path_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) {
ac155bb8 111 Path *p = PATH(u);
d200735e
MS
112 const BusBoundProperties bps[] = {
113 { "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
114 { "org.freedesktop.systemd1.Path", bus_path_properties, p },
115 { NULL, }
01f78473
LP
116 };
117
d200735e 118 return bus_default_message_handler(c, message, INTROSPECTION, INTERFACES_LIST, bps);
01f78473 119}