Blob Blame History Raw
From d18fdd7f8964d01b4dfc39bf84133695cff5a13a Mon Sep 17 00:00:00 2001
From: Lubos Kardos <lkardos@redhat.com>
Date: Thu, 6 Aug 2015 14:28:25 +0200
Subject: [PATCH] Add --filetriggers option to show info about file triggers.

---
 lib/rpmtag.h        |   4 ++
 lib/tagexts.c       | 107 +++++++++++++++++++++++++++++++++++++++++++++++-----
 rpmpopt.in          |   8 ++++
 tests/rpmgeneral.at |   4 ++
 4 files changed, 113 insertions(+), 10 deletions(-)

diff --git a/lib/rpmtag.h b/lib/rpmtag.h
index ac6ee64..94c0655 100644
--- a/lib/rpmtag.h
+++ b/lib/rpmtag.h
@@ -352,6 +352,10 @@ typedef enum rpmTag_e {
     RPMTAG_REMOVEPATHPOSTFIXES  = 5083, /* s internal */
     RPMTAG_FILETRIGGERPRIORITIES	= 5084, /* i[] */
     RPMTAG_TRANSFILETRIGGERPRIORITIES	= 5085, /* i[] */
+    RPMTAG_FILETRIGGERCONDS		= 5086, /* s[] extension */
+    RPMTAG_FILETRIGGERTYPE		= 5087, /* s[] extension */
+    RPMTAG_TRANSFILETRIGGERCONDS	= 5088, /* s[] extension */
+    RPMTAG_TRANSFILETRIGGERTYPE		= 5089, /* s[] extension */
 
     RPMTAG_FIRSTFREE_TAG	/*!< internal */
 } rpmTag;
diff --git a/lib/tagexts.c b/lib/tagexts.c
index fa3fe72..69f3c24 100644
--- a/lib/tagexts.c
+++ b/lib/tagexts.c
@@ -191,6 +191,12 @@ exit:
     return rc;
 }
 
+typedef enum tMode_e {
+    NORMALTRIGGER     = 0,
+    FILETRIGGER       = 1,
+    TRANSFILETRIGGER  = 2,
+} tMode;
+
 /**
  * Retrieve trigger info.
  * @param h		header
@@ -198,22 +204,49 @@ exit:
  * @param hgflags	header get flags
  * @return		1 on success
  */
-static int triggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+static int triggercondsTagFor(tMode mode, Header h, rpmtd td,
+				headerGetFlags hgflags)
 {
     uint32_t * indices;
     int i, j;
     char ** conds;
     struct rpmtd_s nametd, indextd, flagtd, versiontd, scripttd;
     int hgeflags = HEADERGET_MINMEM;
+    rpmTagVal triggername, triggerindex, triggerflags;
+    rpmTagVal triggerversion, triggerscripts;
+
+    switch (mode) {
+	case NORMALTRIGGER:
+	    triggername = RPMTAG_TRIGGERNAME;
+	    triggerindex = RPMTAG_TRIGGERINDEX;
+	    triggerflags = RPMTAG_TRIGGERFLAGS;
+	    triggerversion = RPMTAG_TRIGGERVERSION;
+	    triggerscripts = RPMTAG_TRIGGERSCRIPTS;
+	    break;
+	case FILETRIGGER:
+	    triggername = RPMTAG_FILETRIGGERNAME;
+	    triggerindex = RPMTAG_FILETRIGGERINDEX;
+	    triggerflags = RPMTAG_FILETRIGGERFLAGS;
+	    triggerversion = RPMTAG_FILETRIGGERVERSION;
+	    triggerscripts = RPMTAG_FILETRIGGERSCRIPTS;
+	    break;
+	case TRANSFILETRIGGER:
+	    triggername = RPMTAG_TRANSFILETRIGGERNAME;
+	    triggerindex = RPMTAG_TRANSFILETRIGGERINDEX;
+	    triggerflags = RPMTAG_TRANSFILETRIGGERFLAGS;
+	    triggerversion = RPMTAG_TRANSFILETRIGGERVERSION;
+	    triggerscripts = RPMTAG_TRANSFILETRIGGERSCRIPTS;
+	    break;
+    }
 
-    if (!headerGet(h, RPMTAG_TRIGGERNAME, &nametd, hgeflags)) {
+    if (!headerGet(h, triggername, &nametd, hgeflags)) {
 	return 0;
     }
 
-    headerGet(h, RPMTAG_TRIGGERINDEX, &indextd, hgeflags);
-    headerGet(h, RPMTAG_TRIGGERFLAGS, &flagtd, hgeflags);
-    headerGet(h, RPMTAG_TRIGGERVERSION, &versiontd, hgeflags);
-    headerGet(h, RPMTAG_TRIGGERSCRIPTS, &scripttd, hgeflags);
+    headerGet(h, triggerindex, &indextd, hgeflags);
+    headerGet(h, triggerflags, &flagtd, hgeflags);
+    headerGet(h, triggerversion, &versiontd, hgeflags);
+    headerGet(h, triggerscripts, &scripttd, hgeflags);
 
     td->type = RPM_STRING_ARRAY_TYPE;
     td->flags = RPMTD_ALLOCED | RPMTD_PTR_ALLOCED;
@@ -262,6 +295,21 @@ static int triggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
     return 1;
 }
 
+static int triggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggercondsTagFor(NORMALTRIGGER, h, td, hgflags);
+}
+
+static int filetriggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggercondsTagFor(FILETRIGGER, h, td, hgflags);
+}
+
+static int transfiletriggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggercondsTagFor(TRANSFILETRIGGER, h, td, hgflags);
+}
+
 /**
  * Retrieve trigger type info.
  * @param h		header
@@ -269,18 +317,38 @@ static int triggercondsTag(Header h, rpmtd td, headerGetFlags hgflags)
  * @param hgflags	header get flags
  * @return		1 on success
  */
-static int triggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+static int triggertypeTagFor(tMode mode, Header h, rpmtd td,
+				headerGetFlags hgflags)
 {
     int i;
     char ** conds;
     struct rpmtd_s indices, flags, scripts;
+    rpmTagVal triggerindex, triggerflags, triggerscripts;
+
+    switch (mode) {
+	case NORMALTRIGGER:
+	    triggerindex = RPMTAG_TRIGGERINDEX;
+	    triggerflags = RPMTAG_TRIGGERFLAGS;
+	    triggerscripts = RPMTAG_TRIGGERSCRIPTS;
+	    break;
+	case FILETRIGGER:
+	    triggerindex = RPMTAG_FILETRIGGERINDEX;
+	    triggerflags = RPMTAG_FILETRIGGERFLAGS;
+	    triggerscripts = RPMTAG_FILETRIGGERSCRIPTS;
+	    break;
+	case TRANSFILETRIGGER:
+	    triggerindex = RPMTAG_TRANSFILETRIGGERINDEX;
+	    triggerflags = RPMTAG_TRANSFILETRIGGERFLAGS;
+	    triggerscripts = RPMTAG_TRANSFILETRIGGERSCRIPTS;
+	    break;
+    }
 
-    if (!headerGet(h, RPMTAG_TRIGGERINDEX, &indices, HEADERGET_MINMEM)) {
+    if (!headerGet(h, triggerindex, &indices, HEADERGET_MINMEM)) {
 	return 0;
     }
 
-    headerGet(h, RPMTAG_TRIGGERFLAGS, &flags, HEADERGET_MINMEM);
-    headerGet(h, RPMTAG_TRIGGERSCRIPTS, &scripts, HEADERGET_MINMEM);
+    headerGet(h, triggerflags, &flags, HEADERGET_MINMEM);
+    headerGet(h, triggerscripts, &scripts, HEADERGET_MINMEM);
 
     td->flags = RPMTD_ALLOCED | RPMTD_PTR_ALLOCED;
     td->count = rpmtdCount(&scripts);
@@ -316,6 +384,21 @@ static int triggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
     return 1;
 }
 
+static int triggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggertypeTagFor(NORMALTRIGGER, h, td, hgflags);
+}
+
+static int filetriggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggertypeTagFor(FILETRIGGER, h, td, hgflags);
+}
+
+static int transfiletriggertypeTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return triggertypeTagFor(TRANSFILETRIGGER, h, td, hgflags);
+}
+
 /**
  * Retrieve installed file paths.
  * @param h		header
@@ -873,7 +956,11 @@ static const struct headerTagFunc_s rpmHeaderTagExtensions[] = {
     { RPMTAG_FILEPROVIDE,	fileprovideTag },
     { RPMTAG_FILEREQUIRE,	filerequireTag },
     { RPMTAG_TRIGGERCONDS,	triggercondsTag },
+    { RPMTAG_FILETRIGGERCONDS,	filetriggercondsTag },
+    { RPMTAG_TRANSFILETRIGGERCONDS,	transfiletriggercondsTag },
     { RPMTAG_TRIGGERTYPE,	triggertypeTag },
+    { RPMTAG_FILETRIGGERTYPE,	filetriggertypeTag },
+    { RPMTAG_TRANSFILETRIGGERTYPE,	transfiletriggertypeTag },
     { RPMTAG_LONGFILESIZES,	longfilesizesTag },
     { RPMTAG_LONGARCHIVESIZE,	longarchivesizeTag },
     { RPMTAG_LONGSIZE,		longsizeTag },
diff --git a/rpmpopt.in b/rpmpopt.in
index 48c5c55..d930862 100644
--- a/rpmpopt.in
+++ b/rpmpopt.in
@@ -115,6 +115,14 @@ rpm	alias --triggerscripts --qf '\
 rpm	alias --triggers --triggerscripts \
 	--POPTdesc=$"list trigger scriptlets from package(s)"
 
+rpm	alias --filetriggerscripts --qf '\
+[filetrigger%{FILETRIGGERTYPE} scriptlet (using %{FILETRIGGERSCRIPTPROG}) -- \
+%{FILETRIGGERCONDS}\n%{FILETRIGGERSCRIPTS}\n]\
+[transfiletrigger%{TRANSFILETRIGGERTYPE} scriptlet (using %{TRANSFILETRIGGERSCRIPTPROG}) -- \
+%{TRANSFILETRIGGERCONDS}\n%{TRANSFILETRIGGERSCRIPTS}\n]'
+rpm	alias --filetriggers --filetriggerscripts \
+	--POPTdesc=$"list filetrigger scriptlets from package(s)"
+
 rpm	alias --last --qf '%|INSTALLTIME?{%{INSTALLTIME}}:{000000000}| %{NVRA} %|INSTALLTIME?{%{INSTALLTIME:date}}:{(not installed)}|\n' \
 	--pipe "LC_NUMERIC=C sort -r -n | sed 's,^[0-9]\+ ,,' | awk '{printf(\"%-45s %-s\n\", $1, substr($0,length($1)+2))}' " \
 	--POPTdesc=$"list package(s) by install time, most recent first"
diff --git a/tests/rpmgeneral.at b/tests/rpmgeneral.at
index 312f43b..ac21a40 100644
--- a/tests/rpmgeneral.at
+++ b/tests/rpmgeneral.at
@@ -115,6 +115,7 @@ FILERDEVS
 FILEREQUIRE
 FILESIZES
 FILESTATES
+FILETRIGGERCONDS
 FILETRIGGERFLAGS
 FILETRIGGERINDEX
 FILETRIGGERNAME
@@ -122,6 +123,7 @@ FILETRIGGERPRIORITIES
 FILETRIGGERSCRIPTFLAGS
 FILETRIGGERSCRIPTPROG
 FILETRIGGERSCRIPTS
+FILETRIGGERTYPE
 FILETRIGGERVERSION
 FILEUSERNAME
 FILEVERIFYFLAGS
@@ -256,6 +258,7 @@ SUPPLEMENTNAME
 SUPPLEMENTNEVRS
 SUPPLEMENTS
 SUPPLEMENTVERSION
+TRANSFILETRIGGERCONDS
 TRANSFILETRIGGERFLAGS
 TRANSFILETRIGGERINDEX
 TRANSFILETRIGGERNAME
@@ -263,6 +266,7 @@ TRANSFILETRIGGERPRIORITIES
 TRANSFILETRIGGERSCRIPTFLAGS
 TRANSFILETRIGGERSCRIPTPROG
 TRANSFILETRIGGERSCRIPTS
+TRANSFILETRIGGERTYPE
 TRANSFILETRIGGERVERSION
 TRIGGERCONDS
 TRIGGERFLAGS
-- 
1.9.3