struct pakfire_jail;
-enum pakfire_jail_flags {
- PAKFIRE_JAIL_NONE = 0,
-};
-
-int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire, int flags);
+int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire);
struct pakfire_jail* pakfire_jail_ref(struct pakfire_jail* jail);
struct pakfire_jail* pakfire_jail_unref(struct pakfire_jail* jail);
typedef int (*pakfire_jail_communicate_out)
(struct pakfire* pakfire, void* data, int priority, const char* line, const size_t length);
+enum pakfire_jail_exec_flags {
+ PAKFIRE_JAIL_HAS_NETWORKING = (1 << 0),
+ PAKFIRE_JAIL_NOENT_OK = (1 << 1),
+};
+
int pakfire_jail_exec(
struct pakfire_jail* jail,
const char* argv[],
pakfire_jail_communicate_in callback_in,
pakfire_jail_communicate_out callback_out,
- void* data);
+ void* data,
+ int flags);
#ifdef PAKFIRE_PRIVATE
uuid_t uuid;
char __uuid[UUID_STR_LEN];
- // Flags
- int flags;
-
// Resource Limits
int nice;
size_t used;
};
-enum pakfire_jail_exec_flags {
- PAKFIRE_JAIL_HAS_NETWORKING = (1 << 0),
-};
-
struct pakfire_jail_exec {
int flags;
return 0;
}
-PAKFIRE_EXPORT int pakfire_jail_create(struct pakfire_jail** jail,
- struct pakfire* pakfire, int flags) {
+PAKFIRE_EXPORT int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire) {
int r;
const char* arch = pakfire_get_arch(pakfire);
// Initialize reference counter
j->nrefs = 1;
- // Store flags
- j->flags = flags;
-
// Generate a random UUID
uuid_generate_random(j->uuid);
// exec() command
r = execvpe(argv[0], (char**)argv, jail->env);
- if (r < 0)
- ERROR(jail->pakfire, "Could not execve(%s): %m\n", argv[0]);
+ if (r < 0) {
+ // Translate errno into regular exit code
+ switch (errno) {
+ case ENOENT:
+ // Ignore if the command doesn't exist
+ if (ctx->flags & PAKFIRE_JAIL_NOENT_OK)
+ r = 0;
+ else
+ r = 127;
- // Translate errno into regular exit code
- switch (errno) {
- case ENOENT:
- r = 127;
- break;
+ break;
- default:
- r = 1;
+ default:
+ r = 1;
+ }
+
+ ERROR(jail->pakfire, "Could not execve(%s): %m\n", argv[0]);
}
// We should not get here
const int interactive,
pakfire_jail_communicate_in communicate_in,
pakfire_jail_communicate_out communicate_out,
- void* data) {
+ void* data, int flags) {
int exit = -1;
int r;
// Initialize context for this call
struct pakfire_jail_exec ctx = {
- .flags = 0,
+ .flags = flags,
.pipes = {
.stdin = { 0, 0 },
const char* argv[],
pakfire_jail_communicate_in callback_in,
pakfire_jail_communicate_out callback_out,
- void* data) {
- return __pakfire_jail_exec(jail, argv, 0, callback_in, callback_out, data);
+ void* data, int flags) {
+ return __pakfire_jail_exec(jail, argv, 0, callback_in, callback_out, data, flags);
}
static int pakfire_jail_exec_interactive(
- struct pakfire_jail* jail, const char* argv[]) {
+ struct pakfire_jail* jail, const char* argv[], int flags) {
int r;
// Setup interactive stuff
if (r)
return r;
- return __pakfire_jail_exec(jail, argv, 1, NULL, NULL, NULL);
+ return __pakfire_jail_exec(jail, argv, 1, NULL, NULL, NULL, flags);
}
int pakfire_jail_exec_script(struct pakfire_jail* jail,
argv[i] = args[i-1];
// Run the script
- r = pakfire_jail_exec(jail, argv, callback_in, callback_out, data);
+ r = pakfire_jail_exec(jail, argv, callback_in, callback_out, data, 0);
ERROR:
if (argv)
int r;
// Create a new jail
- r = pakfire_jail_create(&jail, pakfire, flags);
+ r = pakfire_jail_create(&jail, pakfire);
if (r)
goto ERROR;
// Execute the command
- r = pakfire_jail_exec(jail, argv, NULL, pakfire_jail_capture_stdout, output);
+ r = pakfire_jail_exec(jail, argv, NULL, pakfire_jail_capture_stdout, output, 0);
ERROR:
if (jail)
int r;
// Create a new jail
- r = pakfire_jail_create(&jail, pakfire, flags);
+ r = pakfire_jail_create(&jail, pakfire);
if (r)
goto ERROR;
};
// Execute /bin/bash
- return pakfire_jail_exec_interactive(jail, argv);
+ return pakfire_jail_exec_interactive(jail, argv, 0);
}
static int pakfire_jail_run_if_possible(struct pakfire* pakfire, const char** argv) {