From 1dd5b084bd86b0c18016eaa678ab83c447ec3c9d Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Fri, 28 May 2010 12:57:59 +0300 Subject: [PATCH] Add internal helper for formatting file attribute strings - Eliminates some copy-paste slopping. Verify code traditionally only shows the first attribute, take care to keep that format to avoid breaking scripts unnecessarily --- lib/formats.c | 22 ++-------------------- lib/misc.h | 3 +++ lib/verify.c | 39 ++++++++++++++++++++++----------------- 3 files changed, 27 insertions(+), 37 deletions(-) diff --git a/lib/formats.c b/lib/formats.c index 3fff34f..499c5d0 100644 --- a/lib/formats.c +++ b/lib/formats.c @@ -301,32 +301,14 @@ static char * permsFormat(rpmtd td, char * formatPrefix) static char * fflagsFormat(rpmtd td, char * formatPrefix) { char * val = NULL; - char buf[15]; if (rpmtdClass(td) != RPM_NUMERIC_CLASS) { val = xstrdup(_("(not a number)")); } else { - uint64_t anint = rpmtdGetNumber(td); - buf[0] = '\0'; - if (anint & RPMFILE_DOC) - strcat(buf, "d"); - if (anint & RPMFILE_CONFIG) - strcat(buf, "c"); - if (anint & RPMFILE_SPECFILE) - strcat(buf, "s"); - if (anint & RPMFILE_MISSINGOK) - strcat(buf, "m"); - if (anint & RPMFILE_NOREPLACE) - strcat(buf, "n"); - if (anint & RPMFILE_GHOST) - strcat(buf, "g"); - if (anint & RPMFILE_LICENSE) - strcat(buf, "l"); - if (anint & RPMFILE_README) - strcat(buf, "r"); - + char *buf = rpmFFlagsString(rpmtdGetNumber(td), ""); strcat(formatPrefix, "s"); rasprintf(&val, formatPrefix, buf); + free(buf); } return val; diff --git a/lib/misc.h b/lib/misc.h index 73d95c6..58a5e70 100644 --- a/lib/misc.h +++ b/lib/misc.h @@ -21,6 +21,9 @@ RPM_GNUC_INTERNAL char * rpmVerifyString(uint32_t verifyResult, const char *pad); RPM_GNUC_INTERNAL +char * rpmFFlagsString(uint32_t fflags, const char *pad); + +RPM_GNUC_INTERNAL unsigned int hashFunctionString(const char * string); /* * These may be called w/ a NULL argument to flush the cache -- they return diff --git a/lib/verify.c b/lib/verify.c index ac561da..8d958ae 100644 --- a/lib/verify.c +++ b/lib/verify.c @@ -306,6 +306,21 @@ char * rpmVerifyString(uint32_t verifyResult, const char *pad) #undef aok #undef unknown +char * rpmFFlagsString(uint32_t fflags, const char *pad) +{ + char *fmt = NULL; + rasprintf(&fmt, "%s%s%s%s%s%s%s%s", + (fflags & RPMFILE_DOC) ? "d" : pad, + (fflags & RPMFILE_CONFIG) ? "c" : pad, + (fflags & RPMFILE_SPECFILE) ? "s" : pad, + (fflags & RPMFILE_MISSINGOK) ? "m" : pad, + (fflags & RPMFILE_NOREPLACE) ? "n" : pad, + (fflags & RPMFILE_GHOST) ? "g" : pad, + (fflags & RPMFILE_LICENSE) ? "l" : pad, + (fflags & RPMFILE_README) ? "r" : pad); + return fmt; +} + /** * Check file info from header against what's actually installed. * @param ts transaction set @@ -323,7 +338,8 @@ static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask, int ghosts) rpmfiInit(fi, 0); while (rpmfiNext(fi) >= 0) { rpmfileAttrs fileAttrs = rpmfiFFlags(fi); - char *buf = NULL; + char *buf = NULL, *attrFormat; + char ac; int rc; /* If not verifying %ghost, skip ghost files. */ @@ -341,16 +357,11 @@ static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask, int ghosts) rpmdbFreeIterator(mi); } + attrFormat = rpmFFlagsString(fileAttrs, ""); + ac = rstreq(attrFormat, "") ? ' ' : attrFormat[0]; if (rc) { if (!(fileAttrs & (RPMFILE_MISSINGOK|RPMFILE_GHOST)) || rpmIsVerbose()) { - rasprintf(&buf, _("missing %c %s"), - ((fileAttrs & RPMFILE_CONFIG) ? 'c' : - (fileAttrs & RPMFILE_DOC) ? 'd' : - (fileAttrs & RPMFILE_GHOST) ? 'g' : - (fileAttrs & RPMFILE_LICENSE) ? 'l' : - (fileAttrs & RPMFILE_PUBKEY) ? 'P' : - (fileAttrs & RPMFILE_README) ? 'r' : ' '), - rpmfiFN(fi)); + rasprintf(&buf, _("missing %c %s"), ac, rpmfiFN(fi)); if ((verifyResult & RPMVERIFY_LSTATFAIL) != 0 && errno != ENOENT) { char *app; @@ -362,18 +373,12 @@ static int verifyHeader(rpmts ts, Header h, rpmVerifyAttrs omitMask, int ghosts) } } else if (verifyResult || rpmIsVerbose()) { char *verifyFormat = rpmVerifyString(verifyResult, "."); - rasprintf(&buf, "%s %c %s", verifyFormat, - ((fileAttrs & RPMFILE_CONFIG) ? 'c' : - (fileAttrs & RPMFILE_DOC) ? 'd' : - (fileAttrs & RPMFILE_GHOST) ? 'g' : - (fileAttrs & RPMFILE_LICENSE) ? 'l' : - (fileAttrs & RPMFILE_PUBKEY) ? 'P' : - (fileAttrs & RPMFILE_README) ? 'r' : ' '), - rpmfiFN(fi)); + rasprintf(&buf, "%s %c %s", verifyFormat, ac, rpmfiFN(fi)); free(verifyFormat); if (verifyResult) ec = 1; } + free(attrFormat); if (buf) { rpmlog(RPMLOG_NOTICE, "%s\n", buf); -- 2.7.4