Sanity.
[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
31 /* ========== Query/Verify/Signature source args */
32 static void rpmQVSourceArgCallback( /*@unused@*/ poptContext con,
33                 /*@unused@*/ enum poptCallbackReason reason,
34                 const struct poptOption * opt, /*@unused@*/ const char * arg, 
35                 /*@unused@*/ const void * data)
36         /*@globals rpmQVKArgs @*/
37         /*@modifies rpmQVKArgs @*/
38 {
39     QVA_t qva = &rpmQVKArgs;
40
41     switch (opt->val) {
42     case 'q':   /* from --query, -q */
43     case 'Q':   /* from --querytags */
44     case 'V':   /* from --verify, -V */
45     case 'A':   /* from --addsign */
46     case 'I':   /* from --import */
47     case 'K':   /* from --checksig, -K */
48     case 'R':   /* from --resign */
49         if (qva->qva_mode == ' ') {
50             qva->qva_mode = opt->val;
51             qva->qva_char = ' ';
52         }
53         break;
54     case 'a': qva->qva_source |= RPMQV_ALL; qva->qva_sourceCount++; break;
55     case 'f': qva->qva_source |= RPMQV_PATH; qva->qva_sourceCount++; break;
56     case 'g': qva->qva_source |= RPMQV_GROUP; qva->qva_sourceCount++; break;
57     case 'p': qva->qva_source |= RPMQV_RPM; qva->qva_sourceCount++; break;
58     case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES; 
59                                 qva->qva_sourceCount++; break;
60     case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES; 
61                                 qva->qva_sourceCount++; break;
62     case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY;
63                                 qva->qva_sourceCount++; break;
64     case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID;
65                                 qva->qva_sourceCount++; break;
66     case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID;
67                                 qva->qva_sourceCount++; break;
68     case POPT_QUERYBYFILEID: qva->qva_source |= RPMQV_FILEID;
69                                 qva->qva_sourceCount++; break;
70     case POPT_QUERYBYTID: qva->qva_source |= RPMQV_TID;
71                                 qva->qva_sourceCount++; break;
72
73 /* XXX SPECFILE is not verify sources */
74     case POPT_SPECFILE:
75         qva->qva_source |= RPMQV_SPECFILE;
76         qva->qva_sourceCount++;
77         break;
78     case POPT_QUERYBYNUMBER:
79         qva->qva_source |= RPMQV_DBOFFSET; 
80         qva->qva_sourceCount++;
81         break;
82     }
83 }
84
85 /**
86  * Common query/verify mode options.
87  */
88 /*@unchecked@*/
89 struct poptOption rpmQVSourcePoptTable[] = {
90 /*@-type@*/ /* FIX: cast? */
91  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
92         rpmQVSourceArgCallback, 0, NULL, NULL },
93 /*@=type@*/
94  { "all", 'a', 0, 0, 'a',
95         N_("query/verify all packages"), NULL },
96  { "checksig", 'K', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'K',
97         N_("rpm checksig mode"), NULL },
98  { "file", 'f', 0, 0, 'f',
99         N_("query/verify package(s) owning file"), "FILE" },
100  { "fileid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYFILEID,
101         N_("query/verify package(s) with file identifier"), "MD5" },
102  { "group", 'g', 0, 0, 'g',
103         N_("query/verify package(s) in group"), "GROUP" },
104  { "hdrid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYHDRID,
105         N_("query/verify package(s) with header identifier"), "SHA1" },
106  { "package", 'p', 0, 0, 'p',
107         N_("query/verify a package file (i.e. a binary *.rpm file)"), NULL },
108  { "pkgid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYPKGID,
109         N_("query/verify package(s) with package identifier"), "MD5" },
110  { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
111         N_("rpm query mode"), NULL },
112  { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, 
113         POPT_QUERYBYNUMBER, NULL, NULL },
114  { "querytags", '\0', 0, 0, 'Q',
115         N_("display known query tags"), NULL },
116  { "specfile", '\0', 0, 0, POPT_SPECFILE,
117         N_("query a spec file"), N_("<spec>") },
118  { "tid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYTID,
119         N_("query/verify package(s) from install transaction"), "TID" },
120  { "triggeredby", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_TRIGGEREDBY, 
121         N_("query the package(s) triggered by the package"), "PACKAGE" },
122  { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
123         N_("rpm verify mode"), NULL },
124  { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES, 
125         N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
126  { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES, 
127         N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
128    POPT_TABLEEND
129 };
130
131 /* ========== Query specific popt args */
132
133 static void queryArgCallback(/*@unused@*/poptContext con,
134                 /*@unused@*/enum poptCallbackReason reason,
135                 const struct poptOption * opt, const char * arg, 
136                 /*@unused@*/ const void * data)
137         /*@globals rpmQVKArgs @*/
138         /*@modifies rpmQVKArgs @*/
139 {
140     QVA_t qva = &rpmQVKArgs;
141
142     switch (opt->val) {
143     case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
144     case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
145     case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
146     case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
147         break;
148     case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST;
149         break;
150     case 'v':
151         /*@-internalglobs@*/ /* FIX: shrug */
152         rpmIncreaseVerbosity();
153         /*@=internalglobs@*/
154         break;
155
156     case POPT_QUERYFORMAT:
157         if (arg) {
158             char * qf = (char *)qva->qva_queryFormat;
159             /*@-branchstate@*/
160             if (qf) {
161                 int len = strlen(qf) + strlen(arg) + 1;
162                 qf = xrealloc(qf, len);
163                 strcat(qf, arg);
164             } else {
165                 qf = xmalloc(strlen(arg) + 1);
166                 strcpy(qf, arg);
167             }
168             /*@=branchstate@*/
169             qva->qva_queryFormat = qf;
170         }
171         break;
172     }
173 }
174
175 /**
176  * Query mode options.
177  */
178 /*@unchecked@*/
179 struct poptOption rpmQueryPoptTable[] = {
180 /*@-type@*/ /* FIX: cast? */
181  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
182         queryArgCallback, 0, NULL, NULL },
183 /*@=type@*/
184  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
185         NULL, NULL },
186  { "configfiles", 'c', 0, 0, 'c',
187         N_("list all configuration files"), NULL },
188  { "docfiles", 'd', 0, 0, 'd',
189         N_("list all documentation files"), NULL },
190  { "dump", '\0', 0, 0, POPT_DUMP,
191         N_("dump basic file information"), NULL },
192  { "list", 'l', 0, 0, 'l',
193         N_("list files in package"), NULL },
194
195  /* Duplicate file attr flags from packages into command line options. */
196  { "noghost", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN,
197         &rpmQVKArgs.qva_fflags, RPMFILE_GHOST,
198         N_("skip %%ghost files"), NULL },
199 #ifdef  NOTEVER         /* XXX there's hardly a need for these */
200  { "nolicense", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
201         &rpmQVKArgs.qva_fflags, RPMFILE_LICENSE,
202         N_("skip %%license files"), NULL },
203  { "noreadme", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
204         &rpmQVKArgs.qva_fflags, RPMFILE_README,
205         N_("skip %%readme files"), NULL },
206 #endif
207
208  { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0, 
209         POPT_QUERYFORMAT, NULL, NULL },
210  { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
211         N_("use the following query format"), "QUERYFORMAT" },
212  { "specedit", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &specedit, -1,
213         N_("substitute i18n sections into spec file"), NULL },
214  { "state", 's', 0, 0, 's',
215         N_("display the states of the listed files"), NULL },
216  { "verbose", 'v', 0, 0, 'v',
217         N_("display a verbose file listing"), NULL },
218    POPT_TABLEEND
219 };
220
221 /**
222  * Verify mode options.
223  */
224 struct poptOption rpmVerifyPoptTable[] = {
225 #ifdef  DYING
226 /*@-type@*/ /* FIX: cast? */
227  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
228         verifyArgCallback, 0, NULL, NULL },
229 /*@=type@*/
230 #endif  /* DYING */
231  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
232         NULL, NULL },
233
234  /* Duplicate file verify flags from packages into command line options. */
235 /** @todo Add --nomd5 alias to rpmpopt, eliminate. */
236  { "nomd5", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_MD5,
237         N_("don't verify MD5 digest of files"), NULL },
238  { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
239         &rpmQVKArgs.qva_flags, VERIFY_SIZE,
240         N_("don't verify size of files"), NULL },
241  { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
242         &rpmQVKArgs.qva_flags, VERIFY_LINKTO,
243         N_("don't verify symlink path of files"), NULL },
244  { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
245         &rpmQVKArgs.qva_flags, VERIFY_USER,
246         N_("don't verify owner of files"), NULL },
247  { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
248         &rpmQVKArgs.qva_flags, VERIFY_GROUP,
249         N_("don't verify group of files"), NULL },
250  { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
251         &rpmQVKArgs.qva_flags, VERIFY_MTIME,
252         N_("don't verify modification time of files"), NULL },
253  { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
254         &rpmQVKArgs.qva_flags, VERIFY_MODE,
255         N_("don't verify mode of files"), NULL },
256  { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
257         &rpmQVKArgs.qva_flags, VERIFY_RDEV,
258         N_("don't verify mode of files"), NULL },
259
260  { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
261         N_("don't verify files in package"), NULL},
262  { "nodeps", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DEPS,
263         N_("don't verify package dependencies"), NULL },
264  { "noscript", '\0', POPT_BIT_SET,&rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
265         N_("don't execute verify script(s)"), NULL },
266  /* XXX legacy had a trailing s on --noscript */
267  { "noscripts", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
268         &rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
269         N_("don't execute verify script(s)"), NULL },
270  { "nodigest", '\0', POPT_BIT_SET,
271         &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
272         N_("don't verify digest(s)"), NULL },
273  { "nosignature", '\0', POPT_BIT_SET,
274         &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
275         N_("don't verify signature(s)"), NULL },
276
277 /** @todo Add --nogpg/--nopgp aliases to rpmpopt, eliminate. */
278  { "nogpg", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
279         &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
280         N_("don't verify GPG V3 DSA signature(s)"), NULL },
281  { "nopgp", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
282         &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
283         N_("don't verify PGP V3 RSA/MD5 signature(s)"), NULL },
284
285     POPT_TABLEEND
286 };
287
288 /**
289  * Signature mode options.
290  */
291 /*@unchecked@*/
292 struct poptOption rpmSignPoptTable[] = {
293 /*@-type@*/ /* FIX: cast? */
294  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
295         rpmQVSourceArgCallback, 0, NULL, NULL },
296 /*@=type@*/
297  { "addsign", '\0', 0, NULL, 'A',
298         N_("sign a packagei (identical to --resign)"), NULL },
299  { "checksig", 'K', 0, NULL, 'K',
300         N_("verify package signature(s)"), NULL },
301  { "import", '\0', 0, NULL, 'I',
302         N_("import an armored public key"), NULL },
303  { "resign", '\0', 0, NULL, 'R',
304         N_("sign a packagei (identical to --addsign)"), NULL },
305  { "sign", '\0', POPT_ARGFLAG_DOC_HIDDEN, &rpmQVKArgs.sign, 0,
306         N_("generate signature"), NULL },
307
308  { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
309         N_("don't verify digest(s)"), NULL },
310  { "nosignature", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
311         N_("don't verify signature(s)"), NULL },
312
313    POPT_TABLEEND
314 };