]> git.ipfire.org Git - people/ric9/pakfire.git/commitdiff
jail: Change callback signature to include the context instead the inaccessible jail
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Dec 2024 16:20:11 +0000 (16:20 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 29 Dec 2024 16:20:11 +0000 (16:20 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/jail.h
src/libpakfire/jail.c
tests/libpakfire/jail.c

index 9c654e2377858c892e32be17b104f1beac2bd48b..e217eeb2c84a5a51c9396a4854fc802535ab9a64 100644 (file)
@@ -45,7 +45,7 @@ int pakfire_jail_nice(struct pakfire_jail* jail, int nice);
 // Timeout
 int pakfire_jail_set_timeout(struct pakfire_jail* jail, unsigned int timeout);
 
-typedef int (*pakfire_jail_callback)(struct pakfire_jail* jail, void* data);
+typedef int (*pakfire_jail_callback)(struct pakfire_ctx* ctx, void* data);
 
 // Standard Input
 typedef int (*pakfire_jail_stdin_callback)
@@ -66,6 +66,9 @@ enum pakfire_jail_exec_flags {
        PAKFIRE_JAIL_HAS_LOOP_DEVICES = (1 << 3),
 };
 
+int pakfire_jail_exec(struct pakfire_jail* jail,
+       pakfire_jail_callback callback, void* data, int flags);
+
 int pakfire_jail_exec_command(struct pakfire_jail* jail,
        const char* argv[], struct pakfire_env* env, int flags);
 
index bed5ba6b0d5ebd66854078bdf62230b79e172a10..c61ebc2ec532ebf7d480b0c3e7300c86e70c89ed 100644 (file)
@@ -150,7 +150,7 @@ struct pakfire_jail_exec {
        struct pakfire_cgroup_stats cgroup_stats;
 
        // The function to be called once the jail has been set up
-       int (*callback)(struct pakfire_jail* jail, void* data);
+       pakfire_jail_callback callback;
        void* data;
 };
 
@@ -971,11 +971,12 @@ static int pakfire_jail_exited(sd_event_source* source, const siginfo_t* si, voi
 }
 
 struct pakfire_jail_command {
+       struct pakfire_jail* jail;
        const char** argv;
        struct pakfire_env* env;
 };
 
-static int pakfire_jail_launch_command(struct pakfire_jail* jail, void* data) {
+static int pakfire_jail_launch_command(struct pakfire_ctx* ctx, void* data) {
        struct pakfire_jail_command* command = data;
        struct pakfire_env* env = NULL;
        char** envp = NULL;
@@ -986,12 +987,12 @@ static int pakfire_jail_launch_command(struct pakfire_jail* jail, void* data) {
                return -EINVAL;
 
        // Create a new environment
-       r = pakfire_env_create(&env, jail->ctx);
+       r = pakfire_env_create(&env, ctx);
        if (r < 0)
                goto ERROR;
 
        // Merge the basic environment
-       r = pakfire_env_merge(env, jail->env);
+       r = pakfire_env_merge(env, command->jail->env);
        if (r < 0)
                goto ERROR;
 
@@ -1002,11 +1003,11 @@ static int pakfire_jail_launch_command(struct pakfire_jail* jail, void* data) {
                        goto ERROR;
        }
 
-       DEBUG(jail->ctx, "Launching command:\n");
+       DEBUG(ctx, "Launching command:\n");
 
        // Log argv
        for (unsigned int i = 0; command->argv[i]; i++)
-               DEBUG(jail->ctx, "  argv[%u] = %s\n", i, command->argv[i]);
+               DEBUG(ctx, "  argv[%u] = %s\n", i, command->argv[i]);
 
        // Fetch the environment
        envp = pakfire_env_get_envp(env);
@@ -1031,7 +1032,7 @@ static int pakfire_jail_launch_command(struct pakfire_jail* jail, void* data) {
                                r = 1;
                }
 
-               ERROR(jail->ctx, "Could not execve(%s): %m\n", command->argv[0]);
+               ERROR(ctx, "Could not execve(%s): %m\n", command->argv[0]);
        }
 
 ERROR:
@@ -1312,7 +1313,7 @@ static int pakfire_jail_child(struct pakfire_jail* jail, struct pakfire_jail_exe
        }
 
        // Call the callback
-       return ctx->callback(jail, ctx->data);
+       return ctx->callback(jail->ctx, ctx->data);
 }
 
 // Run a command in the jail
@@ -1561,6 +1562,7 @@ int pakfire_jail_exec(struct pakfire_jail* jail,
 int pakfire_jail_exec_command(struct pakfire_jail* jail,
                const char* argv[], struct pakfire_env* env, int flags) {
        struct pakfire_jail_command command = {
+               .jail = jail,
                .argv = argv,
                .env  = env,
        };
@@ -1572,6 +1574,7 @@ int pakfire_jail_exec_command(struct pakfire_jail* jail,
 int pakfire_jail_exec_capture_output(struct pakfire_jail* jail,
                const char* argv[], struct pakfire_env* env, int flags, char** output, size_t* length) {
        struct pakfire_jail_command command = {
+               .jail = jail,
                .argv = argv,
                .env  = env,
        };
@@ -1585,6 +1588,7 @@ int pakfire_jail_communicate(
                pakfire_pty_stdin_callback stdin_callback, void* stdin_data,
                pakfire_pty_stdout_callback stdout_callback, void* stdout_data) {
        struct pakfire_jail_command command = {
+               .jail = jail,
                .argv = argv,
                .env  = env,
        };
index d7dd1fffb1da819445558236253a05a68ee76f6a..05513ac5f30c268b861c07685fa1432ff7a17192 100644 (file)
@@ -432,11 +432,11 @@ FAIL:
        return r;
 }
 
-static int __callback(struct pakfire_jail* jail, void* data) {
+static int __callback(struct pakfire_ctx* ctx, void* data) {
        int* i = data;
 
        // Log a message
-       //INFO(jail->ctx, "Callback called, returning %d\n", *i);
+       INFO(ctx, "Callback called, returning %d\n", *i);
 
        return *i;
 }