diff --git a/NEWS b/NEWS
index 284aa666..8e358868 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
xbps-0.48 (???):
+ * libxbps: relative cachedir set via xbps.d(5) now work correctly.
+ Fixes #117 (https://github.com/voidlinux/xbps/issues/117)
+
* xbps-create(1): --compression now accepts "none" to not use any
compression format.
diff --git a/lib/initend.c b/lib/initend.c
index 4e95fa97..1c00b274 100644
--- a/lib/initend.c
+++ b/lib/initend.c
@@ -55,38 +55,34 @@ static int parse_file(struct xbps_handle *, const char *, const char *, bool);
* Use these functions to initialize some parameters before start
* using libxbps and finalize usage to release resources at the end.
*/
+
static void
-store_vpkg(struct xbps_handle *xhp, const char *path, size_t line, char *vpkg_s)
+store_vars(struct xbps_handle *xhp, xbps_dictionary_t *d,
+ const char *key, const char *path, size_t line, char *buf)
{
+ char *lp, *rp, *tc;
+ size_t len;
+
+ if (*d == NULL)
+ *d = xbps_dictionary_create();
/*
- * Append virtual package overrides to our vpkgd dictionary:
- *
- * vpkgver
- * realpkgname
+ * Parse strings delimited by ':' i.e
+ * :
*/
- char *vpkg, *rpkg, *tc;
- size_t vpkglen;
-
- if (xhp->vpkgd == NULL)
- xhp->vpkgd = xbps_dictionary_create();
-
- /* real pkg after ':' */
- vpkg = vpkg_s;
- rpkg = strchr(vpkg_s, ':');
- if (rpkg == NULL || *rpkg == '\0') {
+ lp = buf;
+ rp = strchr(buf, ':');
+ if (rp == NULL || *rp == '\0') {
xbps_dbg_printf(xhp, "%s: ignoring invalid "
- "virtualpkg option at line %zu\n", path, line);
+ "%s option at line %zu\n", path, key, line);
return;
}
- /* vpkg until ':' */
- tc = strchr(vpkg_s, ':');
- vpkglen = strlen(vpkg_s) - strlen(tc);
- vpkg[vpkglen] = '\0';
+ tc = strchr(buf, ':');
+ len = strlen(buf) - strlen(tc);
+ lp[len] = '\0';
- /* skip ':' */
- rpkg++;
- xbps_dictionary_set_cstring(xhp->vpkgd, vpkg, rpkg);
- xbps_dbg_printf(xhp, "%s: added vpkg %s for %s\n", path, vpkg, rpkg);
+ rp++;
+ xbps_dictionary_set_cstring(*d, lp, rp);
+ xbps_dbg_printf(xhp, "%s: added %s %s for %s\n", path, key, lp, rp);
}
static void
@@ -262,7 +258,7 @@ parse_file(struct xbps_handle *xhp, const char *cwd, const char *path, bool nest
if (store_repo(xhp, v))
xbps_dbg_printf(xhp, "%s: added repository %s\n", path, v);
} else if (strcmp(k, "virtualpkg") == 0) {
- store_vpkg(xhp, path, nlines, v);
+ store_vars(xhp, &xhp->vpkgd, k, path, nlines, v);
} else if (strcmp(k, "preserve") == 0) {
store_preserved_file(xhp, v);
} else if (strcmp(k, "bestmatching") == 0) {
@@ -416,30 +412,6 @@ xbps_init(struct xbps_handle *xhp)
free(buf);
}
xbps_dbg_printf(xhp, "%s\n", XBPS_RELVER);
- /* Set cachedir */
- if (xhp->cachedir[0] == '\0') {
- snprintf(xhp->cachedir, sizeof(xhp->cachedir),
- "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
- XBPS_CACHE_PATH);
- } else if (xhp->cachedir[0] != '/') {
- /* relative path */
- buf = strdup(xhp->cachedir);
- snprintf(xhp->cachedir, sizeof(xhp->cachedir),
- "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
- free(buf);
- }
- /* Set metadir */
- if (xhp->metadir[0] == '\0') {
- snprintf(xhp->metadir, sizeof(xhp->metadir),
- "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
- XBPS_META_PATH);
- } else if (xhp->metadir[0] != '/') {
- /* relative path */
- buf = strdup(xhp->metadir);
- snprintf(xhp->metadir, sizeof(xhp->metadir),
- "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
- free(buf);
- }
/* set confdir */
if (xhp->confdir[0] == '\0') {
snprintf(xhp->confdir, sizeof(xhp->confdir),
@@ -472,6 +444,31 @@ xbps_init(struct xbps_handle *xhp)
if ((rv = parse_dir(xhp, cwd, xhp->confdir, sysconfdir)) != 0)
return rv;
+ /* Set cachedir */
+ if (xhp->cachedir[0] == '\0') {
+ snprintf(xhp->cachedir, sizeof(xhp->cachedir),
+ "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
+ XBPS_CACHE_PATH);
+ } else if (xhp->cachedir[0] != '/') {
+ /* relative path */
+ buf = strdup(xhp->cachedir);
+ snprintf(xhp->cachedir, sizeof(xhp->cachedir),
+ "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
+ free(buf);
+ }
+ /* Set metadir */
+ if (xhp->metadir[0] == '\0') {
+ snprintf(xhp->metadir, sizeof(xhp->metadir),
+ "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "",
+ XBPS_META_PATH);
+ } else if (xhp->metadir[0] != '/') {
+ /* relative path */
+ buf = strdup(xhp->metadir);
+ snprintf(xhp->metadir, sizeof(xhp->metadir),
+ "%s/%s", strcmp(xhp->rootdir, "/") ? xhp->rootdir : "", buf);
+ free(buf);
+ }
+
xbps_dbg_printf(xhp, "rootdir=%s\n", xhp->rootdir);
xbps_dbg_printf(xhp, "metadir=%s\n", xhp->metadir);
xbps_dbg_printf(xhp, "cachedir=%s\n", xhp->cachedir);