]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/dbus-service.c
relicense to LGPLv2.1 (with exceptions)
[thirdparty/systemd.git] / src / core / dbus-service.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4139c1b2
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
4139c1b2
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.
4139c1b2 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
4139c1b2
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-execute.h"
26#include "dbus-service.h"
bfebab7f 27#include "dbus-common.h"
4139c1b2 28
07459bb6 29#ifdef HAVE_SYSV_COMPAT
cb7f6996 30#define BUS_SERVICE_SYSV_INTERFACE_FRAGMENT \
d264aa33
LP
31 " <property name=\"SysVStartPriority\" type=\"i\" access=\"read\"/>\n" \
32 " <property name=\"SysVRunLevels\" type=\"s\" access=\"read\"/>\n" \
cb7f6996 33 " <property name=\"SysVPath\" type=\"s\" access=\"read\"/>\n"
07459bb6 34#else
cb7f6996
AB
35#define BUS_SERVICE_SYSV_INTERFACE_FRAGMENT ""
36#endif
37
07459bb6
FF
38#define BUS_SERVICE_INTERFACE \
39 " <interface name=\"org.freedesktop.systemd1.Service\">\n" \
40 " <property name=\"Type\" type=\"s\" access=\"read\"/>\n" \
41 " <property name=\"Restart\" type=\"s\" access=\"read\"/>\n" \
42 " <property name=\"PIDFile\" type=\"s\" access=\"read\"/>\n" \
43 " <property name=\"NotifyAccess\" type=\"s\" access=\"read\"/>\n" \
44 " <property name=\"RestartUSec\" type=\"t\" access=\"read\"/>\n" \
45 " <property name=\"TimeoutUSec\" type=\"t\" access=\"read\"/>\n" \
bb242b7b 46 " <property name=\"WatchdogUSec\" type=\"t\" access=\"read\"/>\n" \
a6927d7f
MO
47 " <property name=\"WatchdogTimestamp\" type=\"t\" access=\"read\"/>\n" \
48 " <property name=\"WatchdogTimestampMonotonic\" type=\"t\" access=\"read\"/>\n" \
4b939747
MO
49 " <property name=\"StartLimitInterval\" type=\"t\" access=\"read\"/>\n" \
50 " <property name=\"StartLimitBurst\" type=\"u\" access=\"read\"/>\n" \
69df6f00 51 " <property name=\"StartLimitAction\" type=\"s\" access=\"readwrite\"/>\n" \
07459bb6
FF
52 BUS_EXEC_COMMAND_INTERFACE("ExecStartPre") \
53 BUS_EXEC_COMMAND_INTERFACE("ExecStart") \
54 BUS_EXEC_COMMAND_INTERFACE("ExecStartPost") \
55 BUS_EXEC_COMMAND_INTERFACE("ExecReload") \
56 BUS_EXEC_COMMAND_INTERFACE("ExecStop") \
57 BUS_EXEC_COMMAND_INTERFACE("ExecStopPost") \
58 BUS_EXEC_CONTEXT_INTERFACE \
59 " <property name=\"PermissionsStartOnly\" type=\"b\" access=\"read\"/>\n" \
60 " <property name=\"RootDirectoryStartOnly\" type=\"b\" access=\"read\"/>\n" \
61 " <property name=\"RemainAfterExit\" type=\"b\" access=\"read\"/>\n" \
62 BUS_EXEC_STATUS_INTERFACE("ExecMain") \
63 " <property name=\"MainPID\" type=\"u\" access=\"read\"/>\n" \
64 " <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
65 " <property name=\"BusName\" type=\"s\" access=\"read\"/>\n" \
66 " <property name=\"StatusText\" type=\"s\" access=\"read\"/>\n" \
cb7f6996 67 " <property name=\"FsckPassNo\" type=\"i\" access=\"read\"/>\n" \
f42806df
LP
68 " <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
69 BUS_SERVICE_SYSV_INTERFACE_FRAGMENT \
07459bb6 70 " </interface>\n"
4288f619
LP
71
72#define INTROSPECTION \
73 DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \
74 "<node>\n" \
75 BUS_UNIT_INTERFACE \
76 BUS_SERVICE_INTERFACE \
77 BUS_PROPERTIES_INTERFACE \
c4e2ceae 78 BUS_PEER_INTERFACE \
4288f619
LP
79 BUS_INTROSPECTABLE_INTERFACE \
80 "</node>\n"
81
05feefe0
LP
82#define INTERFACES_LIST \
83 BUS_UNIT_INTERFACES_LIST \
84 "org.freedesktop.systemd1.Service\0"
85
9a60da28 86const char bus_service_interface[] _introspect_("Service") = BUS_SERVICE_INTERFACE;
4139c1b2 87
c4e2ceae
LP
88const char bus_service_invalidating_properties[] =
89 "ExecStartPre\0"
90 "ExecStart\0"
91 "ExecStartPost\0"
92 "ExecReload\0"
93 "ExecStop\0"
94 "ExecStopPost\0"
95 "ExecMain\0"
a6927d7f
MO
96 "WatchdogTimestamp\0"
97 "WatchdogTimestampMonotonic\0"
c4e2ceae
LP
98 "MainPID\0"
99 "ControlPID\0"
f42806df
LP
100 "StatusText\0"
101 "Result\0";
c4e2ceae 102
4139c1b2
LP
103static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_service_append_type, service_type, ServiceType);
104static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_service_append_restart, service_restart, ServiceRestart);
d264aa33 105static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_service_append_notify_access, notify_access, NotifyAccess);
f42806df 106static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_service_append_service_result, service_result, ServiceResult);
4b939747 107static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_service_append_start_limit_action, start_limit_action, StartLimitAction);
69df6f00 108static DEFINE_BUS_PROPERTY_SET_ENUM(bus_service_set_start_limit_action, start_limit_action, StartLimitAction);
4139c1b2 109
d200735e
MS
110static const BusProperty bus_exec_main_status_properties[] = {
111 { "ExecMainStartTimestamp", bus_property_append_usec, "t", offsetof(ExecStatus, start_timestamp.realtime) },
112 { "ExecMainStartTimestampMonotonic",bus_property_append_usec, "t", offsetof(ExecStatus, start_timestamp.monotonic) },
113 { "ExecMainExitTimestamp", bus_property_append_usec, "t", offsetof(ExecStatus, start_timestamp.realtime) },
114 { "ExecMainExitTimestampMonotonic", bus_property_append_usec, "t", offsetof(ExecStatus, start_timestamp.monotonic) },
115 { "ExecMainPID", bus_property_append_pid, "u", offsetof(ExecStatus, pid) },
116 { "ExecMainCode", bus_property_append_int, "i", offsetof(ExecStatus, code) },
117 { "ExecMainStatus", bus_property_append_int, "i", offsetof(ExecStatus, status) },
118 { NULL, }
119};
120
121static const BusProperty bus_service_properties[] = {
a6927d7f
MO
122 { "Type", bus_service_append_type, "s", offsetof(Service, type) },
123 { "Restart", bus_service_append_restart, "s", offsetof(Service, restart) },
124 { "PIDFile", bus_property_append_string, "s", offsetof(Service, pid_file), true },
125 { "NotifyAccess", bus_service_append_notify_access, "s", offsetof(Service, notify_access) },
126 { "RestartUSec", bus_property_append_usec, "t", offsetof(Service, restart_usec) },
127 { "TimeoutUSec", bus_property_append_usec, "t", offsetof(Service, timeout_usec) },
bb242b7b 128 { "WatchdogUSec", bus_property_append_usec, "t", offsetof(Service, watchdog_usec) },
a6927d7f
MO
129 { "WatchdogTimestamp", bus_property_append_usec, "t", offsetof(Service, watchdog_timestamp.realtime) },
130 { "WatchdogTimestampMonotonic",bus_property_append_usec, "t", offsetof(Service, watchdog_timestamp.monotonic) },
4b939747
MO
131 { "StartLimitInterval", bus_property_append_usec, "t", offsetof(Service, start_limit.interval) },
132 { "StartLimitBurst", bus_property_append_uint32, "u", offsetof(Service, start_limit.burst) },
69df6f00 133 { "StartLimitAction", bus_service_append_start_limit_action,"s", offsetof(Service, start_limit_action), false, bus_service_set_start_limit_action},
d200735e
MS
134 BUS_EXEC_COMMAND_PROPERTY("ExecStartPre", offsetof(Service, exec_command[SERVICE_EXEC_START_PRE]), true ),
135 BUS_EXEC_COMMAND_PROPERTY("ExecStart", offsetof(Service, exec_command[SERVICE_EXEC_START]), true ),
136 BUS_EXEC_COMMAND_PROPERTY("ExecStartPost", offsetof(Service, exec_command[SERVICE_EXEC_START_POST]), true ),
137 BUS_EXEC_COMMAND_PROPERTY("ExecReload", offsetof(Service, exec_command[SERVICE_EXEC_RELOAD]), true ),
138 BUS_EXEC_COMMAND_PROPERTY("ExecStop", offsetof(Service, exec_command[SERVICE_EXEC_STOP]), true ),
139 BUS_EXEC_COMMAND_PROPERTY("ExecStopPost", offsetof(Service, exec_command[SERVICE_EXEC_STOP_POST]), true ),
a6927d7f
MO
140 { "PermissionsStartOnly", bus_property_append_bool, "b", offsetof(Service, permissions_start_only) },
141 { "RootDirectoryStartOnly", bus_property_append_bool, "b", offsetof(Service, root_directory_start_only) },
142 { "RemainAfterExit", bus_property_append_bool, "b", offsetof(Service, remain_after_exit) },
143 { "GuessMainPID", bus_property_append_bool, "b", offsetof(Service, guess_main_pid) },
144 { "MainPID", bus_property_append_pid, "u", offsetof(Service, main_pid) },
145 { "ControlPID", bus_property_append_pid, "u", offsetof(Service, control_pid) },
146 { "BusName", bus_property_append_string, "s", offsetof(Service, bus_name), true },
147 { "StatusText", bus_property_append_string, "s", offsetof(Service, status_text), true },
07459bb6 148#ifdef HAVE_SYSV_COMPAT
a6927d7f
MO
149 { "SysVRunLevels", bus_property_append_string, "s", offsetof(Service, sysv_runlevels), true },
150 { "SysVStartPriority", bus_property_append_int, "i", offsetof(Service, sysv_start_priority) },
151 { "SysVPath", bus_property_append_string, "s", offsetof(Service, sysv_path), true },
07459bb6 152#endif
a6927d7f 153 { "FsckPassNo", bus_property_append_int, "i", offsetof(Service, fsck_passno) },
f42806df 154 { "Result", bus_service_append_service_result,"s", offsetof(Service, result) },
d200735e
MS
155 { NULL, }
156};
157
158DBusHandlerResult bus_service_message_handler(Unit *u, DBusConnection *connection, DBusMessage *message) {
159 Service *s = SERVICE(u);
160 const BusBoundProperties bps[] = {
161 { "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
162 { "org.freedesktop.systemd1.Service", bus_service_properties, s },
163 { "org.freedesktop.systemd1.Service", bus_exec_context_properties, &s->exec_context },
164 { "org.freedesktop.systemd1.Service", bus_exec_main_status_properties, &s->main_exec_status },
165 { NULL, }
4139c1b2
LP
166 };
167
d200735e 168 return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, bps);
4139c1b2 169}