2010-01-23 03:52:57 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef fooservicehfoo
# define fooservicehfoo
2010-02-03 15:03:47 +03:00
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
General Public License for more details .
You should have received a copy of the GNU General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2010-01-23 03:52:57 +03:00
typedef struct Service Service ;
2010-01-26 23:39:06 +03:00
# include "unit.h"
2010-01-29 06:42:57 +03:00
# include "ratelimit.h"
2010-01-23 03:52:57 +03:00
typedef enum ServiceState {
SERVICE_DEAD ,
SERVICE_START_PRE ,
SERVICE_START ,
SERVICE_START_POST ,
SERVICE_RUNNING ,
2010-04-13 04:06:27 +04:00
SERVICE_EXITED , /* Nothing is running anymore, but ValidNoProcess is true, ehnce this is OK */
2010-01-23 03:52:57 +03:00
SERVICE_RELOAD ,
2010-01-26 06:18:44 +03:00
SERVICE_STOP , /* No STOP_PRE state, instead just register multiple STOP executables */
SERVICE_STOP_SIGTERM ,
SERVICE_STOP_SIGKILL ,
2010-01-23 03:52:57 +03:00
SERVICE_STOP_POST ,
2010-01-26 06:18:44 +03:00
SERVICE_FINAL_SIGTERM , /* In case the STOP_POST executable hangs, we shoot that down, too */
SERVICE_FINAL_SIGKILL ,
2010-01-23 03:52:57 +03:00
SERVICE_MAINTAINANCE ,
2010-01-26 06:18:44 +03:00
SERVICE_AUTO_RESTART ,
2010-01-23 03:52:57 +03:00
_SERVICE_STATE_MAX ,
2010-01-30 03:55:42 +03:00
_SERVICE_STATE_INVALID = - 1
2010-01-23 03:52:57 +03:00
} ServiceState ;
2010-01-26 06:18:44 +03:00
typedef enum ServiceRestart {
2010-01-23 03:52:57 +03:00
SERVICE_ONCE ,
2010-01-26 06:18:44 +03:00
SERVICE_RESTART_ON_SUCCESS ,
2010-01-30 03:55:42 +03:00
SERVICE_RESTART_ALWAYS ,
_SERVICE_RESTART_MAX ,
_SERVICE_RESTART_INVALID = - 1
2010-01-26 06:18:44 +03:00
} ServiceRestart ;
typedef enum ServiceType {
2010-01-30 03:55:42 +03:00
SERVICE_FORKING , /* forks by itself (i.e. traditional daemons) */
2010-04-16 01:16:16 +04:00
SERVICE_SIMPLE , /* we fork and go on right-away (i.e. modern socket activated daemons) */
2010-01-30 03:55:42 +03:00
SERVICE_FINISH , /* we fork and wait until the program finishes (i.e. programs like fsck which run and need to finish before we continue) */
2010-04-16 01:16:16 +04:00
SERVICE_DBUS , /* we fork and wait until a specific D-Bus name appears on the bus */
2010-01-30 03:55:42 +03:00
_SERVICE_TYPE_MAX ,
_SERVICE_TYPE_INVALID = - 1
2010-01-26 06:18:44 +03:00
} ServiceType ;
2010-01-23 03:52:57 +03:00
typedef enum ServiceExecCommand {
SERVICE_EXEC_START_PRE ,
SERVICE_EXEC_START ,
SERVICE_EXEC_START_POST ,
SERVICE_EXEC_RELOAD ,
SERVICE_EXEC_STOP ,
SERVICE_EXEC_STOP_POST ,
2010-04-10 19:53:17 +04:00
_SERVICE_EXEC_COMMAND_MAX ,
_SERVICE_EXEC_COMMAND_INVALID = - 1
2010-01-23 03:52:57 +03:00
} ServiceExecCommand ;
struct Service {
Meta meta ;
2010-01-26 06:18:44 +03:00
ServiceType type ;
ServiceRestart restart ;
/* If set we'll read the main daemon PID from this file */
char * pid_file ;
usec_t restart_usec ;
usec_t timeout_usec ;
2010-01-23 03:52:57 +03:00
2010-04-10 19:53:17 +04:00
ExecCommand * exec_command [ _SERVICE_EXEC_COMMAND_MAX ] ;
2010-01-23 03:52:57 +03:00
ExecContext exec_context ;
2010-02-15 00:43:08 +03:00
bool permissions_start_only ;
bool root_directory_start_only ;
2010-03-31 18:29:55 +04:00
bool valid_no_process ;
2010-02-15 00:43:08 +03:00
2010-04-21 05:27:44 +04:00
ServiceState state , deserialized_state ;
2010-01-26 06:18:44 +03:00
2010-04-08 02:52:14 +04:00
KillMode kill_mode ;
2010-01-26 06:18:44 +03:00
ExecStatus main_exec_status ;
ExecCommand * control_command ;
2010-04-21 05:27:44 +04:00
ServiceExecCommand control_command_id ;
2010-01-26 06:18:44 +03:00
pid_t main_pid , control_pid ;
bool main_pid_known : 1 ;
2010-01-23 03:52:57 +03:00
2010-04-16 01:16:16 +04:00
/* If we shut down, remember why */
bool failure : 1 ;
bool bus_name_good : 1 ;
2010-01-29 06:42:57 +03:00
2010-04-21 08:01:13 +04:00
bool got_socket_fd : 1 ;
2010-04-10 19:53:17 +04:00
bool sysv_has_lsb : 1 ;
2010-02-14 03:09:01 +03:00
char * sysv_path ;
int sysv_start_priority ;
2010-04-07 22:27:52 +04:00
char * sysv_runlevels ;
2010-02-14 03:09:01 +03:00
2010-04-16 01:16:16 +04:00
char * bus_name ;
2010-01-29 06:42:57 +03:00
RateLimit ratelimit ;
2010-04-10 19:53:17 +04:00
2010-04-15 08:19:54 +04:00
int socket_fd ;
2010-04-10 19:53:17 +04:00
Watch timer_watch ;
2010-01-23 03:52:57 +03:00
} ;
2010-02-03 16:21:48 +03:00
extern const UnitVTable service_vtable ;
2010-01-23 03:52:57 +03:00
2010-04-15 08:19:54 +04:00
int service_set_socket_fd ( Service * s , int fd ) ;
2010-01-30 03:55:42 +03:00
const char * service_state_to_string ( ServiceState i ) ;
ServiceState service_state_from_string ( const char * s ) ;
const char * service_restart_to_string ( ServiceRestart i ) ;
ServiceRestart service_restart_from_string ( const char * s ) ;
const char * service_type_to_string ( ServiceType i ) ;
ServiceType service_type_from_string ( const char * s ) ;
const char * service_exec_command_to_string ( ServiceExecCommand i ) ;
ServiceExecCommand service_exec_command_from_string ( const char * s ) ;
2010-01-23 03:52:57 +03:00
# endif