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)
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;
274 {
static char hex[] =
"0123456789abcdef";
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 ];
297 fdigest =
_free(fdigest);
303 fdigest =
_free(fdigest);
309 fdigest =
_free(fdigest);
315 fdigest =
_free(fdigest);
321 fdigest =
_free(fdigest);
327 if (fn) sb += strlen(fn);
328 if (fdigest) sb += strlen(fdigest);
329 if (fuser) sb += strlen(fuser);
330 if (fgroup) sb += strlen(fgroup);
331 if (flink) sb += strlen(flink);
332 if ((sb + BUFSIZ) > tb) {
333 size_t tx = (te -
t);
348 te =
stpcpy(te,
_(
"replaced "));
351 te =
stpcpy(te,
_(
"not installed "));
354 te =
stpcpy(te,
_(
"net shared "));
357 te =
stpcpy(te,
_(
"wrong color "));
360 te =
stpcpy(te,
_(
"(no state) "));
363 sprintf(te,
_(
"(unknown %3d) "), fstate);
370 sprintf(te,
"%s %d %d %s 0%o ",
371 fn, (
int)fsize, fmtime, fdigest, fmode);
374 if (fuser && fgroup) {
376 sprintf(te,
"%s %s", fuser, fgroup);
384 FF_ISSET(fflags, CONFIG) ?
"1" :
"0",
389 sprintf(te,
"%s", (flink && *flink ? flink :
"X"));
398 if (S_ISDIR(fmode)) {
403 if (fuser && fgroup) {
406 fuser, fgroup, flink);
414 fdigest =
_free(fdigest);
424 JBJDEBUG((stderr,
"<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, qva, ts, h, rc));
436 JBJDEBUG((stderr,
"--> %s(%p,%p)\n", __FUNCTION__, qva, ts));
457 JBJDEBUG((stderr,
"<-- %s(%p,%p) rc %d\n", __FUNCTION__, qva, ts, ec));
479 JBJDEBUG((stderr,
"--> %s(%p,%p)\n", __FUNCTION__, qva, ts));
491 JBJDEBUG((stderr,
"<-- %s(%p,%p) rc %d\n", __FUNCTION__, qva, ts, ec));
503 if (c >=
'0' && c <=
'9')
505 if (c >=
'A' && c <=
'F')
506 return (c -
'A') + 10;
507 if (c >=
'a' && c <=
'f')
508 return (c -
'a') + 10;
517 int provides_checked = 0;
519 JBJDEBUG((stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, qva, ts, arg));
535 #if defined(RPM_VENDOR_PLD)
574 _(
"group %s does not contain any packages\n"), arg);
593 {
unsigned char MD5[
MD5len+1];
597 for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
605 for (i = 0, t = MD5, s = arg; i <
MD5len; i++, t++, s += 2)
611 #if defined(RPM_VENDOR_PLD)
625 for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
633 #if defined(RPM_VENDOR_PLD)
651 for (dlen = 0, s = arg; *s && isxdigit(*s); s++, dlen++)
653 if ((dlen & 1) || dlen < 8) {
660 for (t = digest, s = arg; *
s; t++, s += 2)
664 #if defined(RPM_VENDOR_PLD)
678 const char * myarg = arg;
691 iid = (
unsigned) strtoul(myarg, &end, mybase);
692 if ((*end) || (end == arg) || (iid == UINT_MAX)) {
697 #if defined(RPM_VENDOR_PLD)
712 #if defined(RPM_VENDOR_PLD)
725 provides_checked = 1;
727 #if defined(RPM_VENDOR_PLD)
740 {
int gotpattern = 0;
743 if (arg[0] ==
'^' || arg[strlen(arg)-1] ==
'$') {
754 for (s = arg; *s !=
'\0'; s++) {
755 if (!(*s ==
'.' || *s ==
'/'))
763 }
else if (*arg !=
'/') {
766 curDir =
_free(curDir);
773 if (qva->
qva_mi ==
NULL && !provides_checked && !gotpattern) {
775 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_PLD)
783 if (!gotpattern &&
Lstat(fn, &sb) != 0)
787 _(
"file %s is not owned by any package\n"), fn);
797 const char * myarg = arg;
810 hdrNum = (uint32_t) strtoul(myarg, &end, mybase);
811 if ((*end) || (end == arg) || (hdrNum == UINT_MAX)) {
817 #if defined(RPM_VENDOR_PLD)
823 _(
"record %u could not be read\n"), (
unsigned)hdrNum);
845 JBJDEBUG((stderr,
"<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, qva, ts, arg, res));
856 JBJDEBUG((stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, ts, qva, argv));
952 JBJDEBUG((stderr,
"<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, ts, qva, argv, ec));
963 JBJDEBUG((stderr,
"--> %s(%p,%p,%p)\n", __FUNCTION__, ts, qva, argv));
984 #if defined(SUPPORT_NOSIGNATURES)
986 VSF_SET(vsflags, NOSHA1HEADER);
1000 VSF_CLR(vsflags, NEEDPAYLOAD);
1014 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)
rpmlog(RPMLOG_ERR,"%s\n", buf)
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)
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.
rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags)
Set transaction flags, i.e.
struct rpmts_s * rpmts
The RPM Transaction Set.
int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_t argv)
static const char * queryHeader(Header h, const char *qfmt)
Header rpmgiHeader(rpmgi gi)
Return current iteration header.
rpmuint16_t rpmfiFRdev(rpmfi fi)
Return current file rdev from file info set.
rpmfi rpmfiFree(rpmfi fi)
Destroy a file info set.
const char * rpmfiFN(rpmfi fi)
Return current file name from file info set.
void rpmtsEmpty(rpmts ts)
Re-create an empty transaction set.
const char * rpmfiFUser(rpmfi fi)
Return current file owner from file info set.
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.
int rpmfiFC(rpmfi fi)
Return file count from file info set.
rpmuint32_t rpmfiFSize(rpmfi fi)
Return current file size from file info set.
static PyObject *char * mode
sprintf(t," (%u)",(unsigned) dig->nbytes)
rpmdepFlags rpmtsSetDFlags(rpmts ts, rpmdepFlags depFlags)
Set dependency flags, i.e.
#define RPMFILE_STATE_MISSING
enum rpmRC_e rpmRC
RPM return codes.
memset(_r, 0, sizeof(*_r))
static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *static PyObject *size_t dlen
void * xcalloc(size_t nmemb, size_t size)
assert(key->size==sizeof(hdrNum))
rpmgi rpmgiNew(rpmts ts, int tag, const void *keyp, size_t keylen)
Return a generalized iterator.
rpmmi rpmmiFree(rpmmi mi)
Destroy rpm database iterator.
unsigned int rpmmiCount(rpmmi mi)
Return number of elements in rpm database iterator.
char * currentDirectory(void)
Return (malloc'd) current working directory.
int showQueryPackage(QVA_t qva, rpmts ts, Header h)
Display results of package query.
enum rpmgiFlags_e rpmgiFlags
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 Lstat(const char *path, struct stat *st)
lstat(2) clone.
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.
Header rpmmiNext(rpmmi mi)
Return next package header from iteration.
rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t argv, int ftsOpts, rpmgiFlags flags)
Load iterator args.
const char * qva_queryFormat
#define QVA_ISSET(_qvaflags, _FLAG)
#define VSF_CLR(_vsflags, _FLAG)
int rpmdbCheckSignals(void)
Check for and exit on termination signals.
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.
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
#define FF_ISSET(_fflags, _FLAG)
enum rpmfileAttrs_e rpmfileAttrs
File Attributes.
int rpmfiNext(rpmfi fi)
Return next file iterator index.
int rpmcliQuery(rpmts ts, QVA_t qva, const char **argv)
Display package information.
static const char *char c
Return text between pl and matching pr characters.
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
#define VSF_SET(_vsflags, _FLAG)
rpmfi rpmfiInit(rpmfi fi, int fx)
Initialize file iterator index.
enum rpmfileState_e rpmfileState
File States (when installed).
static const char * prefix[]
Tables for prefixing and suffixing patterns, according to the -w, -x, and -F options.
static PyObject *rpmtransFlags transFlags
static int rpmcliShowMatches(QVA_t qva, rpmts ts)
Display query/verify information for each header in iterator.
const char * rpmfiFLink(rpmfi fi)
Return current file linkto (i.e.
enum rpmtransFlags_e rpmtransFlags
Bit(s) to control rpmtsRun() operation.
char * stpcpy(char *dest, const char *src)
Structures and prototypes used for an "rpmts" transaction set.
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.
static void
Print copy of spec file, filling in Group/Description/Summary from specspo.
const char * rpmgiHdrPath(rpmgi gi)
Return current header path.
struct rpmfi_s * rpmfi
File info tag sets from a header, so that a header can be discarded early.
Access RPM indices using Berkeley DB interface(s).
rpmmi rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)
Return transaction database iterator.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
enum rpmdepFlags_e rpmdepFlags
Bit(s) to control rpmtsCheck() and rpmtsOrder() operation.
char * Realpath(const char *path, char *resolved_path)
realpath(3) clone.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
struct rpmgi_s * rpmgi
Generalized iterator.
int rpmQueryVerify(QVA_t qva, rpmts ts, const char *arg)
Common query/verify source interface, called once for each CLI arg.
#define RPMDBI_PACKAGES
Pseudo-tags used by the rpmdb and rpmgi iterator API's.
const unsigned char * digest