From: Michael Tremer Date: Sun, 29 Dec 2024 16:20:11 +0000 (+0000) Subject: jail: Change callback signature to include the context instead the inaccessible jail X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d3dac5bd80cd15f7c97d66f7b37357e8592e8ae6;p=people%2Fric9%2Fpakfire.git jail: Change callback signature to include the context instead the inaccessible jail Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/jail.h b/src/libpakfire/include/pakfire/jail.h index 9c654e237..e217eeb2c 100644 --- a/src/libpakfire/include/pakfire/jail.h +++ b/src/libpakfire/include/pakfire/jail.h @@ -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); diff --git a/src/libpakfire/jail.c b/src/libpakfire/jail.c index bed5ba6b0..c61ebc2ec 100644 --- a/src/libpakfire/jail.c +++ b/src/libpakfire/jail.c @@ -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, }; diff --git a/tests/libpakfire/jail.c b/tests/libpakfire/jail.c index d7dd1fffb..05513ac5f 100644 --- a/tests/libpakfire/jail.c +++ b/tests/libpakfire/jail.c @@ -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; }