7 #define _RPMGI_INTERNAL
17 rpmgi XrpmgiUnlink(rpmgi gi, const char * msg, const char * fn, unsigned ln)
19 if (gi == NULL) return NULL;
21 if (_rpmgi_debug && msg != NULL)
22 fprintf(stderr, "--> gi %p -- %d %s at %s:%u\n", gi, gi->nrefs, msg, fn, ln);
28 rpmgi XrpmgiLink(rpmgi gi, const char * msg, const char * fn, unsigned ln)
30 if (gi == NULL) return NULL;
33 if (_rpmgi_debug && msg != NULL)
34 fprintf(stderr, "--> gi %p ++ %d %s at %s:%u\n", gi, gi->nrefs, msg, fn, ln);
36 /*@-refcounttrans@*/ return gi; /*@=refcounttrans@*/
39 rpmgi rpmgiFree(rpmgi gi)
45 return rpmgiUnlink(gi, NULL);
48 fprintf(stderr, "*** gi %p\t%p[%d]\n", gi, gi->argv, gi->argc);
50 (void) rpmgiUnlink(gi, NULL);
64 gi->queryFormat = _free(gi->queryFormat);
65 if (gi->ftsp != NULL) {
67 xx = Fts_close(gi->ftsp);
71 gi->mi = rpmdbFreeIterator(gi->mi);
72 gi->ts = rpmtsFree(gi->ts);
74 memset(gi, 0, sizeof(*gi)); /* XXX trash and burn */
79 rpmgi rpmgiNew(rpmts ts, int tag, const void * keyp, size_t keylen)
81 rpmgi gi = xcalloc(1, sizeof(*gi));
86 gi->ts = rpmtsLink(ts, NULL);
93 gi->mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, NULL, 0);
96 fprintf(stderr, "*** gi %p\t%p\n", gi, gi->mi);
103 { char *const * argv = keyp;
104 unsigned flags = keylen;
109 while (*argv++ != NULL)
113 if (_rpmgi_debug < 0)
114 fprintf(stderr, "*** gi %p\t%p[%d]\n", gi, gi->argv, gi->argc);
119 gi = rpmgiLink(gi, NULL);
124 static int indent = 2;
126 static const char * ftsInfoStrings[] = {
144 static const char * ftsInfoStr(int fts_info) {
145 if (!(fts_info >= 1 && fts_info <= 14))
147 return ftsInfoStrings[ fts_info ];
151 static const char * rpmgiPathOrQF(rpmgi gi, const char * fn,
152 /*@null@*/ Header * hdrp)
153 /*@modifies gi, *hdrp @*/
155 const char * fmt = ((gi->queryFormat != NULL)
156 ? gi->queryFormat : "%{name}-%{version}-%{release}");
157 const char * val = NULL;
160 if (hdrp != NULL && *hdrp != NULL)
161 h = headerLink(*hdrp);
164 val = headerSprintf(h, fmt, rpmTagTable, rpmHeaderFormats, NULL);
173 const char * rpmgiNext(/*@null@*/ rpmgi gi)
176 const char * val = NULL;
179 if (gi != NULL && ++gi->i >= 0)
183 h = rpmdbNextIterator(gi->mi);
185 val = rpmgiPathOrQF(gi, "rpmdb", &h);
187 gi->mi = rpmdbFreeIterator(gi->mi);
194 if (gi->argv != NULL && gi->argv[gi->i] != NULL) {
195 if (_rpmgi_debug < 0)
196 fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->argv, gi->i, gi->argv[gi->i]);
197 val = rpmgiPathOrQF(gi, gi->argv[gi->i], NULL);
202 if (gi->argv == NULL)
204 if (gi->ftsp == NULL && gi->i == 0) {
205 gi->ftsp = Fts_open(gi->argv, gi->ftsOpts, NULL);
206 /* XXX NULL with open(2)/malloc(3) errno set */
209 if (gi->ftsp != NULL)
210 while (val == NULL && (gi->fts = Fts_read(gi->ftsp)) != NULL) {
211 FTSENT * fts = gi->fts;
213 if (_rpmgi_debug < 0)
214 fprintf(stderr, "FTS_%s\t%*s %s\n", ftsInfoStr(fts->fts_info),
215 indent * (fts->fts_level < 0 ? 0 : fts->fts_level), "",
218 switch (fts->fts_info) {
221 if (_rpmgi_debug < 0)
222 fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->ftsp, gi->i, fts->fts_path);
223 val = rpmgiPathOrQF(gi, fts->fts_path, NULL);
229 if (gi->fts == NULL && gi->ftsp != NULL) {
231 xx = Fts_close(gi->ftsp);
241 int rpmgiSetQueryFormat(rpmgi gi, const char * queryFormat)
246 gi->queryFormat = _free(gi->queryFormat);
247 gi->queryFormat = xstrdup(queryFormat);