diff options
author | ewt <devnull@localhost> | 1997-05-29 20:10:03 +0000 |
---|---|---|
committer | ewt <devnull@localhost> | 1997-05-29 20:10:03 +0000 |
commit | 93af6a49c303b2b1eed3957e6eb70d2a9215dd7c (patch) | |
tree | b8694f73288a1007b3a83517587d4ae28776a266 /lib/formats.c | |
parent | 2eb5561b5add234d261f1b49593d72388137f241 (diff) | |
download | rpm-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.c | 147 |
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; +} |