23 #define _RPMGI_INTERNAL
33 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
35 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
36 #define VSF_SET(_vsflags, _FLAG) \
37 (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG))
38 #define VSF_CLR(_vsflags, _FLAG) \
39 (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG))
43 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
45 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
46 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG)
47 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG)
100 static int cmpItem(
const void * a,
const void *
b) {
109 for (i = 0; i <
nitems; i++)
111 items =
_free(items);
120 if (fp == NULL) fp = stdout;
121 for (i = 0; i <
nitems; i++) {
130 fprintf(fp,
"%s\n", ip->
path);
137 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
151 for (i = 0; i <
nitems; i++) {
164 if (!xx || md5 == NULL) {
231 struct stat sb, * st;
242 if (items != NULL &&
nitems > 0) {
243 Item needle = memset(
alloca(
sizeof(*needle)), 0,
sizeof(*needle));
244 Item * found, * fneedle = &needle;
248 found = bsearch(fneedle, items,
nitems,
sizeof(*found),
cmpItem);
251 while (found > items &&
cmpItem(found-1, fneedle) == 0)
256 while (found < (items +
nitems) &&
cmpItem(found, fneedle) == 0) {
275 }
else if (ec == 1) {
285 if (st == NULL || ((
long)st & 0xffff0000) == 0
L) {
287 memset(st, 0,
sizeof(*st));
292 items[
i]->
size = st->st_size;
293 items[
i]->
mtime = st->st_mtime;
303 fprintf(stderr,
"\t%*s [%d] %s\n",
333 if (!(fts_info >= 1 && fts_info <= 14))
340 FTS * ftsp = gi->ftsp;
376 if ((patterns = bhg->
patterns) != NULL)
377 while ((pattern = *patterns++) != NULL) {
391 if ((patterns = bhg->
patterns) != NULL)
392 while ((pattern = *patterns++) != NULL) {
429 if (strcmp(s,
".rpm"))
471 if (argv != NULL && * argv != NULL) {
479 while ((arg = *argv++) != NULL) {
483 t[-1] = (char)(single ?
'\0' :
')');
501 macro =
"%{_bhpath}";
504 macro =
"%{_bhcoll}";
507 macro = (buf[0] ==
'\0' ?
"%{_bhN}" : buf);
523 if (pattern == NULL || *pattern ==
'\0') {
524 pattern =
_free(pattern);
529 if (bhglobs[i].patterns[0] != NULL)
531 i, bhglobs[i].patterns[0]);
542 bhglobs =
_free(bhglobs);
552 N_(
"don't verify header+payload signature"), NULL },
554 {
"cache",
'\0', POPT_ARG_VAL, &
noCache, 0,
555 N_(
"update cache database"), NULL },
556 {
"nocache",
'\0', POPT_ARG_VAL, &
noCache, -1,
557 N_(
"don't update cache database, only print package paths"), NULL },
560 N_(
"File tree walk options:"),
564 N_(
"Common options for all rpm modes and executables:"),
587 s =
rpmExpand(
"%{?_cache_dbpath}", NULL);
596 fprintf(stderr,
_(
"%s: %%{_cache_dbpath} macro is mis-configured.\n"),
603 #if defined(SUPPORT_NOSIGNATURES)
624 { uint32_t tid = (uint32_t)
time(NULL);
652 fprintf(stderr,
_(
"%s: cache operation failed: ec %d.\n"),
static rpmRC cacheWalkPathFilter(rpmgi gi)
static Item freeItem(Item item)
rpmQueryFlags rpmcliQueryFlags
Bit(s) from common command line options.
static rpmRC cacheStashLatest(rpmgi gi, Header h)
const char bson_timestamp_t * ts
char * xstrdup(const char *str)
#define VSF_SET(_vsflags, _FLAG)
rpmgi rpmgiFree(rpmgi gi)
Destroy a generalized iterator.
static void initGlobs(rpmts ts, const char **argv)
Initialize fts and glob structures.
int Access(const char *path, int amode)
access(2) clone.
struct poptOption rpmcliAllPoptTable[]
Popt option table for options shared by all modes and executables.
struct poptOption rpmioFtsPoptTable[]
Popt option table for options to set Fts(3) options.
int Stat(const char *path, struct stat *st)
stat(2) clone.
static rpmVSFlags vsflags
struct _ftsent * fts_parent
int main(int argc, char *argv[])
static void rpmlog(int code, const char *fmt,...)
poptContext rpmcliInit(int argc, char *const argv[], struct poptOption *optionsTable)
Initialize most everything needed by an rpm CLI executable context.
struct rpmds_s * rpmds
Dependency tag sets from a header, so that a header can be discarded early.
rpmds rpmdsFree(rpmds ds)
Destroy a dependency set.
static int ftsCacheUpdate(rpmts ts)
rpmuint32_t rpmtsSetTid(rpmts ts, rpmuint32_t tid)
Set transaction id, i.e.
void * xcalloc(size_t nmemb, size_t size)
static struct poptOption optionsTable[]
static const char * ftsInfoStrings[]
rpmgi rpmgiNew(rpmts ts, int tag, const void *keyp, size_t keylen)
Return a generalized iterator.
Structures and prototypes used for an "rpmps" problem set.
int rpmdsCompare(const rpmds A, const rpmds B)
Compare two versioned dependency ranges, looking for overlap.
int rpmDefineMacro(MacroContext mc, const char *macro, int level)
Define macro in context.
#define VSF_CLR(_vsflags, _FLAG)
int Glob_pattern_p(const char *pattern, int quote)
glob_pattern_p(3) clone.
#define QVA_ISSET(_qvaflags, _FLAG)
static void freeGlobs(void)
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.
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
Header headerFree(Header h)
Dereference a header instance.
static int ftsCachePrint(rpmts ts, FILE *fp)
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
rpmRC rpmMkdirPath(const char *dpath, const char *dname)
Create directory if it does not exist, and make sure path is writable.
const char const char int arg
const char * rpmdsN(const rpmds ds)
Return current dependency name.
rpmmi rpmmiFree(rpmmi mi)
Destroy rpm database iterator.
static int cmpItem(const void *a, const void *b)
static void freeItems(void)
int Fts_set(FTS *sp, FTSENT *p, int instr)
Modify the traversal for a file set member.
Header headerLink(Header h)
Reference a header instance.
rpmdb rpmtsGetRdb(rpmts ts)
Get transaction set database handle.
static const char * ftsInfoStr(int fts_info)
struct rpmgi_s * rpmgi
Generalized iterator.
enum rpmRC_e rpmRC
RPM return codes.
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
rpmts rpmtsCreate(void)
Create an empty transaction set.
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.
rpmVSFlags rpmtsVSFlags(rpmts ts)
Get verify signatures flag(s).
static struct ftsglob_s * bhglobs
int rpmtsOpenDB(rpmts ts, int dbmode)
Open the database used by the transaction.
rpmRC rpmgiNext(rpmgi gi)
Perform next iteration step.
int rpmdbAdd(rpmdb db, int iid, Header h, rpmts ts)
Add package header to rpm database and indices.
const char const char * pattern
rpmuint32_t rpmtsGetTid(rpmts ts)
Get transaction id, i.e.
Access RPM indices using Berkeley DB interface(s).
unsigned int rpmmiCount(rpmmi mi)
Return number of elements in rpm database iterator.
int rpmtsCloseDB(rpmts ts)
Close the database used by the transaction.
int fnmatch(char *pattern, const char *string, int flags) const
rpmds rpmdsThis(Header h, rpmTag tagN, evrFlags Flags)
Create, load and initialize a dependency for this header.
poptContext rpmcliFini(poptContext optCon)
Destroy most everything needed by an rpm CLI executable context.
static Item newItem(void)