Add internal helper for formatting file attribute strings
authorPanu Matilainen <pmatilai@redhat.com>
Fri, 28 May 2010 09:57:59 +0000 (12:57 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Fri, 28 May 2010 09:57:59 +0000 (12:57 +0300)
- 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
lib/misc.h
lib/verify.c

index 3fff34f..499c5d0 100644 (file)
@@ -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;
index 73d95c6..58a5e70 100644 (file)
@@ -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
index ac561da..8d958ae 100644 (file)
@@ -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);