From d18fdd7f8964d01b4dfc39bf84133695cff5a13a Mon Sep 17 00:00:00 2001 From: Lubos Kardos 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