2010-01-23 03:52:57 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef fooexecutehfoo
# define fooexecutehfoo
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 ExecStatus ExecStatus ;
typedef struct ExecCommand ExecCommand ;
typedef struct ExecContext ExecContext ;
# include <sys/time.h>
# include <sys/resource.h>
# include <sys/capability.h>
# include <stdbool.h>
# include <stdio.h>
2010-01-30 03:55:42 +03:00
# include <sched.h>
2010-01-23 03:52:57 +03:00
2010-03-31 18:29:55 +04:00
struct CGroupBonding ;
2010-01-23 03:52:57 +03:00
# include "list.h"
2010-01-26 06:18:44 +03:00
# include "util.h"
2010-01-23 03:52:57 +03:00
2010-01-28 04:06:20 +03:00
/* Abstract namespace! */
2010-03-31 18:26:24 +04:00
# define LOGGER_SOCKET " / org / freedesktop / systemd1 / logger"
2010-01-28 04:06:20 +03:00
typedef enum ExecOutput {
2010-01-30 03:55:42 +03:00
EXEC_OUTPUT_CONSOLE ,
EXEC_OUTPUT_NULL ,
EXEC_OUTPUT_SYSLOG ,
EXEC_OUTPUT_KERNEL ,
_EXEC_OUTPUT_MAX ,
_EXEC_OUTPUT_INVALID = - 1
2010-01-28 04:06:20 +03:00
} ExecOutput ;
2010-01-30 03:55:42 +03:00
typedef enum ExecInput {
EXEC_INPUT_NULL ,
EXEC_INPUT_CONSOLE ,
_EXEC_INPUT_MAX ,
_EXEC_INPUT_INVALID = - 1
} ExecInput ;
2010-01-23 03:52:57 +03:00
struct ExecStatus {
pid_t pid ;
2010-04-10 07:03:14 +04:00
usec_t start_timestamp ;
usec_t exit_timestamp ;
2010-01-24 02:39:29 +03:00
int code ; /* as in siginfo_t::si_code */
int status ; /* as in sigingo_t::si_status */
2010-01-23 03:52:57 +03:00
} ;
struct ExecCommand {
char * path ;
char * * argv ;
2010-01-26 06:18:44 +03:00
ExecStatus exec_status ;
LIST_FIELDS ( ExecCommand , command ) ; /* useful for chaining commands */
2010-01-23 03:52:57 +03:00
} ;
struct ExecContext {
char * * environment ;
mode_t umask ;
2010-01-30 03:55:42 +03:00
struct rlimit * rlimit [ RLIMIT_NLIMITS ] ;
2010-01-29 22:46:22 +03:00
char * working_directory , * root_directory ;
2010-01-23 03:52:57 +03:00
int oom_adjust ;
int nice ;
2010-01-29 22:46:22 +03:00
int ioprio ;
2010-01-30 03:55:42 +03:00
int cpu_sched_policy ;
int cpu_sched_priority ;
cpu_set_t cpu_affinity ;
unsigned long timer_slack_ns ;
2010-01-28 04:53:56 +03:00
bool oom_adjust_set : 1 ;
bool nice_set : 1 ;
2010-01-29 22:46:22 +03:00
bool ioprio_set : 1 ;
2010-01-30 03:55:42 +03:00
bool cpu_sched_set : 1 ;
bool cpu_affinity_set : 1 ;
bool timer_slack_ns_set : 1 ;
2010-01-26 06:18:44 +03:00
2010-02-02 14:50:04 +03:00
bool cpu_sched_reset_on_fork ;
2010-02-12 04:00:18 +03:00
bool non_blocking ;
2010-04-08 01:23:58 +04:00
bool new_session ;
2010-02-02 14:50:04 +03:00
2010-01-30 03:55:42 +03:00
ExecInput input ;
2010-01-28 04:06:20 +03:00
ExecOutput output ;
int syslog_priority ;
char * syslog_identifier ;
2010-01-26 06:18:44 +03:00
cap_t capabilities ;
2010-01-30 03:55:42 +03:00
int secure_bits ;
uint64_t capability_bounding_set_drop ;
2010-01-23 03:52:57 +03:00
2010-01-30 03:55:42 +03:00
/* Since resolving these names might might involve socket
2010-01-23 03:52:57 +03:00
* connections and we don ' t want to deadlock ourselves these
2010-01-30 03:55:42 +03:00
* names are resolved on execution only and in the child
* process . */
2010-01-23 03:52:57 +03:00
char * user ;
char * group ;
char * * supplementary_groups ;
} ;
2010-01-26 06:18:44 +03:00
typedef enum ExitStatus {
/* EXIT_SUCCESS defined by libc */
/* EXIT_FAILURE defined by libc */
EXIT_INVALIDARGUMENT = 2 ,
EXIT_NOTIMPLEMENTED = 3 ,
EXIT_NOPERMISSION = 4 ,
EXIT_NOTINSTALLED = 5 ,
EXIT_NOTCONFIGURED = 6 ,
EXIT_NOTRUNNING = 7 ,
/* The LSB suggests that error codes >= 200 are "reserved". We
* use them here under the assumption that they hence are
* unused by init scripts .
*
* http : //refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html */
EXIT_CHDIR = 200 ,
EXIT_NICE ,
EXIT_FDS ,
EXIT_EXEC ,
EXIT_MEMORY ,
EXIT_LIMITS ,
2010-01-27 08:17:51 +03:00
EXIT_OOM_ADJUST ,
2010-01-28 04:06:20 +03:00
EXIT_SIGNAL_MASK ,
2010-01-30 03:55:42 +03:00
EXIT_INPUT ,
2010-01-29 22:46:22 +03:00
EXIT_OUTPUT ,
2010-02-15 00:43:08 +03:00
EXIT_CHROOT , /* 210 */
2010-01-29 22:46:22 +03:00
EXIT_PGID ,
2010-01-30 03:55:42 +03:00
EXIT_IOPRIO ,
EXIT_TIMERSLACK ,
EXIT_SECUREBITS ,
EXIT_SETSCHEDULER ,
2010-02-15 00:43:08 +03:00
EXIT_CPUAFFINITY ,
EXIT_GROUP ,
EXIT_USER ,
2010-03-31 18:29:55 +04:00
EXIT_CAPABILITIES ,
2010-04-08 01:23:58 +04:00
EXIT_CGROUP , /* 220 */
EXIT_SETSID
2010-01-26 06:18:44 +03:00
} ExitStatus ;
2010-04-10 07:03:14 +04:00
int exec_spawn ( ExecCommand * command ,
2010-02-15 00:43:08 +03:00
const ExecContext * context ,
int * fds , unsigned n_fds ,
bool apply_permissions ,
bool apply_chroot ,
2010-03-31 18:29:55 +04:00
struct CGroupBonding * cgroup_bondings ,
2010-02-15 00:43:08 +03:00
pid_t * ret ) ;
2010-01-23 03:52:57 +03:00
void exec_command_free_list ( ExecCommand * c ) ;
2010-01-26 06:18:44 +03:00
void exec_command_free_array ( ExecCommand * * c , unsigned n ) ;
2010-01-23 03:52:57 +03:00
2010-01-26 09:02:51 +03:00
char * exec_command_line ( ExecCommand * c ) ;
void exec_command_dump ( ExecCommand * c , FILE * f , const char * prefix ) ;
void exec_command_dump_list ( ExecCommand * c , FILE * f , const char * prefix ) ;
2010-02-14 03:05:55 +03:00
void exec_command_append_list ( ExecCommand * * l , ExecCommand * e ) ;
2010-04-10 19:46:41 +04:00
int exec_command_set ( ExecCommand * c , const char * path , . . . ) ;
2010-01-26 09:02:51 +03:00
2010-01-26 06:18:44 +03:00
void exec_context_init ( ExecContext * c ) ;
void exec_context_done ( ExecContext * c ) ;
2010-01-23 03:52:57 +03:00
void exec_context_dump ( ExecContext * c , FILE * f , const char * prefix ) ;
2010-01-26 06:18:44 +03:00
void exec_status_fill ( ExecStatus * s , pid_t pid , int code , int status ) ;
2010-04-10 07:03:14 +04:00
void exec_status_dump ( ExecStatus * s , FILE * f , const char * prefix ) ;
2010-01-23 03:52:57 +03:00
2010-01-30 03:55:42 +03:00
const char * exec_output_to_string ( ExecOutput i ) ;
int exec_output_from_string ( const char * s ) ;
const char * exec_input_to_string ( ExecInput i ) ;
int exec_input_from_string ( const char * s ) ;
2010-01-23 03:52:57 +03:00
# endif