]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
Merge pull request #2131 from evverx/regenerate-m4-on-reconfigure
[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;
5cb5a6ff 121
a6927d7f 122 dual_timestamp watchdog_timestamp;
bb242b7b 123 usec_t watchdog_usec;
718db961 124 sd_event_source *watchdog_event_source;
a6927d7f 125
e537352b 126 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 127
5cb5a6ff 128 ExecContext exec_context;
4819ff03 129 KillContext kill_context;
4ad49000 130 CGroupContext cgroup_context;
5cb5a6ff 131
a16e1123 132 ServiceState state, deserialized_state;
034c6ed7 133
867b3b7d 134 /* The exit status of the real main process */
034c6ed7
LP
135 ExecStatus main_exec_status;
136
867b3b7d 137 /* The currently executed control process */
034c6ed7 138 ExecCommand *control_command;
867b3b7d
LP
139
140 /* The currently executed main process, which may be NULL if
141 * the main process got started via forking mode and not by
142 * us */
143 ExecCommand *main_command;
144
145 /* The ID of the control command currently being executed */
a16e1123 146 ServiceExecCommand control_command_id;
867b3b7d 147
613b411c
LP
148 /* Runtime data of the execution context */
149 ExecRuntime *exec_runtime;
150
034c6ed7 151 pid_t main_pid, control_pid;
07459bb6 152 int socket_fd;
16115b0a 153 bool socket_fd_selinux_context_net;
8fe914ec 154
e44da745
DM
155 int bus_endpoint_fd;
156
8fe914ec
LP
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
4b939747 180 RateLimit start_limit;
bf500566 181 FailureAction start_limit_action;
2928b0a8 182 FailureAction failure_action;
efe6e7d3 183 char *reboot_arg;
4b939747 184
57020a3a 185 UnitRef accept_socket;
4f2d528d 186
718db961 187 sd_event_source *timer_event_source;
3a111838 188 PathSpec *pid_file_pathspec;
8fe914ec
LP
189
190 NotifyAccess notify_access;
308d72dc 191 NotifyState notify_state;
a354329f
LP
192
193 ServiceFDStore *fd_store;
194 unsigned n_fd_store;
195 unsigned n_fd_store_max;
6b7e5923
PS
196
197 char *usb_function_descriptors;
198 char *usb_function_strings;
a34ceba6
LP
199
200 int stdin_fd;
201 int stdout_fd;
202 int stderr_fd;
5cb5a6ff
LP
203};
204
47be870b 205extern const UnitVTable service_vtable;
5cb5a6ff 206
16115b0a 207int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
4f2d528d 208
44a6b1b6
ZJS
209const char* service_restart_to_string(ServiceRestart i) _const_;
210ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 211
44a6b1b6
ZJS
212const char* service_type_to_string(ServiceType i) _const_;
213ServiceType service_type_from_string(const char *s) _pure_;
94f04347 214
44a6b1b6
ZJS
215const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
216ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 217
44a6b1b6
ZJS
218const char* notify_access_to_string(NotifyAccess i) _const_;
219NotifyAccess notify_access_from_string(const char *s) _pure_;
c952c6ec 220
308d72dc
LP
221const char* notify_state_to_string(NotifyState i) _const_;
222NotifyState notify_state_from_string(const char *s) _pure_;
223
44a6b1b6
ZJS
224const char* service_result_to_string(ServiceResult i) _const_;
225ServiceResult service_result_from_string(const char *s) _pure_;