From 78d8ecc99ea39c6564f90ba63a1ba791df25abc6 Mon Sep 17 00:00:00 2001 From: Max Rees Date: Sat, 10 Aug 2019 02:08:10 -0500 Subject: cache: report errors when unlinking Before: $ abuild-apk del mutt (1/3) Purging mutt (1.12.1-r0) (2/3) Purging gdbm (1.18.1-r0) (3/3) Purging libidn (1.35-r0) OK: 3752 MiB in 805 packages $ apk cache sync --purge || echo nope, sorry $ ls /home/apk-cache/*gdbm* /home/apk-cache/gdbm-1.18.1-r0.b0b17e93.apk After: $ apk cache sync --purge || echo nope, sorry ERROR: Unable to delete gdbm-1.18.1-r0.b0b17e93.apk: Permission denied nope, sorry --- src/apk_database.h | 2 +- src/app_cache.c | 20 ++++++++++++++------ src/database.c | 9 ++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/apk_database.h b/src/apk_database.h index da29ce9..92a6fbd 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -277,7 +277,7 @@ 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, int static_cache, +typedef int (*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 static_cache); diff --git a/src/app_cache.c b/src/app_cache.c index f40c836..5508387 100644 --- a/src/app_cache.c +++ b/src/app_cache.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "apk_defines.h" #include "apk_applet.h" @@ -142,21 +143,21 @@ 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 static_cache, int dirfd, const char *name, struct apk_package *pkg) +static int 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 (!static_cache) { - if (strcmp(name, "installed") == 0) return; + if (strcmp(name, "installed") == 0) return 0; if (pkg) { if (apk_flags & APK_PURGE) { if (db->permanent || !pkg->ipkg) 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; + return 0; } } @@ -164,16 +165,23 @@ static void cache_clean_item(struct apk_database *db, int static_cache, int dirf for (i = 0; i < db->num_repos; i++) { /* Check if this is a valid index */ apk_repo_format_cache_index(APK_BLOB_BUF(tmp), &db->repos[i]); - if (apk_blob_compare(b, APK_BLOB_STR(tmp)) == 0) return; + if (apk_blob_compare(b, APK_BLOB_STR(tmp)) == 0) return 0; } delete: if (apk_verbosity >= 2) apk_message("deleting %s", name); if (!(apk_flags & APK_SIMULATE)) { - if (unlinkat(dirfd, name, 0) < 0 && errno == EISDIR) - unlinkat(dirfd, name, AT_REMOVEDIR); + if (unlinkat(dirfd, name, 0) < 0) { + if (errno != EISDIR || + (errno == EISDIR && unlinkat(dirfd, name, AT_REMOVEDIR) < 0)) { + apk_error("Unable to delete %s: %s", name, strerror(errno)); + return -errno; + } + } } + + return 0; } static int cache_clean(struct apk_database *db) diff --git a/src/database.c b/src/database.c index d0ab6e2..9864543 100644 --- a/src/database.c +++ b/src/database.c @@ -1367,12 +1367,13 @@ static char *find_mountpoint(int atfd, const char *rel_path) return ret; } -static void mark_in_cache(struct apk_database *db, int static_cache, int dirfd, const char *name, struct apk_package *pkg) +static int mark_in_cache(struct apk_database *db, int static_cache, int dirfd, const char *name, struct apk_package *pkg) { if (pkg == NULL) - return; + return 0; pkg->repos |= BIT(APK_REPOSITORY_CACHED); + return 0; } static int add_repos_from_file(void *ctx, int dirfd, const char *file) @@ -2052,9 +2053,7 @@ static int foreach_cache_file(void *pctx, int dirfd, const char *name) } } no_pkg: - ctx->cb(db, ctx->static_cache, dirfd, name, pkg); - - return 0; + return ctx->cb(db, ctx->static_cache, dirfd, name, pkg); } int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb, int static_cache) -- cgit v1.2.3-60-g2f50