diff --git a/include/rpm/rpmds.h b/include/rpm/rpmds.h index 6f6b6c678e..6d4dea7cdc 100644 --- a/include/rpm/rpmds.h +++ b/include/rpm/rpmds.h @@ -299,6 +299,14 @@ int rpmdsIsWeak(rpmds ds); */ int rpmdsIsReverse(rpmds ds); +/** \ingroup rpmds + * Return whether dependency represents a sysusers.d entry + * @param ds dependency set + * @param[out] sysuser sysusers.d line if true (malloced), may be NULL + * @return 1 if reversed, 0 if not + */ +int rpmdsIsSysuser(rpmds ds, char **sysuser); + /** \ingroup rpmds * Return current dependency color. * @param ds dependency set diff --git a/lib/psm.c b/lib/psm.c index 4d7d96aade..cc49266a78 100644 --- a/lib/psm.c +++ b/lib/psm.c @@ -373,19 +373,11 @@ static rpmRC runSysusers(rpmpsm psm) * followed by decoded sysusers lines. */ while ((dx = rpmdsNext(provides)) >= 0) { - const char *name = rpmdsN(provides); - char *fn = NULL; char *line = NULL; - size_t llen = 0; - int px = -1; - - if (!(rstreqn(name, "user(", 5) || rstreqn(name, "group(", 6) - || rstreqn(name, "groupmember(", 12))) - continue; - if (!(rpmdsFlags(provides) & RPMSENSE_EQUAL)) - continue; - if (rpmBase64Decode(rpmdsEVR(provides), (void **)&line, &llen)) + if (!rpmdsIsSysuser(provides, &line)) continue; + char *fn = NULL; + int px = -1; if (sysusers == NULL) sysusers = xcalloc(rpmdsCount(provides), sizeof(*sysusers)); @@ -408,7 +400,7 @@ static rpmRC runSysusers(rpmpsm psm) nsysusers++; } - argvAddN(&sysusers[px], line, llen); + argvAdd(&sysusers[px], line); free(fn); free(line); diff --git a/lib/rpmds.c b/lib/rpmds.c index 14727ed96a..65a6e014f6 100644 --- a/lib/rpmds.c +++ b/lib/rpmds.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "rpmds_internal.h" @@ -1179,6 +1180,32 @@ int rpmdsIsReverse(rpmds ds) return reverse; } +int rpmdsIsSysuser(rpmds ds, char **sysuser) +{ + if (rpmdsTagN(ds) != RPMTAG_PROVIDENAME) + return 0; + if (!(rpmdsFlags(ds) & RPMSENSE_EQUAL)) + return 0; + + const char *name = rpmdsN(ds); + if (!(rstreqn(name, "user(", 5) || rstreqn(name, "group(", 6) || + rstreqn(name, "groupmember(", 12))) { + return 0; + } + + char *line = NULL; + size_t llen = 0; + + if (rpmBase64Decode(rpmdsEVR(ds), (void **)&line, &llen)) + return 0; + + if (sysuser) + *sysuser = rstrndup(line, llen); + free(line); + + return 1; +} + rpmsenseFlags rpmSanitizeDSFlags(rpmTagVal tagN, rpmsenseFlags Flags) { rpmsenseFlags extra = RPMSENSE_ANY; diff --git a/lib/tagexts.c b/lib/tagexts.c index 11c760c64b..240ff1bb29 100644 --- a/lib/tagexts.c +++ b/lib/tagexts.c @@ -985,20 +985,11 @@ static int sysusersTag(Header h, rpmtd td, headerGetFlags hgflags) rpmds provides = rpmdsNew(h, RPMTAG_PROVIDENAME, 0); while (rpmdsNext(provides) >= 0) { - size_t llen = 0; char *line = NULL; - const char *name = rpmdsN(provides); - - if (!(rstreqn(name, "user(", 5) || rstreqn(name, "group(", 6) - || rstreqn(name, "groupmember(", 12))) - continue; - if (!(rpmdsFlags(provides) & RPMSENSE_EQUAL)) - continue; - if (rpmBase64Decode(rpmdsEVR(provides), (void **)&line, &llen)) - continue; - - argvAddN(&sysusers, line, llen); - free(line); + if (rpmdsIsSysuser(provides, &line)) { + argvAdd(&sysusers, line); + free(line); + } } rpmdsFree(provides); diff --git a/python/rpmds-py.c b/python/rpmds-py.c index a79038e102..c9df0fb6d2 100644 --- a/python/rpmds-py.c +++ b/python/rpmds-py.c @@ -82,6 +82,12 @@ rpmds_IsReverse(rpmdsObject * s) return PyBool_FromLong(rpmdsIsReverse(s->ds)); } +static PyObject * +rpmds_IsSysuser(rpmdsObject * s) +{ + return PyBool_FromLong(rpmdsIsSysuser(s->ds, NULL)); +} + static PyObject * rpmds_iternext(rpmdsObject * s) { @@ -216,6 +222,8 @@ The current index in ds is positioned at overlapping member." }, "ds.IsRich() -- Return whether the dependency is rich."}, {"IsReverse", (PyCFunction)rpmds_IsReverse, METH_NOARGS, "ds.IsReverse() -- Return whether the dependency is reversed."}, + {"IsSysuser", (PyCFunction)rpmds_IsSysuser, METH_NOARGS, + "ds.IsSysuser() -- Return whether the dependency represents a sysusers.d entry."}, {NULL, NULL} /* sentinel */ }; diff --git a/tests/rpmpython.at b/tests/rpmpython.at index 6cc7976950..134c9a320b 100644 --- a/tests/rpmpython.at +++ b/tests/rpmpython.at @@ -580,15 +580,17 @@ deps.append(rpm.ds(('bar', rpm.RPMSENSE_EQUAL|rpm.RPMSENSE_MISSINGOK, '2.0'), rp deps.append(rpm.ds(('(foo if bar)',), rpm.RPMTAG_REQUIRENAME)) deps.append(rpm.ds(('(foo if bar)',), rpm.RPMTAG_SUGGESTNAME)) deps.append(rpm.ds(('(foo if bar)',), rpm.RPMTAG_SUPPLEMENTNAME)) +deps.append(rpm.ds(('user(rtkit)', rpm.RPMSENSE_EQUAL, 'dSBydGtpdCAxNzIgIlJlYWx0aW1lS2l0IiAvIC9zYmluL25vbG9naW4A'), rpm.RPMTAG_PROVIDENAME)) for d in deps: - myprint("%s %s %s %s" % (d.DNEVR(), d.IsWeak(), d.IsRich(), d.IsReverse())) -], -[R foo = 2.0 False False False -r bar = 2.0 True False False -R bar = 2.0 True False False -R (foo if bar) False True False -s (foo if bar) True True False -S (foo if bar) True True True + myprint("%s %s %s %s %s" % (d.DNEVR(), d.IsWeak(), d.IsRich(), d.IsReverse(), d.IsSysuser())) +], +[R foo = 2.0 False False False False +r bar = 2.0 True False False False +R bar = 2.0 True False False False +R (foo if bar) False True False False +s (foo if bar) True True False False +S (foo if bar) True True True False +P user(rtkit) = dSBydGtpdCAxNzIgIlJlYWx0aW1lS2l0IiAvIC9zYmluL25vbG9naW4A False False False True ], [])