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