summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2023-01-31 14:44:26 +0200
committerTimo Teräs <timo.teras@iki.fi>2023-04-10 22:06:24 +0300
commitc1db6b2238c728aee982fd65ef7037d6489c3084 (patch)
tree70b90cabaa54cb9d88fdde4531e8d32cb974f3c7
parentd351992ad529dccb95fc1c8997cd328e9c694a92 (diff)
downloadapk-tools-c1db6b2238c728aee982fd65ef7037d6489c3084.tar.gz
apk-tools-c1db6b2238c728aee982fd65ef7037d6489c3084.tar.bz2
apk-tools-c1db6b2238c728aee982fd65ef7037d6489c3084.tar.xz
apk-tools-c1db6b2238c728aee982fd65ef7037d6489c3084.zip
cache: fix 'clean' to prune static cache always
Fix cache applet to prune the static cache which is used for index files if explicit caching is not enabled. fixes #10754
-rw-r--r--src/apk_database.h4
-rw-r--r--src/app_cache.c30
-rw-r--r--src/database.c17
3 files changed, 30 insertions, 21 deletions
diff --git a/src/apk_database.h b/src/apk_database.h
index aa0145b..a0a62ca 100644
--- a/src/apk_database.h
+++ b/src/apk_database.h
@@ -259,10 +259,10 @@ int apk_cache_download(struct apk_database *db, struct apk_repository *repo,
struct apk_package *pkg, int verify, int autoupdate,
apk_progress_cb cb, void *cb_ctx);
-typedef void (*apk_cache_item_cb)(struct apk_database *db,
+typedef void (*apk_cache_item_cb)(struct apk_database *db, int static_cache,
int dirfd, const char *name,
struct apk_package *pkg);
-int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb);
+int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb, int static_cache);
int apk_db_install_pkg(struct apk_database *db,
struct apk_package *oldpkg,
diff --git a/src/app_cache.c b/src/app_cache.c
index 09d9adf..7239faa 100644
--- a/src/app_cache.c
+++ b/src/app_cache.c
@@ -142,19 +142,20 @@ static int cache_download(struct cache_ctx *cctx, struct apk_database *db, struc
return ret;
}
-static void cache_clean_item(struct apk_database *db, int dirfd, const char *name, struct apk_package *pkg)
+static void cache_clean_item(struct apk_database *db, int static_cache, int dirfd, const char *name, struct apk_package *pkg)
{
char tmp[PATH_MAX];
apk_blob_t b;
int i;
- if (strcmp(name, "installed") == 0) return;
-
- if (pkg) {
- if ((apk_flags & APK_PURGE) && pkg->ipkg == NULL) goto delete;
- if (pkg->repos & db->local_repos & ~BIT(APK_REPOSITORY_CACHED)) goto delete;
- if (pkg->ipkg == NULL && !(pkg->repos & ~BIT(APK_REPOSITORY_CACHED))) goto delete;
- return;
+ if (!static_cache) {
+ if (strcmp(name, "installed") == 0) return;
+ if (pkg) {
+ if ((apk_flags & APK_PURGE) && pkg->ipkg == NULL) goto delete;
+ if (pkg->repos & db->local_repos & ~BIT(APK_REPOSITORY_CACHED)) goto delete;
+ if (pkg->ipkg == NULL && !(pkg->repos & ~BIT(APK_REPOSITORY_CACHED))) goto delete;
+ return;
+ }
}
b = APK_BLOB_STR(name);
@@ -175,7 +176,11 @@ delete:
static int cache_clean(struct apk_database *db)
{
- return apk_db_cache_foreach_item(db, cache_clean_item);
+ if (apk_db_cache_active(db)) {
+ int r = apk_db_cache_foreach_item(db, cache_clean_item, 0);
+ if (r) return r;
+ }
+ return apk_db_cache_foreach_item(db, cache_clean_item, 1);
}
static int cache_main(void *ctx, struct apk_database *db, struct apk_string_array *args)
@@ -197,11 +202,8 @@ static int cache_main(void *ctx, struct apk_database *db, struct apk_string_arra
else
return -EINVAL;
- if (!apk_db_cache_active(db)) {
- apk_error("Package cache is not enabled.");
- r = 2;
- goto err;
- }
+ if (!apk_db_cache_active(db))
+ actions &= CACHE_CLEAN;
if ((actions & CACHE_DOWNLOAD) && (cctx->solver_flags || cctx->add_dependencies)) {
if (db->repositories.stale || db->repositories.unavailable) {
diff --git a/src/database.c b/src/database.c
index 7118c64..04eac61 100644
--- a/src/database.c
+++ b/src/database.c
@@ -1391,7 +1391,7 @@ static char *find_mountpoint(int atfd, const char *rel_path)
return ret;
}
-static void mark_in_cache(struct apk_database *db, int dirfd, const char *name, struct apk_package *pkg)
+static void mark_in_cache(struct apk_database *db, int static_cache, int dirfd, const char *name, struct apk_package *pkg)
{
if (pkg == NULL)
return;
@@ -1722,7 +1722,7 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
}
if (apk_db_cache_active(db) && (dbopts->open_flags & (APK_OPENF_NO_REPOS|APK_OPENF_NO_INSTALLED)) == 0)
- apk_db_cache_foreach_item(db, mark_in_cache);
+ apk_db_cache_foreach_item(db, mark_in_cache, 0);
db->open_complete = 1;
@@ -2038,6 +2038,7 @@ int apk_db_cache_active(struct apk_database *db)
struct foreach_cache_item_ctx {
struct apk_database *db;
apk_cache_item_cb cb;
+ int static_cache;
};
static int foreach_cache_file(void *pctx, int dirfd, const char *name)
@@ -2067,15 +2068,21 @@ static int foreach_cache_file(void *pctx, int dirfd, const char *name)
}
}
no_pkg:
- ctx->cb(db, dirfd, name, pkg);
+ ctx->cb(db, ctx->static_cache, dirfd, name, pkg);
return 0;
}
-int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb)
+int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb, int static_cache)
{
- struct foreach_cache_item_ctx ctx = { db, cb };
+ struct foreach_cache_item_ctx ctx = { db, cb, static_cache };
+ if (static_cache) {
+ return apk_dir_foreach_file(
+ openat(db->root_fd, apk_static_cache_dir, O_RDONLY | O_CLOEXEC),
+ foreach_cache_file, &ctx);
+ }
+ if (db->cache_fd < 0) return db->cache_fd;
return apk_dir_foreach_file(dup(db->cache_fd), foreach_cache_file, &ctx);
}