2010-01-23 07:52:57 +07: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"
|
|
|
|
|
|
|
|
struct ExecStatus {
|
|
|
|
pid_t pid;
|
|
|
|
time_t timestamp;
|
2010-01-24 06:39:29 +07:00
|
|
|
int code; /* as in siginfo_t::si_code */
|
|
|
|
int status; /* as in sigingo_t::si_status */
|
2010-01-23 07:52:57 +07:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ExecCommand {
|
|
|
|
char *path;
|
|
|
|
char **argv;
|
|
|
|
ExecStatus last_exec_status;
|
|
|
|
LIST_FIELDS(ExecCommand);
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ExecContext {
|
|
|
|
char **environment;
|
|
|
|
mode_t umask;
|
|
|
|
struct rlimit *rlimit[RLIMIT_NLIMITS];
|
|
|
|
cap_t capabilities;
|
|
|
|
bool capabilities_set:1;
|
|
|
|
bool dumpable:1;
|
|
|
|
int oom_adjust;
|
|
|
|
int nice;
|
|
|
|
char *chdir;
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
};
|
|
|
|
|
|
|
|
int exec_spawn(const ExecCommand *command, const ExecContext *context, pid_t *ret);
|
|
|
|
|
|
|
|
void exec_context_free(ExecContext *c);
|
|
|
|
void exec_command_free_list(ExecCommand *c);
|
|
|
|
|
|
|
|
void exec_context_dump(ExecContext *c, FILE* f, const char *prefix);
|
|
|
|
|
|
|
|
void exec_context_defaults(ExecContext *c);
|
|
|
|
|
|
|
|
#endif
|