X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=execute.h;h=5c2d15787eb1f084bff73b802c3439a6ede9ae25;hp=cb69bb3bd82c43f8f2b06116b76e69053a5133ed;hb=afb757b1a8a416b3c692728330a266b3915eef41;hpb=8e27452380193a5f81bfd08a59aab8b07008ba0b diff --git a/execute.h b/execute.h index cb69bb3bd..5c2d15787 100644 --- a/execute.h +++ b/execute.h @@ -41,25 +41,31 @@ struct CGroupBonding; /* Abstract namespace! */ #define LOGGER_SOCKET "/org/freedesktop/systemd1/logger" +typedef enum ExecInput { + EXEC_INPUT_NULL, + EXEC_INPUT_TTY, + EXEC_INPUT_TTY_FORCE, + EXEC_INPUT_TTY_FAIL, + EXEC_INPUT_SOCKET, + _EXEC_INPUT_MAX, + _EXEC_INPUT_INVALID = -1 +} ExecInput; + typedef enum ExecOutput { - EXEC_OUTPUT_CONSOLE, + EXEC_OUTPUT_INHERIT, EXEC_OUTPUT_NULL, + EXEC_OUTPUT_TTY, EXEC_OUTPUT_SYSLOG, EXEC_OUTPUT_KERNEL, + EXEC_OUTPUT_SOCKET, _EXEC_OUTPUT_MAX, _EXEC_OUTPUT_INVALID = -1 } ExecOutput; -typedef enum ExecInput { - EXEC_INPUT_NULL, - EXEC_INPUT_CONSOLE, - _EXEC_INPUT_MAX, - _EXEC_INPUT_INVALID = -1 -} ExecInput; - struct ExecStatus { + usec_t start_timestamp; + usec_t exit_timestamp; pid_t pid; - usec_t timestamp; int code; /* as in siginfo_t::si_code */ int status; /* as in sigingo_t::si_status */ }; @@ -73,35 +79,27 @@ struct ExecCommand { struct ExecContext { char **environment; - mode_t umask; struct rlimit *rlimit[RLIMIT_NLIMITS]; char *working_directory, *root_directory; + + mode_t umask; int oom_adjust; int nice; int ioprio; int cpu_sched_policy; int cpu_sched_priority; + cpu_set_t cpu_affinity; unsigned long timer_slack_ns; - bool oom_adjust_set:1; - bool nice_set:1; - bool ioprio_set:1; - bool cpu_sched_set:1; - bool cpu_affinity_set:1; - bool timer_slack_ns_set:1; - - bool cpu_sched_reset_on_fork; - bool non_blocking; + ExecInput std_input; + ExecOutput std_output; + ExecOutput std_error; - ExecInput input; - ExecOutput output; int syslog_priority; char *syslog_identifier; - cap_t capabilities; - int secure_bits; - uint64_t capability_bounding_set_drop; + char *tty_path; /* Since resolving these names might might involve socket * connections and we don't want to deadlock ourselves these @@ -110,6 +108,32 @@ struct ExecContext { char *user; char *group; char **supplementary_groups; + + char **read_write_dirs, **read_only_dirs, **inaccessible_dirs; + unsigned long mount_flags; + + uint64_t capability_bounding_set_drop; + + cap_t capabilities; + int secure_bits; + + bool cpu_sched_reset_on_fork; + bool non_blocking; + bool private_tmp; + + bool oom_adjust_set:1; + bool nice_set:1; + bool ioprio_set:1; + bool cpu_sched_set:1; + bool cpu_affinity_set:1; + bool timer_slack_ns_set:1; + + /* This is not exposed to the user but available + * internally. We need it to make sure that whenever we spawn + * /bin/mount it is run in the same process group as us so + * that the autofs logic detects that it belongs to us and we + * don't enter a trigger loop. */ + bool no_setsid:1; }; typedef enum ExitStatus { @@ -136,10 +160,9 @@ typedef enum ExitStatus { EXIT_LIMITS, EXIT_OOM_ADJUST, EXIT_SIGNAL_MASK, - EXIT_INPUT, - EXIT_OUTPUT, + EXIT_STDIN, + EXIT_STDOUT, EXIT_CHROOT, /* 210 */ - EXIT_PGID, EXIT_IOPRIO, EXIT_TIMERSLACK, EXIT_SECUREBITS, @@ -148,30 +171,43 @@ typedef enum ExitStatus { EXIT_GROUP, EXIT_USER, EXIT_CAPABILITIES, - EXIT_CGROUP + EXIT_CGROUP, + EXIT_SETSID, /* 220 */ + EXIT_CONFIRM, + EXIT_STDERR + } ExitStatus; -int exec_spawn(const ExecCommand *command, +int exec_spawn(ExecCommand *command, + char **argv, const ExecContext *context, - int *fds, unsigned n_fds, + int fds[], unsigned n_fds, + char **environment, bool apply_permissions, bool apply_chroot, + bool confirm_spawn, struct CGroupBonding *cgroup_bondings, pid_t *ret); +void exec_command_done(ExecCommand *c); +void exec_command_done_array(ExecCommand *c, unsigned n); + void exec_command_free_list(ExecCommand *c); void exec_command_free_array(ExecCommand **c, unsigned n); -char *exec_command_line(ExecCommand *c); +char *exec_command_line(char **argv); + void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix); void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix); void exec_command_append_list(ExecCommand **l, ExecCommand *e); +int exec_command_set(ExecCommand *c, const char *path, ...); void exec_context_init(ExecContext *c); void exec_context_done(ExecContext *c); void exec_context_dump(ExecContext *c, FILE* f, const char *prefix); void exec_status_fill(ExecStatus *s, pid_t pid, int code, int status); +void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix); const char* exec_output_to_string(ExecOutput i); int exec_output_from_string(const char *s); @@ -179,4 +215,6 @@ int exec_output_from_string(const char *s); const char* exec_input_to_string(ExecInput i); int exec_input_from_string(const char *s); +const char* exit_status_to_string(ExitStatus status); + #endif