commit: b9329cff22e3e88bd9ba3d259ed586b75fe9740f Author: Fabian Groffen <grobian <AT> gentoo <DOT> org> AuthorDate: Thu Apr 25 08:46:09 2019 +0000 Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org> CommitDate: Thu Apr 25 08:46:09 2019 +0000 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=b9329cff
libq/cache: set repo in cache_pkg_ctx when found Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org> libq/cache.c | 31 +++++++++++++++++++++++++------ libq/cache.h | 1 + 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/libq/cache.c b/libq/cache.c index eec39db..7724287 100644 --- a/libq/cache.c +++ b/libq/cache.c @@ -16,6 +16,8 @@ #include <xalloc.h> #include "cache.h" +#include "eat_file.h" +#include "rmspace.h" #include "scandirat.h" #include "vdb.h" @@ -47,17 +49,27 @@ cache_dump(cache_pkg_meta *cache) static const char portcachedir_pms[] = "metadata/cache"; static const char portcachedir_md5[] = "metadata/md5-cache"; +static const char portrepo_name[] = "profiles/repo_name"; cache_ctx * cache_open(const char *sroot, const char *portdir) { q_vdb_ctx *dir; cache_ctx *ret; char buf[_Q_PATH_MAX]; + size_t repolen = 0; + + ret = xzalloc(sizeof(cache_ctx)); + + snprintf(buf, sizeof(buf), "%s%s/%s", sroot, portdir, portrepo_name); + if (eat_file(buf, &ret->repo, &repolen)) { + (void)rmspace(ret->repo); + } else { + ret->repo = NULL; /* ignore missing repo file */ + } snprintf(buf, sizeof(buf), "%s/%s", portdir, portcachedir_md5); dir = q_vdb_open2(sroot, buf, true); if (dir != NULL) { - ret = xmalloc(sizeof(cache_ctx)); ret->dir_ctx = dir; ret->cachetype = CACHE_METADATA_MD5; return ret; @@ -66,7 +78,6 @@ cache_open(const char *sroot, const char *portdir) snprintf(buf, sizeof(buf), "%s/%s", portdir, portcachedir_pms); dir = q_vdb_open2(sroot, buf, true); if (dir != NULL) { - ret = xmalloc(sizeof(cache_ctx)); ret->dir_ctx = dir; ret->cachetype = CACHE_METADATA_PMS; return ret; @@ -74,12 +85,12 @@ cache_open(const char *sroot, const char *portdir) dir = q_vdb_open2(sroot, portdir, true); if (dir != NULL) { - ret = xmalloc(sizeof(cache_ctx)); ret->dir_ctx = dir; ret->cachetype = CACHE_EBUILD; return ret; } + cache_close(ret); warnf("could not open repository at %s (under root %s)", portdir, sroot); @@ -89,7 +100,10 @@ cache_open(const char *sroot, const char *portdir) void cache_close(cache_ctx *ctx) { - q_vdb_close(ctx->dir_ctx); + if (ctx->dir_ctx != NULL) + q_vdb_close(ctx->dir_ctx); + if (ctx->repo != NULL) + free(ctx->repo); free(ctx); } @@ -120,7 +134,9 @@ cache_close_cat(cache_cat_ctx *cat_ctx) cache_pkg_ctx * cache_open_pkg(cache_cat_ctx *cat_ctx, const char *name) { - return q_vdb_open_pkg(cat_ctx, name); + cache_pkg_ctx *ret = q_vdb_open_pkg(cat_ctx, name); + ret->repo = ((cache_ctx *)cat_ctx->ctx)->repo; + return ret; } cache_pkg_ctx * @@ -154,7 +170,7 @@ cache_next_pkg(cache_cat_ctx *cat_ctx) ctx->ebuilddir_pkg_ctx = NULL; } else { if ((p = strstr(ret->name, ".ebuild")) == NULL) { - q_vdb_close_pkg(ret); + cache_close_pkg(ret); ret = NULL; } else { /* "zap" the pkg such that it looks like CAT/P */ @@ -475,6 +491,9 @@ cache_close_meta(cache_pkg_meta *cache) void cache_close_pkg(cache_pkg_ctx *pkg_ctx) { + /* avoid free of cache_ctx' repo by q_vdb_close_pkg */ + if (((cache_ctx *)pkg_ctx->cat_ctx->ctx)->repo == pkg_ctx->repo) + pkg_ctx->repo = NULL; q_vdb_close_pkg(pkg_ctx); } diff --git a/libq/cache.h b/libq/cache.h index a4c5803..0157824 100644 --- a/libq/cache.h +++ b/libq/cache.h @@ -24,6 +24,7 @@ typedef struct cache_ctx { q_vdb_pkg_ctx *ebuilddir_pkg_ctx; q_vdb_cat_ctx *ebuilddir_cat_ctx; q_vdb_ctx ebuilddir_ctx; + char *repo; } cache_ctx; #define cache_cat_ctx q_vdb_cat_ctx #define cache_pkg_ctx q_vdb_pkg_ctx