execute.h revision 15ae422b7471cf6f41ccf450243d8afd8ea0a054
337eebb936be1da1215535e866965ce54c82d755Lennart Poettering/*-*- Mode: C; c-basic-offset: 8 -*-*/
652e737517bbbae692923246aeb687e2d1f314efZbigniew Jędrzejewski-Szmek
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poettering#ifndef fooexecutehfoo
652e737517bbbae692923246aeb687e2d1f314efZbigniew Jędrzejewski-Szmek#define fooexecutehfoo
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering/***
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering This file is part of systemd.
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering Copyright 2010 Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering systemd is free software; you can redistribute it and/or modify it
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering under the terms of the GNU General Public License as published by
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering the Free Software Foundation; either version 2 of the License, or
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering (at your option) any later version.
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering systemd is distributed in the hope that it will be useful, but
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
652e737517bbbae692923246aeb687e2d1f314efZbigniew Jędrzejewski-Szmek General Public License for more details.
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering You should have received a copy of the GNU General Public License
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering***/
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poetteringtypedef struct ExecStatus ExecStatus;
93a1d735aca5584a005d851f12cb0b8c7bb5e5caLennart Poetteringtypedef struct ExecCommand ExecCommand;
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poetteringtypedef struct ExecContext ExecContext;
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include <sys/time.h>
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include <sys/resource.h>
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include <sys/capability.h>
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include <stdbool.h>
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include <stdio.h>
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include <sched.h>
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poetteringstruct CGroupBonding;
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include "list.h"
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering#include "util.h"
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering/* Abstract namespace! */
3a67e927e3be7efb8edf314a31aa4f8f5cba4f53Tom Gundersen#define LOGGER_SOCKET "/org/freedesktop/systemd1/logger"
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poetteringtypedef enum ExecInput {
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_INPUT_NULL,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_INPUT_TTY,
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poettering EXEC_INPUT_TTY_FORCE,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_INPUT_TTY_FAIL,
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poettering EXEC_INPUT_SOCKET,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering _EXEC_INPUT_MAX,
2b93b027d3a68b5d7ae26d0c2cd487eb5019d2a9Lennart Poettering _EXEC_INPUT_INVALID = -1
091a364c802e34a58f3260c9cb5db9b75c62215cTom Gundersen} ExecInput;
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering
0e0320e04500d1e68630b3973714f14cfb7b3450Lennart Poetteringtypedef enum ExecOutput {
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_OUTPUT_INHERIT,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_OUTPUT_NULL,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_OUTPUT_TTY,
a91df40e69fec72cc98c9829721fa5153da28bc2Kay Sievers EXEC_OUTPUT_SYSLOG,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_OUTPUT_KERNEL,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering EXEC_OUTPUT_SOCKET,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering _EXEC_OUTPUT_MAX,
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering _EXEC_OUTPUT_INVALID = -1
f13b388f97bc3ba8db844bd3413d510e2466a0b6Kay Sievers} ExecOutput;
f13b388f97bc3ba8db844bd3413d510e2466a0b6Kay Sievers
51dfddc2cceb345ffc994014e4a4b3f2d2d3a3aaColin Guthriestruct ExecStatus {
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering usec_t start_timestamp;
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering usec_t exit_timestamp;
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering pid_t pid;
7c9a6f906308a6474f1ebb98058c4a33a02c33f1Lennart Poettering int code; /* as in siginfo_t::si_code */
08c51903fb895e836866b8e7a09f0523b72b9aafMarc-Antoine Perennou int status; /* as in sigingo_t::si_status */
};
struct ExecCommand {
char *path;
char **argv;
ExecStatus exec_status;
LIST_FIELDS(ExecCommand, command); /* useful for chaining commands */
};
struct ExecContext {
char **environment;
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;
ExecInput std_input;
ExecOutput std_output;
ExecOutput std_error;
int syslog_priority;
char *syslog_identifier;
char *tty_path;
/* Since resolving these names might might involve socket
* connections and we don't want to deadlock ourselves these
* names are resolved on execution only and in the child
* process. */
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 {
/* 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_STDIN,
EXIT_STDOUT,
EXIT_CHROOT, /* 210 */
EXIT_IOPRIO,
EXIT_TIMERSLACK,
EXIT_SECUREBITS,
EXIT_SETSCHEDULER,
EXIT_CPUAFFINITY,
EXIT_GROUP,
EXIT_USER,
EXIT_CAPABILITIES,
EXIT_CGROUP,
EXIT_SETSID, /* 220 */
EXIT_CONFIRM,
EXIT_STDERR
} ExitStatus;
int exec_spawn(ExecCommand *command,
char **argv,
const ExecContext *context,
int fds[], unsigned n_fds,
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(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);
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