break;
}
+ gi->queryFormat = _free(gi->queryFormat);
if (gi->ftsp != NULL) {
int xx;
xx = Fts_close(gi->ftsp);
return ftsInfoStrings[ fts_info ];
}
+/*@only@*/
+static const char * rpmgiPathOrQF(rpmgi gi, const char * fn,
+ /*@null@*/ Header * hdrp)
+ /*@modifies gi, *hdrp @*/
+{
+ const char * fmt = ((gi->queryFormat != NULL)
+ ? gi->queryFormat : "%{name}-%{version}-%{release}");
+ const char * val = NULL;
+ Header h = NULL;
+
+ if (hdrp != NULL && *hdrp != NULL)
+ h = headerLink(*hdrp);
+
+ if (h != NULL)
+ val = headerSprintf(h, fmt, rpmTagTable, rpmHeaderFormats, NULL);
+ else
+ val = xstrdup(fn);
+
+ h = headerFree(h);
+
+ return val;
+}
+
const char * rpmgiNext(/*@null@*/ rpmgi gi)
/*@modifies gi @*/
{
case RPMGI_RPMDB:
h = rpmdbNextIterator(gi->mi);
if (h != NULL) {
- const char * fmt = "%{NAME}-%{VERSION}-%{RELEASE}";
- val = headerSprintf(h, fmt, rpmTagTable, rpmHeaderFormats, NULL);
+ val = rpmgiPathOrQF(gi, "rpmdb", &h);
} else {
gi->mi = rpmdbFreeIterator(gi->mi);
gi->i = -1;
if (gi->argv != NULL && gi->argv[gi->i] != NULL) {
if (_rpmgi_debug < 0)
fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->argv, gi->i, gi->argv[gi->i]);
- val = xstrdup(gi->argv[gi->i]);
+ val = rpmgiPathOrQF(gi, gi->argv[gi->i], NULL);
} else
gi->i = -1;
break;
case RPMGI_FTSWALK:
- if (gi->ftsp == NULL && gi->i == 0)
+ if (gi->argv == NULL)
+ break;
+ if (gi->ftsp == NULL && gi->i == 0) {
gi->ftsp = Fts_open(gi->argv, gi->ftsOpts, NULL);
+ /* XXX NULL with open(2)/malloc(3) errno set */
+ }
+ if (gi->ftsp != NULL)
while (val == NULL && (gi->fts = Fts_read(gi->ftsp)) != NULL) {
FTSENT * fts = gi->fts;
case FTS_SL:
if (_rpmgi_debug < 0)
fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->ftsp, gi->i, fts->fts_path);
- val = xstrdup(fts->fts_path);
+ val = rpmgiPathOrQF(gi, fts->fts_path, NULL);
break;
default:
break;
return val;
}
+
+int rpmgiSetQueryFormat(rpmgi gi, const char * queryFormat)
+{
+ int rc = 0;
+
+ if (gi != NULL) {
+ gi->queryFormat = _free(gi->queryFormat);
+ gi->queryFormat = xstrdup(queryFormat);
+ }
+ return rc;
+
+}
+
/*@=modfilesys@*/
static int gitag = RPMGI_FTSWALK;
static int ftsOpts = 0;
+static const char * queryFormat = NULL;
+
static struct poptOption optionsTable[] = {
{ "rpmgidebug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmgi_debug, -1,
N_("debug generalized iterator"), NULL},
{ "ftswalk", '\0', POPT_ARG_VAL, &gitag, RPMGI_FTSWALK,
N_("iterate fts(3) walk"), NULL },
+ { "qf", '\0', POPT_ARG_STRING, &queryFormat, 0,
+ N_("use the following query format"), "QUERYFORMAT" },
+ { "queryformat", '\0', POPT_ARG_STRING, &queryFormat, 0,
+ N_("use the following query format"), "QUERYFORMAT" },
+
{ "comfollow", '\0', POPT_BIT_SET, &ftsOpts, FTS_COMFOLLOW,
N_("follow command line symlinks"), NULL },
{ "logical", '\0', POPT_BIT_SET, &ftsOpts, FTS_LOGICAL,
{ "whiteout", '\0', POPT_BIT_SET, &ftsOpts, FTS_WHITEOUT,
N_("return whiteout information"), NULL },
-#ifdef DYING
- { "ftpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ftp_debug, -1,
- N_("debug protocol data stream"), NULL},
- { "rpmiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmio_debug, -1,
- N_("debug rpmio I/O"), NULL},
- { "urldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_url_debug, -1,
- N_("debug URL cache handling"), NULL},
- { "verbose", 'v', 0, 0, 'v', NULL, NULL },
-#endif
-
{ NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
N_("Common options for all rpm modes and executables:"),
NULL },
ts = rpmtsCreate();
av = poptGetArgs(optCon);
gi = rpmgiNew(ts, gitag, av, ftsOpts);
+ (void) rpmgiSetQueryFormat(gi, queryFormat);
ac = 0;
while ((arg = rpmgiNext(gi)) != NULL) {