]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
When warning about unsupported options, be more detailed
[thirdparty/systemd.git] / src / core / service.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5cb5a6ff 2
c2f1db8f 3#pragma once
5cb5a6ff 4
a7334b09
LP
5/***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
5cb5a6ff
LP
24typedef struct Service Service;
25
87f0e418 26#include "unit.h"
9cf3ab0e 27#include "path.h"
1e2e8133 28#include "ratelimit.h"
4819ff03 29#include "kill.h"
96342de6 30#include "exit-status.h"
2928b0a8 31#include "failure-action.h"
5cb5a6ff
LP
32
33typedef enum ServiceState {
34 SERVICE_DEAD,
35 SERVICE_START_PRE,
36 SERVICE_START,
37 SERVICE_START_POST,
38 SERVICE_RUNNING,
ba035df2 39 SERVICE_EXITED, /* Nothing is running anymore, but RemainAfterExit is true hence this is OK */
5cb5a6ff 40 SERVICE_RELOAD,
034c6ed7 41 SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
db2cb23b 42 SERVICE_STOP_SIGABRT, /* Watchdog timeout */
034c6ed7
LP
43 SERVICE_STOP_SIGTERM,
44 SERVICE_STOP_SIGKILL,
5cb5a6ff 45 SERVICE_STOP_POST,
034c6ed7
LP
46 SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
47 SERVICE_FINAL_SIGKILL,
fdf20a31 48 SERVICE_FAILED,
034c6ed7 49 SERVICE_AUTO_RESTART,
5cb5a6ff 50 _SERVICE_STATE_MAX,
94f04347 51 _SERVICE_STATE_INVALID = -1
5cb5a6ff
LP
52} ServiceState;
53
034c6ed7 54typedef enum ServiceRestart {
525ee6f4 55 SERVICE_RESTART_NO,
034c6ed7 56 SERVICE_RESTART_ON_SUCCESS,
50caaedb 57 SERVICE_RESTART_ON_FAILURE,
6cfe2fde 58 SERVICE_RESTART_ON_ABNORMAL,
dc99a976 59 SERVICE_RESTART_ON_WATCHDOG,
50caaedb 60 SERVICE_RESTART_ON_ABORT,
94f04347
LP
61 SERVICE_RESTART_ALWAYS,
62 _SERVICE_RESTART_MAX,
63 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
64} ServiceRestart;
65
66typedef enum ServiceType {
05e343b7 67 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 68 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 69 SERVICE_ONESHOT, /* we fork and wait until the program finishes (i.e. programs like fsck which run and need to finish before we continue) */
05e343b7 70 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 71 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
f2b68789 72 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
94f04347
LP
73 _SERVICE_TYPE_MAX,
74 _SERVICE_TYPE_INVALID = -1
034c6ed7 75} ServiceType;
5cb5a6ff
LP
76
77typedef enum ServiceExecCommand {
78 SERVICE_EXEC_START_PRE,
79 SERVICE_EXEC_START,
80 SERVICE_EXEC_START_POST,
5cb5a6ff 81 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
82 SERVICE_EXEC_STOP,
83 SERVICE_EXEC_STOP_POST,
e537352b
LP
84 _SERVICE_EXEC_COMMAND_MAX,
85 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
86} ServiceExecCommand;
87
c952c6ec
LP
88typedef enum NotifyAccess {
89 NOTIFY_NONE,
90 NOTIFY_ALL,
91 NOTIFY_MAIN,
92 _NOTIFY_ACCESS_MAX,
93 _NOTIFY_ACCESS_INVALID = -1
94} NotifyAccess;
95
308d72dc
LP
96typedef enum NotifyState {
97 NOTIFY_UNKNOWN,
98 NOTIFY_READY,
99 NOTIFY_RELOADING,
100 NOTIFY_STOPPING,
101 _NOTIFY_STATE_MAX,
102 _NOTIFY_STATE_INVALID = -1
103} NotifyState;
104
f42806df
LP
105typedef enum ServiceResult {
106 SERVICE_SUCCESS,
107 SERVICE_FAILURE_RESOURCES,
108 SERVICE_FAILURE_TIMEOUT,
109 SERVICE_FAILURE_EXIT_CODE,
110 SERVICE_FAILURE_SIGNAL,
111 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 112 SERVICE_FAILURE_WATCHDOG,
8d1b002a 113 SERVICE_FAILURE_START_LIMIT,
f42806df
LP
114 _SERVICE_RESULT_MAX,
115 _SERVICE_RESULT_INVALID = -1
116} ServiceResult;
117
5cb5a6ff 118struct Service {
ac155bb8 119 Unit meta;
5cb5a6ff 120
034c6ed7
LP
121 ServiceType type;
122 ServiceRestart restart;
37520c1b
LP
123 ExitStatusSet restart_prevent_status;
124 ExitStatusSet restart_force_status;
96342de6 125 ExitStatusSet success_status;
034c6ed7
LP
126
127 /* If set we'll read the main daemon PID from this file */
128 char *pid_file;
129
130 usec_t restart_usec;
d568a335
MS
131 usec_t timeout_start_usec;
132 usec_t timeout_stop_usec;
5cb5a6ff 133
a6927d7f 134 dual_timestamp watchdog_timestamp;
bb242b7b 135 usec_t watchdog_usec;
718db961 136 sd_event_source *watchdog_event_source;
a6927d7f 137
e537352b 138 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 139
5cb5a6ff 140 ExecContext exec_context;
4819ff03 141 KillContext kill_context;
4ad49000 142 CGroupContext cgroup_context;
5cb5a6ff 143
a16e1123 144 ServiceState state, deserialized_state;
034c6ed7 145
867b3b7d 146 /* The exit status of the real main process */
034c6ed7
LP
147 ExecStatus main_exec_status;
148
867b3b7d 149 /* The currently executed control process */
034c6ed7 150 ExecCommand *control_command;
867b3b7d
LP
151
152 /* The currently executed main process, which may be NULL if
153 * the main process got started via forking mode and not by
154 * us */
155 ExecCommand *main_command;
156
157 /* The ID of the control command currently being executed */
a16e1123 158 ServiceExecCommand control_command_id;
867b3b7d 159
613b411c
LP
160 /* Runtime data of the execution context */
161 ExecRuntime *exec_runtime;
162
034c6ed7 163 pid_t main_pid, control_pid;
07459bb6 164 int socket_fd;
16115b0a 165 bool socket_fd_selinux_context_net;
8fe914ec 166
e44da745
DM
167 int bus_endpoint_fd;
168
8fe914ec
LP
169 bool permissions_start_only;
170 bool root_directory_start_only;
02ee865a 171 bool remain_after_exit;
3185a36b 172 bool guess_main_pid;
8fe914ec 173
05e343b7 174 /* If we shut down, remember why */
f42806df
LP
175 ServiceResult result;
176 ServiceResult reload_result;
e2f3b44c 177
5de6b302 178 bool main_pid_known:1;
6dfa5494 179 bool main_pid_alien:1;
05e343b7 180 bool bus_name_good:1;
47342320 181 bool forbid_restart:1;
d568a335 182 bool start_timeout_defined:1;
07459bb6 183#ifdef HAVE_SYSV_COMPAT
2c4104f0 184 int sysv_start_priority;
07459bb6 185#endif
2c4104f0 186
05e343b7
LP
187 char *bus_name;
188
8c47c732 189 char *status_text;
4774e357 190 int status_errno;
8c47c732 191
4b939747 192 RateLimit start_limit;
bf500566 193 FailureAction start_limit_action;
2928b0a8 194 FailureAction failure_action;
efe6e7d3 195 char *reboot_arg;
4b939747 196
57020a3a 197 UnitRef accept_socket;
4f2d528d 198
718db961 199 sd_event_source *timer_event_source;
3a111838 200 PathSpec *pid_file_pathspec;
8fe914ec
LP
201
202 NotifyAccess notify_access;
308d72dc 203 NotifyState notify_state;
5cb5a6ff
LP
204};
205
47be870b 206extern const UnitVTable service_vtable;
5cb5a6ff 207
57020a3a
LP
208struct Socket;
209
16115b0a 210int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
4f2d528d 211
44a6b1b6
ZJS
212const char* service_state_to_string(ServiceState i) _const_;
213ServiceState service_state_from_string(const char *s) _pure_;
94f04347 214
44a6b1b6
ZJS
215const char* service_restart_to_string(ServiceRestart i) _const_;
216ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 217
44a6b1b6
ZJS
218const char* service_type_to_string(ServiceType i) _const_;
219ServiceType service_type_from_string(const char *s) _pure_;
94f04347 220
44a6b1b6
ZJS
221const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
222ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 223
44a6b1b6
ZJS
224const char* notify_access_to_string(NotifyAccess i) _const_;
225NotifyAccess notify_access_from_string(const char *s) _pure_;
c952c6ec 226
308d72dc
LP
227const char* notify_state_to_string(NotifyState i) _const_;
228NotifyState notify_state_from_string(const char *s) _pure_;
229
44a6b1b6
ZJS
230const char* service_result_to_string(ServiceResult i) _const_;
231ServiceResult service_result_from_string(const char *s) _pure_;