chiark / gitweb /
add basic (and not very useful) D-Bus support
[elogind.git] / dbus-unit.c
1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
2
3 #include <errno.h>
4
5 #include "dbus.h"
6 #include "log.h"
7
8 static 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
22 static 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
39 static 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
56 static 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
73 static 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
90 static 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
103 static 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
131 const DBusObjectPathVTable bus_unit_vtable = {
132         .message_function = bus_unit_message_handler
133 };