]>
Commit | Line | Data |
---|---|---|
ea430986 LP |
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 | }; |