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