From: Michael Tremer Date: Thu, 21 Sep 2023 14:50:48 +0000 (+0000) Subject: request: Implement locking the running kernel as a pool job X-Git-Tag: 0.9.30~1671 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a06b6096f1d0797711e2bdec3d4f2796c41a0ed6;p=pakfire.git request: Implement locking the running kernel as a pool job Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index e1c837b8b..a3c74f20c 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -294,6 +295,31 @@ static Id pakfire_namespace_callback(Pool* pool, void* data, Id ns, Id id) { return 0; } +static int pakfire_lock_running_kernel(struct pakfire* pakfire) { + struct utsname utsname; + char buffer[NAME_MAX]; + + // Call uname() + int r = uname(&utsname); + if (r) { + ERROR(pakfire, "uname() failed: %m\n"); + return r; + } + + DEBUG(pakfire, "Locking running kernel %s\n", utsname.release); + + r = pakfire_string_format(buffer, "kernel(%s)", utsname.release); + if (r) + return r; + + // Add a locking pool job + Id id = pool_str2id(pakfire->pool, buffer, 1); + if (id) + queue_push2(&pakfire->pool->pooljobs, SOLVER_LOCK|SOLVER_SOLVABLE_PROVIDES, id); + + return 0; +} + static int pakfire_populate_pool(struct pakfire* pakfire) { struct pakfire_db* db = NULL; struct pakfire_repo* commandline = NULL; @@ -370,6 +396,13 @@ static int pakfire_populate_pool(struct pakfire* pakfire) { if (r) goto ERROR; + // Lock the running kernel + if (pakfire_on_root(pakfire)) { + r = pakfire_lock_running_kernel(pakfire); + if (r) + goto ERROR; + } + ERROR: if (db) pakfire_db_unref(db); diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index e0259658a..0a348e6c9 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -62,31 +61,6 @@ static void pakfire_request_free(struct pakfire_request* request) { free(request); } -static void pakfire_request_lock_running_kernel(struct pakfire_request* request) { - struct utsname utsname; - char buffer[NAME_MAX]; - - // Call uname() - int r = uname(&utsname); - if (r) { - ERROR(request->pakfire, "uname() failed: %m\n"); - return; - } - - DEBUG(request->pakfire, "Locking running kernel %s\n", utsname.release); - - r = pakfire_string_format(buffer, "kernel(%s)", utsname.release); - if (r) - return; - - Pool* pool = pakfire_get_solv_pool(request->pakfire); - - // Add a locking pool job - Id id = pool_str2id(pool, buffer, 1); - if (id) - queue_push2(&request->jobs, SOLVER_LOCK|SOLVER_SOLVABLE_PROVIDES, id); -} - static int setup_solver(struct pakfire_request* request, int flags) { // Automatically update when installation is requested solver_set_flag(request->solver, SOLVER_FLAG_INSTALL_ALSO_UPDATES, 1); @@ -103,10 +77,6 @@ static int setup_solver(struct pakfire_request* request, int flags) { if (flags & PAKFIRE_REQUEST_WITHOUT_RECOMMENDED) solver_set_flag(request->solver, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); - // Lock the running kernel - if (pakfire_on_root(request->pakfire)) - pakfire_request_lock_running_kernel(request); - return 0; }