X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=execute.h;h=04b9f6ef8b945f7eb456755e5ea8a8af55056cd4;hb=fb33a393e21a15ce3b4ac8c16d947fd9b6e77206;hp=fb952d1e6a5dac5efaa934033b5a9bb4a2bcd1e7;hpb=5cb5a6ffc33667c93e9bc3572534dcaa684046e3;p=elogind.git diff --git a/execute.h b/execute.h index fb952d1e6..04b9f6ef8 100644 --- a/execute.h +++ b/execute.h @@ -14,30 +14,50 @@ typedef struct ExecContext ExecContext; #include #include "list.h" +#include "util.h" + +/* Abstract namespace! */ +#define LOGGER_SOCKET "/systemd/logger" + +typedef enum ExecOutput { + EXEC_CONSOLE, + EXEC_NULL, + EXEC_SYSLOG, + EXEC_KERNEL +} ExecOutput; struct ExecStatus { pid_t pid; - time_t timestamp; - int status; /* as in wait() */ + usec_t timestamp; + int code; /* as in siginfo_t::si_code */ + int status; /* as in sigingo_t::si_status */ }; struct ExecCommand { char *path; char **argv; - ExecStatus last_exec_status; - LIST_FIELDS(ExecCommand); + ExecStatus exec_status; + LIST_FIELDS(ExecCommand, command); /* useful for chaining commands */ }; struct ExecContext { char **environment; mode_t umask; - struct rlimit *rlimit[RLIMIT_NLIMITS]; - cap_t capabilities; - bool capabilities_set:1; - bool dumpable:1; + struct rlimit *rlimit[RLIMIT_NLIMITS]; /* FIXME: load-fragment parser missing */ + char *directory; int oom_adjust; int nice; - char *chdir; + + bool oom_adjust_set:1; + bool nice_set:1; + + ExecOutput output; + int syslog_priority; + char *syslog_identifier; + + /* FIXME: all privs related settings need parser and enforcer */ + cap_t capabilities; + bool capabilities_set:1; /* since resolving these names might might involve socket * connections and we don't want to deadlock ourselves these @@ -47,13 +67,46 @@ struct ExecContext { char **supplementary_groups; }; -int exec_spawn(const ExecCommand *command, const ExecContext *context, pid_t *ret); +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, + EXIT_SIGNAL_MASK, + EXIT_OUTPUT +} ExitStatus; + +int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds, unsigned n_fds, pid_t *ret); -void exec_context_free(ExecContext *c); void exec_command_free_list(ExecCommand *c); +void exec_command_free_array(ExecCommand **c, unsigned n); + +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); +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_context_defaults(ExecContext *c); +void exec_status_fill(ExecStatus *s, pid_t pid, int code, int status); #endif