Verified Commit 80272404 authored by Max Rees's avatar Max Rees

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
parent 15ecc3d6
......@@ -253,7 +253,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,
typedef int (*apk_cache_item_cb)(struct apk_database *db,
int dirfd, const char *name,
struct apk_package *pkg);
int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb);
......
......@@ -15,6 +15,7 @@
#include <dirent.h>
#include <unistd.h>
#include <limits.h>
#include <string.h>
#include "apk_defines.h"
#include "apk_applet.h"
......@@ -113,35 +114,42 @@ static int cache_download(struct cache_ctx *cctx, struct apk_database *db)
return ret;
}
static void cache_clean_item(struct apk_database *db, int dirfd, const char *name, struct apk_package *pkg)
static int cache_clean_item(struct apk_database *db, 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 (strcmp(name, "installed") == 0) return 0;
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;
return 0;
}
b = APK_BLOB_STR(name);
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)
......
......@@ -1388,12 +1388,13 @@ 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 int mark_in_cache(struct apk_database *db, 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)
......@@ -2035,9 +2036,7 @@ static int foreach_cache_file(void *pctx, int dirfd, const char *name)
}
}
no_pkg:
ctx->cb(db, dirfd, name, pkg);
return 0;
return ctx->cb(db, dirfd, name, pkg);
}
int apk_db_cache_foreach_item(struct apk_database *db, apk_cache_item_cb cb)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment