summaryrefslogtreecommitdiff
path: root/uname-deps.patch
blob: 61ba65274c595876262387d84a3c14bfc1c527d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
diff --git a/lib/depends.c b/lib/depends.c
index 28a4a784d..1d8ce1f8a 100644
--- a/lib/depends.c
+++ b/lib/depends.c
@@ -690,6 +690,17 @@ retry:
 	goto unsatisfied;
     }
 
+    char * N = rpmdsN(dep);
+    if (strstr(N, "uname(") == N) {
+	if (tsmem->uname == NULL)
+	    rpmdsUnamePool(rpmtsPool(ts), &(tsmem->uname));
+	
+	if (tsmem->uname != NULL && rpmdsSearch(tsmem->uname, dep) >= 0) {
+	    rpmdsNotify(dep, "(uname provides)", rc);
+	    goto exit;
+	}
+    }
+
     /* Dont look at pre-requisites of already installed packages */
     if (!adding && isTransientReq(dsflags))
 	goto exit;
diff --git a/lib/rpmds.c b/lib/rpmds.c
index f7ee76392..754969e39 100644
--- a/lib/rpmds.c
+++ b/lib/rpmds.c
@@ -2,6 +2,7 @@
  * \file lib/rpmds.c
  */
 #include "system.h"
+#include <sys/utsname.h>
 
 #include <rpm/rpmtypes.h>
 #include <rpm/rpmlib.h>		/* rpmvercmp */
@@ -1596,3 +1597,60 @@ rpmRC rpmdsParseRichDep(rpmds dep, rpmds *leftds, rpmds *rightds, rpmrichOp *op,
     return rc;
 }
 
+/**
+ * Merge a single provides, wrapping N as "NS(N)".
+ */
+static int rpmdsNSAdd(rpmstrPool pool, rpmds *dsp, const char * NS,
+		const char *N, const char *EVR, rpmsenseFlags Flags)
+{
+    char *t;
+    rpmds ds;
+    int rc;
+
+    t = (char *) alloca(strlen(NS)+sizeof("()")+strlen(N));
+    *t = '\0';
+    (void) stpcpy( stpcpy( stpcpy( stpcpy(t, NS), "("), N), ")");
+
+    ds = rpmdsSinglePool(pool, RPMTAG_PROVIDENAME, t, EVR, Flags);
+    rc = rpmdsMerge(dsp, ds);
+    rpmdsFree(ds);
+    return rc;
+}
+
+int rpmdsUnamePool(rpmstrPool pool, rpmds * dsp)
+{
+    int rc = -1;
+    static const char * NS = "uname";
+    struct utsname un;
+
+    if (uname(&un) < 0)
+	goto exit;
+
+    rc = rpmdsNSAdd(pool, dsp, NS, "sysname", un.sysname, RPMSENSE_EQUAL);
+    if (rc < 0)
+	goto exit;
+    rc = rpmdsNSAdd(pool, dsp, NS, "nodename", un.nodename, RPMSENSE_EQUAL);
+    if (rc < 0)
+	goto exit;
+    rc = rpmdsNSAdd(pool, dsp, NS, "release", un.release, RPMSENSE_EQUAL);
+    if (rc < 0)
+	goto exit;
+    rc = rpmdsNSAdd(pool, dsp, NS, "machine", un.machine, RPMSENSE_EQUAL);
+    if (rc < 0)
+	goto exit;
+#if defined(__linux__)
+    rc = rpmdsNSAdd(pool, dsp, NS, "domainname", un.domainname, RPMSENSE_EQUAL);
+    if (rc < 0)
+	goto exit;
+#endif
+exit:
+    /* freeze the pool to save memory, but only if private pool */
+    if (*dsp && (*dsp)->pool != pool)
+	rpmstrPoolFreeze((*dsp)->pool, 0);
+    return (rc < 0) ? -1 : 0;
+}
+
+int rpmdsUname(rpmds * dsp)
+{
+    return rpmdsUnamePool(NULL, dsp);
+}
diff --git a/lib/rpmds.h b/lib/rpmds.h
index 90d54aa27..558252c04 100644
--- a/lib/rpmds.h
+++ b/lib/rpmds.h
@@ -412,6 +412,13 @@ int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote);
  */
 int rpmdsRpmlib(rpmds * dsp, const void * tblp);
 
+/**
+ * Load uname provides into a dependency set.
+ * @retval *dsp		(loaded) dependency set
+ * @return		0 on success
+ */
+int rpmdsUname(rpmds * dsp);
+
 /** \ingroup rpmds
  * Create and load a dependency set.
  * @param pool		shared string pool (or NULL for private pool)
@@ -468,6 +475,14 @@ rpmds rpmdsSinglePoolTix(rpmstrPool pool, rpmTagVal tagN,
  */
 int rpmdsRpmlibPool(rpmstrPool pool, rpmds * dsp, const void * tblp);
 
+/**
+ * Load uname provides into a dependency set.
+ * @param pool		shared string pool (or NULL for private pool)
+ * @retval *dsp		(loaded) dependency set
+ * @return		0 on success
+ */
+int rpmdsUnamePool(rpmstrPool pool, rpmds * dsp);
+
 
 typedef enum rpmrichOp_e {
     RPMRICHOP_SINGLE  = 1,
diff --git a/lib/rpmts_internal.h b/lib/rpmts_internal.h
index e69ef2584..ecdb12f0c 100644
--- a/lib/rpmts_internal.h
+++ b/lib/rpmts_internal.h
@@ -21,6 +21,7 @@ typedef struct tsMembers_s {
     rpmal addedPackages;	/*!< Set of packages being installed. */
 
     rpmds rpmlib;		/*!< rpmlib() dependency set. */
+    rpmds uname;		/*!< uname() dependency set. */
     rpmte * order;		/*!< Packages sorted by dependencies. */
     int orderCount;		/*!< No. of transaction elements. */
     int orderAlloced;		/*!< No. of allocated transaction elements. */