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