]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/service.h
unit: reduce heap usage for unit objects
[thirdparty/systemd.git] / src / 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
12 under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
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
19 General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
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
5cb5a6ff
LP
91struct Service {
92 Meta meta;
93
034c6ed7
LP
94 ServiceType type;
95 ServiceRestart restart;
96
97 /* If set we'll read the main daemon PID from this file */
98 char *pid_file;
99
100 usec_t restart_usec;
101 usec_t timeout_usec;
5cb5a6ff 102
e537352b 103 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
5cb5a6ff
LP
104 ExecContext exec_context;
105
a16e1123 106 ServiceState state, deserialized_state;
034c6ed7 107
867b3b7d 108 /* The exit status of the real main process */
034c6ed7
LP
109 ExecStatus main_exec_status;
110
867b3b7d 111 /* The currently executed control process */
034c6ed7 112 ExecCommand *control_command;
867b3b7d
LP
113
114 /* The currently executed main process, which may be NULL if
115 * the main process got started via forking mode and not by
116 * us */
117 ExecCommand *main_command;
118
119 /* The ID of the control command currently being executed */
a16e1123 120 ServiceExecCommand control_command_id;
867b3b7d 121
034c6ed7 122 pid_t main_pid, control_pid;
07459bb6 123 int socket_fd;
8fe914ec 124
9fff8a1f
LP
125 int fsck_passno;
126
8fe914ec
LP
127 bool permissions_start_only;
128 bool root_directory_start_only;
02ee865a 129 bool remain_after_exit;
3185a36b 130 bool guess_main_pid;
8fe914ec 131
05e343b7
LP
132 /* If we shut down, remember why */
133 bool failure:1;
e2f3b44c
LP
134 bool reload_failure:1;
135
5de6b302 136 bool main_pid_known:1;
6dfa5494 137 bool main_pid_alien:1;
05e343b7 138 bool bus_name_good:1;
47342320 139 bool forbid_restart:1;
701cc384 140 bool got_socket_fd:1;
07459bb6 141#ifdef HAVE_SYSV_COMPAT
e537352b 142 bool sysv_has_lsb:1;
5de6b302 143 bool sysv_enabled:1;
ea87ca5a 144 int sysv_start_priority_from_rcnd;
2c4104f0 145 int sysv_start_priority;
8fe914ec
LP
146
147 char *sysv_path;
8309400a 148 char *sysv_runlevels;
5f4b19f4 149 usec_t sysv_mtime;
07459bb6 150#endif
2c4104f0 151
05e343b7
LP
152 char *bus_name;
153
8c47c732
LP
154 char *status_text;
155
1e2e8133 156 RateLimit ratelimit;
e537352b 157
57020a3a 158 UnitRef accept_socket;
4f2d528d 159
e537352b 160 Watch timer_watch;
3a111838 161 PathSpec *pid_file_pathspec;
8fe914ec
LP
162
163 NotifyAccess notify_access;
5cb5a6ff
LP
164};
165
47be870b 166extern const UnitVTable service_vtable;
5cb5a6ff 167
57020a3a
LP
168struct Socket;
169
6cf6bbc2 170int service_set_socket_fd(Service *s, int fd, struct Socket *socket);
4f2d528d 171
94f04347
LP
172const char* service_state_to_string(ServiceState i);
173ServiceState service_state_from_string(const char *s);
174
175const char* service_restart_to_string(ServiceRestart i);
176ServiceRestart service_restart_from_string(const char *s);
177
178const char* service_type_to_string(ServiceType i);
179ServiceType service_type_from_string(const char *s);
180
181const char* service_exec_command_to_string(ServiceExecCommand i);
182ServiceExecCommand service_exec_command_from_string(const char *s);
183
c952c6ec
LP
184const char* notify_access_to_string(NotifyAccess i);
185NotifyAccess notify_access_from_string(const char *s);
186
5cb5a6ff 187#endif