summaryrefslogtreecommitdiff
path: root/lib/formats.c
diff options
context:
space:
mode:
authorewt <devnull@localhost>1997-05-29 20:10:03 +0000
committerewt <devnull@localhost>1997-05-29 20:10:03 +0000
commit93af6a49c303b2b1eed3957e6eb70d2a9215dd7c (patch)
treeb8694f73288a1007b3a83517587d4ae28776a266 /lib/formats.c
parent2eb5561b5add234d261f1b49593d72388137f241 (diff)
downloadrpm-93af6a49c303b2b1eed3957e6eb70d2a9215dd7c.tar.gz
rpm-93af6a49c303b2b1eed3957e6eb70d2a9215dd7c.tar.bz2
rpm-93af6a49c303b2b1eed3957e6eb70d2a9215dd7c.zip
*** empty log message ***
CVS patchset: 1667 CVS date: 1997/05/29 20:10:03
Diffstat (limited to 'lib/formats.c')
-rw-r--r--lib/formats.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/lib/formats.c b/lib/formats.c
new file mode 100644
index 000000000..2e0f10146
--- /dev/null
+++ b/lib/formats.c
@@ -0,0 +1,147 @@
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "header.h"
+#include "rpmlib.h"
+
+static char * permsFormat(int_32 type, const void * data,
+ char * formatPrefix, int padding, int element);
+static char * depflagsFormat(int_32 type, const void * data,
+ char * formatPrefix, int padding, int element);
+static char * fflagsFormat(int_32 type, const void * data,
+ char * formatPrefix, int padding, int element);
+static char * permsString(int mode);
+
+const struct headerSprintfExtension rpmHeaderFormats[] = {
+ { HEADER_EXT_FORMAT, "depflags", { depflagsFormat } },
+ { HEADER_EXT_FORMAT, "fflags", { fflagsFormat } },
+ { HEADER_EXT_FORMAT, "perms", { permsFormat } },
+ { HEADER_EXT_FORMAT, "permissions", { permsFormat } },
+ { HEADER_EXT_MORE, NULL, { (void *) headerDefaultFormats } }
+} ;
+
+static char * permsString(int mode) {
+ char * perms = malloc(11);
+
+ strcpy(perms, "-----------");
+
+ if (mode & S_ISVTX) perms[10] = 't';
+
+ if (mode & S_IRUSR) perms[1] = 'r';
+ if (mode & S_IWUSR) perms[2] = 'w';
+ if (mode & S_IXUSR) perms[3] = 'x';
+
+ if (mode & S_IRGRP) perms[4] = 'r';
+ if (mode & S_IWGRP) perms[5] = 'w';
+ if (mode & S_IXGRP) perms[6] = 'x';
+
+ if (mode & S_IROTH) perms[7] = 'r';
+ if (mode & S_IWOTH) perms[8] = 'w';
+ if (mode & S_IXOTH) perms[9] = 'x';
+
+ if (mode & S_ISUID) {
+ if (mode & S_IXUSR)
+ perms[3] = 's';
+ else
+ perms[3] = 'S';
+ }
+
+ if (mode & S_ISGID) {
+ if (mode & S_IXGRP)
+ perms[6] = 's';
+ else
+ perms[6] = 'S';
+ }
+
+ if (S_ISDIR(mode))
+ perms[0] = 'd';
+ else if (S_ISLNK(mode)) {
+ perms[0] = 'l';
+ }
+ else if (S_ISFIFO(mode))
+ perms[0] = 'p';
+ else if (S_ISSOCK(mode))
+ perms[0] = 'l';
+ else if (S_ISCHR(mode)) {
+ perms[0] = 'c';
+ } else if (S_ISBLK(mode)) {
+ perms[0] = 'b';
+ }
+
+ return perms;
+}
+
+static char * permsFormat(int_32 type, const void * data,
+ char * formatPrefix, int padding, int element) {
+ char * val;
+ char * buf;
+
+ if (type != RPM_INT32_TYPE) {
+ val = malloc(20);
+ strcpy(val, "(not a number)");
+ } else {
+ val = malloc(15 + padding);
+ strcat(formatPrefix, "s");
+ buf = permsString(*((int_32 *) data));
+ sprintf(val, formatPrefix, buf);
+ free(buf);
+ }
+
+ return val;
+}
+
+static char * fflagsFormat(int_32 type, const void * data,
+ char * formatPrefix, int padding, int element) {
+ char * val;
+ char buf[10];
+ int anint = *((int_32 *) data);
+
+ if (type != RPM_INT32_TYPE) {
+ val = malloc(20);
+ strcpy(val, "(not a number)");
+ } else {
+ buf[0] = '\0';
+ if (anint & RPMFILE_DOC)
+ strcat(buf, "d");
+ if (anint & RPMFILE_CONFIG)
+ strcat(buf, "c");
+
+ val = malloc(5 + padding);
+ strcat(formatPrefix, "s");
+ sprintf(val, formatPrefix, buf);
+ }
+
+ return val;
+}
+
+static char * depflagsFormat(int_32 type, const void * data,
+ char * formatPrefix, int padding, int element) {
+ char * val;
+ char buf[10];
+ int anint = *((int_32 *) data);
+
+ if (type != RPM_INT32_TYPE) {
+ val = malloc(20);
+ strcpy(val, "(not a number)");
+ } else {
+ *buf = '\0';
+
+ if (anint & RPMSENSE_LESS)
+ strcat(buf, "<");
+ if (anint & RPMSENSE_GREATER)
+ strcat(buf, ">");
+ if (anint & RPMSENSE_EQUAL)
+ strcat(buf, "=");
+ if (anint & RPMSENSE_SERIAL)
+ strcat(buf, "S");
+
+ val = malloc(5 + padding);
+ strcat(formatPrefix, "s");
+ sprintf(val, formatPrefix, buf);
+ }
+
+ return val;
+}