From 595a207f27c0ef38d6e604deda2ac9423a9b4421 Mon Sep 17 00:00:00 2001 From: jbj Date: Sun, 24 Oct 2004 20:35:41 +0000 Subject: [PATCH] Arg iteration for --query and --verify, everything but RPMQV_ALL. CVS patchset: 7505 CVS date: 2004/10/24 20:35:41 --- lib/query.c | 16 ++++++++-------- lib/rpmgi.c | 30 ++++++++++++++++-------------- lib/rpmgi.h | 3 ++- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/lib/query.c b/lib/query.c index 83a429c70..f34418ef4 100644 --- a/lib/query.c +++ b/lib/query.c @@ -784,12 +784,14 @@ restart: int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_t argv) { - const char * arg; + int gitag = RPMDBI_ARGLIST; + int gikey = NULL; + int gikeylen = 0; int ftsOpts = 0; - rpmgiFlags giflags = RPMGI_NOGLOB; + rpmgiFlags giflags = RPMGI_NOGLOB|RPMGI_NOHEADER; int ec = 0; - qva->qva_gi = rpmgiNew(ts, RPMDBI_ARGLIST, NULL, 0); + qva->qva_gi = rpmgiNew(ts, gitag, gikey, gikeylen); qva->qva_rc = rpmgiSetArgs(qva->qva_gi, argv, ftsOpts, giflags); switch (qva->qva_source) { @@ -797,15 +799,13 @@ int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_t argv) /*@-nullpass@*/ /* FIX: argv can be NULL, cast to pass argv array */ ec = rpmQueryVerify(qva, ts, (const char *) argv); /*@=nullpass@*/ + rpmtsEmpty(ts); break; default: -/*@-boundsread@*/ - if (argv != NULL) - while ((arg = *argv++) != NULL) { - ec += rpmQueryVerify(qva, ts, arg); + while (rpmgiNext(qva->qva_gi) == RPMRC_OK) { + ec += rpmQueryVerify(qva, ts, rpmgiHdrPath(qva->qva_gi)); rpmtsEmpty(ts); } -/*@=boundsread@*/ break; } diff --git a/lib/rpmgi.c b/lib/rpmgi.c index 5b429e552..f8a5854c0 100644 --- a/lib/rpmgi.c +++ b/lib/rpmgi.c @@ -146,17 +146,19 @@ static rpmRC rpmgiLoadReadHeader(rpmgi gi) rpmRC rpmrc = RPMRC_NOTFOUND; Header h = NULL; + if (gi->argv != NULL && gi->argv[gi->i] != NULL) do { const char * fn; /* XXX gi->hdrPath? */ fn = gi->argv[gi->i]; - h = rpmgiReadHeader(gi, fn); - if (h != NULL || (gi->flags & RPMGI_NOHEADER)) { + if (!(gi->flags & RPMGI_NOHEADER)) { + h = rpmgiReadHeader(gi, fn); + if (h != NULL) + rpmrc = RPMRC_OK; + } else rpmrc = RPMRC_OK; - break; - } - if (gi->flags & RPMGI_NOMANIFEST) + if (rpmrc == RPMRC_OK || gi->flags & RPMGI_NOMANIFEST) break; /* Not a header, so try for a manifest. */ @@ -169,7 +171,7 @@ static rpmRC rpmgiLoadReadHeader(rpmgi gi) fn = _free(fn); } while (1); - if (rpmrc == RPMRC_OK && h != NULL && !(gi->flags & RPMGI_NOHEADER)) + if (rpmrc == RPMRC_OK && h != NULL) gi->h = headerLink(h); h = headerFree(h); @@ -229,10 +231,10 @@ fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->ftsp, gi->i, fts->fts_path); /** * Append globbed arg list to iterator. * @param gi generalized iterator - * @param argv arg list to be globbed + * @param argv arg list to be globbed (or NULL) * @returns RPMRC_OK on success */ -static rpmRC rpmgiGlobArgv(rpmgi gi, ARGV_t argv) +static rpmRC rpmgiGlobArgv(rpmgi gi, /*@null@*/ ARGV_t argv) /*@globals internalState @*/ /*@modifies gi, internalState @*/ { @@ -242,9 +244,11 @@ static rpmRC rpmgiGlobArgv(rpmgi gi, ARGV_t argv) int xx; if (gi->flags & RPMGI_NOGLOB) { - while (argv[ac] != NULL) - ac++; - xx = argvAppend(&gi->argv, argv); + if (argv != NULL) { + while (argv[ac] != NULL) + ac++; + xx = argvAppend(&gi->argv, argv); + } gi->argc = ac; return rpmrc; } @@ -420,9 +424,7 @@ fprintf(stderr, "*** gi %p\t%p\n", gi, gi->mi); gi->hdrPath = rpmExpand("hdlist h# ", hnum, NULL); break; case RPMDBI_ARGLIST: - if (gi->argv == NULL || gi->argv[gi->i] == NULL) - goto enditer; - + /* XXX gi->active initialize? */ if (_rpmgi_debug < 0) fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->argv, gi->i, gi->argv[gi->i]); /* Read next header, lazily expanding manifests as found. */ diff --git a/lib/rpmgi.h b/lib/rpmgi.h index c1ebcb118..18d91f747 100644 --- a/lib/rpmgi.h +++ b/lib/rpmgi.h @@ -172,7 +172,8 @@ rpmts rpmgiTs(/*@null@*/ rpmgi gi) * @param flags iterator flags * @returns RPMRC_OK on success */ -rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t argv, int ftsOpts, rpmgiFlags flags) +rpmRC rpmgiSetArgs(rpmgi gi, /*@null@*/ ARGV_t argv, + int ftsOpts, rpmgiFlags flags) /*@modifies gi @*/; #ifdef __cplusplus