From: Michael Tremer Date: Wed, 3 Aug 2022 08:44:05 +0000 (+0000) Subject: build: Use factory function to create jail X-Git-Tag: 0.9.28~610 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e99f22d8d578fe032afcf87f4648173b721185e;p=pakfire.git build: Use factory function to create jail This jail can be configured and customised for the build process. Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index 6762f8d93..c4094f49c 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -58,8 +59,32 @@ static const char* stages[] = { "\n" \ "exit 0\n" +/* + This function creates a new jail which is pre-configured for a build job. + + TODO Add resource limits +*/ +static struct pakfire_jail* pakfire_build_make_jail(struct pakfire* pakfire) { + struct pakfire_jail* jail = NULL; + int r; + + // Create a new jail + r = pakfire_jail_create(&jail, pakfire, 0); + if (r) + goto ERROR; + + return jail; + +ERROR: + if (jail) + pakfire_jail_unref(jail); + + return NULL; +} + static int pakfire_build_run_script(struct pakfire* pakfire, const char* filename, const char* args[], pakfire_execute_logging_callback logging_callback, void* data) { + struct pakfire_jail* jail = NULL; char* script = NULL; size_t size = 0; char path[PATH_MAX]; @@ -83,13 +108,27 @@ static int pakfire_build_run_script(struct pakfire* pakfire, const char* filenam goto ERROR; } - // Execute it - r = pakfire_execute_script(pakfire, script, size, args, NULL, 0, logging_callback, data); + // Create a new jail + jail = pakfire_build_make_jail(pakfire); + if (!jail) + goto ERROR; + + // Configure logging + if (logging_callback) { + r = pakfire_jail_set_log_callback(jail, logging_callback, data); + if (r) + goto ERROR; + } + + // Execute the script + r = pakfire_jail_exec_script(jail, script, size, args); if (r) { ERROR(pakfire, "Script '%s' failed with status %d\n", filename, r); } ERROR: + if (jail) + pakfire_jail_unref(jail); if (script) free(script);