2010-01-23 03:52:57 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef fooexecutehfoo
# define fooexecutehfoo
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>
# include "list.h"
2010-01-26 06:18:44 +03:00
# include "util.h"
2010-01-23 03:52:57 +03:00
struct ExecStatus {
pid_t pid ;
2010-01-26 06:18:44 +03:00
usec_t 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 ;
struct rlimit * rlimit [ RLIMIT_NLIMITS ] ;
int oom_adjust ;
int nice ;
2010-01-26 06:18:44 +03:00
char * directory ;
cap_t capabilities ;
bool capabilities_set : 1 ;
2010-01-23 03:52:57 +03:00
/* since resolving these names might might involve socket
* connections and we don ' t want to deadlock ourselves these
* names are resolved on execution only . */
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 ,
EXIT_OOM_ADJUST
} ExitStatus ;
int exec_spawn ( const ExecCommand * command , const ExecContext * context , int * fds , unsigned n_fds , 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 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-01-23 03:52:57 +03:00
# endif