1 diff --git a/lib/depends.c b/lib/depends.c
2 index 28a4a784d..1d8ce1f8a 100644
5 @@ -690,6 +690,17 @@ retry:
9 + char * N = rpmdsN(dep);
10 + if (strstr(N, "uname(") == N) {
11 + if (tsmem->uname == NULL)
12 + rpmdsUnamePool(rpmtsPool(ts), &(tsmem->uname));
14 + if (tsmem->uname != NULL && rpmdsSearch(tsmem->uname, dep) >= 0) {
15 + rpmdsNotify(dep, "(uname provides)", rc);
20 /* Dont look at pre-requisites of already installed packages */
21 if (!adding && isTransientReq(dsflags))
23 diff --git a/lib/rpmds.c b/lib/rpmds.c
24 index f7ee76392..754969e39 100644
31 +#include <sys/utsname.h>
33 #include <rpm/rpmtypes.h>
34 #include <rpm/rpmlib.h> /* rpmvercmp */
35 @@ -1596,3 +1597,60 @@ rpmRC rpmdsParseRichDep(rpmds dep, rpmds *leftds, rpmds *rightds, rpmrichOp *op,
40 + * Merge a single provides, wrapping N as "NS(N)".
42 +static int rpmdsNSAdd(rpmstrPool pool, rpmds *dsp, const char * NS,
43 + const char *N, const char *EVR, rpmsenseFlags Flags)
49 + t = (char *) alloca(strlen(NS)+sizeof("()")+strlen(N));
51 + (void) stpcpy( stpcpy( stpcpy( stpcpy(t, NS), "("), N), ")");
53 + ds = rpmdsSinglePool(pool, RPMTAG_PROVIDENAME, t, EVR, Flags);
54 + rc = rpmdsMerge(dsp, ds);
59 +int rpmdsUnamePool(rpmstrPool pool, rpmds * dsp)
62 + static const char * NS = "uname";
68 + rc = rpmdsNSAdd(pool, dsp, NS, "sysname", un.sysname, RPMSENSE_EQUAL);
71 + rc = rpmdsNSAdd(pool, dsp, NS, "nodename", un.nodename, RPMSENSE_EQUAL);
74 + rc = rpmdsNSAdd(pool, dsp, NS, "release", un.release, RPMSENSE_EQUAL);
77 + rc = rpmdsNSAdd(pool, dsp, NS, "machine", un.machine, RPMSENSE_EQUAL);
80 +#if defined(__linux__)
81 + rc = rpmdsNSAdd(pool, dsp, NS, "domainname", un.domainname, RPMSENSE_EQUAL);
86 + /* freeze the pool to save memory, but only if private pool */
87 + if (*dsp && (*dsp)->pool != pool)
88 + rpmstrPoolFreeze((*dsp)->pool, 0);
89 + return (rc < 0) ? -1 : 0;
92 +int rpmdsUname(rpmds * dsp)
94 + return rpmdsUnamePool(NULL, dsp);
96 diff --git a/lib/rpmds.h b/lib/rpmds.h
97 index 90d54aa27..558252c04 100644
100 @@ -412,6 +412,13 @@ int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote);
102 int rpmdsRpmlib(rpmds * dsp, const void * tblp);
105 + * Load uname provides into a dependency set.
106 + * @retval *dsp (loaded) dependency set
107 + * @return 0 on success
109 +int rpmdsUname(rpmds * dsp);
112 * Create and load a dependency set.
113 * @param pool shared string pool (or NULL for private pool)
114 @@ -468,6 +475,14 @@ rpmds rpmdsSinglePoolTix(rpmstrPool pool, rpmTagVal tagN,
116 int rpmdsRpmlibPool(rpmstrPool pool, rpmds * dsp, const void * tblp);
119 + * Load uname provides into a dependency set.
120 + * @param pool shared string pool (or NULL for private pool)
121 + * @retval *dsp (loaded) dependency set
122 + * @return 0 on success
124 +int rpmdsUnamePool(rpmstrPool pool, rpmds * dsp);
127 typedef enum rpmrichOp_e {
128 RPMRICHOP_SINGLE = 1,
129 diff --git a/lib/rpmts_internal.h b/lib/rpmts_internal.h
130 index e69ef2584..ecdb12f0c 100644
131 --- a/lib/rpmts_internal.h
132 +++ b/lib/rpmts_internal.h
133 @@ -21,6 +21,7 @@ typedef struct tsMembers_s {
134 rpmal addedPackages; /*!< Set of packages being installed. */
136 rpmds rpmlib; /*!< rpmlib() dependency set. */
137 + rpmds uname; /*!< uname() dependency set. */
138 rpmte * order; /*!< Packages sorted by dependencies. */
139 int orderCount; /*!< No. of transaction elements. */
140 int orderAlloced; /*!< No. of allocated transaction elements. */