aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/rpm/files/extcond.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/rpm/files/extcond.patch')
-rw-r--r--recipes/rpm/files/extcond.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/recipes/rpm/files/extcond.patch b/recipes/rpm/files/extcond.patch
new file mode 100644
index 0000000000..6963b8606c
--- /dev/null
+++ b/recipes/rpm/files/extcond.patch
@@ -0,0 +1,78 @@
+This patch supports an extension in the condition evaluation.
+If the condition is a format and returns an nonempty string, it is
+assumed to be true.
+This mechanism is used by the weakdeps patch to filter the
+"RPMSENSE_STRONG" flag.
+
+--- ./rpmdb/header.c.orig 2005-06-06 23:33:54.000000000 +0000
++++ ./rpmdb/header.c 2006-03-17 18:08:02.000000000 +0000
+@@ -2980,8 +2980,12 @@ static int parseExpression(headerSprintf
+
+ *endPtr = chptr;
+
++ token->u.cond.tag.type = NULL;
++ token->u.cond.tag.format = "";
+ token->type = PTOK_COND;
+
++ if ((token->u.cond.tag.type = strchr(str, ':')) != 0)
++ *token->u.cond.tag.type++ = 0;
+ (void) findTag(hsa, token, str);
+
+ return 0;
+@@ -3239,6 +3243,7 @@ static char * singleSprintf(headerSprint
+ int_32 type;
+ int_32 count;
+ sprintfToken spft;
++ sprintfTag stag;
+ int condNumFormats;
+ size_t need;
+
+@@ -3270,6 +3275,18 @@ static char * singleSprintf(headerSprint
+ if (token->u.cond.tag.ext || headerIsEntry(hsa->h, token->u.cond.tag.tag)) {
+ spft = token->u.cond.ifFormat;
+ condNumFormats = token->u.cond.numIfTokens;
++ if (token->u.cond.tag.fmt) {
++ /* check if format creates output */
++ size_t vallen = hsa->vallen;
++ formatValue(hsa, &token->u.cond.tag, element);
++ if (hsa->vallen == vallen) {
++ spft = token->u.cond.elseFormat;
++ condNumFormats = token->u.cond.numElseTokens;
++ } else {
++ hsa->vallen = vallen;
++ hsa->val[hsa->vallen] = 0;
++ }
++ }
+ } else {
+ spft = token->u.cond.elseFormat;
+ condNumFormats = token->u.cond.numElseTokens;
+@@ -3291,19 +3308,22 @@ static char * singleSprintf(headerSprint
+ spft = token->u.array.format;
+ for (i = 0; i < token->u.array.numTokens; i++, spft++)
+ {
+- if (spft->type != PTOK_TAG ||
+- spft->u.tag.arrayCount ||
+- spft->u.tag.justOne) continue;
++ if (spft->type != PTOK_TAG && spft->type != PTOK_COND)
++ continue;
++
++ stag = (spft->type == PTOK_COND ? &spft->u.cond.tag : &spft->u.tag);
++ if (stag->arrayCount || stag->justOne)
++ continue;
+
+- if (spft->u.tag.ext) {
++ if (stag->ext) {
+ /*@-boundswrite@*/
+- if (getExtension(hsa, spft->u.tag.ext, &type, NULL, &count,
+- hsa->ec + spft->u.tag.extNum))
++ if (getExtension(hsa, stag->ext, &type, NULL, &count,
++ hsa->ec + stag->extNum))
+ continue;
+ /*@=boundswrite@*/
+ } else {
+ /*@-boundswrite@*/
+- if (!headerGetEntry(hsa->h, spft->u.tag.tag, &type, NULL, &count))
++ if (!headerGetEntry(hsa->h, stag->tag, &type, NULL, &count))
+ continue;
+ /*@=boundswrite@*/
+ }