From: Michael Tremer Date: Fri, 25 Jun 2021 14:57:20 +0000 (+0000) Subject: request: Move locking running kernel from pakfire X-Git-Tag: 0.9.28~1173 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=708096feb7701a2d1a4c329452d077e9bd4d1ad5;p=pakfire.git request: Move locking running kernel from pakfire Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index 19e5a3b70..407c0e8be 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -93,6 +93,8 @@ int pakfire_sync(Pakfire pakfire, int flags, int* changed); #include +int pakfire_on_root(Pakfire pakfire); + void pakfire_log(Pakfire pakfire, int priority, const char *file, int line, const char *fn, const char *format, ...) __attribute__((format(printf, 6, 7))); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 6fe53b551..0da3f13b3 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -126,7 +125,7 @@ const char* pakfire_multiinstall_packages[] = { NULL, }; -static int pakfire_on_root(Pakfire pakfire) { +int pakfire_on_root(Pakfire pakfire) { return (strcmp(pakfire->path, "/") == 0); } @@ -399,40 +398,6 @@ static Id pakfire_namespace_callback(Pool* pool, void* data, Id ns, Id id) { return 0; } -static void pakfire_pool_add_multiinstall(Pool* pool) { - for (const char** package = pakfire_multiinstall_packages; *package; package++) { - Id id = pool_str2id(pool, *package, 1); - queue_push2(&pool->pooljobs, SOLVER_MULTIVERSION|SOLVER_SOLVABLE_PROVIDES, id); - } -} - -static void pakfire_lock_running_kernel(Pakfire pakfire, Pool* pool) { - struct utsname utsname; - char buffer[NAME_MAX]; - - // Nothing to do when not running on / - if (!pakfire_on_root(pakfire)) - return; - - // Call uname() - int r = uname(&utsname); - if (r) { - ERROR(pakfire, "uname() failed: %m\n"); - return; - } - - DEBUG(pakfire, "Locking running kernel %s\n", utsname.release); - - r = pakfire_string_format(buffer, "kernel(%s)", utsname.release); - if (r < 0) - return; - - // Add a locking pool job - Id id = pool_str2id(pool, buffer, 1); - if (id) - queue_push2(&pool->pooljobs, SOLVER_LOCK|SOLVER_SOLVABLE_PROVIDES, id); -} - static int pakfire_populate_pool(Pakfire pakfire) { struct pakfire_db* db; PakfireRepo repo = NULL; @@ -463,8 +428,6 @@ static int pakfire_populate_pool(Pakfire pakfire) { // Add multiinstall packages pakfire_pool_add_multiinstall(pool); - // Lock the running kernel - pakfire_lock_running_kernel(pakfire, pool); // Open database in read-only mode and try to load all installed packages r = pakfire_db_open(&db, pakfire, PAKFIRE_DB_READWRITE); diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index 0e8169e2f..37b3b2ad9 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -60,6 +61,31 @@ 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 < 0) + 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) { if (flags & PAKFIRE_SOLVER_ALLOW_DOWNGRADE) solver_set_flag(request->solver, SOLVER_FLAG_ALLOW_DOWNGRADE, 1); @@ -76,6 +102,10 @@ static int setup_solver(struct pakfire_request* request, int flags) { /* no arch change for forcebest */ solver_set_flag(request->solver, SOLVER_FLAG_BEST_OBEY_POLICY, 1); + // Lock the running kernel + if (pakfire_on_root(request->pakfire)) + pakfire_request_lock_running_kernel(request); + return 0; }