22 #define _RPMTS_INTERNAL 34 #define JBJDEBUG(_list) if (_jbj) fprintf _list 40 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG)) 42 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (QUERY_##_FLAG)) 44 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 45 #define VSF_SET(_vsflags, _FLAG) \ 46 (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG)) 47 #define VSF_CLR(_vsflags, _FLAG) \ 48 (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG)) 52 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG)) 54 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (QUERY_##_FLAG)) 56 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 57 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG) 58 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG) 65 size_t size,
unsigned short mode,
67 unsigned short rdev,
unsigned int nlink,
68 const char * owner,
const char * group,
73 #if defined(RPM_VENDOR_OPENPKG) 77 char ownerfield[13+1], groupfield[13+1];
79 char ownerfield[8+1], groupfield[8+1];
85 static struct tm nowtm;
86 const char * namefield =
name;
96 strncpy(ownerfield, owner,
sizeof(ownerfield));
97 ownerfield[
sizeof(ownerfield)-1] =
'\0';
99 strncpy(groupfield, group,
sizeof(groupfield));
100 groupfield[
sizeof(groupfield)-1] =
'\0';
103 #if defined(RPM_VENDOR_OPENPKG) 107 sprintf(sizefield,
"%8u", (
unsigned)size);
109 sprintf(sizefield,
"%12u", (
unsigned)size);
116 alloca(strlen(name) +
sizeof(
" -> ") + strlen(linkto));
117 sprintf(nf,
"%s -> %s", name, linkto);
119 }
else if (S_ISCHR(mode)) {
121 sprintf(sizefield,
"%3u, %3u", ((
unsigned)(rdev >> 8) & 0xff),
122 ((
unsigned)rdev & 0xff));
123 }
else if (S_ISBLK(mode)) {
125 sprintf(sizefield,
"%3u, %3u", ((
unsigned)(rdev >> 8) & 0xff),
126 ((
unsigned)rdev & 0xff));
130 tm = localtime(&when);
134 if (now > when + 6
L * 30
L * 24
L * 60
L * 60
L ||
135 now < when - 60
L * 60
L)
148 (void)strftime(timefield,
sizeof(timefield) - 1, fmt, tm);
151 #if defined(RPM_VENDOR_OPENPKG) 155 sprintf(te,
"%s %d %-13s %-13s %8s %s %s", perms,
156 (
int)nlink, ownerfield, groupfield, sizefield, timefield, namefield);
158 sprintf(te,
"%s %4d %-7s %-8s %10s %s %s", perms,
159 (
int)nlink, ownerfield, groupfield, sizefield, timefield, namefield);
161 perms =
_free(perms);
170 const char * errstr =
"(unkown error)";
207 size_t tb = 2 * BUFSIZ;
214 JBJDEBUG((stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, qva, ts, h));
226 size_t tx = (te - t);
247 te =
stpcpy(te,
_(
"(contains no files)"));
255 unsigned short fmode;
256 unsigned short frdev;
261 const char * fdigest;
274 {
static char hex[] =
"0123456789abcdef";
277 const unsigned char * digest =
rpmfiDigest(fi, &dalgo, &dlen);
280 fdigest = p = (
char *)
xcalloc(1, ((2 * dlen) + 1));
281 for (j = 0; j < dlen; j++) {
282 unsigned k = *digest++;
283 *p++ = hex[ (k >> 4) & 0xf ];
284 *p++ = hex[ (k ) & 0xf ];
293 assert(fdigest != NULL);
317 if (fn) sb += strlen(fn);
318 if (fdigest) sb += strlen(fdigest);
319 if (fuser) sb += strlen(fuser);
320 if (fgroup) sb += strlen(fgroup);
321 if (flink) sb += strlen(flink);
322 if ((sb + BUFSIZ) > tb) {
323 size_t tx = (te - t);
338 te =
stpcpy(te,
_(
"replaced "));
341 te =
stpcpy(te,
_(
"not installed "));
344 te =
stpcpy(te,
_(
"net shared "));
347 te =
stpcpy(te,
_(
"wrong color "));
350 te =
stpcpy(te,
_(
"(no state) "));
353 sprintf(te,
_(
"(unknown %3d) "), fstate);
360 sprintf(te,
"%s %d %d %s 0%o ",
361 fn, (
int)fsize, fmtime, fdigest, fmode);
364 if (fuser && fgroup) {
366 sprintf(te,
"%s %s", fuser, fgroup);
373 sprintf(te,
" %s %s %u ",
374 FF_ISSET(fflags, CONFIG) ?
"1" :
"0",
379 sprintf(te,
"%s", (flink && *flink ? flink :
"X"));
388 if (S_ISDIR(fmode)) {
393 if (fuser && fgroup) {
396 fuser, fgroup, flink);
404 fdigest =
_free(fdigest);
414 JBJDEBUG((stderr,
"<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, qva, ts, h, rc));
426 JBJDEBUG((stderr,
"--> %s(%p,%p)\n", __FUNCTION__, qva, ts));
447 JBJDEBUG((stderr,
"<-- %s(%p,%p) rc %d\n", __FUNCTION__, qva, ts, ec));
469 JBJDEBUG((stderr,
"--> %s(%p,%p)\n", __FUNCTION__, qva, ts));
481 JBJDEBUG((stderr,
"<-- %s(%p,%p) rc %d\n", __FUNCTION__, qva, ts, ec));
490 static inline unsigned char nibble(
char c)
493 if (c >=
'0' && c <=
'9')
495 if (c >=
'A' && c <=
'F')
496 return (c -
'A') + 10;
497 if (c >=
'a' && c <=
'f')
498 return (c -
'a') + 10;
507 int provides_checked = 0;
509 JBJDEBUG((stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, qva, ts, arg));
525 if (qva->
qva_mi == NULL) {
558 if (qva->
qva_mi == NULL) {
560 _(
"group %s does not contain any packages\n"), arg);
568 if (qva->
qva_mi == NULL) {
578 {
unsigned char MD5[16];
582 for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
590 for (i = 0, t = MD5, s = arg; i < 16; i++, t++, s += 2)
596 if (qva->
qva_mi == NULL) {
605 for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
613 if (qva->
qva_mi == NULL) {
623 unsigned char * digest;
627 for (dlen = 0, s = arg; *s && isxdigit(*s); s++, dlen++)
629 if ((dlen & 1) || dlen < 8) {
635 digest = (
unsigned char *) memset(
alloca(dlen), 0, dlen);
636 for (t = digest, s = arg; *s; t++, s += 2)
640 if (qva->
qva_mi == NULL) {
650 const char * myarg = arg;
663 iid = (unsigned) strtoul(myarg, &end, mybase);
664 if ((*end) || (end == arg) || (iid == UINT_MAX)) {
669 if (qva->
qva_mi == NULL) {
680 if (qva->
qva_mi == NULL) {
689 provides_checked = 1;
691 if (qva->
qva_mi == NULL) {
700 {
int gotpattern = 0;
703 if (arg[0] ==
'^' || arg[strlen(arg)-1] ==
'$') {
714 for (s = arg; *s !=
'\0'; s++) {
715 if (!(*s ==
'.' || *s ==
'/'))
722 fn =
xstrdup( (fn != NULL ? fn : arg) );
723 }
else if (*arg !=
'/') {
725 fn = (
char *)
rpmGetPath(curDir,
"/", arg, NULL);
726 curDir =
_free(curDir);
733 if (qva->
qva_mi == NULL && !provides_checked && !gotpattern) {
735 #if defined(RPM_VENDOR_MANDRIVA) 741 if (qva->
qva_mi == NULL) {
743 if (!gotpattern &&
Lstat(fn, &sb) != 0)
747 _(
"file %s is not owned by any package\n"), fn);
757 const char * myarg = arg;
770 hdrNum = (uint32_t) strtoul(myarg, &end, mybase);
771 if ((*end) || (end == arg) || (hdrNum == UINT_MAX)) {
777 if (qva->
qva_mi == NULL) {
779 _(
"record %u could not be read\n"), (
unsigned)hdrNum);
787 if (qva->
qva_mi == NULL) {
801 JBJDEBUG((stderr,
"<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, qva, ts, arg, res));
812 JBJDEBUG((stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, ts, qva, argv));
898 assert(path != NULL);
908 JBJDEBUG((stderr,
"<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, ts, qva, argv, ec));
919 JBJDEBUG((stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, ts, qva, argv));
940 #if defined(SUPPORT_NOSIGNATURES) 942 VSF_SET(vsflags, NOSHA1HEADER);
970 JBJDEBUG((stderr,
"<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, ts, qva, argv, ec));
rpmuint32_t rpmfiFFlags(rpmfi fi)
Return current file flags from file info set.
static void flushBuffer(char **tp, char **tep, int nonewline)
int rpmQueryVerify(QVA_t qva, rpmts ts, const char *arg)
Common query/verify source interface, called once for each CLI arg.
rpmgiFlags rpmgiGetFlags(rpmgi gi)
Return current iteration flags.
static void printFileInfo(char *te, const char *name, size_t size, unsigned short mode, unsigned int mtime, unsigned short rdev, unsigned int nlink, const char *owner, const char *group, const char *linkto)
int rpmcliQuery(rpmts ts, QVA_t qva, const char **argv)
Display package information.
rpmuint32_t rpmfiFNlink(rpmfi fi)
Return (calculated) current file nlink count from file info set.
char * xstrdup(const char *str)
char * rpmCleanPath(char *path)
Canonicalize file path.
rpmgi rpmgiFree(rpmgi gi)
Destroy a generalized iterator.
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
Structure(s) used for file info tag sets.
int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_t argv)
static const char * queryHeader(Header h, const char *qfmt)
static rpmVSFlags vsflags
Header rpmgiHeader(rpmgi gi)
Return current iteration header.
rpmuint16_t rpmfiFRdev(rpmfi fi)
Return current file rdev from file info set.
static int rpmcliShowMatches(QVA_t qva, rpmts ts)
Display query/verify information for each header in iterator.
rpmfi rpmfiFree(rpmfi fi)
Destroy a file info set.
const char * rpmfiFN(rpmfi fi)
Return current file name from file info set.
int rpmdbCheckSignals(void)
Check for and exit on termination signals.
const char * rpmfiFUser(rpmfi fi)
Return current file owner from file info set.
static void rpmlog(int code, const char *fmt,...)
const char * rpmfiFGroup(rpmfi fi)
Return current file group from file info set.
rpmfi rpmfiNew(const void *_ts, Header h, rpmTag tagN, int flags)
Create and load a file info set.
Command line option information.
char * headerSprintf(Header h, const char *fmt, headerTagTableEntry tags, headerSprintfExtension exts, errmsg_t *errmsg)
Return formatted output string from header tags.
int rpmfiFC(rpmfi fi)
Return file count from file info set.
rpmuint32_t rpmfiFSize(rpmfi fi)
Return current file size from file info set.
#define RPMFILE_STATE_MISSING
rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags)
Set transaction flags, i.e.
void * xcalloc(size_t nmemb, size_t size)
rpmgi rpmgiNew(rpmts ts, int tag, const void *keyp, size_t keylen)
Return a generalized iterator.
char * currentDirectory(void)
Return (malloc'd) current working directory.
enum rpmgiFlags_e rpmgiFlags
struct rpmfi_s * rpmfi
File info tag sets from a header, so that a header can be discarded early.
static unsigned char nibble(char c)
Convert hex to binary nibble.
rpmuint16_t rpmfiFMode(rpmfi fi)
Return current file mode from file info set.
int showQueryPackage(QVA_t qva, rpmts ts, Header h)
Display results of package query.
int Lstat(const char *path, struct stat *st)
lstat(2) clone.
enum rpmdepFlags_e rpmdepFlags
Bit(s) to control rpmtsCheck() and rpmtsOrder() operation.
char * rpmPermsString(int mode)
Return ls(1)-like formatted mode string.
static int rpmgiShowMatches(QVA_t qva, rpmts ts)
const char * tagName(rpmTag tag)
Return tag name from value.
Routines to expand a manifest containing glob expressions into an argv list.
int Glob_pattern_p(const char *pattern, int quote)
glob_pattern_p(3) clone.
rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t argv, int ftsOpts, rpmgiFlags flags)
Load iterator args.
rpmmi rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)
Return transaction database iterator.
const char * qva_queryFormat
#define QVA_ISSET(_qvaflags, _FLAG)
#define VSF_CLR(_vsflags, _FLAG)
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
rpmuint32_t rpmfiFMtime(rpmfi fi)
Return current file modify time from file info set.
rpmmi rpmmiFree(rpmmi mi)
Destroy rpm database iterator.
#define FF_ISSET(_fflags, _FLAG)
enum rpmfileAttrs_e rpmfileAttrs
File Attributes.
int rpmfiNext(rpmfi fi)
Return next file iterator index.
struct rpmgi_s * rpmgi
Generalized iterator.
enum rpmRC_e rpmRC
RPM return codes.
#define VSF_SET(_vsflags, _FLAG)
rpmfi rpmfiInit(rpmfi fi, int fx)
Initialize file iterator index.
enum rpmfileState_e rpmfileState
File States (when installed).
rpmdepFlags rpmtsSetDFlags(rpmts ts, rpmdepFlags depFlags)
Set dependency flags, i.e.
static const char * prefix[]
Tables for prefixing and suffixing patterns, according to the -w, -x, and -F options.
const char * rpmfiFLink(rpmfi fi)
Return current file linkto (i.e.
enum rpmtransFlags_e rpmtransFlags
Bit(s) to control rpmtsRun() operation.
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
char * stpcpy(char *dest, const char *src)
struct rpmts_s * rpmts
The RPM Transaction Set.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
Structures and prototypes used for an "rpmts" transaction set.
Header rpmmiNext(rpmmi mi)
Return next package header from iteration.
rpmfileState rpmfiFState(rpmfi fi)
Return current file state from file info set.
const unsigned char * rpmfiDigest(rpmfi fi, int *algop, size_t *lenp)
Return current file (binary) digest from file info set.
rpmRC rpmgiNext(rpmgi gi)
Perform next iteration step.
const char * rpmgiHdrPath(rpmgi gi)
Return current header path.
Access RPM indices using Berkeley DB interface(s).
unsigned int rpmmiCount(rpmmi mi)
Return number of elements in rpm database iterator.
char * Realpath(const char *path, char *resolved_path)
realpath(3) clone.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
#define RPMDBI_PACKAGES
Pseudo-tags used by the rpmdb and rpmgi iterator API's.
void rpmtsEmpty(rpmts ts)
Re-create an empty transaction set.