]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
NEWS: start section for 231, with tmpfs.mount option changes (#3576)
[thirdparty/systemd.git] / src / core / service.h
CommitLineData
c2f1db8f 1#pragma once
5cb5a6ff 2
a7334b09
LP
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
a7334b09
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.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
5cb5a6ff 22typedef struct Service Service;
a354329f 23typedef struct ServiceFDStore ServiceFDStore;
5cb5a6ff 24
71d35b6b
TA
25#include "exit-status.h"
26#include "kill.h"
9cf3ab0e 27#include "path.h"
1e2e8133 28#include "ratelimit.h"
5cb5a6ff 29
034c6ed7 30typedef enum ServiceRestart {
525ee6f4 31 SERVICE_RESTART_NO,
034c6ed7 32 SERVICE_RESTART_ON_SUCCESS,
50caaedb 33 SERVICE_RESTART_ON_FAILURE,
6cfe2fde 34 SERVICE_RESTART_ON_ABNORMAL,
dc99a976 35 SERVICE_RESTART_ON_WATCHDOG,
50caaedb 36 SERVICE_RESTART_ON_ABORT,
94f04347
LP
37 SERVICE_RESTART_ALWAYS,
38 _SERVICE_RESTART_MAX,
39 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
40} ServiceRestart;
41
42typedef enum ServiceType {
05e343b7 43 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 44 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 45 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 46 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 47 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
f2b68789 48 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
94f04347
LP
49 _SERVICE_TYPE_MAX,
50 _SERVICE_TYPE_INVALID = -1
034c6ed7 51} ServiceType;
5cb5a6ff
LP
52
53typedef enum ServiceExecCommand {
54 SERVICE_EXEC_START_PRE,
55 SERVICE_EXEC_START,
56 SERVICE_EXEC_START_POST,
5cb5a6ff 57 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
58 SERVICE_EXEC_STOP,
59 SERVICE_EXEC_STOP_POST,
e537352b
LP
60 _SERVICE_EXEC_COMMAND_MAX,
61 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
62} ServiceExecCommand;
63
c952c6ec
LP
64typedef enum NotifyAccess {
65 NOTIFY_NONE,
66 NOTIFY_ALL,
67 NOTIFY_MAIN,
68 _NOTIFY_ACCESS_MAX,
69 _NOTIFY_ACCESS_INVALID = -1
70} NotifyAccess;
71
308d72dc
LP
72typedef enum NotifyState {
73 NOTIFY_UNKNOWN,
74 NOTIFY_READY,
75 NOTIFY_RELOADING,
76 NOTIFY_STOPPING,
77 _NOTIFY_STATE_MAX,
78 _NOTIFY_STATE_INVALID = -1
79} NotifyState;
80
f42806df
LP
81typedef enum ServiceResult {
82 SERVICE_SUCCESS,
0b2de9d9 83 SERVICE_FAILURE_RESOURCES, /* a bit of a misnomer, just our catch-all error for errnos we didn't expect */
f42806df
LP
84 SERVICE_FAILURE_TIMEOUT,
85 SERVICE_FAILURE_EXIT_CODE,
86 SERVICE_FAILURE_SIGNAL,
87 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 88 SERVICE_FAILURE_WATCHDOG,
07299350 89 SERVICE_FAILURE_START_LIMIT_HIT,
f42806df
LP
90 _SERVICE_RESULT_MAX,
91 _SERVICE_RESULT_INVALID = -1
92} ServiceResult;
93
a354329f
LP
94struct ServiceFDStore {
95 Service *service;
96
97 int fd;
8dd4c05b 98 char *fdname;
a354329f
LP
99 sd_event_source *event_source;
100
101 LIST_FIELDS(ServiceFDStore, fd_store);
102};
103
5cb5a6ff 104struct Service {
ac155bb8 105 Unit meta;
5cb5a6ff 106
034c6ed7
LP
107 ServiceType type;
108 ServiceRestart restart;
37520c1b
LP
109 ExitStatusSet restart_prevent_status;
110 ExitStatusSet restart_force_status;
96342de6 111 ExitStatusSet success_status;
034c6ed7
LP
112
113 /* If set we'll read the main daemon PID from this file */
114 char *pid_file;
115
116 usec_t restart_usec;
d568a335
MS
117 usec_t timeout_start_usec;
118 usec_t timeout_stop_usec;
36c16a7c 119 usec_t runtime_max_usec;
5cb5a6ff 120
a6927d7f 121 dual_timestamp watchdog_timestamp;
bb242b7b 122 usec_t watchdog_usec;
718db961 123 sd_event_source *watchdog_event_source;
a6927d7f 124
e537352b 125 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 126
5cb5a6ff 127 ExecContext exec_context;
4819ff03 128 KillContext kill_context;
4ad49000 129 CGroupContext cgroup_context;
5cb5a6ff 130
a16e1123 131 ServiceState state, deserialized_state;
034c6ed7 132
867b3b7d 133 /* The exit status of the real main process */
034c6ed7
LP
134 ExecStatus main_exec_status;
135
867b3b7d 136 /* The currently executed control process */
034c6ed7 137 ExecCommand *control_command;
867b3b7d
LP
138
139 /* The currently executed main process, which may be NULL if
140 * the main process got started via forking mode and not by
141 * us */
142 ExecCommand *main_command;
143
144 /* The ID of the control command currently being executed */
a16e1123 145 ServiceExecCommand control_command_id;
867b3b7d 146
613b411c
LP
147 /* Runtime data of the execution context */
148 ExecRuntime *exec_runtime;
149
034c6ed7 150 pid_t main_pid, control_pid;
07459bb6 151 int socket_fd;
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
5ad096b3
LP
169 bool reset_cpu_usage:1;
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
2928b0a8 177 FailureAction failure_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;
6b7e5923
PS
190
191 char *usb_function_descriptors;
192 char *usb_function_strings;
a34ceba6
LP
193
194 int stdin_fd;
195 int stdout_fd;
196 int stderr_fd;
5cb5a6ff
LP
197};
198
47be870b 199extern const UnitVTable service_vtable;
5cb5a6ff 200
16115b0a 201int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
3e7a1f50 202void service_close_socket_fd(Service *s);
4f2d528d 203
44a6b1b6
ZJS
204const char* service_restart_to_string(ServiceRestart i) _const_;
205ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 206
44a6b1b6
ZJS
207const char* service_type_to_string(ServiceType i) _const_;
208ServiceType service_type_from_string(const char *s) _pure_;
94f04347 209
44a6b1b6
ZJS
210const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
211ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 212
44a6b1b6
ZJS
213const char* notify_access_to_string(NotifyAccess i) _const_;
214NotifyAccess notify_access_from_string(const char *s) _pure_;
c952c6ec 215
308d72dc
LP
216const char* notify_state_to_string(NotifyState i) _const_;
217NotifyState notify_state_from_string(const char *s) _pure_;
218
44a6b1b6
ZJS
219const char* service_result_to_string(ServiceResult i) _const_;
220ServiceResult service_result_from_string(const char *s) _pure_;