6 static char * permsString(int mode)
8 char * perms = xmalloc(11);
10 strcpy(perms, "-----------");
12 if (mode & S_ISVTX) perms[10] = 't';
15 if (mode & S_IRUSR) perms[1] = 'r';
16 if (mode & S_IWUSR) perms[2] = 'w';
17 if (mode & S_IXUSR) perms[3] = 'x';
19 if (mode & S_IRGRP) perms[4] = 'r';
20 if (mode & S_IWGRP) perms[5] = 'w';
21 if (mode & S_IXGRP) perms[6] = 'x';
23 if (mode & S_IROTH) perms[7] = 'r';
24 if (mode & S_IWOTH) perms[8] = 'w';
25 if (mode & S_IXOTH) perms[9] = 'x';
44 else if (S_ISLNK(mode)) {
47 else if (S_ISFIFO(mode))
49 else if (S_ISSOCK(mode))
51 else if (S_ISCHR(mode)) {
53 } else if (S_ISBLK(mode)) {
60 static char * triggertypeFormat(int_32 type, const void * data,
61 /*@unused@*/ char * formatPrefix, /*@unused@*/ int padding,
62 /*@unused@*/ int element)
64 const int_32 * item = data;
67 if (type != RPM_INT32_TYPE) {
68 val = xstrdup(_("(not a number)"));
69 } else if (*item & RPMSENSE_TRIGGERIN) {
78 static char * permsFormat(int_32 type, const void * data,
79 char * formatPrefix, int padding, /*@unused@*/ int element)
84 if (type != RPM_INT32_TYPE) {
85 val = xstrdup(_("(not a number)"));
87 val = xmalloc(15 + padding);
88 strcat(formatPrefix, "s");
89 buf = permsString(*((int_32 *) data));
90 sprintf(val, formatPrefix, buf);
97 static char * fflagsFormat(int_32 type, const void * data,
98 char * formatPrefix, int padding, /*@unused@*/ int element)
102 int anint = *((int_32 *) data);
104 if (type != RPM_INT32_TYPE) {
105 val = xstrdup(_("(not a number)"));
108 if (anint & RPMFILE_DOC)
110 if (anint & RPMFILE_CONFIG)
112 if (anint & RPMFILE_SPECFILE)
114 if (anint & RPMFILE_MISSINGOK)
116 if (anint & RPMFILE_NOREPLACE)
118 if (anint & RPMFILE_GHOST)
121 val = xmalloc(5 + padding);
122 strcat(formatPrefix, "s");
123 sprintf(val, formatPrefix, buf);
129 static char * depflagsFormat(int_32 type, const void * data,
130 char * formatPrefix, int padding, /*@unused@*/ int element)
134 int anint = *((int_32 *) data);
136 if (type != RPM_INT32_TYPE) {
137 val = xstrdup(_("(not a number)"));
141 if (anint & RPMSENSE_LESS)
143 if (anint & RPMSENSE_GREATER)
145 if (anint & RPMSENSE_EQUAL)
148 val = xmalloc(5 + padding);
149 strcat(formatPrefix, "s");
150 sprintf(val, formatPrefix, buf);
156 static int fsnamesTag( /*@unused@*/ Header h, /*@out@*/ int_32 * type,
157 /*@out@*/ void ** data, /*@out@*/ int_32 * count,
158 /*@out@*/ int * freeData)
162 if (rpmGetFilesystemList(&list, count)) {
166 *type = RPM_STRING_ARRAY_TYPE;
167 *((const char ***) data) = list;
174 static int instprefixTag(Header h, /*@out@*/ int_32 * type,
175 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
176 /*@out@*/ int * freeData)
180 if (headerGetEntry(h, RPMTAG_INSTALLPREFIX, type, (void **)data, count)) {
183 } else if (headerGetEntry(h, RPMTAG_INSTPREFIXES, NULL, (void **) &array,
185 *data = xstrdup(array[0]);
187 *type = RPM_STRING_TYPE;
195 static int fssizesTag(Header h, /*@out@*/ int_32 * type,
196 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
197 /*@out@*/ int * freeData)
199 const char ** filenames;
204 if (!headerGetEntry(h, RPMTAG_FILESIZES, NULL, (void **) &filesizes,
210 rpmBuildFileList(h, &filenames, &numFiles);
213 if (rpmGetFilesystemList(NULL, count)) {
217 *type = RPM_INT32_TYPE;
220 if (filenames == NULL) {
221 usages = xcalloc((*count), sizeof(usages));
227 if (rpmGetFilesystemUsage(filenames, filesizes, numFiles, &usages, 0))
232 if (filenames) free(filenames);
237 static int triggercondsTag(Header h, /*@out@*/ int_32 * type,
238 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
239 /*@out@*/ int * freeData)
241 int_32 * indices, * flags;
242 char ** names, ** versions;
243 int numNames, numScripts;
245 char * item, * flagsStr;
250 if (!headerGetEntry(h, RPMTAG_TRIGGERNAME, NULL, (void **) &names,
256 headerGetEntry(h, RPMTAG_TRIGGERINDEX, NULL, (void **) &indices, NULL);
257 headerGetEntry(h, RPMTAG_TRIGGERFLAGS, NULL, (void **) &flags, NULL);
258 headerGetEntry(h, RPMTAG_TRIGGERVERSION, NULL, (void **) &versions, NULL);
259 headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, (void **) &s, &numScripts);
263 *data = conds = xmalloc(sizeof(char * ) * numScripts);
265 *type = RPM_STRING_ARRAY_TYPE;
266 for (i = 0; i < numScripts; i++) {
269 for (j = 0; j < numNames; j++) {
270 if (indices[j] != i) continue;
272 item = xmalloc(strlen(names[j]) + strlen(versions[j]) + 20);
273 if (flags[j] & RPMSENSE_SENSEMASK) {
274 buf[0] = '%', buf[1] = '\0';
275 flagsStr = depflagsFormat(RPM_INT32_TYPE, flags, buf,
277 sprintf(item, "%s %s %s", names[j], flagsStr, versions[j]);
280 strcpy(item, names[j]);
283 chptr = xrealloc(chptr, strlen(chptr) + strlen(item) + 5);
284 if (*chptr) strcat(chptr, ", ");
298 static int triggertypeTag(Header h, /*@out@*/ int_32 * type,
299 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
300 /*@out@*/ int * freeData)
302 int_32 * indices, * flags;
305 int numScripts, numNames;
307 if (!headerGetEntry(h, RPMTAG_TRIGGERINDEX, NULL, (void **) &indices,
313 headerGetEntry(h, RPMTAG_TRIGGERFLAGS, NULL, (void **) &flags, NULL);
315 headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, (void **) &s, &numScripts);
319 *data = conds = xmalloc(sizeof(char * ) * numScripts);
321 *type = RPM_STRING_ARRAY_TYPE;
322 for (i = 0; i < numScripts; i++) {
323 for (j = 0; j < numNames; j++) {
324 if (indices[j] != i) continue;
326 if (flags[j] & RPMSENSE_TRIGGERIN)
327 conds[i] = xstrdup("in");
328 else if (flags[j] & RPMSENSE_TRIGGERUN)
329 conds[i] = xstrdup("un");
331 conds[i] = xstrdup("postun");
339 static int filenamesTag(Header h, /*@out@*/ int_32 * type,
340 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
341 /*@out@*/ int * freeData)
343 *type = RPM_STRING_ARRAY_TYPE;
345 rpmBuildFileList(h, (const char ***) data, count);
348 *freeData = 0; /* XXX WTFO? */
353 /* I18N look aside diversions */
355 char * i18ndomains = NULL;
357 int _nl_msg_cat_cntr; /* XXX GNU gettext voodoo */
358 static const char * language = "LANGUAGE";
360 static int i18nTag(Header h, int_32 tag, /*@out@*/ int_32 * type,
361 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
362 /*@out@*/ int * freeData)
366 *type = RPM_STRING_TYPE;
372 char * dstring, *domain, *de;
373 const char * langval;
377 { const char * tn = tagName(tag);
380 headerNVR(h, &n, NULL, NULL);
381 mk = alloca(strlen(n) + strlen(tn) + sizeof("()"));
382 sprintf(mk, "%s(%s)", n, tn);
386 /* change to en_US for msgkey -> msgid resolution */
387 langval = getenv(language);
388 setenv(language, "en_US", 1);
392 dstring = xstrdup(i18ndomains);
393 for (domain = dstring; domain != NULL; domain = de) {
394 de = strchr(domain, ':');
395 if (de) *de++ = '\0';
396 msgid = /*@-unrecog@*/ dgettext(domain, msgkey) /*@=unrecog@*/;
397 if (msgid != msgkey) break;
400 /* restore previous environment for msgid -> msgstr resolution */
402 setenv(language, langval, 1);
407 if (domain && msgid) {
408 *data = xstrdup(/*@-unrecog@*/ dgettext(domain, msgid) /*@=unrecog@*/);
418 rc = headerGetEntry(h, tag, type, (void **)data, count);
421 *data = xstrdup(*data);
432 static int summaryTag(Header h, /*@out@*/ int_32 * type,
433 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
434 /*@out@*/ int * freeData)
436 return i18nTag(h, RPMTAG_SUMMARY, type, data, count, freeData);
439 static int descriptionTag(Header h, /*@out@*/ int_32 * type,
440 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
441 /*@out@*/ int * freeData)
443 return i18nTag(h, RPMTAG_DESCRIPTION, type, data, count, freeData);
446 static int groupTag(Header h, /*@out@*/ int_32 * type,
447 /*@out@*/ const void ** data, /*@out@*/ int_32 * count,
448 /*@out@*/ int * freeData)
450 return i18nTag(h, RPMTAG_GROUP, type, data, count, freeData);
453 const struct headerSprintfExtension rpmHeaderFormats[] = {
454 { HEADER_EXT_TAG, "RPMTAG_GROUP", { groupTag } },
455 { HEADER_EXT_TAG, "RPMTAG_DESCRIPTION", { descriptionTag } },
456 { HEADER_EXT_TAG, "RPMTAG_SUMMARY", { summaryTag } },
457 { HEADER_EXT_TAG, "RPMTAG_FILENAMES", { filenamesTag } },
458 { HEADER_EXT_TAG, "RPMTAG_FSSIZES", { fssizesTag } },
459 { HEADER_EXT_TAG, "RPMTAG_FSNAMES", { fsnamesTag } },
460 { HEADER_EXT_TAG, "RPMTAG_INSTALLPREFIX", { instprefixTag } },
461 { HEADER_EXT_TAG, "RPMTAG_TRIGGERCONDS", { triggercondsTag } },
462 { HEADER_EXT_TAG, "RPMTAG_TRIGGERTYPE", { triggertypeTag } },
463 { HEADER_EXT_FORMAT, "depflags", { depflagsFormat } },
464 { HEADER_EXT_FORMAT, "fflags", { fflagsFormat } },
465 { HEADER_EXT_FORMAT, "perms", { permsFormat } },
466 { HEADER_EXT_FORMAT, "permissions", { permsFormat } },
467 { HEADER_EXT_FORMAT, "triggertype", { triggertypeFormat } },
468 { HEADER_EXT_MORE, NULL, { (void *) headerDefaultFormats } }