#include <pakfire/config.h>
+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)));
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <sys/types.h>
-#include <sys/utsname.h>
#include <syslog.h>
#include <unistd.h>
NULL,
};
-static int pakfire_on_root(Pakfire pakfire) {
+int pakfire_on_root(Pakfire pakfire) {
return (strcmp(pakfire->path, "/") == 0);
}
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;
// 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);
#include <errno.h>
#include <linux/limits.h>
#include <stdlib.h>
+#include <sys/utsname.h>
#include <solv/queue.h>
#include <solv/selection.h>
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);
/* 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;
}