#include "config.h" #include "miscfn.h" #include #include #include #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 int fsnamesTag(Header h, int_32 * type, void ** data, int_32 * count, int * freeData); static int fssizesTag(Header h, int_32 * type, void ** data, int_32 * count, int * freeData); static char * permsString(int mode); const struct headerSprintfExtension rpmHeaderFormats[] = { { HEADER_EXT_TAG, "RPMTAG_FSSIZES", { fssizesTag } }, { HEADER_EXT_TAG, "RPMTAG_FSNAMES", { fsnamesTag } }, { 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[15]; 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"); if (anint & RPMFILE_SPECFILE) strcat(buf, "s"); if (anint & RPMFILE_MISSINGOK) strcat(buf, "m"); if (anint & RPMFILE_NOREPLACE) strcat(buf, "n"); 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; } static int fsnamesTag(Header h, int_32 * type, void ** data, int_32 * count, int * freeData) { char ** list; if (rpmGetFilesystemList(&list, count)) { return 1; } *type = RPM_STRING_ARRAY_TYPE; *((char ***) data) = list; *freeData = 0; return 0; } static int fssizesTag(Header h, int_32 * type, void ** data, int_32 * count, int * freeData) { char ** filenames; int_32 * filesizes; uint_32 * usages; int numFiles; headerGetEntry(h, RPMTAG_FILENAMES, NULL, (void **) &filenames, NULL); headerGetEntry(h, RPMTAG_FILESIZES, NULL, (void **) &filesizes, &numFiles); if (rpmGetFilesystemList(NULL, count)) { return 1; } if (rpmGetFilesystemUsage(filenames, filesizes, numFiles, &usages, 0)) return 1; *type = RPM_INT32_TYPE; *freeData = 1; *data = usages; return 0; }