19 #define _RPMGI_INTERNAL
33 unsigned int size,
unsigned short mode,
35 unsigned short rdev,
unsigned int nlink,
36 const char * owner,
const char * group,
41 char ownerfield[8+1], groupfield[8+1];
46 static struct tm nowtm;
47 const char * namefield =
name;
59 strncpy(ownerfield, owner,
sizeof(ownerfield));
60 ownerfield[
sizeof(ownerfield)-1] =
'\0';
62 strncpy(groupfield, group,
sizeof(groupfield));
63 groupfield[
sizeof(groupfield)-1] =
'\0';
66 sprintf(sizefield,
"%12u", size);
71 char *nf =
alloca(strlen(name) +
sizeof(
" -> ") + strlen(linkto));
72 sprintf(nf,
"%s -> %s", name, linkto);
74 }
else if (S_ISCHR(mode)) {
76 sprintf(sizefield,
"%3u, %3u", ((
unsigned)(rdev >> 8) & 0xff),
77 ((
unsigned)rdev & 0xff));
78 }
else if (S_ISBLK(mode)) {
80 sprintf(sizefield,
"%3u, %3u", ((
unsigned)(rdev >> 8) & 0xff),
81 ((
unsigned)rdev & 0xff));
85 tm = localtime(&when);
89 if (now > when + 6L * 30L * 24L * 60L * 60L ||
90 now < when - 60L * 60L)
103 (void)strftime(timefield,
sizeof(timefield) - 1, fmt, tm);
106 sprintf(te,
"%s %4d %-7s %-8s %10s %s %s", perms,
107 (
int)nlink, ownerfield, groupfield, sizefield, timefield, namefield);
108 perms =
_free(perms);
116 const char * errstr =
"(unkown error)";
153 size_t tb = 2 * BUFSIZ;
156 char * prefix = NULL;
169 size_t tx = (te - t);
194 te =
stpcpy(te,
_(
"(contains no files)"));
203 unsigned short fmode;
204 unsigned short frdev;
209 const char * fdigest;
223 {
static char hex[] =
"0123456789abcdef";
226 const unsigned char * digest =
rpmfiDigest(fi, &dalgo, &dlen);
229 fdigest = p =
xcalloc(1, ((2 * dlen) + 1));
230 for (j = 0; j < dlen; j++) {
231 unsigned k = *digest++;
232 *p++ = hex[ (k >> 4) & 0xf ];
233 *p++ = hex[ (k ) & 0xf ];
243 assert(fdigest != NULL);
254 if ((qva->
qva_fflags & RPMFILE_CONFIG) && (fflags & RPMFILE_CONFIG))
258 if ((qva->
qva_fflags & RPMFILE_DOC) && (fflags & RPMFILE_DOC))
267 if (fn) sb += strlen(fn);
268 if (fdigest) sb += strlen(fdigest);
269 if (fuser) sb += strlen(fuser);
270 if (fgroup) sb += strlen(fgroup);
271 if (flink) sb += strlen(flink);
273 if ((sb + BUFSIZ) > tb) {
274 size_t tx = (te - t);
291 te =
stpcpy(te,
_(
"replaced "));
294 te =
stpcpy(te,
_(
"not installed "));
297 te =
stpcpy(te,
_(
"net shared "));
300 te =
stpcpy(te,
_(
"wrong color "));
303 te =
stpcpy(te,
_(
"(no state) "));
306 sprintf(te,
_(
"(unknown %3d) "), fstate);
314 sprintf(te,
"%s %d %d %s 0%o ",
315 fn, (
int)fsize, fmtime, fdigest, fmode);
318 if (fuser && fgroup) {
320 sprintf(te,
"%s %s", fuser, fgroup);
325 _(
"package has not file owner/group lists\n"));
328 sprintf(te,
" %s %s %u ",
329 fflags & RPMFILE_CONFIG ?
"1" :
"0",
330 fflags & RPMFILE_DOC ?
"1" :
"0",
334 sprintf(te,
"%s", (flink && *flink ? flink :
"X"));
345 if (S_ISDIR(fmode)) {
350 if (fuser && fgroup) {
353 fuser, fgroup, flink);
358 _(
"package has neither file owner or id lists\n"));
362 fdigest =
_free(fdigest);
384 fprintf(fp,
"%-20s", t->
name + 7);
387 static const char * tagtypes[] = {
388 "",
"char",
"int8",
"int16",
"int32",
"int64",
389 "string",
"blob",
"argv",
"i18nstring",
"asn1",
"openpgp"
391 fprintf(fp,
" %6d", t->
val);
393 fprintf(fp,
" %s", tagtypes[t->
type]);
398 while (ext->
name != NULL) {
411 fprintf(fp,
"%s\n", ext->
name + 7);
462 static inline unsigned char nibble(
char c)
465 if (c >=
'0' && c <=
'9')
467 if (c >=
'A' && c <=
'F')
468 return (c -
'A') + 10;
469 if (c >=
'a' && c <=
'f')
470 return (c -
'a') + 10;
479 int provides_checked = 0;
512 if (qva->
qva_mi == NULL) {
514 _(
"group %s does not contain any packages\n"), arg);
522 if (qva->
qva_mi == NULL) {
530 {
unsigned char MD5[16];
533 for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
541 for (i = 0, t = MD5, s = arg; i < 16; i++, t++, s += 2)
545 if (qva->
qva_mi == NULL) {
554 for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
562 if (qva->
qva_mi == NULL) {
572 unsigned char * digest;
576 for (dlen = 0, s = arg; *s && isxdigit(*s); s++, dlen++)
578 if ((dlen & 1) || dlen < 8) {
584 digest = memset(
alloca(dlen), 0, dlen);
585 for (t = digest, s = arg; *s; t++, s += 2)
589 if (qva->
qva_mi == NULL) {
599 const char * myarg = arg;
612 iid = (unsigned) strtoul(myarg, &end, mybase);
613 if ((*end) || (end == arg) || (iid == UINT_MAX)) {
618 if (qva->
qva_mi == NULL) {
629 if (qva->
qva_mi == NULL) {
638 provides_checked = 1;
640 if (qva->
qva_mi == NULL) {
651 for (s = arg; *s !=
'\0'; s++)
652 if (!(*s ==
'.' || *s ==
'/'))
658 fn =
xstrdup( (fn != NULL ? fn : arg) );
659 }
else if (*arg !=
'/') {
661 fn = (
char *)
rpmGetPath(curDir,
"/", arg, NULL);
662 curDir =
_free(curDir);
669 if (qva->
qva_mi == NULL && !provides_checked)
672 if (qva->
qva_mi == NULL) {
674 if (
Lstat(fn, &sb) != 0)
678 _(
"file %s is not owned by any package\n"), fn);
688 const char * myarg = arg;
701 recOffset = (unsigned) strtoul(myarg, &end, mybase);
702 if ((*end) || (end == arg) || (recOffset == UINT_MAX)) {
708 if (qva->
qva_mi == NULL) {
710 _(
"record %u could not be read\n"), recOffset);
719 if (qva->
qva_mi == NULL) {
810 if (qva->
qva_gi != NULL && (qva->
qva_gi->flags & RPMGI_TSADD))
827 assert(path != NULL);