Add macro %isu_package to generate ISU Package
[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 <rpm/rpmcli.h>
9 #include "lib/rpmgi.h"  /* XXX for giFlags */
10
11 #include "debug.h"
12
13 struct rpmQVKArguments_s rpmQVKArgs;
14
15 #define POPT_QUERYFORMAT        -1000
16 #define POPT_WHATREQUIRES       -1001
17 #define POPT_WHATPROVIDES       -1002
18 #define POPT_QUERYBYNUMBER      -1003
19 #define POPT_TRIGGEREDBY        -1004
20 #define POPT_DUMP               -1005
21 #define POPT_QUERYBYPKGID       -1007
22 #define POPT_QUERYBYHDRID       -1008
23 #define POPT_QUERYBYTID         -1010
24 #define POPT_WHATRECOMMENDS     -1011
25 #define POPT_WHATSUGGESTS       -1012
26 #define POPT_WHATSUPPLEMENTS    -1013
27 #define POPT_WHATENHANCES       -1014
28
29 /* ========== Query/Verify/Signature source args */
30 static void rpmQVSourceArgCallback( poptContext con,
31                 enum poptCallbackReason reason,
32                 const struct poptOption * opt, const char * arg, 
33                 const void * data)
34 {
35     QVA_t qva = &rpmQVKArgs;
36     rpmQVSources sources = qva->qva_source;;
37
38     switch (opt->val) {
39     case 'q':   /* from --query, -q */
40     case 'Q':   /* from --querytags (handled by poptALL) */
41     case 'V':   /* from --verify, -V */
42         if (qva->qva_mode == '\0' || strchr("qQ ", qva->qva_mode)) {
43             qva->qva_mode = opt->val;
44         }
45         break;
46     case 'a': qva->qva_source |= RPMQV_ALL; break;
47     case 'f': qva->qva_source |= RPMQV_PATH; break;
48     case 'g': qva->qva_source |= RPMQV_GROUP; break;
49     case 'p': qva->qva_source |= RPMQV_RPM; break;
50     case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES; break;
51     case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES; break;
52     case POPT_WHATRECOMMENDS: qva->qva_source |= RPMQV_WHATRECOMMENDS; break;
53     case POPT_WHATSUGGESTS: qva->qva_source |= RPMQV_WHATSUGGESTS; break;
54     case POPT_WHATSUPPLEMENTS: qva->qva_source |= RPMQV_WHATSUPPLEMENTS; break;
55     case POPT_WHATENHANCES: qva->qva_source |= RPMQV_WHATENHANCES; break;
56     case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY; break;
57     case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID; break;
58     case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID; break;
59     case POPT_QUERYBYTID: qva->qva_source |= RPMQV_TID; break;
60     case POPT_QUERYBYNUMBER: qva->qva_source |= RPMQV_DBOFFSET; break;
61     }
62
63     if (sources != qva->qva_source)
64         qva->qva_sourceCount++;
65 }
66
67 /**
68  * Common query/verify mode options.
69  */
70 struct poptOption rpmQVSourcePoptTable[] = {
71 /* FIX: cast? */
72  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
73         rpmQVSourceArgCallback, 0, NULL, NULL },
74  { "all", 'a', 0, 0, 'a',
75         N_("query/verify all packages"), NULL },
76  { "checksig", 'K', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'K',
77         N_("rpm checksig mode"), NULL },
78  { "file", 'f', 0, 0, 'f',
79         N_("query/verify package(s) owning file"), "FILE" },
80  { "group", 'g', 0, 0, 'g',
81         N_("query/verify package(s) in group"), "GROUP" },
82  { "package", 'p', 0, 0, 'p',
83         N_("query/verify a package file"), NULL },
84
85  { "pkgid", '\0', 0, 0, POPT_QUERYBYPKGID,
86         N_("query/verify package(s) with package identifier"), "MD5" },
87  { "hdrid", '\0', 0, 0, POPT_QUERYBYHDRID,
88         N_("query/verify package(s) with header identifier"), "SHA1" },
89
90  { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
91         N_("rpm query mode"), NULL },
92  { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYNUMBER,
93         N_("query/verify a header instance"), "HDRNUM" },
94  { "tid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYTID,
95         N_("query/verify package(s) from install transaction"), "TID" },
96  { "triggeredby", '\0', 0, 0, POPT_TRIGGEREDBY, 
97         N_("query the package(s) triggered by the package"), "PACKAGE" },
98  { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
99         N_("rpm verify mode"), NULL },
100  { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES, 
101         N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
102  { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES, 
103         N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
104  { "whatrecommends", '\0', 0, 0, POPT_WHATRECOMMENDS,
105         N_("query/verify the package(s) which recommends a dependency"), "CAPABILITY" },
106  { "whatsuggests", '\0', 0, 0, POPT_WHATSUGGESTS,
107         N_("query/verify the package(s) which suggests a dependency"), "CAPABILITY" },
108  { "whatsupplements", '\0', 0, 0, POPT_WHATSUPPLEMENTS,
109         N_("query/verify the package(s) which supplements a dependency"), "CAPABILITY" },
110  { "whatenhances", '\0', 0, 0, POPT_WHATENHANCES,
111         N_("query/verify the package(s) which enhances a dependency"), "CAPABILITY" },
112
113  { "noglob", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOGLOB,
114         N_("do not glob arguments"), NULL},
115  { "nomanifest", '\0', POPT_BIT_SET, &giFlags, RPMGI_NOMANIFEST,
116         N_("do not process non-package files as manifests"), NULL},
117
118    POPT_TABLEEND
119 };
120
121 /* ========== Query specific popt args */
122
123 static void queryArgCallback(poptContext con,
124                 enum poptCallbackReason reason,
125                 const struct poptOption * opt, const char * arg, 
126                 const void * data)
127 {
128     QVA_t qva = &rpmQVKArgs;
129
130     switch (opt->val) {
131     case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
132     case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
133     case 'L': qva->qva_flags |= QUERY_FOR_LICENSE | QUERY_FOR_LIST; break;
134     case 'A': qva->qva_flags |= QUERY_FOR_ARTIFACT | QUERY_FOR_LIST; break;
135     case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
136     case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
137         break;
138     case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST;
139         break;
140
141     case POPT_QUERYFORMAT:
142         rstrcat(&qva->qva_queryFormat, arg);
143         break;
144
145     case 'i':
146         if (qva->qva_mode == 'q') {
147             const char * infoCommand[] = { "--info", NULL };
148             (void) poptStuffArgs(con, infoCommand);
149         }
150         break;
151
152     case RPMCLI_POPT_NODEPS:
153         qva->qva_flags |= VERIFY_DEPS;
154         break;
155
156     case RPMCLI_POPT_NOFILEDIGEST:
157         qva->qva_flags |= VERIFY_FILEDIGEST;
158         break;
159
160     case RPMCLI_POPT_NOCONTEXTS:
161         qva->qva_flags |= VERIFY_CONTEXTS;
162         break;
163
164     case RPMCLI_POPT_NOCAPS:
165         qva->qva_flags |= VERIFY_CAPS;
166         break;
167
168 #ifdef  NOTYET
169     case RPMCLI_POPT_FORCE:
170         ia->probFilter |=
171                 ( RPMPROB_FILTER_REPLACEPKG
172                 | RPMPROB_FILTER_REPLACEOLDFILES
173                 | RPMPROB_FILTER_REPLACENEWFILES
174                 | RPMPROB_FILTER_OLDPACKAGE );
175         break;
176 #endif
177
178     case RPMCLI_POPT_NOSCRIPTS:
179         qva->qva_flags |= VERIFY_SCRIPT;
180         break;
181
182     }
183 }
184
185 /**
186  * Query mode options.
187  */
188 struct poptOption rpmQueryPoptTable[] = {
189 /* FIX: cast? */
190  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
191         queryArgCallback, 0, NULL, NULL },
192  { "configfiles", 'c', 0, 0, 'c',
193         N_("list all configuration files"), NULL },
194  { "docfiles", 'd', 0, 0, 'd',
195         N_("list all documentation files"), NULL },
196  { "licensefiles", 'L', 0, 0, 'L',
197         N_("list all license files"), NULL },
198  { "artifactfiles", 'A', 0, 0, 'A',
199         N_("list all artifact files"), NULL },
200  { "dump", '\0', 0, 0, POPT_DUMP,
201         N_("dump basic file information"), NULL },
202  { NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',
203         NULL, NULL },
204  { "list", 'l', 0, 0, 'l',
205         N_("list files in package"), NULL },
206
207  /* Duplicate file attr flags from packages into command line options. */
208  { "noghost", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
209         &rpmQVKArgs.qva_fflags, RPMFILE_GHOST,
210         N_("skip %%ghost files"), NULL },
211  { "noconfig", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
212         &rpmQVKArgs.qva_fflags, RPMFILE_CONFIG,
213         N_("skip %%config files"), NULL },
214  { "noartifact", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
215         &rpmQVKArgs.qva_fflags, RPMFILE_ARTIFACT,
216         N_("skip %%artifact files"), NULL },
217
218  { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0, 
219         POPT_QUERYFORMAT, NULL, NULL },
220  { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
221         N_("use the following query format"), "QUERYFORMAT" },
222  { "state", 's', 0, 0, 's',
223         N_("display the states of the listed files"), NULL },
224    POPT_TABLEEND
225 };
226
227 /**
228  * Verify mode options.
229  */
230 struct poptOption rpmVerifyPoptTable[] = {
231 /* FIX: cast? */
232  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
233         queryArgCallback, 0, NULL, NULL },
234
235  { "nofiledigest", '\0', 0, NULL, RPMCLI_POPT_NOFILEDIGEST,
236         N_("don't verify digest of files"), NULL },
237  { "nomd5", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOFILEDIGEST,
238         N_("don't verify digest of files"), NULL },
239  { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
240         &rpmQVKArgs.qva_flags, VERIFY_SIZE,
241         N_("don't verify size of files"), NULL },
242  { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
243         &rpmQVKArgs.qva_flags, VERIFY_LINKTO,
244         N_("don't verify symlink path of files"), NULL },
245  { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
246         &rpmQVKArgs.qva_flags, VERIFY_USER,
247         N_("don't verify owner of files"), NULL },
248  { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
249         &rpmQVKArgs.qva_flags, VERIFY_GROUP,
250         N_("don't verify group of files"), NULL },
251  { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
252         &rpmQVKArgs.qva_flags, VERIFY_MTIME,
253         N_("don't verify modification time of files"), NULL },
254  { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
255         &rpmQVKArgs.qva_flags, VERIFY_MODE,
256         N_("don't verify mode of files"), NULL },
257  { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
258         &rpmQVKArgs.qva_flags, VERIFY_RDEV,
259         N_("don't verify mode of files"), NULL },
260
261  { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
262         N_("don't verify file security contexts"), NULL },
263  { "nocaps", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCAPS,
264         N_("don't verify capabilities of files"), NULL },
265  { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
266         N_("don't verify files in package"), NULL},
267  { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
268         N_("don't verify package dependencies"), NULL },
269
270  { "noscript", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
271         N_("don't execute verify script(s)"), NULL },
272  /* XXX legacy had a trailing s on --noscript */
273  { "noscripts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOSCRIPTS,
274         N_("don't execute verify script(s)"), NULL },
275
276     POPT_TABLEEND
277 };