]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
relicense to LGPLv2.1 (with exceptions)
[thirdparty/systemd.git] / src / core / service.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5cb5a6ff
LP
2
3#ifndef fooservicehfoo
4#define fooservicehfoo
5
a7334b09
LP
6/***
7 This file is part of systemd.
8
9 Copyright 2010 Lennart Poettering
10
11 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
12 under the terms of the GNU Lesser General Public License as published by
13 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
14 (at your option) any later version.
15
16 systemd is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 19 Lesser General Public License for more details.
a7334b09 20
5430f7f2 21 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
22 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23***/
24
5cb5a6ff
LP
25typedef struct Service Service;
26
87f0e418 27#include "unit.h"
9cf3ab0e 28#include "path.h"
1e2e8133 29#include "ratelimit.h"
57020a3a 30#include "service.h"
5cb5a6ff
LP
31
32typedef enum ServiceState {
33 SERVICE_DEAD,
34 SERVICE_START_PRE,
35 SERVICE_START,
36 SERVICE_START_POST,
37 SERVICE_RUNNING,
ba035df2 38 SERVICE_EXITED, /* Nothing is running anymore, but RemainAfterExit is true hence this is OK */
5cb5a6ff 39 SERVICE_RELOAD,
034c6ed7
LP
40 SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
41 SERVICE_STOP_SIGTERM,
42 SERVICE_STOP_SIGKILL,
5cb5a6ff 43 SERVICE_STOP_POST,
034c6ed7
LP
44 SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
45 SERVICE_FINAL_SIGKILL,
fdf20a31 46 SERVICE_FAILED,
034c6ed7 47 SERVICE_AUTO_RESTART,
5cb5a6ff 48 _SERVICE_STATE_MAX,
94f04347 49 _SERVICE_STATE_INVALID = -1
5cb5a6ff
LP
50} ServiceState;
51
034c6ed7 52typedef enum ServiceRestart {
525ee6f4 53 SERVICE_RESTART_NO,
034c6ed7 54 SERVICE_RESTART_ON_SUCCESS,
50caaedb
LP
55 SERVICE_RESTART_ON_FAILURE,
56 SERVICE_RESTART_ON_ABORT,
94f04347
LP
57 SERVICE_RESTART_ALWAYS,
58 _SERVICE_RESTART_MAX,
59 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
60} ServiceRestart;
61
62typedef enum ServiceType {
05e343b7 63 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 64 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 65 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 66 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 67 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
94f04347
LP
68 _SERVICE_TYPE_MAX,
69 _SERVICE_TYPE_INVALID = -1
034c6ed7 70} ServiceType;
5cb5a6ff
LP
71
72typedef enum ServiceExecCommand {
73 SERVICE_EXEC_START_PRE,
74 SERVICE_EXEC_START,
75 SERVICE_EXEC_START_POST,
5cb5a6ff 76 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
77 SERVICE_EXEC_STOP,
78 SERVICE_EXEC_STOP_POST,
e537352b
LP
79 _SERVICE_EXEC_COMMAND_MAX,
80 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
81} ServiceExecCommand;
82
c952c6ec
LP
83typedef enum NotifyAccess {
84 NOTIFY_NONE,
85 NOTIFY_ALL,
86 NOTIFY_MAIN,
87 _NOTIFY_ACCESS_MAX,
88 _NOTIFY_ACCESS_INVALID = -1
89} NotifyAccess;
90
f42806df
LP
91typedef enum ServiceResult {
92 SERVICE_SUCCESS,
93 SERVICE_FAILURE_RESOURCES,
94 SERVICE_FAILURE_TIMEOUT,
95 SERVICE_FAILURE_EXIT_CODE,
96 SERVICE_FAILURE_SIGNAL,
97 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 98 SERVICE_FAILURE_WATCHDOG,
f42806df
LP
99 _SERVICE_RESULT_MAX,
100 _SERVICE_RESULT_INVALID = -1
101} ServiceResult;
102
4b939747
MO
103typedef enum StartLimitAction {
104 SERVICE_START_LIMIT_NONE,
105 SERVICE_START_LIMIT_REBOOT,
106 SERVICE_START_LIMIT_REBOOT_FORCE,
107 SERVICE_START_LIMIT_REBOOT_IMMEDIATE,
108 _SERVICE_START_LIMIT_MAX,
109 _SERVICE_START_LIMIT_INVALID = -1
110} StartLimitAction;
111
5cb5a6ff 112struct Service {
ac155bb8 113 Unit meta;
5cb5a6ff 114
034c6ed7
LP
115 ServiceType type;
116 ServiceRestart restart;
117
118 /* If set we'll read the main daemon PID from this file */
119 char *pid_file;
120
121 usec_t restart_usec;
122 usec_t timeout_usec;
5cb5a6ff 123
a6927d7f 124 dual_timestamp watchdog_timestamp;
bb242b7b
MO
125 usec_t watchdog_usec;
126 Watch watchdog_watch;
a6927d7f 127
e537352b 128 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
5cb5a6ff
LP
129 ExecContext exec_context;
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
034c6ed7 147 pid_t main_pid, control_pid;
07459bb6 148 int socket_fd;
8fe914ec 149
9fff8a1f
LP
150 int fsck_passno;
151
8fe914ec
LP
152 bool permissions_start_only;
153 bool root_directory_start_only;
02ee865a 154 bool remain_after_exit;
3185a36b 155 bool guess_main_pid;
8fe914ec 156
05e343b7 157 /* If we shut down, remember why */
f42806df
LP
158 ServiceResult result;
159 ServiceResult reload_result;
e2f3b44c 160
5de6b302 161 bool main_pid_known:1;
6dfa5494 162 bool main_pid_alien:1;
05e343b7 163 bool bus_name_good:1;
47342320 164 bool forbid_restart:1;
701cc384 165 bool got_socket_fd:1;
07459bb6 166#ifdef HAVE_SYSV_COMPAT
e537352b 167 bool sysv_has_lsb:1;
5de6b302 168 bool sysv_enabled:1;
ea87ca5a 169 int sysv_start_priority_from_rcnd;
2c4104f0 170 int sysv_start_priority;
8fe914ec
LP
171
172 char *sysv_path;
8309400a 173 char *sysv_runlevels;
5f4b19f4 174 usec_t sysv_mtime;
07459bb6 175#endif
2c4104f0 176
05e343b7
LP
177 char *bus_name;
178
8c47c732
LP
179 char *status_text;
180
4b939747
MO
181 RateLimit start_limit;
182 StartLimitAction start_limit_action;
183
e537352b 184
57020a3a 185 UnitRef accept_socket;
4f2d528d 186
e537352b 187 Watch timer_watch;
3a111838 188 PathSpec *pid_file_pathspec;
8fe914ec
LP
189
190 NotifyAccess notify_access;
5cb5a6ff
LP
191};
192
47be870b 193extern const UnitVTable service_vtable;
5cb5a6ff 194
57020a3a
LP
195struct Socket;
196
6cf6bbc2 197int service_set_socket_fd(Service *s, int fd, struct Socket *socket);
4f2d528d 198
94f04347
LP
199const char* service_state_to_string(ServiceState i);
200ServiceState service_state_from_string(const char *s);
201
202const char* service_restart_to_string(ServiceRestart i);
203ServiceRestart service_restart_from_string(const char *s);
204
205const char* service_type_to_string(ServiceType i);
206ServiceType service_type_from_string(const char *s);
207
208const char* service_exec_command_to_string(ServiceExecCommand i);
209ServiceExecCommand service_exec_command_from_string(const char *s);
210
c952c6ec
LP
211const char* notify_access_to_string(NotifyAccess i);
212NotifyAccess notify_access_from_string(const char *s);
213
f42806df
LP
214const char* service_result_to_string(ServiceResult i);
215ServiceResult service_result_from_string(const char *s);
216
4b939747
MO
217const char* start_limit_action_to_string(StartLimitAction i);
218StartLimitAction start_limit_action_from_string(const char *s);
219
5cb5a6ff 220#endif