Stub out rpmgiWalkPathFilter, prior to teaching rpmcache about rpmgi.
[platform/upstream/rpm.git] / lib / poptQV.c
1 /** \ingroup rpmcli
2  * \file lib/poptQV.c
3  *  Popt tables for query/verify modes.
4  */
5
6 #include "system.h"
7
8 #include <rpmcli.h>
9 #include <rpmbuild.h>
10
11 #include "debug.h"
12
13 /*@unchecked@*/
14 struct rpmQVKArguments_s rpmQVKArgs;
15
16 /*@unchecked@*/
17 int specedit = 0;
18
19 #define POPT_QUERYFORMAT        -1000
20 #define POPT_WHATREQUIRES       -1001
21 #define POPT_WHATPROVIDES       -1002
22 #define POPT_QUERYBYNUMBER      -1003
23 #define POPT_TRIGGEREDBY        -1004
24 #define POPT_DUMP               -1005
25 #define POPT_SPECFILE           -1006
26 #define POPT_QUERYBYPKGID       -1007
27 #define POPT_QUERYBYHDRID       -1008
28 #define POPT_QUERYBYFILEID      -1009
29 #define POPT_QUERYBYTID         -1010
30 #define POPT_HDLIST             -1011
31 #define POPT_FTSWALK            -1012
32
33 /* ========== Query/Verify/Signature source args */
34 static void rpmQVSourceArgCallback( /*@unused@*/ poptContext con,
35                 /*@unused@*/ enum poptCallbackReason reason,
36                 const struct poptOption * opt, /*@unused@*/ const char * arg, 
37                 /*@unused@*/ const void * data)
38         /*@globals rpmQVKArgs @*/
39         /*@modifies rpmQVKArgs @*/
40 {
41     QVA_t qva = &rpmQVKArgs;
42
43     switch (opt->val) {
44     case 'q':   /* from --query, -q */
45     case 'Q':   /* from --querytags (handled by poptALL) */
46     case 'V':   /* from --verify, -V */
47     case 'A':   /* from --addsign */
48     case 'I':   /* from --import */
49     case 'K':   /* from --checksig, -K */
50     case 'R':   /* from --resign */
51         if (qva->qva_mode == '\0' || strchr("qQ ", qva->qva_mode)) {
52             qva->qva_mode = opt->val;
53             qva->qva_char = ' ';
54         }
55         break;
56     case 'a': qva->qva_source |= RPMQV_ALL; qva->qva_sourceCount++; break;
57     case 'f': qva->qva_source |= RPMQV_PATH; qva->qva_sourceCount++; break;
58     case 'g': qva->qva_source |= RPMQV_GROUP; qva->qva_sourceCount++; break;
59     case 'p': qva->qva_source |= RPMQV_RPM; qva->qva_sourceCount++; break;
60     case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES; 
61                                 qva->qva_sourceCount++; break;
62     case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES; 
63                                 qva->qva_sourceCount++; break;
64     case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY;
65                                 qva->qva_sourceCount++; break;
66     case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID;
67                                 qva->qva_sourceCount++; break;
68     case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID;
69                                 qva->qva_sourceCount++; break;
70     case POPT_QUERYBYFILEID: qva->qva_source |= RPMQV_FILEID;
71                                 qva->qva_sourceCount++; break;
72     case POPT_QUERYBYTID: qva->qva_source |= RPMQV_TID;
73                                 qva->qva_sourceCount++; break;
74     case POPT_HDLIST: qva->qva_source |= RPMQV_HDLIST;
75                                 qva->qva_sourceCount++; break;
76     case POPT_FTSWALK:qva->qva_source |= RPMQV_FTSWALK;
77                                 qva->qva_sourceCount++; break;
78
79 /* XXX SPECFILE is not verify sources */
80     case POPT_SPECFILE:
81         qva->qva_source |= RPMQV_SPECFILE;
82         qva->qva_sourceCount++;
83         break;
84     case POPT_QUERYBYNUMBER:
85         qva->qva_source |= RPMQV_DBOFFSET; 
86         qva->qva_sourceCount++;
87         break;
88     }
89 }
90
91 /**
92  * Common query/verify mode options.
93  */
94 /*@unchecked@*/
95 struct poptOption rpmQVSourcePoptTable[] = {
96 /*@-type@*/ /* FIX: cast? */
97  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
98         rpmQVSourceArgCallback, 0, NULL, NULL },
99 /*@=type@*/
100  { "all", 'a', 0, 0, 'a',
101         N_("query/verify all packages"), NULL },
102  { "checksig", 'K', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'K',
103         N_("rpm checksig mode"), NULL },
104  { "file", 'f', 0, 0, 'f',
105         N_("query/verify package(s) owning file"), "FILE" },
106  { "fileid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYFILEID,
107         N_("query/verify package(s) with file identifier"), "MD5" },
108  { "ftswalk", 'W', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_FTSWALK,
109         N_("query/verify package(s) from TOP file tree walk"), "TOP" },
110  { "group", 'g', 0, 0, 'g',
111         N_("query/verify package(s) in group"), "GROUP" },
112  { "hdlist", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_HDLIST,
113         N_("query/verify package(s) from system hdlist"), "TOP" },
114  { "hdrid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYHDRID,
115         N_("query/verify package(s) with header identifier"), "SHA1" },
116  { "package", 'p', 0, 0, 'p',
117         N_("query/verify a package file"), NULL },
118  { "pkgid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYPKGID,
119         N_("query/verify package(s) with package identifier"), "MD5" },
120  { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
121         N_("rpm query mode"), NULL },
122  { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYNUMBER,
123         N_("query/verify a header instance"), "HDRNUM" },
124  { "specfile", '\0', 0, 0, POPT_SPECFILE,
125         N_("query a spec file"), N_("<spec>") },
126  { "tid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYTID,
127         N_("query/verify package(s) from install transaction"), "TID" },
128  { "triggeredby", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_TRIGGEREDBY, 
129         N_("query the package(s) triggered by the package"), "PACKAGE" },
130  { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
131         N_("rpm verify mode"), NULL },
132  { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES, 
133         N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
134  { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES, 
135         N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
136    POPT_TABLEEND
137 };
138
139 /* ========== Query specific popt args */
140
141 static void queryArgCallback(poptContext con,
142                 /*@unused@*/enum poptCallbackReason reason,
143                 const struct poptOption * opt, const char * arg, 
144                 /*@unused@*/ const void * data)
145         /*@globals rpmQVKArgs @*/
146         /*@modifies con, rpmQVKArgs @*/
147 {
148     QVA_t qva = &rpmQVKArgs;
149
150     switch (opt->val) {
151     case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
152     case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
153     case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
154     case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
155         break;
156     case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST;
157         break;
158
159     case POPT_QUERYFORMAT:
160         if (arg) {
161             char * qf = (char *)qva->qva_queryFormat;
162             /*@-branchstate@*/
163             if (qf) {
164                 int len = strlen(qf) + strlen(arg) + 1;
165                 qf = xrealloc(qf, len);
166 /*@-boundswrite@*/
167                 strcat(qf, arg);
168 /*@=boundswrite@*/
169             } else {
170                 qf = xmalloc(strlen(arg) + 1);
171                 strcpy(qf, arg);
172             }
173             /*@=branchstate@*/
174             qva->qva_queryFormat = qf;
175         }
176         break;
177
178     case 'i':
179         if (qva->qva_mode == 'q') {
180             /*@-nullassign -readonlytrans@*/
181             const char * infoCommand[] = { "--info", NULL };
182             /*@=nullassign =readonlytrans@*/
183             (void) poptStuffArgs(con, infoCommand);
184         }
185         break;
186
187     case RPMCLI_POPT_NODIGEST:
188         qva->qva_flags |= VERIFY_DIGEST;
189         break;
190
191     case RPMCLI_POPT_NOSIGNATURE:
192         qva->qva_flags |= VERIFY_SIGNATURE;
193         break;
194
195     case RPMCLI_POPT_NOHDRCHK:
196         qva->qva_flags |= VERIFY_HDRCHK;
197         break;
198
199     case RPMCLI_POPT_NODEPS:
200         qva->qva_flags |= VERIFY_DEPS;
201         break;
202
203     case RPMCLI_POPT_NOMD5:
204         qva->qva_flags |= VERIFY_MD5;
205         break;
206
207     case RPMCLI_POPT_NOCONTEXTS:
208         qva->qva_flags |= VERIFY_CONTEXTS;
209         break;
210
211 #ifdef  NOTYET
212     case RPMCLI_POPT_FORCE:
213         ia->probFilter |=
214                 ( RPMPROB_FILTER_REPLACEPKG
215                 | RPMPROB_FILTER_REPLACEOLDFILES
216                 | RPMPROB_FILTER_REPLACENEWFILES
217                 | RPMPROB_FILTER_OLDPACKAGE );
218         break;
219 #endif
220
221     case RPMCLI_POPT_NOSCRIPTS:
222         qva->qva_flags |= VERIFY_SCRIPT;
223         break;
224
225     }
226 }
227
228 /**
229  * Query mode options.
230  */
231 /*@unchecked@*/
232 struct poptOption rpmQueryPoptTable[] = {
233 /*@-type@*/ /* FIX: cast? */
234  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
235         queryArgCallback, 0, NULL, NULL },
236 /*@=type@*/
237  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
238         NULL, NULL },
239  { "configfiles", 'c', 0, 0, 'c',
240         N_("list all configuration files"), NULL },
241  { "docfiles", 'd', 0, 0, 'd',
242         N_("list all documentation files"), NULL },
243  { "dump", '\0', 0, 0, POPT_DUMP,
244         N_("dump basic file information"), NULL },
245  { NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',
246         NULL, NULL },
247  { "list", 'l', 0, 0, 'l',
248         N_("list files in package"), NULL },
249
250  /* Duplicate file attr flags from packages into command line options. */
251  { "noghost", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN,
252         &rpmQVKArgs.qva_fflags, RPMFILE_GHOST,
253         N_("skip %%ghost files"), NULL },
254 #ifdef  NOTEVER         /* XXX there's hardly a need for these */
255  { "nolicense", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
256         &rpmQVKArgs.qva_fflags, RPMFILE_LICENSE,
257         N_("skip %%license files"), NULL },
258  { "noreadme", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
259         &rpmQVKArgs.qva_fflags, RPMFILE_README,
260         N_("skip %%readme files"), NULL },
261 #endif
262
263  { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0, 
264         POPT_QUERYFORMAT, NULL, NULL },
265  { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
266         N_("use the following query format"), "QUERYFORMAT" },
267  { "specedit", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &specedit, -1,
268         N_("substitute i18n sections into spec file"), NULL },
269  { "state", 's', 0, 0, 's',
270         N_("display the states of the listed files"), NULL },
271    POPT_TABLEEND
272 };
273
274 /**
275  * Verify mode options.
276  */
277 struct poptOption rpmVerifyPoptTable[] = {
278 /*@-type@*/ /* FIX: cast? */
279  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
280         queryArgCallback, 0, NULL, NULL },
281 /*@=type@*/
282  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
283         NULL, NULL },
284
285  /* Duplicate file verify flags from packages into command line options. */
286 /** @todo Add --nomd5 alias to rpmpopt, eliminate. */
287 #ifdef  DYING
288  { "nomd5", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_MD5,
289         N_("don't verify MD5 digest of files"), NULL },
290 #else
291  { "nomd5", '\0', 0, NULL, RPMCLI_POPT_NOMD5,
292         N_("don't verify MD5 digest of files"), NULL },
293 #endif
294  { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
295         &rpmQVKArgs.qva_flags, VERIFY_SIZE,
296         N_("don't verify size of files"), NULL },
297  { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
298         &rpmQVKArgs.qva_flags, VERIFY_LINKTO,
299         N_("don't verify symlink path of files"), NULL },
300  { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
301         &rpmQVKArgs.qva_flags, VERIFY_USER,
302         N_("don't verify owner of files"), NULL },
303  { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
304         &rpmQVKArgs.qva_flags, VERIFY_GROUP,
305         N_("don't verify group of files"), NULL },
306  { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
307         &rpmQVKArgs.qva_flags, VERIFY_MTIME,
308         N_("don't verify modification time of files"), NULL },
309  { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
310         &rpmQVKArgs.qva_flags, VERIFY_MODE,
311         N_("don't verify mode of files"), NULL },
312  { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
313         &rpmQVKArgs.qva_flags, VERIFY_RDEV,
314         N_("don't verify mode of files"), NULL },
315
316  { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
317         N_("don't verify file security contexts"), NULL },
318  { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
319         N_("don't verify files in package"), NULL},
320 #ifdef  DYING
321  { "nodeps", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DEPS,
322         N_("don't verify package dependencies"), NULL },
323 #else
324  { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
325         N_("don't verify package dependencies"), NULL },
326 #endif
327
328 #ifdef  DYING
329  { "noscript", '\0', POPT_BIT_SET,&rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
330         N_("don't execute verify script(s)"), NULL },
331  /* XXX legacy had a trailing s on --noscript */
332  { "noscripts", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
333         &rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
334         N_("don't execute verify script(s)"), NULL },
335 #else
336  { "noscript", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
337         N_("don't execute verify script(s)"), NULL },
338  /* XXX legacy had a trailing s on --noscript */
339  { "noscripts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOSCRIPTS,
340         N_("don't execute verify script(s)"), NULL },
341 #endif
342
343 #ifdef  DYING
344  { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
345         N_("don't verify package digest(s)"), NULL },
346  { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
347         &rpmQVKArgs.qva_flags, VERIFY_HDRCHK,
348         N_("don't verify database header(s) when retrieved"), NULL },
349  { "nosignature", '\0', POPT_BIT_SET,
350         &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
351         N_("don't verify package signature(s)"), NULL },
352 #else
353  { "nodigest", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NODIGEST,
354         N_("don't verify package digest(s)"), NULL },
355  { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOHDRCHK,
356         N_("don't verify database header(s) when retrieved"), NULL },
357  { "nosignature", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOSIGNATURE,
358         N_("don't verify package signature(s)"), NULL },
359 #endif
360
361 /** @todo Add --nogpg/--nopgp aliases to rpmpopt, eliminate. */
362  { "nogpg", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
363         &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
364         N_("don't verify GPG V3 DSA signature(s)"), NULL },
365  { "nopgp", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
366         &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
367         N_("don't verify PGP V3 RSA/MD5 signature(s)"), NULL },
368
369     POPT_TABLEEND
370 };
371
372 /**
373  * Signature mode options.
374  */
375 /*@unchecked@*/
376 struct poptOption rpmSignPoptTable[] = {
377 /*@-type@*/ /* FIX: cast? */
378  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
379         rpmQVSourceArgCallback, 0, NULL, NULL },
380 /*@=type@*/
381  { "addsign", '\0', 0, NULL, 'A',
382         N_("sign package(s) (identical to --resign)"), NULL },
383  { "checksig", 'K', 0, NULL, 'K',
384         N_("verify package signature(s)"), NULL },
385  { "import", '\0', 0, NULL, 'I',
386         N_("import an armored public key"), NULL },
387  { "resign", '\0', 0, NULL, 'R',
388         N_("sign package(s) (identical to --addsign)"), NULL },
389  { "sign", '\0', POPT_ARGFLAG_DOC_HIDDEN, &rpmQVKArgs.sign, 0,
390         N_("generate signature"), NULL },
391
392  { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
393         N_("don't verify package digest(s)"), NULL },
394  { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
395         &rpmQVKArgs.qva_flags, VERIFY_HDRCHK,
396         N_("don't verify database header(s) when retrieved"), NULL },
397  { "nosignature", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
398         N_("don't verify package signature(s)"), NULL },
399
400    POPT_TABLEEND
401 };