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