]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
core: add a concept of "dynamic" user ids, that are allocated as long as a service...
[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;
2787d83c
M
123 usec_t watchdog_override_usec;
124 bool watchdog_override_enable;
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;
29206d46 151 DynamicCreds dynamic_creds;
613b411c 152
034c6ed7 153 pid_t main_pid, control_pid;
07459bb6 154 int socket_fd;
16115b0a 155 bool socket_fd_selinux_context_net;
8fe914ec
LP
156
157 bool permissions_start_only;
158 bool root_directory_start_only;
02ee865a 159 bool remain_after_exit;
3185a36b 160 bool guess_main_pid;
8fe914ec 161
05e343b7 162 /* If we shut down, remember why */
f42806df
LP
163 ServiceResult result;
164 ServiceResult reload_result;
e2f3b44c 165
5de6b302 166 bool main_pid_known:1;
6dfa5494 167 bool main_pid_alien:1;
05e343b7 168 bool bus_name_good:1;
47342320 169 bool forbid_restart:1;
d568a335 170 bool start_timeout_defined:1;
2c4104f0 171
5ad096b3
LP
172 bool reset_cpu_usage:1;
173
05e343b7 174 char *bus_name;
d8ccf5fd 175 char *bus_name_owner; /* unique name of the current owner */
05e343b7 176
8c47c732 177 char *status_text;
4774e357 178 int status_errno;
8c47c732 179
2928b0a8 180 FailureAction failure_action;
4b939747 181
57020a3a 182 UnitRef accept_socket;
4f2d528d 183
718db961 184 sd_event_source *timer_event_source;
3a111838 185 PathSpec *pid_file_pathspec;
8fe914ec
LP
186
187 NotifyAccess notify_access;
308d72dc 188 NotifyState notify_state;
a354329f
LP
189
190 ServiceFDStore *fd_store;
191 unsigned n_fd_store;
192 unsigned n_fd_store_max;
6b7e5923
PS
193
194 char *usb_function_descriptors;
195 char *usb_function_strings;
a34ceba6
LP
196
197 int stdin_fd;
198 int stdout_fd;
199 int stderr_fd;
5cb5a6ff
LP
200};
201
47be870b 202extern const UnitVTable service_vtable;
5cb5a6ff 203
16115b0a 204int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
3e7a1f50 205void service_close_socket_fd(Service *s);
4f2d528d 206
44a6b1b6
ZJS
207const char* service_restart_to_string(ServiceRestart i) _const_;
208ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 209
44a6b1b6
ZJS
210const char* service_type_to_string(ServiceType i) _const_;
211ServiceType service_type_from_string(const char *s) _pure_;
94f04347 212
44a6b1b6
ZJS
213const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
214ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 215
44a6b1b6
ZJS
216const char* notify_access_to_string(NotifyAccess i) _const_;
217NotifyAccess notify_access_from_string(const char *s) _pure_;
c952c6ec 218
308d72dc
LP
219const char* notify_state_to_string(NotifyState i) _const_;
220NotifyState notify_state_from_string(const char *s) _pure_;
221
44a6b1b6
ZJS
222const char* service_result_to_string(ServiceResult i) _const_;
223ServiceResult service_result_from_string(const char *s) _pure_;