]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
Add SPDX license identifiers to source files under the LGPL
[thirdparty/systemd.git] / src / core / service.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
c2f1db8f 2#pragma once
5cb5a6ff 3
a7334b09
LP
4/***
5 This file is part of systemd.
6
7 Copyright 2010 Lennart Poettering
8
9 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 17 Lesser General Public License for more details.
a7334b09 18
5430f7f2 19 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
5cb5a6ff 23typedef struct Service Service;
a354329f 24typedef struct ServiceFDStore ServiceFDStore;
5cb5a6ff 25
71d35b6b
TA
26#include "exit-status.h"
27#include "kill.h"
9cf3ab0e 28#include "path.h"
1e2e8133 29#include "ratelimit.h"
5cb5a6ff 30
034c6ed7 31typedef enum ServiceRestart {
525ee6f4 32 SERVICE_RESTART_NO,
034c6ed7 33 SERVICE_RESTART_ON_SUCCESS,
50caaedb 34 SERVICE_RESTART_ON_FAILURE,
6cfe2fde 35 SERVICE_RESTART_ON_ABNORMAL,
dc99a976 36 SERVICE_RESTART_ON_WATCHDOG,
50caaedb 37 SERVICE_RESTART_ON_ABORT,
94f04347
LP
38 SERVICE_RESTART_ALWAYS,
39 _SERVICE_RESTART_MAX,
40 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
41} ServiceRestart;
42
43typedef enum ServiceType {
05e343b7 44 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 45 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 46 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 47 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 48 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
f2b68789 49 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
94f04347
LP
50 _SERVICE_TYPE_MAX,
51 _SERVICE_TYPE_INVALID = -1
034c6ed7 52} ServiceType;
5cb5a6ff
LP
53
54typedef enum ServiceExecCommand {
55 SERVICE_EXEC_START_PRE,
56 SERVICE_EXEC_START,
57 SERVICE_EXEC_START_POST,
5cb5a6ff 58 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
59 SERVICE_EXEC_STOP,
60 SERVICE_EXEC_STOP_POST,
e537352b
LP
61 _SERVICE_EXEC_COMMAND_MAX,
62 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
63} ServiceExecCommand;
64
308d72dc
LP
65typedef enum NotifyState {
66 NOTIFY_UNKNOWN,
67 NOTIFY_READY,
68 NOTIFY_RELOADING,
69 NOTIFY_STOPPING,
70 _NOTIFY_STATE_MAX,
71 _NOTIFY_STATE_INVALID = -1
72} NotifyState;
73
a4e26faf
JW
74/* The values of this enum are referenced in man/systemd.exec.xml and src/shared/bus-unit-util.c.
75 * Update those sources for each change to this enum. */
f42806df
LP
76typedef enum ServiceResult {
77 SERVICE_SUCCESS,
0b2de9d9 78 SERVICE_FAILURE_RESOURCES, /* a bit of a misnomer, just our catch-all error for errnos we didn't expect */
c35755fb 79 SERVICE_FAILURE_PROTOCOL,
f42806df
LP
80 SERVICE_FAILURE_TIMEOUT,
81 SERVICE_FAILURE_EXIT_CODE,
82 SERVICE_FAILURE_SIGNAL,
83 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 84 SERVICE_FAILURE_WATCHDOG,
07299350 85 SERVICE_FAILURE_START_LIMIT_HIT,
f42806df
LP
86 _SERVICE_RESULT_MAX,
87 _SERVICE_RESULT_INVALID = -1
88} ServiceResult;
89
a354329f
LP
90struct ServiceFDStore {
91 Service *service;
92
93 int fd;
8dd4c05b 94 char *fdname;
a354329f
LP
95 sd_event_source *event_source;
96
97 LIST_FIELDS(ServiceFDStore, fd_store);
98};
99
5cb5a6ff 100struct Service {
ac155bb8 101 Unit meta;
5cb5a6ff 102
034c6ed7
LP
103 ServiceType type;
104 ServiceRestart restart;
37520c1b
LP
105 ExitStatusSet restart_prevent_status;
106 ExitStatusSet restart_force_status;
96342de6 107 ExitStatusSet success_status;
034c6ed7
LP
108
109 /* If set we'll read the main daemon PID from this file */
110 char *pid_file;
111
112 usec_t restart_usec;
d568a335
MS
113 usec_t timeout_start_usec;
114 usec_t timeout_stop_usec;
36c16a7c 115 usec_t runtime_max_usec;
5cb5a6ff 116
a6927d7f 117 dual_timestamp watchdog_timestamp;
bb242b7b 118 usec_t watchdog_usec;
2787d83c
M
119 usec_t watchdog_override_usec;
120 bool watchdog_override_enable;
718db961 121 sd_event_source *watchdog_event_source;
a6927d7f 122
e537352b 123 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 124
5cb5a6ff 125 ExecContext exec_context;
4819ff03 126 KillContext kill_context;
4ad49000 127 CGroupContext cgroup_context;
5cb5a6ff 128
a16e1123 129 ServiceState state, deserialized_state;
034c6ed7 130
867b3b7d 131 /* The exit status of the real main process */
034c6ed7
LP
132 ExecStatus main_exec_status;
133
867b3b7d 134 /* The currently executed control process */
034c6ed7 135 ExecCommand *control_command;
867b3b7d
LP
136
137 /* The currently executed main process, which may be NULL if
138 * the main process got started via forking mode and not by
139 * us */
140 ExecCommand *main_command;
141
142 /* The ID of the control command currently being executed */
a16e1123 143 ServiceExecCommand control_command_id;
867b3b7d 144
613b411c
LP
145 /* Runtime data of the execution context */
146 ExecRuntime *exec_runtime;
29206d46 147 DynamicCreds dynamic_creds;
613b411c 148
034c6ed7 149 pid_t main_pid, control_pid;
07459bb6 150 int socket_fd;
9d565427 151 SocketPeer *peer;
16115b0a 152 bool socket_fd_selinux_context_net;
8fe914ec
LP
153
154 bool permissions_start_only;
155 bool root_directory_start_only;
02ee865a 156 bool remain_after_exit;
3185a36b 157 bool guess_main_pid;
8fe914ec 158
05e343b7 159 /* If we shut down, remember why */
f42806df
LP
160 ServiceResult result;
161 ServiceResult reload_result;
e2f3b44c 162
5de6b302 163 bool main_pid_known:1;
6dfa5494 164 bool main_pid_alien:1;
05e343b7 165 bool bus_name_good:1;
47342320 166 bool forbid_restart:1;
d568a335 167 bool start_timeout_defined:1;
2c4104f0 168
906c06f6 169 bool reset_accounting:1;
5ad096b3 170
05e343b7 171 char *bus_name;
d8ccf5fd 172 char *bus_name_owner; /* unique name of the current owner */
05e343b7 173
8c47c732 174 char *status_text;
4774e357 175 int status_errno;
8c47c732 176
87a47f99 177 EmergencyAction emergency_action;
4b939747 178
57020a3a 179 UnitRef accept_socket;
4f2d528d 180
718db961 181 sd_event_source *timer_event_source;
3a111838 182 PathSpec *pid_file_pathspec;
8fe914ec
LP
183
184 NotifyAccess notify_access;
308d72dc 185 NotifyState notify_state;
a354329f
LP
186
187 ServiceFDStore *fd_store;
188 unsigned n_fd_store;
189 unsigned n_fd_store_max;
7eb2a8a1 190 unsigned n_keep_fd_store;
6b7e5923
PS
191
192 char *usb_function_descriptors;
193 char *usb_function_strings;
a34ceba6
LP
194
195 int stdin_fd;
196 int stdout_fd;
197 int stderr_fd;
7a0019d3
LP
198
199 unsigned n_restarts;
200 bool flush_n_restarts;
5cb5a6ff
LP
201};
202
47be870b 203extern const UnitVTable service_vtable;
5cb5a6ff 204
16115b0a 205int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
3e7a1f50 206void service_close_socket_fd(Service *s);
4f2d528d 207
44a6b1b6
ZJS
208const char* service_restart_to_string(ServiceRestart i) _const_;
209ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 210
44a6b1b6
ZJS
211const char* service_type_to_string(ServiceType i) _const_;
212ServiceType service_type_from_string(const char *s) _pure_;
94f04347 213
44a6b1b6
ZJS
214const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
215ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 216
308d72dc
LP
217const char* notify_state_to_string(NotifyState i) _const_;
218NotifyState notify_state_from_string(const char *s) _pure_;
219
44a6b1b6
ZJS
220const char* service_result_to_string(ServiceResult i) _const_;
221ServiceResult service_result_from_string(const char *s) _pure_;