poldek: poldek/pm/mod.h, poldek/pm/pm.c, poldek/pm/pm.h, poldek/pm...
mis
mis at pld-linux.org
Mon Jan 8 18:22:05 CET 2007
Author: mis Date: Mon Jan 8 17:22:05 2007 GMT
Module: poldek Tag: HEAD
---- Log message:
- support for new, runtime-resolved rpm reqs (executable(), readable(), etc); machine_score() bugfix (arekm)
---- Files affected:
poldek/poldek/pm:
mod.h (1.12 -> 1.13) , pm.c (1.10 -> 1.11) , pm.h (1.17 -> 1.18)
poldek/poldek/pm/rpm:
misc.c (1.8 -> 1.9) , mod.c (1.6 -> 1.7) , pm_rpm.h (1.15 -> 1.16)
poldek/poldek/pm/pset:
mod.c (1.6 -> 1.7)
poldek/poldek:
pkgset-req.c (1.46 -> 1.47) , pkgset.c (1.90 -> 1.91) , pkgset.h (1.60 -> 1.61)
---- Diffs:
================================================================
Index: poldek/poldek/pm/mod.h
diff -u poldek/poldek/pm/mod.h:1.12 poldek/poldek/pm/mod.h:1.13
--- poldek/poldek/pm/mod.h:1.12 Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pm/mod.h Mon Jan 8 18:21:59 2007
@@ -10,6 +10,7 @@
#include <trurl/nmalloc.h>
struct pkgdir;
+struct capreq;
struct pkgdb;
struct poldek_ts;
struct pkgdb_it;
@@ -23,8 +24,10 @@
void (*destroy)(void *modh);
int (*configure)(void *modh, const char *key, void *val);
int (*conf_get)(void *modh, const char *key, char *value, int vsize);
-
+
tn_array *(*pm_caps)(void *modh);
+ int (*pm_satisfies)(void *modh, const struct capreq *req);
+
char *(*dbpath)(void *modh, char *path, size_t size);
time_t (*dbmtime)(void *modh, const char *path);
int (*dbdepdirs)(void *modh, const char *rootdir, const char *dbpath,
================================================================
Index: poldek/poldek/pm/pm.c
diff -u poldek/poldek/pm/pm.c:1.10 poldek/poldek/pm/pm.c:1.11
--- poldek/poldek/pm/pm.c:1.10 Sun Apr 2 20:46:21 2006
+++ poldek/poldek/pm/pm.c Mon Jan 8 18:22:00 2007
@@ -132,6 +132,13 @@
return NULL;
}
+int pm_satisfies(struct pm_ctx *ctx, const struct capreq *req)
+{
+ if (ctx->mod->pm_satisfies)
+ return ctx->mod->pm_satisfies(ctx->modh, req);
+ return 0;
+}
+
struct pkg *pm_load_package(struct pm_ctx *ctx,
tn_alloc *na, const char *path, unsigned ldflags)
{
================================================================
Index: poldek/poldek/pm/pm.h
diff -u poldek/poldek/pm/pm.h:1.17 poldek/poldek/pm/pm.h:1.18
--- poldek/poldek/pm/pm.h:1.17 Sun Dec 17 23:37:05 2006
+++ poldek/poldek/pm/pm.h Mon Jan 8 18:22:00 2007
@@ -206,6 +206,7 @@
enum pm_machine_score_tag tag, const char *val);
tn_array *pm_get_pmcaps(struct pm_ctx *ctx);
+int pm_satisfies(struct pm_ctx *ctx, const struct capreq *req);
int pm_get_dbdepdirs(struct pm_ctx *ctx,
const char *rootdir, const char *dbpath,
================================================================
Index: poldek/poldek/pm/rpm/misc.c
diff -u poldek/poldek/pm/rpm/misc.c:1.8 poldek/poldek/pm/rpm/misc.c:1.9
--- poldek/poldek/pm/rpm/misc.c:1.8 Sun Dec 17 23:37:05 2006
+++ poldek/poldek/pm/rpm/misc.c Mon Jan 8 18:22:00 2007
@@ -38,7 +38,6 @@
#include "pm_rpm.h"
#if HAVE_RPMDSRPMLIB /* rpmdsRpmlib() => rpm >= 4.4.3 */
-
static int extract_rpmds(tn_array *caps, rpmds ds)
{
ds = rpmdsInit(ds);
@@ -103,9 +102,9 @@
return extract_rpmds(caps, ds);
}
-
#endif /* HAVE_RPMDSRPMLIB */
+
#if HAVE_RPMGETRPMLIBPROVIDES /* rpmGetRpmlibProvides() => rpm < 4.4.3 */
static int get_rpmlib_caps_rpm_lt_4_4_3(tn_array *caps)
{
@@ -164,6 +163,7 @@
return caps;
}
+
#ifdef HAVE_RPMMACHINESCORE
static int machine_score(int tag, const char *val)
{
@@ -186,7 +186,7 @@
n_assert(rpmtag);
return rpmMachineScore(rpmtag, val);
}
-#else /* killed rpmMachineScore() (since 4.4.7) */
+#else /* !HAVE_RPMMACHINESCORE; killed rpmMachineScore() (since 4.4.7) */
static int machine_score(int tag, const char *val)
{
int rc = 0;
@@ -222,6 +222,7 @@
return machine_score(tag, val);
}
+
/* XXX: function used directly in pkg.c */
int pm_rpm_arch_score(const char *arch)
{
@@ -246,7 +247,36 @@
free(host_arch);
}
}
+#endif
+ return rc;
+}
+
+int pm_rpm_satisfies(void *pm_rpm, const struct capreq *req)
+{
+ int n, rc = 0;
+ const char *name;
+
+ pm_rpm = pm_rpm;
+ if (capreq_versioned(req))
+ return 0;
+
+ name = capreq_name(req);
+ n = strlen(name);
+
+ /* code copied from lib/depends.c:563 */
+ if (n > 5 && name[n - 1] == ')' &&
+ ((strchr("Rr_", name[0]) != NULL &&
+ strchr("Ww_", name[1]) != NULL &&
+ strchr("Xx_", name[2]) != NULL &&
+ name[3] == '(') || !strncmp(name, "exists(", sizeof("exists(")-1)
+ || !strncmp(name, "executable(", sizeof("executable(")-1)
+ || !strncmp(name, "readable(", sizeof("readable(")-1)
+ || !strncmp(name, "writable(", sizeof("writable(")-1)
+ )) {
+
+ rc = (rpmioAccess(name, NULL, X_OK) == 0);
+ }
+
return rc;
}
-#endif
================================================================
Index: poldek/poldek/pm/rpm/mod.c
diff -u poldek/poldek/pm/rpm/mod.c:1.6 poldek/poldek/pm/rpm/mod.c:1.7
--- poldek/poldek/pm/rpm/mod.c:1.6 Sun Apr 2 20:46:21 2006
+++ poldek/poldek/pm/rpm/mod.c Mon Jan 8 18:22:00 2007
@@ -9,6 +9,7 @@
pm_rpm_conf_get,
pm_rpm_rpmlib_caps, /* XXX: TODO replace with pm_rpm_conf_get() */
+ pm_rpm_satisfies,
pm_rpm_dbpath,
pm_rpm_dbmtime,
pm_rpm_dbdepdirs,
================================================================
Index: poldek/poldek/pm/rpm/pm_rpm.h
diff -u poldek/poldek/pm/rpm/pm_rpm.h:1.15 poldek/poldek/pm/rpm/pm_rpm.h:1.16
--- poldek/poldek/pm/rpm/pm_rpm.h:1.15 Sun Dec 17 23:37:05 2006
+++ poldek/poldek/pm/rpm/pm_rpm.h Mon Jan 8 18:22:00 2007
@@ -36,6 +36,7 @@
int pm_rpm_conf_get(void *pm_rpm, const char *key, char *value, int vsize);
tn_array *pm_rpm_rpmlib_caps(void *pm_rpm);
+int pm_rpm_satisfies(void *pm_rpm, const struct capreq *req);
char *pm_rpm_dbpath(void *pm_rpm, char *path, size_t size);
time_t pm_rpm_dbmtime(void *pm_rpm, const char *dbfull_path);
================================================================
Index: poldek/poldek/pm/pset/mod.c
diff -u poldek/poldek/pm/pset/mod.c:1.6 poldek/poldek/pm/pset/mod.c:1.7
--- poldek/poldek/pm/pset/mod.c:1.6 Sun Apr 2 20:46:21 2006
+++ poldek/poldek/pm/pset/mod.c Mon Jan 8 18:22:00 2007
@@ -8,6 +8,7 @@
pm_pset_configure,
NULL,
NULL,
+ NULL,
// pm_pset_dbpath,
// pm_pset_dbmtime,
================================================================
Index: poldek/poldek/pkgset-req.c
diff -u poldek/poldek/pkgset-req.c:1.46 poldek/poldek/pkgset-req.c:1.47
--- poldek/poldek/pkgset-req.c:1.46 Mon Sep 11 23:47:45 2006
+++ poldek/poldek/pkgset-req.c Mon Jan 8 18:22:00 2007
@@ -380,7 +380,7 @@
*npkgs = 0;
}
- if (!matched && pkgset_pmprovides(ps, req)) {
+ if (!matched && pkgset_pm_satisfies(ps, req)) {
matched = 1;
capreq_set_satisfied(req);
msg(4, " req %-35s --> PM_CAP\n", capreq_snprintf_s(req));
================================================================
Index: poldek/poldek/pkgset.c
diff -u poldek/poldek/pkgset.c:1.90 poldek/poldek/pkgset.c:1.91
--- poldek/poldek/pkgset.c:1.90 Tue Aug 22 17:08:30 2006
+++ poldek/poldek/pkgset.c Mon Jan 8 18:22:00 2007
@@ -73,7 +73,8 @@
ps->flags = 0;
if (pmctx) {
- ps->rpmcaps = pm_get_pmcaps(pmctx);
+ ps->pmcaps = pm_get_pmcaps(pmctx);
+ ps->pmctx = pmctx;
}
return ps;
}
@@ -102,54 +103,47 @@
ps->_vrfy_unreqs = NULL;
}
- if (ps->_vrfy_file_conflicts) {
- n_array_free(ps->_vrfy_file_conflicts);
- ps->_vrfy_file_conflicts = NULL;
- }
-
+ if (ps->_vrfy_file_conflicts)
+ n_array_cfree(&ps->_vrfy_file_conflicts);
- n_array_free(ps->pkgs);
+ n_array_cfree(&ps->pkgs);
- if (ps->ordered_pkgs) {
- n_array_free(ps->ordered_pkgs);
- ps->ordered_pkgs = NULL;
- }
+ if (ps->ordered_pkgs)
+ n_array_cfree(&ps->ordered_pkgs);
- if (ps->depdirs) {
- n_array_free(ps->depdirs);
- ps->depdirs = NULL;
- }
+ if (ps->depdirs)
+ n_array_cfree(&ps->depdirs);
- if (ps->pkgdirs) {
- n_array_free(ps->pkgdirs);
- ps->pkgdirs = NULL;
- }
+ if (ps->pkgdirs)
+ n_array_cfree(&ps->pkgdirs);
- if (ps->rpmcaps) {
- n_array_free(ps->rpmcaps);
- ps->rpmcaps = NULL;
- }
+ if (ps->pmcaps)
+ n_array_cfree(&ps->pmcaps);
+
memset(ps, 0, sizeof(*ps));
free(ps);
}
-int pkgset_pmprovides(const struct pkgset *ps, const struct capreq *req)
+int pkgset_pm_satisfies(const struct pkgset *ps, const struct capreq *req)
{
struct capreq *cap;
- if (ps->rpmcaps == NULL)
+ if (ps->pmcaps == NULL)
return 0; /* no caps -> assume NO */
/* internal caps have names like name(feature) */
if (!capreq_is_rpmlib(req) && strstr(capreq_name(req), "(") == NULL)
return 0;
- cap = n_array_bsearch_ex(ps->rpmcaps, req,
+ cap = n_array_bsearch_ex(ps->pmcaps, req,
(tn_fn_cmp)capreq_cmp_name);
if (cap && cap_match_req(cap, req, 1))
return 1;
+
+ if (ps->pmctx)
+ return pm_satisfies(ps->pmctx, req);
return 0;
}
================================================================
Index: poldek/poldek/pkgset.h
diff -u poldek/poldek/pkgset.h:1.60 poldek/poldek/pkgset.h:1.61
--- poldek/poldek/pkgset.h:1.60 Sun Dec 17 18:33:25 2006
+++ poldek/poldek/pkgset.h Mon Jan 8 18:22:00 2007
@@ -23,8 +23,9 @@
tn_array *depdirs; /* char* [] */
int nerrors;
- tn_array *rpmcaps; /* capreq* [] */
-
+ tn_array *pmcaps; /* capreq* [] */
+ struct pm_ctx *pmctx;
+
tn_hash *_vrfy_unreqs;
tn_array *_vrfy_file_conflicts;
@@ -90,7 +91,7 @@
tn_array *pkgset_get_packages_bynvr(const struct pkgset *ps);
-int pkgset_pmprovides(const struct pkgset *ps, const struct capreq *req);
+int pkgset_pm_satisfies(const struct pkgset *ps, const struct capreq *req);
void pkgset_report_fileconflicts(struct pkgset *ps, tn_array *pkgs);
================================================================
---- CVS-web:
http://cvs.pld-linux.org/poldek/poldek/pm/mod.h?r1=1.12&r2=1.13&f=u
http://cvs.pld-linux.org/poldek/poldek/pm/pm.c?r1=1.10&r2=1.11&f=u
http://cvs.pld-linux.org/poldek/poldek/pm/pm.h?r1=1.17&r2=1.18&f=u
http://cvs.pld-linux.org/poldek/poldek/pm/rpm/misc.c?r1=1.8&r2=1.9&f=u
http://cvs.pld-linux.org/poldek/poldek/pm/rpm/mod.c?r1=1.6&r2=1.7&f=u
http://cvs.pld-linux.org/poldek/poldek/pm/rpm/pm_rpm.h?r1=1.15&r2=1.16&f=u
http://cvs.pld-linux.org/poldek/poldek/pm/pset/mod.c?r1=1.6&r2=1.7&f=u
http://cvs.pld-linux.org/poldek/poldek/pkgset-req.c?r1=1.46&r2=1.47&f=u
http://cvs.pld-linux.org/poldek/poldek/pkgset.c?r1=1.90&r2=1.91&f=u
http://cvs.pld-linux.org/poldek/poldek/pkgset.h?r1=1.60&r2=1.61&f=u
More information about the pld-cvs-commit
mailing list