]> git.ipfire.org Git - people/ms/systemd.git/blame - dbus-unit.c
add basic (and not very useful) D-Bus support
[people/ms/systemd.git] / dbus-unit.c
CommitLineData
ea430986
LP
1/*-*- Mode: C; c-basic-offset: 8 -*-*/
2
3#include <errno.h>
4
5#include "dbus.h"
6#include "log.h"
7
8static const char introspection[] =
9 DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE
10 "<node>"
11 " <!-- you suck -->"
12 " <interface name=\"org.freedesktop.systemd1.Unit\">"
13 " <property name=\"Id\" type=\"s\" access=\"read\"/>"
14 " <property name=\"Description\" type=\"s\" access=\"read\"/>"
15 " <property name=\"LoadState\" type=\"s\" access=\"read\"/>"
16 " <property name=\"ActiveState\" type=\"s\" access=\"read\"/>"
17 " </interface>"
18 BUS_PROPERTIES_INTERFACE
19 BUS_INTROSPECTABLE_INTERFACE
20 "</node>";
21
22static int bus_unit_append_id(Manager *m, DBusMessageIter *i, const char *property, void *data) {
23 Unit *u = data;
24 const char *id;
25
26 assert(m);
27 assert(i);
28 assert(property);
29 assert(u);
30
31 id = unit_id(u);
32
33 if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &u))
34 return -ENOMEM;
35
36 return 0;
37}
38
39static int bus_unit_append_description(Manager *m, DBusMessageIter *i, const char *property, void *data) {
40 Unit *u = data;
41 const char *d;
42
43 assert(m);
44 assert(i);
45 assert(property);
46 assert(u);
47
48 d = unit_description(u);
49
50 if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &d))
51 return -ENOMEM;
52
53 return 0;
54}
55
56static int bus_unit_append_load_state(Manager *m, DBusMessageIter *i, const char *property, void *data) {
57 Unit *u = data;
58 const char *state;
59
60 assert(m);
61 assert(i);
62 assert(property);
63 assert(u);
64
65 state = unit_load_state_to_string(u->meta.load_state);
66
67 if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &state))
68 return -ENOMEM;
69
70 return 0;
71}
72
73static int bus_unit_append_active_state(Manager *m, DBusMessageIter *i, const char *property, void *data) {
74 Unit *u = data;
75 const char *state;
76
77 assert(m);
78 assert(i);
79 assert(property);
80 assert(u);
81
82 state = unit_active_state_to_string(unit_active_state(u));
83
84 if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &state))
85 return -ENOMEM;
86
87 return 0;
88}
89
90static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusMessage *message) {
91
92 const BusProperty properties[] = {
93 { "org.freedesktop.systemd1.Unit", "Id", bus_unit_append_id, "s", u },
94 { "org.freedesktop.systemd1.Unit", "Description", bus_unit_append_description, "s", u },
95 { "org.freedesktop.systemd1.Unit", "LoadState", bus_unit_append_load_state, "s", u },
96 { "org.freedesktop.systemd1.Unit", "ActiveState", bus_unit_append_active_state, "s", u },
97 { NULL, NULL, NULL, NULL, NULL }
98 };
99
100 return bus_default_message_handler(u->meta.manager, message, introspection, properties);
101}
102
103static DBusHandlerResult bus_unit_message_handler(DBusConnection *connection, DBusMessage *message, void *data) {
104 Manager *m = data;
105 Unit *u;
106 int r;
107
108 assert(connection);
109 assert(message);
110 assert(m);
111
112 log_debug("Got D-Bus request: %s.%s() on %s",
113 dbus_message_get_interface(message),
114 dbus_message_get_member(message),
115 dbus_message_get_path(message));
116
117 if ((r = manager_get_unit_from_dbus_path(m, dbus_message_get_path(message), &u)) < 0) {
118
119 if (r == -ENOMEM)
120 return DBUS_HANDLER_RESULT_NEED_MEMORY;
121
122 if (r == -ENOENT)
123 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
124
125 return bus_send_error_reply(m, message, NULL, r);
126 }
127
128 return bus_unit_message_dispatch(u, message);
129}
130
131const DBusObjectPathVTable bus_unit_vtable = {
132 .message_function = bus_unit_message_handler
133};