};
// Create a new jail
- r = pakfire_jail_create(&jail, archive->root);
+ r = pakfire_jail_create(&jail, archive->ctx, archive->root);
if (r)
goto ERROR;
int r;
// Create a new jail
- r = pakfire_jail_create(&build->jail, build->root);
+ r = pakfire_jail_create(&build->jail, build->ctx, build->root);
if (r) {
ERROR(build->ctx, "Could not create jail for build %s: %m\n", build->_id);
return r;
return jail->__uuid;
}
-int pakfire_jail_create(pakfire_jail** jail, pakfire_root* root) {
+int pakfire_jail_create(pakfire_jail** jail, pakfire_ctx* ctx, pakfire_root* root) {
pakfire_jail* self = NULL;
int r;
return -errno;
// Reference context
- self->ctx = pakfire_root_get_ctx(root);
+ self->ctx = pakfire_ctx_ref(ctx);
// Reference to the root
self->root = pakfire_root_ref(root);
A convenience function that creates a new jail, runs the given command and destroys
the jail again.
*/
-int pakfire_jail_run(pakfire_root* root, const char* argv[], pakfire_env* env,
+int pakfire_jail_run(pakfire_ctx* ctx, pakfire_root* root, const char* argv[], pakfire_env* env,
int flags, char** output, size_t* output_length) {
pakfire_jail* jail = NULL;
int r;
// Create a new jail
- r = pakfire_jail_create(&jail, root);
+ r = pakfire_jail_create(&jail, ctx, root);
if (r)
goto ERROR;
return r;
}
-int pakfire_jail_run_script(pakfire_root* root, const char* script, const size_t length,
+int pakfire_jail_run_script(pakfire_ctx* ctx, pakfire_root* root, const char* script, const size_t length,
const char* argv[], pakfire_env* env, int flags) {
pakfire_jail* jail = NULL;
int r;
// Create a new jail
- r = pakfire_jail_create(&jail, root);
+ r = pakfire_jail_create(&jail, ctx, root);
if (r)
goto ERROR;
return r;
}
-static int pakfire_jail_run_if_possible(pakfire_root* root, const char** argv) {
+static int pakfire_jail_run_if_possible(pakfire_ctx* ctx, pakfire_root* root, const char** argv) {
char path[PATH_MAX];
int r;
- // Fetch the context
- pakfire_ctx* ctx = pakfire_root_get_ctx(root);
-
r = pakfire_root_path(root, path, "%s", *argv);
- if (r)
- goto ERROR;
+ if (r < 0)
+ return r;
// Check if the file is executable
r = access(path, X_OK);
if (r) {
DEBUG(ctx, "%s is not executable. Skipping...\n", *argv);
- goto ERROR;
+ return r;
}
- r = pakfire_jail_run(root, argv, NULL, 0, NULL, NULL);
-
-ERROR:
- if (ctx)
- pakfire_ctx_unref(ctx);
-
- return r;
+ return pakfire_jail_run(ctx, root, argv, NULL, 0, NULL, NULL);
}
-int pakfire_jail_ldconfig(pakfire_root* root) {
+int pakfire_jail_ldconfig(pakfire_ctx* ctx, pakfire_root* root) {
const char* argv[] = {
"/sbin/ldconfig",
NULL,
};
- return pakfire_jail_run_if_possible(root, argv);
+ return pakfire_jail_run_if_possible(ctx, root, argv);
}
-int pakfire_jail_run_systemd_tmpfiles(pakfire_root* root) {
+int pakfire_jail_run_systemd_tmpfiles(pakfire_ctx* ctx, pakfire_root* root) {
const char* argv[] = {
"/usr/bin/systemd-tmpfiles",
"--create",
NULL,
};
- return pakfire_jail_run_if_possible(root, argv);
+ return pakfire_jail_run_if_possible(ctx, root, argv);
}
ssize_t pakfire_jail_send_buffer(pakfire_ctx* ctx,
#include <pakfire/buffer.h>
#include <pakfire/cgroup.h>
+#include <pakfire/ctx.h>
#include <pakfire/env.h>
#include <pakfire/root.h>
typedef int (*pakfire_jail_output_callback)(pakfire_ctx* ctx, void* data,
const enum pakfire_jail_output_stream stream, const char* line, size_t length);
-int pakfire_jail_create(pakfire_jail** jail, pakfire_root* root);
+int pakfire_jail_create(pakfire_jail** jail, pakfire_ctx* ctx, pakfire_root* root);
pakfire_jail* pakfire_jail_ref(pakfire_jail* jail);
pakfire_jail* pakfire_jail_unref(pakfire_jail* jail);
pakfire_jail_output_callback output_callback, void* output_data);
// Convenience functions
-int pakfire_jail_run(pakfire_root* root,
+int pakfire_jail_run(pakfire_ctx* ctx, pakfire_root* root,
const char* argv[], pakfire_env* env, int flags, char** output, size_t* output_length);
-int pakfire_jail_run_script(pakfire_root* root,
+int pakfire_jail_run_script(pakfire_ctx* ctx, pakfire_root* root,
const char* script, const size_t length, const char* argv[], pakfire_env* env, int flags);
int pakfire_jail_execute_script(pakfire_jail* jail,
pakfire_jail_output_callback output_callback, void* output_data);
int pakfire_jail_shell(pakfire_jail* jail, pakfire_env* env);
-int pakfire_jail_ldconfig(pakfire_root* root);
-int pakfire_jail_run_systemd_tmpfiles(pakfire_root* root);
+int pakfire_jail_ldconfig(pakfire_ctx* ctx, pakfire_root* root);
+int pakfire_jail_run_systemd_tmpfiles(pakfire_ctx* ctx, pakfire_root* root);
// Streaming functions
struct pakfire_input_buffer {
size_t length = 0;
// Execute the command inside the Pakfire environment
- r = pakfire_jail_run(parser->root, argv, NULL, 0, &output, &length);
+ r = pakfire_jail_run(parser->ctx, parser->root, argv, NULL, 0, &output, &length);
if (r) {
// Just log this and continue
DEBUG(parser->ctx, "Command '%s' failed with return code %d\n", command, r);
int pakfire_scriptlet_execute(pakfire_scriptlet* scriptlet, pakfire_root* root) {
// Detect what kind of script this is and run it
if (pakfire_scriptlet_is_shell_script(scriptlet))
- return pakfire_jail_run_script(root, scriptlet->data, scriptlet->size, NULL, NULL, 0);
+ return pakfire_jail_run_script(scriptlet->ctx, root,
+ scriptlet->data, scriptlet->size, NULL, NULL, 0);
ERROR(scriptlet->ctx, "Scriptlet is of an unknown kind\n");
return -ENOTSUP;
// Update the runtime linker cache
if (pakfire_filelist_contains(filelist, "*/lib*.so.?"))
- pakfire_jail_ldconfig(transaction->root);
+ pakfire_jail_ldconfig(transaction->ctx, transaction->root);
if (filelist)
pakfire_filelist_unref(filelist);
goto ERROR;
// Update the runtime linker cache after all files have been removed
- pakfire_jail_ldconfig(transaction->root);
+ pakfire_jail_ldconfig(transaction->ctx, transaction->root);
ERROR:
pakfire_progress_pop_status(transaction->progress);
pakfire_transaction* transaction, pakfire_package* pkg) {
// Apply any tmpfiles (ignore any errors)
if (pakfire_package_matches_dep(pkg, PAKFIRE_PKG_REQUIRES, "pakfire(systemd-tmpfiles)"))
- pakfire_jail_run_systemd_tmpfiles(transaction->root);
+ pakfire_jail_run_systemd_tmpfiles(transaction->ctx, transaction->root);
return 0;
}
input_callback = pakfire_jail_send_buffer;
// Create a new jail
- r = pakfire_jail_create(&jail, self->root);
+ r = pakfire_jail_create(&jail, self->ctx->ctx, self->root);
if (r < 0) {
errno = -r;
PyErr_SetFromErrno(PyExc_OSError);
ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Connect jail to the cgroup
ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
pakfire_jail* jail = NULL;
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Destroy it
ASSERT_NULL(pakfire_jail_unref(jail));
};
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Check if we receive the correct exit code
ASSERT_EQUALS(pakfire_jail_execute_command(jail, argv, NULL, 0), 123);
};
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Check if we receive the correct exit code
ASSERT(pakfire_jail_execute_command(jail, argv, NULL, 0) == 139);
size_t length = 0;
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Try to execute something
ASSERT_SUCCESS(pakfire_jail_execute_capture_output(jail, cmd_hello_world, NULL, 0, &output, &length));
ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Connect jail to the cgroup
ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
};
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Set invalid nice levels
ASSERT_ERROR(pakfire_jail_nice(jail, 100), EINVAL);
ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
// Create jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Connect jail to the cgroup
ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
ASSERT_SUCCESS(pakfire_cgroup_create(&cgroup, t->ctx, NULL, "pakfire-test", 0));
// Create jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Connect jail to the cgroup
ASSERT_SUCCESS(pakfire_jail_set_cgroup(jail, cgroup));
char* output = NULL;
// Execute a simple command
- ASSERT_SUCCESS(pakfire_jail_run(t->root, cmd_stat_ownership, NULL, 0, &output, NULL));
+ ASSERT_SUCCESS(pakfire_jail_run(t->ctx, t->root, cmd_stat_ownership, NULL, 0, &output, NULL));
// Check if the file has been mapped to root/root
ASSERT_STRING_EQUALS(output, "uid=0 gid=0\n");
};
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Bind-mount nonsense
ASSERT_ERROR(pakfire_jail_bind(jail, NULL, target, 0), EINVAL);
};
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Check if the mount actually works
ASSERT_SUCCESS(pakfire_jail_communicate(jail, argv, NULL, 0,
int r = EXIT_FAILURE;
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Sending SIGTERM to ourselves
ASSERT(test_send_one_signal(t, jail, "15") == 0);
};
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Set a timeout of one second
ASSERT_SUCCESS(pakfire_jail_set_timeout(jail, 1));
int i = 123;
// Create a new jail
- ASSERT_SUCCESS(pakfire_jail_create(&jail, t->root));
+ ASSERT_SUCCESS(pakfire_jail_create(&jail, t->ctx, t->root));
// Check if we receive the correct exit code
ASSERT(pakfire_jail_execute(jail, __callback, &i, 0) == 123);