]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
service: add options RestartPreventExitStatus and SuccessExitStatus
[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"
57020a3a 29#include "service.h"
4819ff03 30#include "kill.h"
96342de6 31#include "exit-status.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
LP
41 SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
42 SERVICE_STOP_SIGTERM,
43 SERVICE_STOP_SIGKILL,
5cb5a6ff 44 SERVICE_STOP_POST,
034c6ed7
LP
45 SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
46 SERVICE_FINAL_SIGKILL,
fdf20a31 47 SERVICE_FAILED,
034c6ed7 48 SERVICE_AUTO_RESTART,
5cb5a6ff 49 _SERVICE_STATE_MAX,
94f04347 50 _SERVICE_STATE_INVALID = -1
5cb5a6ff
LP
51} ServiceState;
52
034c6ed7 53typedef enum ServiceRestart {
525ee6f4 54 SERVICE_RESTART_NO,
034c6ed7 55 SERVICE_RESTART_ON_SUCCESS,
50caaedb
LP
56 SERVICE_RESTART_ON_FAILURE,
57 SERVICE_RESTART_ON_ABORT,
94f04347
LP
58 SERVICE_RESTART_ALWAYS,
59 _SERVICE_RESTART_MAX,
60 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
61} ServiceRestart;
62
63typedef enum ServiceType {
05e343b7 64 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 65 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 66 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 67 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 68 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
f2b68789 69 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
94f04347
LP
70 _SERVICE_TYPE_MAX,
71 _SERVICE_TYPE_INVALID = -1
034c6ed7 72} ServiceType;
5cb5a6ff
LP
73
74typedef enum ServiceExecCommand {
75 SERVICE_EXEC_START_PRE,
76 SERVICE_EXEC_START,
77 SERVICE_EXEC_START_POST,
5cb5a6ff 78 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
79 SERVICE_EXEC_STOP,
80 SERVICE_EXEC_STOP_POST,
e537352b
LP
81 _SERVICE_EXEC_COMMAND_MAX,
82 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
83} ServiceExecCommand;
84
c952c6ec
LP
85typedef enum NotifyAccess {
86 NOTIFY_NONE,
87 NOTIFY_ALL,
88 NOTIFY_MAIN,
89 _NOTIFY_ACCESS_MAX,
90 _NOTIFY_ACCESS_INVALID = -1
91} NotifyAccess;
92
f42806df
LP
93typedef enum ServiceResult {
94 SERVICE_SUCCESS,
95 SERVICE_FAILURE_RESOURCES,
96 SERVICE_FAILURE_TIMEOUT,
97 SERVICE_FAILURE_EXIT_CODE,
98 SERVICE_FAILURE_SIGNAL,
99 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 100 SERVICE_FAILURE_WATCHDOG,
f42806df
LP
101 _SERVICE_RESULT_MAX,
102 _SERVICE_RESULT_INVALID = -1
103} ServiceResult;
104
4b939747
MO
105typedef enum StartLimitAction {
106 SERVICE_START_LIMIT_NONE,
107 SERVICE_START_LIMIT_REBOOT,
108 SERVICE_START_LIMIT_REBOOT_FORCE,
109 SERVICE_START_LIMIT_REBOOT_IMMEDIATE,
110 _SERVICE_START_LIMIT_MAX,
111 _SERVICE_START_LIMIT_INVALID = -1
112} StartLimitAction;
113
5cb5a6ff 114struct Service {
ac155bb8 115 Unit meta;
5cb5a6ff 116
034c6ed7
LP
117 ServiceType type;
118 ServiceRestart restart;
96342de6
LN
119 ExitStatusSet restart_ignore_status;
120 ExitStatusSet success_status;
034c6ed7
LP
121
122 /* If set we'll read the main daemon PID from this file */
123 char *pid_file;
124
125 usec_t restart_usec;
d568a335
MS
126 usec_t timeout_start_usec;
127 usec_t timeout_stop_usec;
5cb5a6ff 128
a6927d7f 129 dual_timestamp watchdog_timestamp;
bb242b7b
MO
130 usec_t watchdog_usec;
131 Watch watchdog_watch;
a6927d7f 132
e537352b 133 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 134
5cb5a6ff 135 ExecContext exec_context;
4819ff03 136 KillContext kill_context;
5cb5a6ff 137
a16e1123 138 ServiceState state, deserialized_state;
034c6ed7 139
867b3b7d 140 /* The exit status of the real main process */
034c6ed7
LP
141 ExecStatus main_exec_status;
142
867b3b7d 143 /* The currently executed control process */
034c6ed7 144 ExecCommand *control_command;
867b3b7d
LP
145
146 /* The currently executed main process, which may be NULL if
147 * the main process got started via forking mode and not by
148 * us */
149 ExecCommand *main_command;
150
151 /* The ID of the control command currently being executed */
a16e1123 152 ServiceExecCommand control_command_id;
867b3b7d 153
034c6ed7 154 pid_t main_pid, control_pid;
07459bb6 155 int socket_fd;
8fe914ec 156
9fff8a1f
LP
157 int fsck_passno;
158
8fe914ec
LP
159 bool permissions_start_only;
160 bool root_directory_start_only;
02ee865a 161 bool remain_after_exit;
3185a36b 162 bool guess_main_pid;
8fe914ec 163
05e343b7 164 /* If we shut down, remember why */
f42806df
LP
165 ServiceResult result;
166 ServiceResult reload_result;
e2f3b44c 167
5de6b302 168 bool main_pid_known:1;
6dfa5494 169 bool main_pid_alien:1;
05e343b7 170 bool bus_name_good:1;
47342320 171 bool forbid_restart:1;
701cc384 172 bool got_socket_fd:1;
d568a335 173 bool start_timeout_defined:1;
07459bb6 174#ifdef HAVE_SYSV_COMPAT
1b64d026 175 bool is_sysv:1;
e537352b 176 bool sysv_has_lsb:1;
5de6b302 177 bool sysv_enabled:1;
ea87ca5a 178 int sysv_start_priority_from_rcnd;
2c4104f0 179 int sysv_start_priority;
8fe914ec 180
8309400a 181 char *sysv_runlevels;
07459bb6 182#endif
2c4104f0 183
05e343b7
LP
184 char *bus_name;
185
8c47c732
LP
186 char *status_text;
187
4b939747
MO
188 RateLimit start_limit;
189 StartLimitAction start_limit_action;
190
57020a3a 191 UnitRef accept_socket;
4f2d528d 192
e537352b 193 Watch timer_watch;
3a111838 194 PathSpec *pid_file_pathspec;
8fe914ec
LP
195
196 NotifyAccess notify_access;
5cb5a6ff
LP
197};
198
47be870b 199extern const UnitVTable service_vtable;
5cb5a6ff 200
57020a3a
LP
201struct Socket;
202
6cf6bbc2 203int service_set_socket_fd(Service *s, int fd, struct Socket *socket);
4f2d528d 204
94f04347
LP
205const char* service_state_to_string(ServiceState i);
206ServiceState service_state_from_string(const char *s);
207
208const char* service_restart_to_string(ServiceRestart i);
209ServiceRestart service_restart_from_string(const char *s);
210
211const char* service_type_to_string(ServiceType i);
212ServiceType service_type_from_string(const char *s);
213
214const char* service_exec_command_to_string(ServiceExecCommand i);
215ServiceExecCommand service_exec_command_from_string(const char *s);
216
c952c6ec
LP
217const char* notify_access_to_string(NotifyAccess i);
218NotifyAccess notify_access_from_string(const char *s);
219
f42806df
LP
220const char* service_result_to_string(ServiceResult i);
221ServiceResult service_result_from_string(const char *s);
222
4b939747
MO
223const char* start_limit_action_to_string(StartLimitAction i);
224StartLimitAction start_limit_action_from_string(const char *s);