]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
core: rework unit timeout handling, and add new setting RuntimeMaxSec=
[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 24typedef struct Service Service;
a354329f 25typedef struct ServiceFDStore ServiceFDStore;
5cb5a6ff 26
71d35b6b
TA
27#include "exit-status.h"
28#include "kill.h"
9cf3ab0e 29#include "path.h"
1e2e8133 30#include "ratelimit.h"
5cb5a6ff 31
034c6ed7 32typedef enum ServiceRestart {
525ee6f4 33 SERVICE_RESTART_NO,
034c6ed7 34 SERVICE_RESTART_ON_SUCCESS,
50caaedb 35 SERVICE_RESTART_ON_FAILURE,
6cfe2fde 36 SERVICE_RESTART_ON_ABNORMAL,
dc99a976 37 SERVICE_RESTART_ON_WATCHDOG,
50caaedb 38 SERVICE_RESTART_ON_ABORT,
94f04347
LP
39 SERVICE_RESTART_ALWAYS,
40 _SERVICE_RESTART_MAX,
41 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
42} ServiceRestart;
43
44typedef enum ServiceType {
05e343b7 45 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 46 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 47 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 48 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 49 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
f2b68789 50 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
94f04347
LP
51 _SERVICE_TYPE_MAX,
52 _SERVICE_TYPE_INVALID = -1
034c6ed7 53} ServiceType;
5cb5a6ff
LP
54
55typedef enum ServiceExecCommand {
56 SERVICE_EXEC_START_PRE,
57 SERVICE_EXEC_START,
58 SERVICE_EXEC_START_POST,
5cb5a6ff 59 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
60 SERVICE_EXEC_STOP,
61 SERVICE_EXEC_STOP_POST,
e537352b
LP
62 _SERVICE_EXEC_COMMAND_MAX,
63 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
64} ServiceExecCommand;
65
c952c6ec
LP
66typedef enum NotifyAccess {
67 NOTIFY_NONE,
68 NOTIFY_ALL,
69 NOTIFY_MAIN,
70 _NOTIFY_ACCESS_MAX,
71 _NOTIFY_ACCESS_INVALID = -1
72} NotifyAccess;
73
308d72dc
LP
74typedef enum NotifyState {
75 NOTIFY_UNKNOWN,
76 NOTIFY_READY,
77 NOTIFY_RELOADING,
78 NOTIFY_STOPPING,
79 _NOTIFY_STATE_MAX,
80 _NOTIFY_STATE_INVALID = -1
81} NotifyState;
82
f42806df
LP
83typedef enum ServiceResult {
84 SERVICE_SUCCESS,
85 SERVICE_FAILURE_RESOURCES,
86 SERVICE_FAILURE_TIMEOUT,
87 SERVICE_FAILURE_EXIT_CODE,
88 SERVICE_FAILURE_SIGNAL,
89 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 90 SERVICE_FAILURE_WATCHDOG,
8d1b002a 91 SERVICE_FAILURE_START_LIMIT,
f42806df
LP
92 _SERVICE_RESULT_MAX,
93 _SERVICE_RESULT_INVALID = -1
94} ServiceResult;
95
a354329f
LP
96struct ServiceFDStore {
97 Service *service;
98
99 int fd;
8dd4c05b 100 char *fdname;
a354329f
LP
101 sd_event_source *event_source;
102
103 LIST_FIELDS(ServiceFDStore, fd_store);
104};
105
5cb5a6ff 106struct Service {
ac155bb8 107 Unit meta;
5cb5a6ff 108
034c6ed7
LP
109 ServiceType type;
110 ServiceRestart restart;
37520c1b
LP
111 ExitStatusSet restart_prevent_status;
112 ExitStatusSet restart_force_status;
96342de6 113 ExitStatusSet success_status;
034c6ed7
LP
114
115 /* If set we'll read the main daemon PID from this file */
116 char *pid_file;
117
118 usec_t restart_usec;
d568a335
MS
119 usec_t timeout_start_usec;
120 usec_t timeout_stop_usec;
36c16a7c 121 usec_t runtime_max_usec;
5cb5a6ff 122
a6927d7f 123 dual_timestamp watchdog_timestamp;
bb242b7b 124 usec_t watchdog_usec;
718db961 125 sd_event_source *watchdog_event_source;
a6927d7f 126
e537352b 127 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 128
5cb5a6ff 129 ExecContext exec_context;
4819ff03 130 KillContext kill_context;
4ad49000 131 CGroupContext cgroup_context;
5cb5a6ff 132
a16e1123 133 ServiceState state, deserialized_state;
034c6ed7 134
867b3b7d 135 /* The exit status of the real main process */
034c6ed7
LP
136 ExecStatus main_exec_status;
137
867b3b7d 138 /* The currently executed control process */
034c6ed7 139 ExecCommand *control_command;
867b3b7d
LP
140
141 /* The currently executed main process, which may be NULL if
142 * the main process got started via forking mode and not by
143 * us */
144 ExecCommand *main_command;
145
146 /* The ID of the control command currently being executed */
a16e1123 147 ServiceExecCommand control_command_id;
867b3b7d 148
613b411c
LP
149 /* Runtime data of the execution context */
150 ExecRuntime *exec_runtime;
151
034c6ed7 152 pid_t main_pid, control_pid;
07459bb6 153 int socket_fd;
16115b0a 154 bool socket_fd_selinux_context_net;
8fe914ec 155
e44da745
DM
156 int bus_endpoint_fd;
157
8fe914ec
LP
158 bool permissions_start_only;
159 bool root_directory_start_only;
02ee865a 160 bool remain_after_exit;
3185a36b 161 bool guess_main_pid;
8fe914ec 162
05e343b7 163 /* If we shut down, remember why */
f42806df
LP
164 ServiceResult result;
165 ServiceResult reload_result;
e2f3b44c 166
5de6b302 167 bool main_pid_known:1;
6dfa5494 168 bool main_pid_alien:1;
05e343b7 169 bool bus_name_good:1;
47342320 170 bool forbid_restart:1;
d568a335 171 bool start_timeout_defined:1;
2c4104f0 172
5ad096b3
LP
173 bool reset_cpu_usage:1;
174
05e343b7 175 char *bus_name;
d8ccf5fd 176 char *bus_name_owner; /* unique name of the current owner */
05e343b7 177
8c47c732 178 char *status_text;
4774e357 179 int status_errno;
8c47c732 180
4b939747 181 RateLimit start_limit;
bf500566 182 FailureAction start_limit_action;
2928b0a8 183 FailureAction failure_action;
efe6e7d3 184 char *reboot_arg;
4b939747 185
57020a3a 186 UnitRef accept_socket;
4f2d528d 187
718db961 188 sd_event_source *timer_event_source;
3a111838 189 PathSpec *pid_file_pathspec;
8fe914ec
LP
190
191 NotifyAccess notify_access;
308d72dc 192 NotifyState notify_state;
a354329f
LP
193
194 ServiceFDStore *fd_store;
195 unsigned n_fd_store;
196 unsigned n_fd_store_max;
6b7e5923
PS
197
198 char *usb_function_descriptors;
199 char *usb_function_strings;
a34ceba6
LP
200
201 int stdin_fd;
202 int stdout_fd;
203 int stderr_fd;
5cb5a6ff
LP
204};
205
47be870b 206extern const UnitVTable service_vtable;
5cb5a6ff 207
16115b0a 208int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
4f2d528d 209
44a6b1b6
ZJS
210const char* service_restart_to_string(ServiceRestart i) _const_;
211ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 212
44a6b1b6
ZJS
213const char* service_type_to_string(ServiceType i) _const_;
214ServiceType service_type_from_string(const char *s) _pure_;
94f04347 215
44a6b1b6
ZJS
216const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
217ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 218
44a6b1b6
ZJS
219const char* notify_access_to_string(NotifyAccess i) _const_;
220NotifyAccess notify_access_from_string(const char *s) _pure_;
c952c6ec 221
308d72dc
LP
222const char* notify_state_to_string(NotifyState i) _const_;
223NotifyState notify_state_from_string(const char *s) _pure_;
224
44a6b1b6
ZJS
225const char* service_result_to_string(ServiceResult i) _const_;
226ServiceResult service_result_from_string(const char *s) _pure_;