]> git.ipfire.org Git - pakfire.git/commitdiff
jail: Add a function to call a custom callback inside the jail
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Dec 2024 16:15:03 +0000 (16:15 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Dec 2024 16:15:03 +0000 (16:15 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/jail.c
tests/libpakfire/jail.c

index 78a65e2b8b6f8be056ae96a8c7236aee634286a1..bed5ba6b0d5ebd66854078bdf62230b79e172a10 100644 (file)
@@ -1553,6 +1553,11 @@ ERROR:
        return r;
 }
 
+int pakfire_jail_exec(struct pakfire_jail* jail,
+               pakfire_jail_callback callback, void* data, int flags) {
+       return __pakfire_jail_exec(jail, callback, data, flags, NULL, NULL, NULL, NULL, NULL, NULL);
+}
+
 int pakfire_jail_exec_command(struct pakfire_jail* jail,
                const char* argv[], struct pakfire_env* env, int flags) {
        struct pakfire_jail_command command = {
index b4f8130d78a143c0aa91dbba73b76424d97e72b7..d7dd1fffb1da819445558236253a05a68ee76f6a 100644 (file)
@@ -432,6 +432,37 @@ FAIL:
        return r;
 }
 
+static int __callback(struct pakfire_jail* jail, void* data) {
+       int* i = data;
+
+       // Log a message
+       //INFO(jail->ctx, "Callback called, returning %d\n", *i);
+
+       return *i;
+}
+
+static int test_callback(const struct test* t) {
+       struct pakfire_jail* jail = NULL;
+       int r = EXIT_FAILURE;
+
+       int i = 123;
+
+       // Create a new jail
+       ASSERT_SUCCESS(pakfire_jail_create(&jail, t->pakfire));
+
+       // Check if we receive the correct exit code
+       ASSERT(pakfire_jail_exec(jail, __callback, &i, 0) == 123);
+
+       // Success
+       r = EXIT_SUCCESS;
+
+FAIL:
+       if (jail)
+               pakfire_jail_unref(jail);
+
+       return r;
+}
+
 int main(int argc, const char* argv[]) {
        testsuite_add_test(test_create, TEST_WANTS_PAKFIRE);
        testsuite_add_test(test_exit_code, TEST_WANTS_PAKFIRE);
@@ -450,6 +481,7 @@ int main(int argc, const char* argv[]) {
        testsuite_add_test(test_communicate, TEST_WANTS_PAKFIRE);
        testsuite_add_test(test_send_signal, TEST_WANTS_PAKFIRE);
        testsuite_add_test(test_timeout, TEST_WANTS_PAKFIRE);
+       testsuite_add_test(test_callback, TEST_WANTS_PAKFIRE);
 
        return testsuite_run(argc, argv);
 }