rpm  4.5
poptQV.c
Go to the documentation of this file.
1 
6 #include "system.h"
7 
8 #include <rpmcli.h>
9 #include <rpmbuild.h>
10 #include <rpmgi.h> /* XXX for giFlags */
11 
12 #include "debug.h"
13 
14 /*@unchecked@*/
16 
17 /*@unchecked@*/
18 int specedit = 0;
19 
20 #define POPT_QUERYFORMAT -1000
21 #define POPT_WHATREQUIRES -1001
22 #define POPT_WHATPROVIDES -1002
23 #define POPT_QUERYBYNUMBER -1003
24 #define POPT_TRIGGEREDBY -1004
25 #define POPT_DUMP -1005
26 #define POPT_SPECFILE -1006
27 #define POPT_QUERYBYPKGID -1007
28 #define POPT_QUERYBYHDRID -1008
29 #define POPT_QUERYBYFILEID -1009
30 #define POPT_QUERYBYTID -1010
31 #define POPT_HDLIST -1011
32 #define POPT_FTSWALK -1012
33 
34 /* -1025 thrugh -1033 are common in rpmcli.h. */
35 #define POPT_TRUST -1037
36 #define POPT_WHATNEEDS -1038
37 #define POPT_SPECSRPM -1039
38 
39 /* ========== Query/Verify/Signature source args */
40 static void rpmQVSourceArgCallback( /*@unused@*/ poptContext con,
41  /*@unused@*/ enum poptCallbackReason reason,
42  const struct poptOption * opt, /*@unused@*/ const char * arg,
43  /*@unused@*/ const void * data)
44  /*@globals rpmQVKArgs @*/
45  /*@modifies rpmQVKArgs @*/
46 {
47  QVA_t qva = &rpmQVKArgs;
48 
49  switch (opt->val) {
50  case 'q': /* from --query, -q */
51  case 'Q': /* from --querytags (handled by poptALL) */
52  case 'V': /* from --verify, -V */
53  case 'A': /* from --addsign */
54  case 'D': /* from --delsign */
55  case 'I': /* from --import */
56  case 'K': /* from --checksig, -K */
57  case 'R': /* from --resign */
58  if (qva->qva_mode == '\0' || strchr("qQ ", qva->qva_mode)) {
59  qva->qva_mode = opt->val;
60  qva->qva_char = ' ';
61  }
62  break;
63  case 'a': qva->qva_source |= RPMQV_ALL; qva->qva_sourceCount++; break;
64  case 'f': qva->qva_source |= RPMQV_PATH; qva->qva_sourceCount++; break;
65  case 'g': qva->qva_source |= RPMQV_GROUP; qva->qva_sourceCount++; break;
66  case 'p': qva->qva_source |= RPMQV_RPM; qva->qva_sourceCount++; break;
68  qva->qva_sourceCount++; break;
70  qva->qva_sourceCount++; break;
72  qva->qva_sourceCount++; break;
74  qva->qva_sourceCount++; break;
76  qva->qva_sourceCount++; break;
78  qva->qva_sourceCount++; break;
80  qva->qva_sourceCount++; break;
81  case POPT_QUERYBYTID: qva->qva_source |= RPMQV_TID;
82  qva->qva_sourceCount++; break;
83  case POPT_HDLIST: qva->qva_source |= RPMQV_HDLIST;
84  qva->qva_sourceCount++; break;
86  qva->qva_sourceCount++; break;
87 
88 /* XXX SPECFILE is not verify sources */
89  case POPT_SPECFILE:
90  qva->qva_source |= RPMQV_SPECFILE;
91  qva->qva_sourceCount++;
92  break;
93 /* XXX SPECSRPM is not verify sources */
94  case POPT_SPECSRPM:
95  qva->qva_source |= RPMQV_SPECSRPM;
96  qva->qva_sourceCount++;
97  break;
98  case POPT_QUERYBYNUMBER:
99  qva->qva_source |= RPMQV_DBOFFSET;
100  qva->qva_sourceCount++;
101  break;
102  }
103 }
104 
108 /*@unchecked@*/
109 struct poptOption rpmQVSourcePoptTable[] = {
110 /*@-type@*/ /* FIX: cast? */
111  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
112  rpmQVSourceArgCallback, 0, NULL, NULL },
113 /*@=type@*/
114  { "all", 'a', 0, 0, 'a',
115  N_("query/verify all packages"), NULL },
116  { "checksig", 'K', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'K',
117  N_("rpm checksig mode"), NULL },
118  { "file", 'f', 0, 0, 'f',
119  N_("query/verify package(s) owning file"), "FILE" },
120  { "group", 'g', 0, 0, 'g',
121  N_("query/verify package(s) in group"), "GROUP" },
122  { "package", 'p', 0, 0, 'p',
123  N_("query/verify a package file"), NULL },
124 
125  { "ftswalk", 'W', 0, 0, POPT_FTSWALK,
126  N_("query/verify package(s) from TOP file tree walk"), "TOP" },
127  { "hdlist", 'H', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_HDLIST,
128  N_("query/verify package(s) from system HDLIST"), "HDLIST" },
129 
130  { "pkgid", '\0', 0, 0, POPT_QUERYBYPKGID,
131  N_("query/verify package(s) with package identifier"), "MD5" },
132  { "hdrid", '\0', 0, 0, POPT_QUERYBYHDRID,
133  N_("query/verify package(s) with header identifier"), "SHA1" },
134  { "fileid", '\0', 0, 0, POPT_QUERYBYFILEID,
135  N_("query/verify package(s) with file identifier"), "MD5" },
136 
137  { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
138  N_("rpm query mode"), NULL },
139  { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYNUMBER,
140  N_("query/verify a header instance"), "HDRNUM" },
141  { "specfile", '\0', 0, 0, POPT_SPECFILE,
142  N_("query a spec file"), N_("<spec>") },
143  { "specsrpm", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_SPECSRPM,
144  N_("query source metadata from spec file parse"), N_("<spec>") },
145  { "tid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYTID,
146  N_("query/verify package(s) from install transaction"), "TID" },
147  { "triggeredby", '\0', 0, 0, POPT_TRIGGEREDBY,
148  N_("query the package(s) triggered by the package"), "PACKAGE" },
149  { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
150  N_("rpm verify mode"), NULL },
151  { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES,
152  N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
153  { "whatneeds", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_WHATNEEDS,
154  N_("query/verify the package(s) which require any contained provide"),
155  "CAPABILITY" },
156 
157  { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES,
158  N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
159 
160  { "transaction", 'T', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, (RPMGI_TSADD|RPMGI_TSORDER),
161  N_("create transaction set"), NULL},
162  { "noorder", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_TSORDER,
163  N_("do not order transaction set"), NULL},
164  { "noglob", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOGLOB,
165  N_("do not glob arguments"), NULL},
166  { "nomanifest", '\0', POPT_BIT_SET, &giFlags, RPMGI_NOMANIFEST,
167  N_("do not process non-package files as manifests"), NULL},
168  { "noheader", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOHEADER,
169  N_("do not read headers"), NULL},
170 
171 
172  POPT_TABLEEND
173 };
174 
175 /* ========== Query specific popt args */
176 
177 static void queryArgCallback(poptContext con,
178  /*@unused@*/enum poptCallbackReason reason,
179  const struct poptOption * opt, const char * arg,
180  /*@unused@*/ const void * data)
181  /*@globals rpmQVKArgs @*/
182  /*@modifies con, rpmQVKArgs @*/
183 {
184  QVA_t qva = &rpmQVKArgs;
185 
186  switch (opt->val) {
187  case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
188  case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
189  case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
190  case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
191  break;
193  break;
194 
195  case POPT_QUERYFORMAT:
196  if (arg) {
197  char * qf = (char *)qva->qva_queryFormat;
198  /*@-branchstate@*/
199  if (qf) {
200  int len = strlen(qf) + strlen(arg) + 1;
201  qf = xrealloc(qf, len);
202 /*@-boundswrite@*/
203  strcat(qf, arg);
204 /*@=boundswrite@*/
205  } else {
206  qf = xmalloc(strlen(arg) + 1);
207  strcpy(qf, arg);
208  }
209  /*@=branchstate@*/
210  qva->qva_queryFormat = qf;
211  }
212  break;
213 
214  case 'i':
215  if (qva->qva_mode == 'q') {
216  /*@-nullassign -readonlytrans@*/
217  const char * infoCommand[] = { "--info", NULL };
218  /*@=nullassign =readonlytrans@*/
219  (void) poptStuffArgs(con, infoCommand);
220  }
221  break;
222 
224  qva->qva_flags |= VERIFY_DIGEST;
225  break;
226 
228  qva->qva_flags |= VERIFY_SIGNATURE;
229  break;
230 
232  qva->qva_flags |= VERIFY_HDRCHK;
233  break;
234 
235  case RPMCLI_POPT_NODEPS:
236  qva->qva_flags |= VERIFY_DEPS;
237  break;
238 
240  qva->qva_flags |= VERIFY_FDIGEST;
241  break;
242 
244  qva->qva_flags |= VERIFY_CONTEXTS;
245  break;
246 
247 #ifdef NOTYET
248  case RPMCLI_POPT_FORCE:
249  ia->probFilter |=
254  break;
255 #endif
256 
258  qva->qva_flags |= VERIFY_SCRIPT;
259  break;
260 
261  /* XXX perhaps POPT_ARG_INT instead of callback. */
262  case POPT_TRUST:
263  { char * end = NULL;
264  long trust = (int) strtol(arg, &end, 0);
265  /* XXX range checks on trust. */
266  /* XXX if (end && *end) argerror(_("non-numeric trust metric.")); */
267  qva->trust = trust;
268  } break;
269  }
270 }
271 
275 /*@unchecked@*/
276 struct poptOption rpmQueryPoptTable[] = {
277 /*@-type@*/ /* FIX: cast? */
278  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
279  queryArgCallback, 0, NULL, NULL },
280 /*@=type@*/
281  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
282  NULL, NULL },
283  { "configfiles", 'c', 0, 0, 'c',
284  N_("list all configuration files"), NULL },
285  { "docfiles", 'd', 0, 0, 'd',
286  N_("list all documentation files"), NULL },
287  { "dump", '\0', 0, 0, POPT_DUMP,
288  N_("dump basic file information"), NULL },
289  { NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',
290  NULL, NULL },
291  { "list", 'l', 0, 0, 'l',
292  N_("list files in package"), NULL },
293 
294  { "aid", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
296  N_("add suggested packages to transaction"), NULL },
297 
298  /* Duplicate file attr flags from packages into command line options. */
299  { "noconfig", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
301  N_("skip %%config files"), NULL },
302  { "nodoc", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
304  N_("skip %%doc files"), NULL },
305  { "noghost", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
307  N_("skip %%ghost files"), NULL },
308 #ifdef NOTEVER /* XXX there's hardly a need for these */
309  { "nolicense", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
311  N_("skip %%license files"), NULL },
312  { "noreadme", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
314  N_("skip %%readme files"), NULL },
315 #endif
316 
317  { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0,
318  POPT_QUERYFORMAT, NULL, NULL },
319  { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
320  N_("use the following query format"), N_("QUERYFORMAT") },
321  { "specedit", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &specedit, -1,
322  N_("substitute i18n sections into spec file"), NULL },
323  { "state", 's', 0, 0, 's',
324  N_("display the states of the listed files"), NULL },
325  { "target", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_TARGETPLATFORM,
326  N_("specify target platform"), N_("CPU-VENDOR-OS") },
327  POPT_TABLEEND
328 };
329 
333 struct poptOption rpmVerifyPoptTable[] = {
334 /*@-type@*/ /* FIX: cast? */
335  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
336  queryArgCallback, 0, NULL, NULL },
337 /*@=type@*/
338  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
339  NULL, NULL },
340 
341  { "aid", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
343  N_("add suggested packages to transaction"), NULL },
344 
345  /* Duplicate file attr flags from packages into command line options. */
346  { "noconfig", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
348  N_("skip %%config files"), NULL },
349  { "nodoc", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
351  N_("skip %%doc files"), NULL },
352 
353  /* Duplicate file verify flags from packages into command line options. */
355 #ifdef DYING
356  { "nomd5", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FDIGEST,
357  N_("don't verify file digests"), NULL },
358 #else
359  { "nomd5", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOFDIGESTS,
360  N_("don't verify file digests"), NULL },
361  { "nofdigests", '\0', 0, NULL, RPMCLI_POPT_NOFDIGESTS,
362  N_("don't verify file digests"), NULL },
363 #endif
364  { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
366  N_("don't verify size of files"), NULL },
367  { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
369  N_("don't verify symlink path of files"), NULL },
370  { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
372  N_("don't verify owner of files"), NULL },
373  { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
375  N_("don't verify group of files"), NULL },
376  { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
378  N_("don't verify modification time of files"), NULL },
379  { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
381  N_("don't verify mode of files"), NULL },
382  { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
384  N_("don't verify mode of files"), NULL },
385 
386  { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
387  N_("don't verify file security contexts"), NULL },
388  { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
389  N_("don't verify files in package"), NULL},
390 #ifdef DYING
391  { "nodeps", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DEPS,
392  N_("don't verify package dependencies"), NULL },
393 #else
394  { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
395  N_("don't verify package dependencies"), NULL },
396 #endif
397 
398 #ifdef DYING
399  { "noscript", '\0', POPT_BIT_SET,&rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
400  N_("don't execute verify script(s)"), NULL },
401  /* XXX legacy had a trailing s on --noscript */
402  { "noscripts", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
404  N_("don't execute verify script(s)"), NULL },
405 #else
406  { "noscript", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
407  N_("don't execute verify script(s)"), NULL },
408  /* XXX legacy had a trailing s on --noscript */
409  { "noscripts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOSCRIPTS,
410  N_("don't execute verify script(s)"), NULL },
411 #endif
412 
413 #ifdef DYING
414  { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
415  N_("don't verify package digest(s)"), NULL },
416  { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
418  N_("don't verify database header(s) when retrieved"), NULL },
419  { "nosignature", '\0', POPT_BIT_SET,
421  N_("don't verify package signature(s)"), NULL },
422 #else
423  { "nodigest", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NODIGEST,
424  N_("don't verify package digest(s)"), NULL },
425  { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOHDRCHK,
426  N_("don't verify database header(s) when retrieved"), NULL },
427  { "nosignature", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOSIGNATURE,
428  N_("don't verify package signature(s)"), NULL },
429 #endif
430 
431  POPT_TABLEEND
432 };
433 
437 /*@unchecked@*/
438 struct poptOption rpmSignPoptTable[] = {
439 /*@-type@*/ /* FIX: cast? */
440  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
441  rpmQVSourceArgCallback, 0, NULL, NULL },
442 /*@=type@*/
443  { "addsign", '\0', 0, NULL, 'A',
444  N_("sign package(s) (identical to --resign)"), NULL },
445  { "checksig", 'K', 0, NULL, 'K',
446  N_("verify package signature(s)"), NULL },
447  { "delsign", '\0', 0, NULL, 'D',
448  N_("delete package signatures"), NULL },
449  { "import", '\0', 0, NULL, 'I',
450  N_("import an armored public key"), NULL },
451  { "resign", '\0', 0, NULL, 'R',
452  N_("sign package(s) (identical to --addsign)"), NULL },
453  { "sign", '\0', POPT_ARGFLAG_DOC_HIDDEN, &rpmQVKArgs.sign, 0,
454  N_("generate signature"), NULL },
455  /* XXX perhaps POPT_ARG_INT instead of callback. */
456  { "trust", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_TRUST,
457  N_("specify trust metric"), "TRUST" },
458  { "trusted", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN,
459  &rpmQVKArgs.trust, 1,
460  N_("set ultimate trust when importing pubkey(s)"), NULL },
461  { "untrusted", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN,
462  &rpmQVKArgs.trust, -1,
463  N_("unset ultimate trust when importing pubkey(s)"), NULL },
464 
465  { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
466  N_("don't verify package digest(s)"), NULL },
467  { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
469  N_("don't verify database header(s) when retrieved"), NULL },
470  { "nosignature", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
471  N_("don't verify package signature(s)"), NULL },
472 
473  POPT_TABLEEND
474 };