]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/dbus-path.c
man: also mention /run/log/journal in systemd-jouranld.service(8)
[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"
cad45ba1 28#include "selinux-access.h"
01f78473 29
ebf57b80
LP
30#define BUS_PATH_INTERFACE \
31 " <interface name=\"org.freedesktop.systemd1.Path\">\n" \
32 " <property name=\"Unit\" type=\"s\" access=\"read\"/>\n" \
33 " <property name=\"Paths\" type=\"a(ss)\" access=\"read\"/>\n" \
0e456f97
LP
34 " <property name=\"MakeDirectory\" type=\"b\" access=\"read\"/>\n" \
35 " <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \
cd43ca73 36 " <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
ebf57b80 37 " </interface>\n"
01f78473
LP
38
39#define INTROSPECTION \
40 DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \
41 "<node>\n" \
42 BUS_UNIT_INTERFACE \
ebf57b80 43 BUS_PATH_INTERFACE \
01f78473 44 BUS_PROPERTIES_INTERFACE \
c4e2ceae 45 BUS_PEER_INTERFACE \
01f78473
LP
46 BUS_INTROSPECTABLE_INTERFACE \
47 "</node>\n"
48
05feefe0
LP
49#define INTERFACES_LIST \
50 BUS_UNIT_INTERFACES_LIST \
51 "org.freedesktop.systemd1.Path\0"
52
9a60da28 53const char bus_path_interface[] _introspect_("Path") = BUS_PATH_INTERFACE;
01f78473 54
cd43ca73
LP
55const char bus_path_invalidating_properties[] =
56 "Result\0";
57
bfebab7f 58static int bus_path_append_paths(DBusMessageIter *i, const char *property, void *data) {
ebf57b80
LP
59 Path *p = data;
60 DBusMessageIter sub, sub2;
61 PathSpec *k;
62
ebf57b80
LP
63 assert(i);
64 assert(property);
65 assert(p);
66
67 if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "(ss)", &sub))
68 return -ENOMEM;
69
70 LIST_FOREACH(spec, k, p->specs) {
71 const char *t = path_type_to_string(k->type);
72
73 if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2) ||
74 !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &t) ||
75 !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &k->path) ||
76 !dbus_message_iter_close_container(&sub, &sub2))
77 return -ENOMEM;
78 }
79
80 if (!dbus_message_iter_close_container(i, &sub))
81 return -ENOMEM;
82
83 return 0;
84}
85
bfebab7f 86static int bus_path_append_unit(DBusMessageIter *i, const char *property, void *data) {
3ecaa09b 87 Unit *u = data, *trigger;
b284eabd
LP
88 const char *t;
89
b284eabd
LP
90 assert(i);
91 assert(property);
92 assert(u);
93
3ecaa09b
LP
94 trigger = UNIT_TRIGGER(u);
95 t = trigger ? trigger->id : "";
b284eabd
LP
96
97 return dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t) ? 0 : -ENOMEM;
98}
99
cd43ca73
LP
100static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_path_append_path_result, path_result, PathResult);
101
d200735e
MS
102static const BusProperty bus_path_properties[] = {
103 { "Unit", bus_path_append_unit, "s", 0 },
104 { "Paths", bus_path_append_paths, "a(ss)", 0 },
105 { "MakeDirectory", bus_property_append_bool, "b", offsetof(Path, make_directory) },
106 { "DirectoryMode", bus_property_append_mode, "u", offsetof(Path, directory_mode) },
cd43ca73 107 { "Result", bus_path_append_path_result, "s", offsetof(Path, result) },
d200735e
MS
108 { NULL, }
109};
110
5e8d1c9a 111DBusHandlerResult bus_path_message_handler(Unit *u, DBusConnection *c, DBusMessage *message) {
ac155bb8 112 Path *p = PATH(u);
d200735e
MS
113 const BusBoundProperties bps[] = {
114 { "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
115 { "org.freedesktop.systemd1.Path", bus_path_properties, p },
116 { NULL, }
01f78473
LP
117 };
118
cad45ba1
LP
119 SELINUX_UNIT_ACCESS_CHECK(u, c, message, "status");
120
d200735e 121 return bus_default_message_handler(c, message, INTROSPECTION, INTERFACES_LIST, bps);
01f78473 122}