rpm  5.4.14
query.c
Go to the documentation of this file.
1 
6 #include "system.h"
7 
8 #ifndef PATH_MAX
9 /*@-incondefs@*/ /* FIX: long int? */
10 # define PATH_MAX 255
11 /*@=incondefs@*/
12 #endif
13 
14 #include <rpmio.h>
15 #include <rpmiotypes.h>
16 #include <poptIO.h>
17 
18 #include <rpmtag.h>
19 #include "rpmdb.h"
20 
21 #include "rpmfi.h"
22 #define _RPMTS_INTERNAL /* XXX for ts->rdb */
23 #include "rpmts.h"
24 #include "rpmgi.h"
25 
26 #include "manifest.h"
27 #include "misc.h" /* XXX for currentDirectory() */
28 
29 #include <rpmcli.h>
30 
31 #include "debug.h"
32 
33 static int _jbj;
34 #define JBJDEBUG(_list) if (_jbj) fprintf _list
35 
36 /*@access rpmts @*/ /* XXX cast */
37 
38 #ifdef __cplusplus
39 
40 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG))
41 
42 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (QUERY_##_FLAG))
43 
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))
49 
50 #else /* __cplusplus */
51 
52 #define FF_ISSET(_fflags, _FLAG) ((_fflags) & (RPMFILE_##_FLAG))
53 
54 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (QUERY_##_FLAG))
55 
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)
59 
60 #endif /* __cplusplus */
61 
64 static void printFileInfo(char * te, const char * name,
65  size_t size, unsigned short mode,
66  unsigned int mtime,
67  unsigned short rdev, unsigned int nlink,
68  const char * owner, const char * group,
69  const char * linkto)
70  /*@modifies *te @*/
71 {
72  char sizefield[15];
73 #if defined(RPM_VENDOR_OPENPKG) /* adjust-verbose-listing */
74  /* In verbose file listing output, give the owner and group fields
75  more width and at the same time reduce the nlink and size fields
76  more to typical sizes within OpenPKG. */
77  char ownerfield[13+1], groupfield[13+1];
78 #else
79  char ownerfield[8+1], groupfield[8+1];
80 #endif
81  char timefield[100];
82  time_t when = mtime; /* important if sizeof(rpmuint32_t) ! sizeof(time_t) */
83  struct tm * tm;
84  static time_t now;
85  static struct tm nowtm;
86  const char * namefield = name;
87  char * perms = rpmPermsString(mode);
88 
89  /* On first call, grab snapshot of now */
90  if (now == 0) {
91  now = time(NULL);
92  tm = localtime(&now);
93  if (tm) nowtm = *tm; /* structure assignment */
94  }
95 
96  strncpy(ownerfield, owner, sizeof(ownerfield));
97  ownerfield[sizeof(ownerfield)-1] = '\0';
98 
99  strncpy(groupfield, group, sizeof(groupfield));
100  groupfield[sizeof(groupfield)-1] = '\0';
101 
102  /* this is normally right */
103 #if defined(RPM_VENDOR_OPENPKG) /* adjust-verbose-listing */
104  /* In verbose file listing output, give the owner and group fields
105  more width and at the same time reduce the nlink and size fields
106  more to typical sizes within OpenPKG. */
107  sprintf(sizefield, "%8u", (unsigned)size);
108 #else
109  sprintf(sizefield, "%12u", (unsigned)size);
110 #endif
111 
112  /* this knows too much about dev_t */
113 
114  if (S_ISLNK(mode)) {
115  char *nf = (char *)
116  alloca(strlen(name) + sizeof(" -> ") + strlen(linkto));
117  sprintf(nf, "%s -> %s", name, linkto);
118  namefield = nf;
119  } else if (S_ISCHR(mode)) {
120  perms[0] = 'c';
121  sprintf(sizefield, "%3u, %3u", ((unsigned)(rdev >> 8) & 0xff),
122  ((unsigned)rdev & 0xff));
123  } else if (S_ISBLK(mode)) {
124  perms[0] = 'b';
125  sprintf(sizefield, "%3u, %3u", ((unsigned)(rdev >> 8) & 0xff),
126  ((unsigned)rdev & 0xff));
127  }
128 
129  /* Convert file mtime to display format */
130  tm = localtime(&when);
131  timefield[0] = '\0';
132  if (tm != NULL)
133  { const char *fmt;
134  if (now > when + 6L * 30L * 24L * 60L * 60L || /* Old. */
135  now < when - 60L * 60L) /* In the future. */
136  {
137  /* The file is fairly old or in the future.
138  * POSIX says the cutoff is 6 months old;
139  * approximate this by 6*30 days.
140  * Allow a 1 hour slop factor for what is considered "the future",
141  * to allow for NFS server/client clock disagreement.
142  * Show the year instead of the time of day.
143  */
144  fmt = "%b %e %Y";
145  } else {
146  fmt = "%b %e %H:%M";
147  }
148  (void)strftime(timefield, sizeof(timefield) - 1, fmt, tm);
149  }
150 
151 #if defined(RPM_VENDOR_OPENPKG) /* adjust-verbose-listing */
152  /* In verbose file listing output, give the owner and group fields
153  more width and at the same time reduce the nlink and size fields
154  more to typical sizes within OpenPKG. */
155  sprintf(te, "%s %d %-13s %-13s %8s %s %s", perms,
156  (int)nlink, ownerfield, groupfield, sizefield, timefield, namefield);
157 #else
158  sprintf(te, "%s %4d %-7s %-8s %10s %s %s", perms,
159  (int)nlink, ownerfield, groupfield, sizefield, timefield, namefield);
160 #endif
161  perms = _free(perms);
162 }
163 
166 static inline /*@null@*/ const char * queryHeader(Header h, const char * qfmt)
167  /*@globals internalState @*/
168  /*@modifies h, internalState @*/
169 {
170  const char * errstr = "(unkown error)";
171  const char * str;
172 
173 /*@-modobserver@*/
174  str = headerSprintf(h, qfmt, NULL, rpmHeaderFormats, &errstr);
175 /*@=modobserver@*/
176  if (str == NULL)
177  rpmlog(RPMLOG_ERR, _("incorrect format: %s\n"), errstr);
178  return str;
179 }
180 
183 static void flushBuffer(char ** tp, char ** tep, int nonewline)
184  /*@modifies *tp, **tp, *tep, **tep @*/
185 {
186  char *t, *te;
187 
188  t = *tp;
189  te = *tep;
190  if (te > t) {
191  if (!nonewline) {
192  *te++ = '\n';
193  *te = '\0';
194  }
195  rpmlog(RPMLOG_NOTICE, "%s", t);
196  te = t;
197  *t = '\0';
198  }
199  *tp = t;
200  *tep = te;
201 }
202 
204 {
205  int scareMem = 0;
206  rpmfi fi = NULL;
207  size_t tb = 2 * BUFSIZ;
208  size_t sb;
209  char * t, * te;
210  char * prefix = NULL;
211  int rc = 0; /* XXX FIXME: need real return code */
212  int i;
213 
214 JBJDEBUG((stderr, "--> %s(%p,%p,%p)\n", __FUNCTION__, qva, ts, h));
215  te = t = (char *) xmalloc(tb);
216  *te = '\0';
217 
218  if (qva->qva_queryFormat != NULL) {
219  const char * str;
220 /*@-type@*/ /* FIX rpmtsGetRDB()? */
221  (void) headerSetRpmdb(h, ts->rdb);
222 /*@=type@*/
223  str = queryHeader(h, qva->qva_queryFormat);
224  (void) headerSetRpmdb(h, NULL);
225  if (str) {
226  size_t tx = (te - t);
227 
228  sb = strlen(str);
229  if (sb) {
230  tb += sb;
231  t = (char *) xrealloc(t, tb);
232  te = t + tx;
233  }
234  /*@-usereleased@*/
235  te = stpcpy(te, str);
236  /*@=usereleased@*/
237  str = _free(str);
238  flushBuffer(&t, &te, 1);
239  }
240  }
241 
242  if (!QVA_ISSET(qva->qva_flags, FOR_LIST))
243  goto exit;
244 
245  fi = rpmfiNew(ts, h, RPMTAG_BASENAMES, scareMem);
246  if (rpmfiFC(fi) <= 0) {
247  te = stpcpy(te, _("(contains no files)"));
248  goto exit;
249  }
250 
251  fi = rpmfiInit(fi, 0);
252  if (fi != NULL)
253  while ((i = rpmfiNext(fi)) >= 0) {
254  rpmfileAttrs fflags;
255  unsigned short fmode;
256  unsigned short frdev;
257  unsigned int fmtime;
258  rpmfileState fstate;
259  size_t fsize;
260  const char * fn;
261  const char * fdigest;
262  const char * fuser;
263  const char * fgroup;
264  const char * flink;
265  rpmuint32_t fnlink;
266 
267  fflags = (rpmfileAttrs) rpmfiFFlags(fi);
268  fmode = rpmfiFMode(fi);
269  frdev = rpmfiFRdev(fi);
270  fmtime = rpmfiFMtime(fi);
271  fstate = rpmfiFState(fi);
272  fsize = rpmfiFSize(fi);
273  fn = rpmfiFN(fi);
274  { static char hex[] = "0123456789abcdef";
275  int dalgo = 0;
276  size_t dlen = 0;
277  const unsigned char * digest = rpmfiDigest(fi, &dalgo, &dlen);
278  char * p;
279  size_t j;
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 ];
285  }
286  *p = '\0';
287  }
288  fuser = rpmfiFUser(fi);
289  fgroup = rpmfiFGroup(fi);
290  flink = rpmfiFLink(fi);
291  fnlink = rpmfiFNlink(fi);
292 assert(fn != NULL);
293 assert(fdigest != NULL);
294 
295  /* If querying only docs, skip non-doc files. */
296  if (QVA_ISSET(qva->qva_flags, FOR_DOCS) && !FF_ISSET(fflags, DOC)) {
297  fdigest = _free(fdigest);
298  continue;
299  }
300 
301  /* If querying only configs, skip non-config files. */
302  if (QVA_ISSET(qva->qva_flags, FOR_CONFIG) && !FF_ISSET(fflags, CONFIG)){
303  fdigest = _free(fdigest);
304  continue;
305  }
306 
307  /* If not querying %config, skip config files. */
308  if (FF_ISSET(qva->qva_fflags, CONFIG) && FF_ISSET(fflags, CONFIG)) {
309  fdigest = _free(fdigest);
310  continue;
311  }
312 
313  /* If not querying %doc, skip doc files. */
314  if (FF_ISSET(qva->qva_fflags, DOC) && FF_ISSET(fflags, DOC)) {
315  fdigest = _free(fdigest);
316  continue;
317  }
318 
319  /* If not querying %ghost, skip ghost files. */
320  if (FF_ISSET(qva->qva_fflags, GHOST) && FF_ISSET(fflags, GHOST)) {
321  fdigest = _free(fdigest);
322  continue;
323  }
324 
325  /* Insure space for header derived data */
326  sb = 0;
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);
334  tb += sb + BUFSIZ;
335  t = (char *) xrealloc(t, tb);
336  te = t + tx;
337  }
338 
339  if (!rpmIsVerbose() && prefix)
340  te = stpcpy(te, prefix);
341 
342  if (QVA_ISSET(qva->qva_flags, FOR_STATE)) {
343  switch (fstate) {
345  te = stpcpy(te, _("normal "));
346  /*@switchbreak@*/ break;
348  te = stpcpy(te, _("replaced "));
349  /*@switchbreak@*/ break;
351  te = stpcpy(te, _("not installed "));
352  /*@switchbreak@*/ break;
354  te = stpcpy(te, _("net shared "));
355  /*@switchbreak@*/ break;
357  te = stpcpy(te, _("wrong color "));
358  /*@switchbreak@*/ break;
360  te = stpcpy(te, _("(no state) "));
361  /*@switchbreak@*/ break;
362  default:
363  sprintf(te, _("(unknown %3d) "), fstate);
364  te += strlen(te);
365  /*@switchbreak@*/ break;
366  }
367  }
368 
369  if (QVA_ISSET(qva->qva_flags, FOR_DUMPFILES)) {
370  sprintf(te, "%s %d %d %s 0%o ",
371  fn, (int)fsize, fmtime, fdigest, fmode);
372  te += strlen(te);
373 
374  if (fuser && fgroup) {
375 /*@-nullpass@*/
376  sprintf(te, "%s %s", fuser, fgroup);
377 /*@=nullpass@*/
378  te += strlen(te);
379  } else {
380  rpmlog(RPMLOG_CRIT, _("package without owner/group tags\n"));
381  }
382 
383  sprintf(te, " %s %s %u ",
384  FF_ISSET(fflags, CONFIG) ? "1" : "0",
385  FF_ISSET(fflags, DOC) ? "1" : "0",
386  frdev);
387  te += strlen(te);
388 
389  sprintf(te, "%s", (flink && *flink ? flink : "X"));
390  te += strlen(te);
391  } else
392  if (!rpmIsVerbose()) {
393  te = stpcpy(te, fn);
394  }
395  else {
396 
397  /* XXX Adjust directory link count and size for display output. */
398  if (S_ISDIR(fmode)) {
399  fnlink++;
400  fsize = 0;
401  }
402 
403  if (fuser && fgroup) {
404 /*@-nullpass@*/
405  printFileInfo(te, fn, fsize, fmode, fmtime, frdev, fnlink,
406  fuser, fgroup, flink);
407 /*@=nullpass@*/
408  te += strlen(te);
409  } else {
410  rpmlog(RPMLOG_CRIT, _("package without owner/group tags\n"));
411  }
412  }
413  flushBuffer(&t, &te, 0);
414  fdigest = _free(fdigest);
415  }
416 
417  rc = 0;
418 
419 exit:
420  flushBuffer(&t, &te, 0);
421  t = _free(t);
422 
423  fi = rpmfiFree(fi);
424 JBJDEBUG((stderr, "<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, qva, ts, h, rc));
425  return rc;
426 }
427 
428 static int rpmgiShowMatches(QVA_t qva, rpmts ts)
429  /*@globals rpmGlobalMacroContext, h_errno, internalState @*/
430  /*@modifies qva, rpmGlobalMacroContext, h_errno, internalState @*/
431 {
432  rpmgi gi = qva->qva_gi;
434  int ec = 0;
435 
436 JBJDEBUG((stderr, "--> %s(%p,%p)\n", __FUNCTION__, qva, ts));
437 
438  while ((rpmrc = rpmgiNext(gi)) == RPMRC_OK) {
439  Header h;
440  int rc;
441 
442 #ifdef NOTYET /* XXX exiting here will leave stale locks. */
444 #endif
445 
446  h = rpmgiHeader(gi);
447  if (h == NULL) /* XXX perhaps stricter break instead? */
448  continue;
449  if ((rc = qva->qva_showPackage(qva, ts, h)) != 0)
450  ec = rc;
451  if (qva->qva_source == RPMQV_DBOFFSET)
452  break;
453  }
454  if (ec == 0 && rpmrc == RPMRC_FAIL)
455  ec++;
456 
457 JBJDEBUG((stderr, "<-- %s(%p,%p) rc %d\n", __FUNCTION__, qva, ts, ec));
458  return ec;
459 }
460 
472 static int rpmcliShowMatches(QVA_t qva, rpmts ts)
473  /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
474  /*@modifies qva, rpmGlobalMacroContext, fileSystem, internalState @*/
475 {
476  Header h;
477  int ec = 1;
478 
479 JBJDEBUG((stderr, "--> %s(%p,%p)\n", __FUNCTION__, qva, ts));
480  qva->qva_showFAIL = qva->qva_showOK = 0;
481  while ((h = rpmmiNext(qva->qva_mi)) != NULL) {
482  ec = qva->qva_showPackage(qva, ts, h);
483  if (ec)
484  qva->qva_showFAIL++;
485  else
486  qva->qva_showOK++;
487  if (qva->qva_source == RPMQV_DBOFFSET)
488  break;
489  }
490  qva->qva_mi = rpmmiFree(qva->qva_mi);
491 JBJDEBUG((stderr, "<-- %s(%p,%p) rc %d\n", __FUNCTION__, qva, ts, ec));
492  return ec;
493 }
494 
500 static inline unsigned char nibble(char c)
501  /*@*/
502 {
503  if (c >= '0' && c <= '9')
504  return (c - '0');
505  if (c >= 'A' && c <= 'F')
506  return (c - 'A') + 10;
507  if (c >= 'a' && c <= 'f')
508  return (c - 'a') + 10;
509  return 0;
510 }
511 
512 int rpmQueryVerify(QVA_t qva, rpmts ts, const char * arg)
513 {
514  int res = 0;
515  const char * s;
516  int i;
517  int provides_checked = 0;
518 
519 JBJDEBUG((stderr, "--> %s(%p,%p,%p)\n", __FUNCTION__, qva, ts, arg));
520 
522 
523  if (qva->qva_showPackage == NULL)
524  return 1;
525 
526  switch (qva->qva_source) {
527 #ifdef NOTYET
528  default:
529 #endif
530  case RPMQV_GROUP:
531  case RPMQV_TRIGGEREDBY:
532  case RPMQV_WHATCONFLICTS:
533  case RPMQV_WHATOBSOLETES:
534  qva->qva_mi = rpmtsInitIterator(ts, (rpmTag) qva->qva_source, arg, 0);
535 #if defined(RPM_VENDOR_PLD)
536  if(rpmmiCount(qva->qva_mi) == 0)
537  qva->qva_mi = rpmmiFree(qva->qva_mi);
538 #endif
539  if (qva->qva_mi == NULL) {
540  rpmlog(RPMLOG_NOTICE, _("key \"%s\" not found in %s table\n"),
541  arg, tagName((rpmTag)qva->qva_source));
542  res = 1;
543  } else
544  res = rpmcliShowMatches(qva, ts);
545  break;
546 
547  case RPMQV_RPM:
548  res = rpmgiShowMatches(qva, ts);
549  break;
550 
551  case RPMQV_ALL:
552  res = rpmgiShowMatches(qva, ts);
553  break;
554 
555  case RPMQV_HDLIST:
556  res = rpmgiShowMatches(qva, ts);
557  break;
558 
559  case RPMQV_FTSWALK:
560  res = rpmgiShowMatches(qva, ts);
561  break;
562 
563  case RPMQV_SPECSRPM:
564  case RPMQV_SPECFILE:
565  res = ((qva->qva_specQuery != NULL)
566  ? qva->qva_specQuery(ts, qva, arg) : 1);
567  break;
568 
569 #ifdef DYING
570  case RPMQV_GROUP:
571  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_GROUP, arg, 0);
572  if (qva->qva_mi == NULL) {
574  _("group %s does not contain any packages\n"), arg);
575  res = 1;
576  } else
577  res = rpmcliShowMatches(qva, ts);
578  break;
579 
580  case RPMQV_TRIGGEREDBY:
581  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_TRIGGERNAME, arg, 0);
582  if (qva->qva_mi == NULL) {
583  rpmlog(RPMLOG_NOTICE, _("no package triggers %s\n"), arg);
584  res = 1;
585  } else
586  res = rpmcliShowMatches(qva, ts);
587  break;
588 #endif
589 
590  case RPMQV_SOURCEPKGID:
591  case RPMQV_PKGID:
592 #define MD5len 128/8 /* XXX coverity #1035850 */
593  { unsigned char MD5[MD5len+1];
594  unsigned char * t;
596 
597  for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
598  {};
599  if (i != 32) {
600  rpmlog(RPMLOG_NOTICE, _("malformed %s: %s\n"), "pkgid", arg);
601  return 1;
602  }
603 
604  MD5[0] = '\0';
605  for (i = 0, t = MD5, s = arg; i < MD5len; i++, t++, s += 2)
606  *t = (nibble(s[0]) << 4) | nibble(s[1]);
607 
608  tag = (qva->qva_source == RPMQV_PKGID
610  qva->qva_mi = rpmtsInitIterator(ts, (rpmTag) tag, MD5, MD5len);
611 #if defined(RPM_VENDOR_PLD)
612  if(rpmmiCount(qva->qva_mi) == 0)
613  qva->qva_mi = rpmmiFree(qva->qva_mi);
614 #endif
615  if (qva->qva_mi == NULL) {
616  rpmlog(RPMLOG_NOTICE, _("no package matches %s: %s\n"),
617  "pkgid", arg);
618  res = 1;
619  } else
620  res = rpmcliShowMatches(qva, ts);
621  } break;
622 #undef MD5len
623 
624  case RPMQV_HDRID:
625  for (i = 0, s = arg; *s && isxdigit(*s); s++, i++)
626  {};
627  if (i != 40) {
628  rpmlog(RPMLOG_NOTICE, _("malformed %s: %s\n"), "hdrid", arg);
629  return 1;
630  }
631 
632  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_SHA1HEADER, arg, 0);
633 #if defined(RPM_VENDOR_PLD)
634  if(rpmmiCount(qva->qva_mi) == 0)
635  qva->qva_mi = rpmmiFree(qva->qva_mi);
636 #endif
637  if (qva->qva_mi == NULL) {
638  rpmlog(RPMLOG_NOTICE, _("no package matches %s: %s\n"),
639  "hdrid", arg);
640  res = 1;
641  } else
642  res = rpmcliShowMatches(qva, ts);
643  break;
644 
645  case RPMQV_FILEID:
646  { unsigned char * t;
647  unsigned char * digest;
648  size_t dlen;
649 
650  /* Insure even no. of digits and at least 8 digits. */
651  for (dlen = 0, s = arg; *s && isxdigit(*s); s++, dlen++)
652  {};
653  if ((dlen & 1) || dlen < 8) {
654  rpmlog(RPMLOG_ERR, _("malformed %s: %s\n"), "fileid", arg);
655  return 1;
656  }
657 
658  dlen /= 2;
659  digest = (unsigned char *) memset(alloca(dlen), 0, dlen);
660  for (t = digest, s = arg; *s; t++, s += 2)
661  *t = (nibble(s[0]) << 4) | nibble(s[1]);
662 
663  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_FILEDIGESTS, digest, dlen);
664 #if defined(RPM_VENDOR_PLD)
665  if(rpmmiCount(qva->qva_mi) == 0)
666  qva->qva_mi = rpmmiFree(qva->qva_mi);
667 #endif
668  if (qva->qva_mi == NULL) {
669  rpmlog(RPMLOG_NOTICE, _("no package matches %s: %s\n"),
670  "fileid", arg);
671  res = 1;
672  } else
673  res = rpmcliShowMatches(qva, ts);
674  } break;
675 
676  case RPMQV_TID:
677  { int mybase = 10;
678  const char * myarg = arg;
679  char * end = NULL;
680  unsigned iid;
681 
682  /* XXX should be in strtoul */
683  if (*myarg == '0') {
684  myarg++;
685  mybase = 8;
686  if (*myarg == 'x') {
687  myarg++;
688  mybase = 16;
689  }
690  }
691  iid = (unsigned) strtoul(myarg, &end, mybase);
692  if ((*end) || (end == arg) || (iid == UINT_MAX)) {
693  rpmlog(RPMLOG_ERR, _("malformed %s: %s\n"), "tid", arg);
694  return 1;
695  }
696  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_INSTALLTID, &iid, sizeof(iid));
697 #if defined(RPM_VENDOR_PLD)
698  if(rpmmiCount(qva->qva_mi) == 0)
699  qva->qva_mi = rpmmiFree(qva->qva_mi);
700 #endif
701  if (qva->qva_mi == NULL) {
702  rpmlog(RPMLOG_NOTICE, _("no package matches %s: %s\n"),
703  "tid", arg);
704  res = 1;
705  } else
706  res = rpmcliShowMatches(qva, ts);
707  } break;
708 
709  case RPMQV_WHATNEEDS:
710  case RPMQV_WHATREQUIRES:
711  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_REQUIRENAME, arg, 0);
712 #if defined(RPM_VENDOR_PLD)
713  if(rpmmiCount(qva->qva_mi) == 0)
714  qva->qva_mi = rpmmiFree(qva->qva_mi);
715 #endif
716  if (qva->qva_mi == NULL) {
717  rpmlog(RPMLOG_NOTICE, _("no package requires %s\n"), arg);
718  res = 1;
719  } else
720  res = rpmcliShowMatches(qva, ts);
721  break;
722 
723  case RPMQV_WHATPROVIDES:
724  if (arg[0] != '/') {
725  provides_checked = 1;
726  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, arg, 0);
727 #if defined(RPM_VENDOR_PLD)
728  if(rpmmiCount(qva->qva_mi) == 0)
729  qva->qva_mi = rpmmiFree(qva->qva_mi);
730 #endif
731  if (qva->qva_mi == NULL) {
732  rpmlog(RPMLOG_NOTICE, _("no package provides %s\n"), arg);
733  res = 1;
734  } else
735  res = rpmcliShowMatches(qva, ts);
736  break;
737  }
738  /*@fallthrough@*/
739  case RPMQV_PATH:
740  { int gotpattern = 0;
741  char * fn;
742 
743  if (arg[0] == '^' || arg[strlen(arg)-1] == '$') {
744  fn = xstrdup(arg);
745  gotpattern++;
746  } else
747 #ifdef NOTYET
748  if (arg[0] == '/' && Glob_pattern_p(arg, 1)) {
749  fn = xstrdup(arg);
750  gotpattern++;
751  } else
752 #endif
753  {
754  for (s = arg; *s != '\0'; s++) {
755  if (!(*s == '.' || *s == '/'))
756  /*@loopbreak@*/ break;
757  }
758 
759  if (*s == '\0') {
760  char fnbuf[PATH_MAX];
761  fn = Realpath(arg, fnbuf);
762  fn = xstrdup( (fn != NULL ? fn : arg) );
763  } else if (*arg != '/') {
764  const char *curDir = currentDirectory();
765  fn = (char *) rpmGetPath(curDir, "/", arg, NULL);
766  curDir = _free(curDir);
767  } else
768  fn = xstrdup(arg);
769  (void) rpmCleanPath(fn);
770  }
771 
772  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_FILEPATHS, fn, 0);
773  if (qva->qva_mi == NULL && !provides_checked && !gotpattern) {
774  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, fn, 0);
775 #if defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_PLD)
776  if(rpmmiCount(qva->qva_mi) == 0)
777  qva->qva_mi = rpmmiFree(qva->qva_mi);
778 #endif
779  }
780 
781  if (qva->qva_mi == NULL) {
782  struct stat sb;
783  if (!gotpattern && Lstat(fn, &sb) != 0)
784  rpmlog(RPMLOG_NOTICE, _("file %s: %s\n"), fn, strerror(errno));
785  else
787  _("file %s is not owned by any package\n"), fn);
788  res = 1;
789  } else
790  res = rpmcliShowMatches(qva, ts);
791 
792  fn = _free(fn);
793  } break;
794 
795  case RPMQV_DBOFFSET:
796  { int mybase = 10;
797  const char * myarg = arg;
798  char * end = NULL;
799  uint32_t hdrNum;
800 
801  /* XXX should be in strtoul */
802  if (*myarg == '0') {
803  myarg++;
804  mybase = 8;
805  if (*myarg == 'x') {
806  myarg++;
807  mybase = 16;
808  }
809  }
810  hdrNum = (uint32_t) strtoul(myarg, &end, mybase);
811  if ((*end) || (end == arg) || (hdrNum == UINT_MAX)) {
812  rpmlog(RPMLOG_NOTICE, _("invalid package number: %s\n"), arg);
813  return 1;
814  }
815  rpmlog(RPMLOG_DEBUG, D_("package record number: %u\n"), (unsigned)hdrNum);
816  qva->qva_mi = rpmtsInitIterator(ts, RPMDBI_PACKAGES, &hdrNum, sizeof(hdrNum));
817 #if defined(RPM_VENDOR_PLD)
818  if(rpmmiCount(qva->qva_mi) == 0)
819  qva->qva_mi = rpmmiFree(qva->qva_mi);
820 #endif
821  if (qva->qva_mi == NULL) {
823  _("record %u could not be read\n"), (unsigned)hdrNum);
824  res = 1;
825  } else
826  res = rpmcliShowMatches(qva, ts);
827  } break;
828 
829  case RPMQV_PACKAGE:
830  qva->qva_mi = rpmtsInitIterator(ts, RPMTAG_NVRA, arg, 0);
831  if (qva->qva_mi == NULL) {
832  rpmlog(RPMLOG_NOTICE, _("package %s is not installed\n"), arg);
833  res = 1;
834  } else {
835  res = rpmcliShowMatches(qva, ts);
836  /* detect foo.bogusarch empty iterations. */
837  if (qva->qva_showOK == 0 && qva->qva_showFAIL == 0) {
838  rpmlog(RPMLOG_NOTICE, _("package %s is not installed\n"), arg);
839  res = 1;
840  }
841  }
842  break;
843  }
844 
845 JBJDEBUG((stderr, "<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, qva, ts, arg, res));
846  return res;
847 }
848 
850  /*@globals rpmioFtsOpts @*/
851  /*@modifies rpmioFtsOpts @*/
852 {
854  int ec = 0;
855 
856 JBJDEBUG((stderr, "--> %s(%p,%p,%p)\n", __FUNCTION__, ts, qva, argv));
857  switch (qva->qva_source) {
858  case RPMQV_ALL:
859  qva->qva_gi = rpmgiNew(ts, RPMDBI_PACKAGES, NULL, 0);
860  qva->qva_rc = rpmgiSetArgs(qva->qva_gi, argv, rpmioFtsOpts, RPMGI_NONE);
861 
862  if (rpmgiGetFlags(qva->qva_gi) & RPMGI_TSADD) /* Load the ts with headers. */
863  while ((rpmrc = rpmgiNext(qva->qva_gi)) == RPMRC_OK)
864  {};
865  if (rpmrc != RPMRC_NOTFOUND)
866  return 1; /* XXX should be no. of failures. */
867 
868  /*@-nullpass@*/ /* FIX: argv can be NULL, cast to pass argv array */
869  ec = rpmQueryVerify(qva, ts, (const char *) argv);
870  /*@=nullpass@*/
871  rpmtsEmpty(ts);
872  break;
873  case RPMQV_RPM:
874  qva->qva_gi = rpmgiNew(ts, RPMDBI_ARGLIST, NULL, 0);
875  qva->qva_rc = rpmgiSetArgs(qva->qva_gi, argv, rpmioFtsOpts, giFlags);
876 
877  if (rpmgiGetFlags(qva->qva_gi) & RPMGI_TSADD) /* Load the ts with headers. */
878  while ((rpmrc = rpmgiNext(qva->qva_gi)) == RPMRC_OK)
879  {};
880  if (rpmrc != RPMRC_NOTFOUND)
881  return 1; /* XXX should be no. of failures. */
882 
883  /*@-nullpass@*/ /* FIX: argv can be NULL, cast to pass argv array */
884  ec = rpmQueryVerify(qva, ts, NULL);
885  /*@=nullpass@*/
886  rpmtsEmpty(ts);
887  break;
888  case RPMQV_HDLIST:
889  qva->qva_gi = rpmgiNew(ts, RPMDBI_HDLIST, NULL, 0);
890  qva->qva_rc = rpmgiSetArgs(qva->qva_gi, argv, rpmioFtsOpts, giFlags);
891 
892  if (rpmgiGetFlags(qva->qva_gi) & RPMGI_TSADD) /* Load the ts with headers. */
893  while ((rpmrc = rpmgiNext(qva->qva_gi)) == RPMRC_OK)
894  {};
895  if (rpmrc != RPMRC_NOTFOUND)
896  return 1; /* XXX should be no. of failures. */
897 
898  /*@-nullpass@*/ /* FIX: argv can be NULL, cast to pass argv array */
899  ec = rpmQueryVerify(qva, ts, NULL);
900  /*@=nullpass@*/
901  rpmtsEmpty(ts);
902  break;
903  case RPMQV_FTSWALK:
904  if (rpmioFtsOpts == 0)
906  qva->qva_gi = rpmgiNew(ts, RPMDBI_FTSWALK, NULL, 0);
907  qva->qva_rc = rpmgiSetArgs(qva->qva_gi, argv, rpmioFtsOpts, giFlags);
908 
909  if (rpmgiGetFlags(qva->qva_gi) & RPMGI_TSADD) /* Load the ts with headers. */
910  while ((rpmrc = rpmgiNext(qva->qva_gi)) == RPMRC_OK)
911  {};
912  if (rpmrc != RPMRC_NOTFOUND)
913  return 1; /* XXX should be no. of failures. */
914 
915  /*@-nullpass@*/ /* FIX: argv can be NULL, cast to pass argv array */
916  ec = rpmQueryVerify(qva, ts, NULL);
917  /*@=nullpass@*/
918  rpmtsEmpty(ts);
919  break;
920  default:
921  if (giFlags & RPMGI_TSADD) {
922  qva->qva_gi = rpmgiNew(ts, RPMTAG_NVRA, NULL, 0);
923  qva->qva_rc = rpmgiSetArgs(qva->qva_gi, argv, rpmioFtsOpts,
924  (rpmgiFlags) (giFlags | (RPMGI_NOGLOB )));
925  if (rpmgiGetFlags(qva->qva_gi) & RPMGI_TSADD) /* Load the ts with headers. */
926  while ((rpmrc = rpmgiNext(qva->qva_gi)) == RPMRC_OK)
927  {};
928  if (rpmrc != RPMRC_NOTFOUND)
929  return 1; /* XXX should be no. of failures. */
930  qva->qva_source = RPMQV_ALL;
931  /*@-nullpass@*/ /* FIX: argv can be NULL, cast to pass argv array */
932  ec = rpmQueryVerify(qva, ts, NULL);
933  /*@=nullpass@*/
934  rpmtsEmpty(ts);
935  } else {
936  qva->qva_gi = rpmgiNew(ts, RPMDBI_ARGLIST, NULL, 0);
937  qva->qva_rc = rpmgiSetArgs(qva->qva_gi, argv, rpmioFtsOpts,
939  while ((rpmrc = rpmgiNext(qva->qva_gi)) == RPMRC_OK) {
940  const char * path;
941  path = rpmgiHdrPath(qva->qva_gi);
942 assert(path != NULL);
943  ec += rpmQueryVerify(qva, ts, path);
944  rpmtsEmpty(ts);
945  }
946  }
947  break;
948  }
949 
950  qva->qva_gi = rpmgiFree(qva->qva_gi);
951 
952 JBJDEBUG((stderr, "<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, ts, qva, argv, ec));
953  return ec;
954 }
955 
956 int rpmcliQuery(rpmts ts, QVA_t qva, const char ** argv)
957 {
958  rpmdepFlags depFlags = qva->depFlags, odepFlags;
959  rpmtransFlags transFlags = qva->transFlags, otransFlags;
960  rpmVSFlags vsflags, ovsflags;
961  int ec = 0;
962 
963 JBJDEBUG((stderr, "--> %s(%p,%p,%p)\n", __FUNCTION__, ts, qva, argv));
964  if (qva->qva_showPackage == NULL)
966 
967  /* If --queryformat unspecified, then set default now. */
968  if (qva->qva_queryFormat == NULL
969  && !QVA_ISSET(qva->qva_flags, FOR_LIST)
970  && !QVA_ISSET(qva->qva_flags, FOR_STATE)
971  && !QVA_ISSET(qva->qva_flags, FOR_DOCS)
972  && !QVA_ISSET(qva->qva_flags, FOR_CONFIG)
973  && !QVA_ISSET(qva->qva_flags, FOR_DUMPFILES)
974  ) {
975  qva->qva_queryFormat = rpmExpand("%{?_query_all_fmt}\n", NULL);
976  if (!(qva->qva_queryFormat != NULL && *qva->qva_queryFormat != '\0')) {
978  qva->qva_queryFormat = xstrdup("%{name}-%{version}-%{release}.%{arch}\n");
979  }
980  }
981 
982  vsflags = (rpmVSFlags) rpmExpandNumeric("%{?_vsflags_query}");
983  vsflags = (rpmVSFlags) 0; /* XXX FIXME: ignore default disablers. */
984 #if defined(SUPPORT_NOSIGNATURES)
985  if (!QVA_ISSET(qva->qva_flags, DIGEST)) {
986  VSF_SET(vsflags, NOSHA1HEADER);
987  VSF_SET(vsflags, NOMD5HEADER);
988  VSF_SET(vsflags, NOSHA1);
989  VSF_SET(vsflags, NOMD5);
990  }
991  if (!QVA_ISSET(qva->qva_flags, SIGNATURE)) {
992  VSF_SET(vsflags, NODSAHEADER);
993  VSF_SET(vsflags, NORSAHEADER);
994  VSF_SET(vsflags, NODSA);
995  VSF_SET(vsflags, NORSA);
996  }
997  if (!QVA_ISSET(qva->qva_flags, HDRCHK)) {
998  VSF_SET(vsflags, NOHDRCHK);
999  }
1000  VSF_CLR(vsflags, NEEDPAYLOAD); /* XXX needed? */
1001 #endif
1002 
1003  odepFlags = rpmtsSetDFlags(ts, depFlags);
1004  otransFlags = rpmtsSetFlags(ts, transFlags);
1005  ovsflags = rpmtsSetVSFlags(ts, vsflags);
1006  ec = rpmcliArgIter(ts, qva, argv);
1007  vsflags = rpmtsSetVSFlags(ts, ovsflags);
1008  transFlags = rpmtsSetFlags(ts, otransFlags);
1009  depFlags = rpmtsSetDFlags(ts, odepFlags);
1010 
1011  if (qva->qva_showPackage == showQueryPackage)
1012  qva->qva_showPackage = NULL;
1013 
1014 JBJDEBUG((stderr, "<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, ts, qva, argv, ec));
1015  return ec;
1016 }
rpmuint32_t rpmfiFFlags(rpmfi fi)
Return current file flags from file info set.
Definition: rpmfi.c:217
void * headerSetRpmdb(Header h, void *rpmdb)
Store rpmdb pointer.
Definition: header.c:1266
iter fi
Definition: fsm.c:170
rpmdepFlags depFlags
Definition: rpmcli.h:671
const char * fdigest
Definition: rpmfi-py.c:248
static void flushBuffer(char **tp, char **tep, int nonewline)
Definition: query.c:183
rpmlog(RPMLOG_ERR,"%s\n", buf)
#define MD5len
rpmgiFlags rpmgiGetFlags(rpmgi gi)
Return current iteration flags.
Definition: rpmgi.c:837
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)
Definition: query.c:64
rpmuint32_t rpmfiFNlink(rpmfi fi)
Return (calculated) current file nlink count from file info set.
Definition: rpmfi.c:427
char * xstrdup(const char *str)
Definition: rpmmalloc.c:321
char * rpmCleanPath(char *path)
Canonicalize file path.
Definition: macro.c:3279
rpmgi rpmgiFree(rpmgi gi)
Destroy a generalized iterator.
char * rpmGetPath(const char *path,...)
Return (malloc&#39;ed) expanded, canonicalized, file path.
Definition: macro.c:3371
Structure(s) used for file info tag sets.
rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags)
Set transaction flags, i.e.
Definition: rpmts.c:1345
struct rpmts_s * rpmts
The RPM Transaction Set.
Definition: rpmtypes.h:14
int rc
Definition: poptALL.c:670
int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_t argv)
Definition: query.c:849
The Header data structure.
rpmQueryFlags qva_flags
Definition: rpmcli.h:633
headerSprintfExtension rpmHeaderFormats
Table of query format extensions.
Definition: formats.c:305
static const char * queryHeader(Header h, const char *qfmt)
Definition: query.c:166
#define RPMTAG_PKGID
Definition: rpmtag.h:160
Header rpmgiHeader(rpmgi gi)
Return current iteration header.
Definition: rpmgi.c:847
rpmuint16_t rpmfiFRdev(rpmfi fi)
Return current file rdev from file info set.
Definition: rpmfi.c:339
#define S_ISLNK(mode)
Definition: system.h:651
enum rpmTag_e rpmTag
Definition: rpmtag.h:468
int errno
rpmfi rpmfiFree(rpmfi fi)
Destroy a file info set.
const char * rpmfiFN(rpmfi fi)
Return current file name from file info set.
Definition: rpmfi.c:163
void rpmtsEmpty(rpmts ts)
Re-create an empty transaction set.
Definition: rpmts.c:623
const char * rpmfiFUser(rpmfi fi)
Return current file owner from file info set.
Definition: rpmfi.c:458
static int _jbj
Definition: query.c:33
const char * rpmfiFGroup(rpmfi fi)
Return current file group from file info set.
Definition: rpmfi.c:470
rpmfi rpmfiNew(const void *_ts, Header h, rpmTag tagN, int flags)
Create and load a file info set.
Definition: rpmfi.c:1403
Header h
Definition: spec.c:739
argv
Definition: rpmmtree.c:3679
Command line option information.
Definition: rpmcli.h:630
int rpmfiFC(rpmfi fi)
Return file count from file info set.
Definition: rpmfi.c:87
rpmuint32_t rpmfiFSize(rpmfi fi)
Return current file size from file info set.
Definition: rpmfi.c:328
static PyObject *char * mode
Definition: rpmfd-py.c:115
QSpecF_t qva_specQuery
Definition: rpmcli.h:646
sprintf(t," (%u)",(unsigned) dig->nbytes)
rpmdepFlags rpmtsSetDFlags(rpmts ts, rpmdepFlags depFlags)
Set dependency flags, i.e.
Definition: rpmts.c:1366
#define RPMFILE_STATE_MISSING
Definition: rpmfi.h:46
rpmRC res
Definition: signature.c:584
char * alloca()
enum rpmRC_e rpmRC
RPM return codes.
Definition: signature.c:616
goto exit
Definition: db3.c:1903
memset(_r, 0, sizeof(*_r))
QVF_t qva_showPackage
Definition: rpmcli.h:642
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
Definition: rpmfi-py.c:246
unsigned int rpmuint32_t
Definition: rpmiotypes.h:28
void * xcalloc(size_t nmemb, size_t size)
Definition: rpmmalloc.c:300
assert(key->size==sizeof(hdrNum))
char * p
Definition: macro.c:413
char * headerSprintf(Header h, const char *fmt, headerTagTableEntry tags, headerSprintfExtension exts, errmsg_t *errmsg)
Return formatted output string from header tags.
Definition: hdrfmt.c:6748
rpmgi rpmgiNew(rpmts ts, int tag, const void *keyp, size_t keylen)
Return a generalized iterator.
Definition: rpmgi.c:543
rpmmi rpmmiFree(rpmmi mi)
Destroy rpm database iterator.
rpmuint32_t size
Definition: signature.c:585
HE_t ec
Definition: hdrfmt.c:6710
unsigned int rpmmiCount(rpmmi mi)
Return number of elements in rpm database iterator.
Definition: rpmdb.c:1759
char * currentDirectory(void)
Return (malloc&#39;d) current working directory.
Definition: misc.c:72
uint32_t hdrNum
Definition: db3.c:1889
int showQueryPackage(QVA_t qva, rpmts ts, Header h)
Display results of package query.
Definition: query.c:203
enum rpmgiFlags_e rpmgiFlags
static unsigned char nibble(char c)
Convert hex to binary nibble.
Definition: query.c:500
rpmuint16_t rpmfiFMode(rpmfi fi)
Return current file mode from file info set.
Definition: rpmfi.c:265
rpmgiFlags giFlags
Definition: rpmgi.c:42
#define FTS_COMFOLLOW
Definition: fts.h:87
int Lstat(const char *path, struct stat *st)
lstat(2) clone.
Definition: rpmrpc.c:1401
he tag
Definition: db3.c:1927
char * rpmPermsString(int mode)
Return ls(1)-like formatted mode string.
Definition: manifest.c:15
static int rpmgiShowMatches(QVA_t qva, rpmts ts)
Definition: query.c:428
const char * tagName(rpmTag tag)
Return tag name from value.
Definition: tagname.c:436
rpmtransFlags transFlags
Definition: rpmcli.h:672
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.
Definition: rpmrpc.c:2231
#define RPMDBI_FTSWALK
Definition: rpmtag.h:485
Header rpmmiNext(rpmmi mi)
Return next package header from iteration.
Definition: rpmdb.c:2248
rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t argv, int ftsOpts, rpmgiFlags flags)
Load iterator args.
Definition: rpmgi.c:866
rpmQVSources qva_source
Definition: rpmcli.h:631
const char * qva_queryFormat
Definition: rpmcli.h:650
#define QVA_ISSET(_qvaflags, _FLAG)
Definition: query.c:54
#define VSF_CLR(_vsflags, _FLAG)
Definition: query.c:58
int rpmioFtsOpts
Definition: poptIO.c:526
int rpmdbCheckSignals(void)
Check for and exit on termination signals.
Definition: rpmdb.c:523
char * rpmExpand(const char *arg,...)
Return (malloc&#39;ed) concatenated macro expansion(s).
Definition: macro.c:3178
rpmuint32_t rpmfiFMtime(rpmfi fi)
Return current file modify time from file info set.
Definition: rpmfi.c:447
rpmfileAttrs qva_fflags
Definition: rpmcli.h:634
static unsigned
Definition: rpmmtree.c:386
rpmRC rpmrc
Definition: rpmts-py.c:924
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
Definition: rpmts.h:35
int j
Definition: spec.c:743
#define FF_ISSET(_fflags, _FLAG)
Definition: query.c:52
enum rpmfileAttrs_e rpmfileAttrs
File Attributes.
int rpmfiNext(rpmfi fi)
Return next file iterator index.
Definition: rpmfi.c:526
int rpmcliQuery(rpmts ts, QVA_t qva, const char **argv)
Display package information.
Definition: query.c:956
#define RPMDBI_HDLIST
Definition: rpmtag.h:483
static const char *char c
Return text between pl and matching pr characters.
Definition: macro.c:470
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
Definition: rpmts.c:843
#define VSF_SET(_vsflags, _FLAG)
Definition: query.c:57
#define RPMDBI_ARGLIST
Definition: rpmtag.h:484
#define L(CS)
Definition: fnmatch.c:161
rpmfi rpmfiInit(rpmfi fi, int fx)
Initialize file iterator index.
Definition: rpmfi.c:548
enum rpmfileState_e rpmfileState
File States (when installed).
const char * s
Definition: poptALL.c:734
char * t
Definition: rpmds.c:2716
static const char * prefix[]
Tables for prefixing and suffixing patterns, according to the -w, -x, and -F options.
Definition: rpmgrep.c:183
static PyObject *rpmtransFlags transFlags
Definition: rpmts-py.c:785
static int rpmcliShowMatches(QVA_t qva, rpmts ts)
Display query/verify information for each header in iterator.
Definition: query.c:472
const char * rpmfiFLink(rpmfi fi)
Return current file linkto (i.e.
Definition: rpmfi.c:317
enum rpmtransFlags_e rpmtransFlags
Bit(s) to control rpmtsRun() operation.
char * path
Definition: poptALL.c:744
char * stpcpy(char *dest, const char *src)
te
Definition: macro.c:552
Structures and prototypes used for an &quot;rpmts&quot; transaction set.
rpmfileState rpmfiFState(rpmfi fi)
Return current file state from file info set.
Definition: rpmfi.c:276
#define JBJDEBUG(_list)
Definition: query.c:34
const unsigned char * rpmfiDigest(rpmfi fi, int *algop, size_t *lenp)
Return current file (binary) digest from file info set.
Definition: rpmfi.c:300
#define FTS_LOGICAL
Definition: fts.h:88
#define rpmIsVerbose()
Definition: rpmcb.h:21
return NULL
Definition: poptALL.c:613
rpmRC rpmgiNext(rpmgi gi)
Perform next iteration step.
Definition: rpmgi.c:584
static void
Print copy of spec file, filling in Group/Description/Summary from specspo.
Definition: spec.c:737
k
Definition: rpmmtree.c:394
static const char * name
#define _(Text)
Definition: system.h:29
const char * rpmgiHdrPath(rpmgi gi)
Return current header path.
Definition: rpmgi.c:842
struct rpmfi_s * rpmfi
File info tag sets from a header, so that a header can be discarded early.
Definition: rpmfi.h:83
#define xmalloc
Definition: system.h:32
ARGstr_t * ARGV_t
Definition: argv.h:12
Access RPM indices using Berkeley DB interface(s).
#define D_(Text)
Definition: system.h:526
#define PATH_MAX
Definition: query.c:10
rpmVSFlags vsflags
Definition: rpmrepo.c:161
rpmmi rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)
Return transaction database iterator.
Definition: rpmts.c:212
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
Definition: rpmiotypes.h:647
int i
Definition: spec.c:743
strncpy(sbuf, f, flen)
#define FTS_NOSTAT
Definition: fts.h:90
enum rpmdepFlags_e rpmdepFlags
Bit(s) to control rpmtsCheck() and rpmtsOrder() operation.
char * Realpath(const char *path, char *resolved_path)
realpath(3) clone.
Definition: rpmrpc.c:2330
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
Definition: macro.c:3252
struct rpmgi_s * rpmgi
Generalized iterator.
Definition: rpmtypes.h:53
int rpmQueryVerify(QVA_t qva, rpmts ts, const char *arg)
Common query/verify source interface, called once for each CLI arg.
Definition: query.c:512
#define RPMDBI_PACKAGES
Pseudo-tags used by the rpmdb and rpmgi iterator API&#39;s.
Definition: rpmtag.h:477
#define xrealloc
Definition: system.h:35
size_t fn
Definition: macro.c:1698
const unsigned char * digest
Definition: rpmfi-py.c:247