]> git.proxmox.com Git - systemd.git/blame - src/core/service.h
New upstream version 236
[systemd.git] / src / core / service.h
CommitLineData
52ad194e 1/* SPDX-License-Identifier: LGPL-2.1+ */
663996b3
MS
2#pragma once
3
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
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
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
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
23typedef struct Service Service;
e735f4d4 24typedef struct ServiceFDStore ServiceFDStore;
663996b3 25
4c89c718
MP
26#include "exit-status.h"
27#include "kill.h"
663996b3
MS
28#include "path.h"
29#include "ratelimit.h"
663996b3 30
663996b3
MS
31typedef enum ServiceRestart {
32 SERVICE_RESTART_NO,
33 SERVICE_RESTART_ON_SUCCESS,
34 SERVICE_RESTART_ON_FAILURE,
60f067b4 35 SERVICE_RESTART_ON_ABNORMAL,
14228c0d 36 SERVICE_RESTART_ON_WATCHDOG,
663996b3
MS
37 SERVICE_RESTART_ON_ABORT,
38 SERVICE_RESTART_ALWAYS,
39 _SERVICE_RESTART_MAX,
40 _SERVICE_RESTART_INVALID = -1
41} ServiceRestart;
42
43typedef enum ServiceType {
44 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
45 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
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) */
47 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
48 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
49 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
50 _SERVICE_TYPE_MAX,
51 _SERVICE_TYPE_INVALID = -1
52} ServiceType;
53
54typedef enum ServiceExecCommand {
55 SERVICE_EXEC_START_PRE,
56 SERVICE_EXEC_START,
57 SERVICE_EXEC_START_POST,
58 SERVICE_EXEC_RELOAD,
59 SERVICE_EXEC_STOP,
60 SERVICE_EXEC_STOP_POST,
61 _SERVICE_EXEC_COMMAND_MAX,
62 _SERVICE_EXEC_COMMAND_INVALID = -1
63} ServiceExecCommand;
64
5eef597e
MP
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
2897b343
MP
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. */
663996b3
MS
76typedef enum ServiceResult {
77 SERVICE_SUCCESS,
aa27b158 78 SERVICE_FAILURE_RESOURCES, /* a bit of a misnomer, just our catch-all error for errnos we didn't expect */
2897b343 79 SERVICE_FAILURE_PROTOCOL,
663996b3
MS
80 SERVICE_FAILURE_TIMEOUT,
81 SERVICE_FAILURE_EXIT_CODE,
82 SERVICE_FAILURE_SIGNAL,
83 SERVICE_FAILURE_CORE_DUMP,
84 SERVICE_FAILURE_WATCHDOG,
aa27b158 85 SERVICE_FAILURE_START_LIMIT_HIT,
663996b3
MS
86 _SERVICE_RESULT_MAX,
87 _SERVICE_RESULT_INVALID = -1
88} ServiceResult;
89
e735f4d4
MP
90struct ServiceFDStore {
91 Service *service;
92
93 int fd;
6300502b 94 char *fdname;
e735f4d4
MP
95 sd_event_source *event_source;
96
97 LIST_FIELDS(ServiceFDStore, fd_store);
98};
99
663996b3
MS
100struct Service {
101 Unit meta;
102
103 ServiceType type;
104 ServiceRestart restart;
e842803a
MB
105 ExitStatusSet restart_prevent_status;
106 ExitStatusSet restart_force_status;
663996b3
MS
107 ExitStatusSet success_status;
108
109 /* If set we'll read the main daemon PID from this file */
110 char *pid_file;
111
112 usec_t restart_usec;
113 usec_t timeout_start_usec;
114 usec_t timeout_stop_usec;
4c89c718 115 usec_t runtime_max_usec;
663996b3
MS
116
117 dual_timestamp watchdog_timestamp;
118 usec_t watchdog_usec;
5a920b42
MP
119 usec_t watchdog_override_usec;
120 bool watchdog_override_enable;
60f067b4 121 sd_event_source *watchdog_event_source;
663996b3
MS
122
123 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
124
125 ExecContext exec_context;
126 KillContext kill_context;
14228c0d 127 CGroupContext cgroup_context;
663996b3
MS
128
129 ServiceState state, deserialized_state;
130
131 /* The exit status of the real main process */
132 ExecStatus main_exec_status;
133
134 /* The currently executed control process */
135 ExecCommand *control_command;
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 */
143 ServiceExecCommand control_command_id;
144
60f067b4
JS
145 /* Runtime data of the execution context */
146 ExecRuntime *exec_runtime;
8a584da2 147 DynamicCreds dynamic_creds;
60f067b4 148
663996b3
MS
149 pid_t main_pid, control_pid;
150 int socket_fd;
8a584da2 151 SocketPeer *peer;
5eef597e
MP
152 bool socket_fd_selinux_context_net;
153
663996b3
MS
154 bool permissions_start_only;
155 bool root_directory_start_only;
156 bool remain_after_exit;
157 bool guess_main_pid;
158
159 /* If we shut down, remember why */
160 ServiceResult result;
161 ServiceResult reload_result;
162
163 bool main_pid_known:1;
164 bool main_pid_alien:1;
165 bool bus_name_good:1;
166 bool forbid_restart:1;
52ad194e
MB
167 /* Keep restart intention between UNIT_FAILED and UNIT_ACTIVATING */
168 bool will_auto_restart:1;
663996b3 169 bool start_timeout_defined:1;
663996b3
MS
170
171 char *bus_name;
4c89c718 172 char *bus_name_owner; /* unique name of the current owner */
663996b3
MS
173
174 char *status_text;
5eef597e 175 int status_errno;
60f067b4 176
663996b3
MS
177 UnitRef accept_socket;
178
60f067b4 179 sd_event_source *timer_event_source;
663996b3
MS
180 PathSpec *pid_file_pathspec;
181
182 NotifyAccess notify_access;
5eef597e 183 NotifyState notify_state;
e735f4d4
MP
184
185 ServiceFDStore *fd_store;
186 unsigned n_fd_store;
187 unsigned n_fd_store_max;
52ad194e 188 unsigned n_keep_fd_store;
6300502b
MP
189
190 char *usb_function_descriptors;
191 char *usb_function_strings;
db2df898
MP
192
193 int stdin_fd;
194 int stdout_fd;
195 int stderr_fd;
f5e65279
MB
196
197 unsigned n_restarts;
198 bool flush_n_restarts;
663996b3
MS
199};
200
201extern const UnitVTable service_vtable;
202
5eef597e 203int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
aa27b158 204void service_close_socket_fd(Service *s);
663996b3 205
663996b3
MS
206const char* service_restart_to_string(ServiceRestart i) _const_;
207ServiceRestart service_restart_from_string(const char *s) _pure_;
208
209const char* service_type_to_string(ServiceType i) _const_;
210ServiceType service_type_from_string(const char *s) _pure_;
211
212const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
213ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
214
5eef597e
MP
215const char* notify_state_to_string(NotifyState i) _const_;
216NotifyState notify_state_from_string(const char *s) _pure_;
217
663996b3
MS
218const char* service_result_to_string(ServiceResult i) _const_;
219ServiceResult service_result_from_string(const char *s) _pure_;