Sanitize python object -> tag number exception handling
[platform/upstream/rpm.git] / lib / rpmcli.h
1 #ifndef H_RPMCLI
2 #define H_RPMCLI
3
4 /** \ingroup rpmcli rpmbuild
5  * \file lib/rpmcli.h
6  */
7
8 #include <popt.h>
9
10 #include <rpm/rpmlib.h>
11 #include <rpm/rpmurl.h>
12 #include <rpm/rpmmacro.h>
13 #include <rpm/rpmcallback.h>
14 #include <rpm/rpmts.h>
15 #include <rpm/rpmfi.h>
16 #include <rpm/rpmvf.h>
17 #include <rpm/argv.h>
18
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22
23 /** \ingroup rpmcli
24  * Should version 3 packages be produced?
25  */
26 extern int _noDirTokens;
27
28 /** \ingroup rpmcli
29  * Popt option table for options shared by all modes and executables.
30  */
31 extern struct poptOption                rpmcliAllPoptTable[];
32
33 extern int ftsOpts;
34
35 extern struct poptOption                rpmcliFtsPoptTable[];
36
37 extern const char * rpmcliPipeOutput;
38
39 extern const char * rpmcliRcfile;
40
41 extern const char * rpmcliRootDir;
42
43 /** \ingroup rpmcli
44  * Initialize most everything needed by an rpm CLI executable context.
45  * @param argc                  no. of args
46  * @param argv                  arg array
47  * @param optionsTable          popt option table
48  * @return                      popt context (or NULL)
49  */
50 poptContext
51 rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable);
52
53 /** \ingroup rpmcli
54  * Make sure that rpm configuration has been read.
55  * @warning Options like --rcfile and --verbose must precede callers option.
56  */
57 void rpmcliConfigured(void);
58
59 /** \ingroup rpmcli
60  * Destroy most everything needed by an rpm CLI executable context.
61  * @param optCon                popt context
62  * @return                      NULL always
63  */
64 poptContext
65 rpmcliFini(poptContext optCon);
66
67 /**
68  * Common/global popt tokens used for command line option tables.
69  */
70 #define RPMCLI_POPT_NODEPS              -1025
71 #define RPMCLI_POPT_FORCE               -1026
72 #define RPMCLI_POPT_NOMD5               -1027
73 #define RPMCLI_POPT_NOFILEDIGEST        -1027   /* same as obsolete RPMCLI_POPT_NOMD5 */
74 #define RPMCLI_POPT_NOSCRIPTS           -1028
75 #define RPMCLI_POPT_NOSIGNATURE         -1029
76 #define RPMCLI_POPT_NODIGEST            -1030
77 #define RPMCLI_POPT_NOHDRCHK            -1031
78 #define RPMCLI_POPT_NOCONTEXTS          -1032
79
80 /* ==================================================================== */
81 /** \name RPMQV */
82
83 /** \ingroup rpmcli
84  * Query/Verify argument qualifiers.
85  * @todo Reassign to tag values.
86  */
87 typedef enum rpmQVSources_e {
88     RPMQV_PACKAGE = 0,  /*!< ... from package name db search. */
89     RPMQV_PATH,         /*!< ... from file path db search. */
90     RPMQV_ALL,          /*!< ... from each installed package. */
91     RPMQV_RPM,          /*!< ... from reading binary rpm package. */
92     RPMQV_GROUP,        /*!< ... from group db search. */
93     RPMQV_WHATPROVIDES, /*!< ... from provides db search. */
94     RPMQV_WHATREQUIRES, /*!< ... from requires db search. */
95     RPMQV_TRIGGEREDBY,  /*!< ... from trigger db search. */
96     RPMQV_DBOFFSET,     /*!< ... from database header instance. */
97     RPMQV_SPECFILE,     /*!< ... from spec file parse (query only). */
98     RPMQV_PKGID,        /*!< ... from package id (header+payload MD5). */
99     RPMQV_HDRID,        /*!< ... from header id (immutable header SHA1). */
100     RPMQV_FILEID,       /*!< ... from file id (file MD5). */
101     RPMQV_TID,          /*!< ... from install transaction id (time stamp). */
102     RPMQV_HDLIST,       /*!< ... from system hdlist. */
103     RPMQV_FTSWALK       /*!< ... from fts(3) walk. */
104 } rpmQVSources;
105
106 /** \ingroup rpmcli
107  * Bit(s) to control rpmQuery() operation, stored in qva_flags.
108  * @todo Merge rpmQueryFlags, rpmVerifyFlags, and rpmVerifyAttrs?.
109  */
110 typedef enum rpmQueryFlags_e {
111     QUERY_FOR_DEFAULT   = 0,            /*!< */
112     QUERY_MD5           = (1 << 0),     /*!< from --nomd5 */
113     QUERY_FILEDIGEST    = (1 << 0),     /*!< from --nofiledigest, same as --nomd5 */
114     QUERY_SIZE          = (1 << 1),     /*!< from --nosize */
115     QUERY_LINKTO        = (1 << 2),     /*!< from --nolink */
116     QUERY_USER          = (1 << 3),     /*!< from --nouser) */
117     QUERY_GROUP         = (1 << 4),     /*!< from --nogroup) */
118     QUERY_MTIME         = (1 << 5),     /*!< from --nomtime) */
119     QUERY_MODE          = (1 << 6),     /*!< from --nomode) */
120     QUERY_RDEV          = (1 << 7),     /*!< from --nodev */
121         /* bits 8-14 unused, reserved for rpmVerifyAttrs */
122     QUERY_CONTEXTS      = (1 << 15),    /*!< verify: from --nocontexts */
123     QUERY_FILES         = (1 << 16),    /*!< verify: from --nofiles */
124     QUERY_DEPS          = (1 << 17),    /*!< verify: from --nodeps */
125     QUERY_SCRIPT        = (1 << 18),    /*!< verify: from --noscripts */
126     QUERY_DIGEST        = (1 << 19),    /*!< verify: from --nodigest */
127     QUERY_SIGNATURE     = (1 << 20),    /*!< verify: from --nosignature */
128     QUERY_PATCHES       = (1 << 21),    /*!< verify: from --nopatches */
129     QUERY_HDRCHK        = (1 << 22),    /*!< verify: from --nohdrchk */
130     QUERY_FOR_LIST      = (1 << 23),    /*!< query:  from --list */
131     QUERY_FOR_STATE     = (1 << 24),    /*!< query:  from --state */
132     QUERY_FOR_DOCS      = (1 << 25),    /*!< query:  from --docfiles */
133     QUERY_FOR_CONFIG    = (1 << 26),    /*!< query:  from --configfiles */
134     QUERY_FOR_DUMPFILES = (1 << 27)     /*!< query:  from --dump */
135 } rpmQueryFlags;
136
137 #define _QUERY_FOR_BITS \
138    (QUERY_FOR_LIST|QUERY_FOR_STATE|QUERY_FOR_DOCS|QUERY_FOR_CONFIG|\
139     QUERY_FOR_DUMPFILES)
140
141 /** \ingroup rpmcli
142  * Bit(s) from common command line options.
143  */
144 extern rpmQueryFlags rpmcliQueryFlags;
145
146 /** \ingroup rpmcli
147  */
148 typedef struct rpmQVKArguments_s * QVA_t;
149
150 /** \ingroup rpmcli
151  * Function to display iterator matches.
152  *
153  * @param qva           parsed query/verify options
154  * @param ts            transaction set
155  * @param h             header to use for query/verify
156  * @return              0 on success
157  */
158 typedef int (*QVF_t) (QVA_t qva, rpmts ts, Header h);
159
160 /** \ingroup rpmcli
161  * Function to query spec file.
162  *
163  * @param ts            transaction set
164  * @param qva           parsed query/verify options
165  * @param arg           query argument
166  * @return              0 on success
167  */
168 typedef int (*QSpecF_t) (rpmts ts, QVA_t qva, const char * arg);
169
170 /** \ingroup rpmcli
171  * Describe query/verify/signature command line operation.
172  */
173 struct rpmQVKArguments_s {
174     rpmQVSources qva_source;    /*!< Identify CLI arg type. */
175     int         qva_sourceCount;/*!< Exclusive option check (>1 is error). */
176     rpmQueryFlags qva_flags;    /*!< Bit(s) to control operation. */
177     rpmfileAttrs qva_fflags;    /*!< Bit(s) to filter on attribute. */
178     rpmdbMatchIterator qva_mi;  /*!< Match iterator on selected headers. */
179     rpmgi qva_gi;               /*!< Generalized iterator on args. */
180     rpmRC qva_rc;               /*!< Current return code. */
181
182     QVF_t qva_showPackage;      /*!< Function to display iterator matches. */
183     QSpecF_t qva_specQuery;     /*!< Function to query spec file. */
184     int qva_verbose;            /*!< (unused) */
185     char * qva_queryFormat;     /*!< Format for headerFormat(). */
186     int sign;                   /*!< Is a passphrase needed? */
187     const char * passPhrase;    /*!< Pass phrase. */
188     const char * qva_prefix;    /*!< Path to top of install tree. */
189     char        qva_mode;
190                 /*!<
191                 - 'q'   from --query, -q
192                 - 'Q'   from --querytags
193                 - 'V'   from --verify, -V
194                 - 'A'   from --addsign
195                 - 'I'   from --import
196                 - 'K'   from --checksig, -K
197                 - 'R'   from --resign
198                 */
199     char        qva_char;       /*!< (unused) always ' ' */
200 };
201
202 /** \ingroup rpmcli
203  */
204 extern struct rpmQVKArguments_s rpmQVKArgs;
205
206 /** \ingroup rpmcli
207  */
208 extern struct poptOption rpmQVSourcePoptTable[];
209
210 /** \ingroup rpmcli
211  */
212 extern struct poptOption rpmQueryPoptTable[];
213
214 /** \ingroup rpmcli
215  */
216 extern struct poptOption rpmVerifyPoptTable[];
217
218 /** \ingroup rpmcli
219  * Display query/verify information for each header in iterator.
220  *
221  * This routine uses:
222  *      - qva->qva_mi           rpm database iterator
223  *      - qva->qva_showPackage  query/verify display routine
224  *
225  * @param qva           parsed query/verify options
226  * @param ts            transaction set
227  * @return              result of last non-zero showPackage() return
228  */
229 int rpmcliShowMatches(QVA_t qva, rpmts ts);
230
231 /** \ingroup rpmcli
232  * Display list of tags that can be used in --queryformat.
233  * @param fp    file handle to use for display
234  */
235 void rpmDisplayQueryTags(FILE * fp);
236
237 /** \ingroup rpmcli
238  * Common query/verify source interface, called once for each CLI arg.
239  *
240  * This routine uses:
241  *      - qva->qva_mi           rpm database iterator
242  *      - qva->qva_showPackage  query/verify display routine
243  *
244  * @param qva           parsed query/verify options
245  * @param ts            transaction set
246  * @param arg           name of source to query/verify
247  * @return              showPackage() result, 1 if rpmdbInitIterator() is NULL
248  */
249 int rpmQueryVerify(QVA_t qva, rpmts ts, const char * arg);
250
251 /** \ingroup rpmcli
252  * Display results of package query.
253  * @todo Devise a meaningful return code.
254  * @param qva           parsed query/verify options
255  * @param ts            transaction set
256  * @param h             header to use for query
257  * @return              0 always
258  */
259 int showQueryPackage(QVA_t qva, rpmts ts, Header h);
260
261 /** \ingroup rpmcli
262  * Iterate over query/verify arg list.
263  * @param ts            transaction set
264  * @param qva           parsed query/verify options
265  * @param argv          query argument(s) (or NULL)
266  * @return              0 on success, else no. of failures
267  */
268 int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_const_t argv);
269
270 /** \ingroup rpmcli
271  * Display package information.
272  * @todo hack: RPMQV_ALL can pass char ** arglist = NULL, not char * arg. Union?
273  * @param ts            transaction set
274  * @param qva           parsed query/verify options
275  * @param argv          query argument(s) (or NULL)
276  * @return              0 on success, else no. of failures
277  */
278 int rpmcliQuery(rpmts ts, QVA_t qva, ARGV_const_t argv);
279
280 /** \ingroup rpmcli
281  * Display results of package verify.
282  * @param qva           parsed query/verify options
283  * @param ts            transaction set
284  * @param h             header to use for verify
285  * @return              result of last non-zero verify return
286  */
287 int showVerifyPackage(QVA_t qva, rpmts ts, Header h);
288
289 /**
290  * Check package and header signatures.
291  * @param qva           parsed query/verify options
292  * @param ts            transaction set
293  * @param fd            package file handle
294  * @param fn            package file name
295  * @return              0 on success, 1 on failure
296  */
297 int rpmVerifySignatures(QVA_t qva, rpmts ts, FD_t fd, const char * fn);
298
299 /** \ingroup rpmcli
300  * Verify package install.
301  * @todo hack: RPMQV_ALL can pass char ** arglist = NULL, not char * arg. Union?
302  * @param ts            transaction set
303  * @param qva           parsed query/verify options
304  * @param argv          verify argument(s) (or NULL)
305  * @return              0 on success, else no. of failures
306  */
307 int rpmcliVerify(rpmts ts, QVA_t qva, ARGV_const_t argv);
308
309 /* ==================================================================== */
310 /** \name RPMBT */
311
312 /** \ingroup rpmcli
313  * Describe build command line request.
314  */
315 struct rpmBuildArguments_s {
316     rpmQueryFlags qva_flags;    /*!< Bit(s) to control verification. */
317     int buildAmount;            /*!< Bit(s) to control operation. */
318     char * buildRootOverride;   /*!< from --buildroot */
319     char * targets;             /*!< Target platform(s), comma separated. */
320     const char * passPhrase;    /*!< Pass phrase. */
321     char * cookie;              /*!< NULL for binary, ??? for source, rpm's */
322     int force;                  /*!< from --force */
323     int noBuild;                /*!< from --nobuild */
324     int noDeps;                 /*!< from --nodeps */
325     int noLang;                 /*!< from --nolang */
326     int shortCircuit;           /*!< from --short-circuit */
327     int sign;                   /*!< from --sign */
328     char buildMode;             /*!< Build mode (one of "btBC") */
329     char buildChar;             /*!< Build stage (one of "abcilps ") */
330     const char * rootdir;
331 };
332
333 /** \ingroup rpmcli
334  */
335 typedef struct rpmBuildArguments_s *    BTA_t;
336
337 /** \ingroup rpmcli
338  */
339 extern struct rpmBuildArguments_s       rpmBTArgs;
340
341 /** \ingroup rpmcli
342  */
343 extern struct poptOption                rpmBuildPoptTable[];
344
345 /* ==================================================================== */
346 /** \name RPMEIU */
347 /* --- install/upgrade/erase modes */
348
349 /** \ingroup rpmcli
350  * Bit(s) to control rpmInstall() operation.
351  */
352 typedef enum rpmInstallFlags_e {
353     INSTALL_NONE        = 0,
354     INSTALL_PERCENT     = (1 << 0),     /*!< from --percent */
355     INSTALL_HASH        = (1 << 1),     /*!< from --hash */
356     INSTALL_NODEPS      = (1 << 2),     /*!< from --nodeps */
357     INSTALL_NOORDER     = (1 << 3),     /*!< from --noorder */
358     INSTALL_LABEL       = (1 << 4),     /*!< from --verbose (notify) */
359     INSTALL_UPGRADE     = (1 << 5),     /*!< from --upgrade */
360     INSTALL_FRESHEN     = (1 << 6),     /*!< from --freshen */
361     INSTALL_INSTALL     = (1 << 7),     /*!< from --install */
362     INSTALL_ERASE       = (1 << 8),     /*!< from --erase */
363     INSTALL_ALLMATCHES  = (1 << 9)      /*!< from --allmatches */
364 } rpmInstallFlags;
365
366 /** \ingroup rpmcli
367  * Bit(s) to control rpmErase() operation.
368  */
369 #define UNINSTALL_NONE INSTALL_NONE
370 #define UNINSTALL_NODEPS INSTALL_NODEPS
371 #define UNINSTALL_ALLMATCHES INSTALL_ALLMATCHES
372
373 extern int rpmcliPackagesTotal;
374 extern int rpmcliHashesCurrent;
375 extern int rpmcliHashesTotal;
376 extern int rpmcliProgressCurrent;
377 extern int rpmcliProgressTotal;
378
379 /** \ingroup rpmcli
380  * The rpm CLI generic transaction callback handler.
381  * @todo Remove headerFormat() from the progress callback.
382  * @deprecated Transaction callback arguments need to change, so don't rely on
383  * this routine in the rpmcli API.
384  *
385  * @param arg           per-callback private data (e.g. an rpm header)
386  * @param what          callback identifier
387  * @param amount        per-callback progress info
388  * @param total         per-callback progress info
389  * @param key           opaque header key (e.g. file name or PyObject)
390  * @param data          private data (e.g. rpmInstallInterfaceFlags)
391  * @return              per-callback data (e.g. an opened FD_t)
392  */
393 void * rpmShowProgress(const void * arg,
394                 const rpmCallbackType what,
395                 const rpm_loff_t amount,
396                 const rpm_loff_t total,
397                 fnpyKey key,
398                 void * data);
399
400 /** \ingroup rpmcli
401  * Install source rpm package.
402  * @param ts            transaction set
403  * @param arg           source rpm file name
404  * @retval *specFilePtr (installed) spec file name
405  * @retval *cookie
406  * @return              0 on success
407  */
408 int rpmInstallSource(rpmts ts, const char * arg,
409                 char ** specFilePtr,
410                 char ** cookie);
411
412
413 /** \ingroup rpmcli
414  * Describe database command line requests.
415  */
416 struct rpmInstallArguments_s {
417     rpmtransFlags transFlags;
418     rpmprobFilterFlags probFilter;
419     rpmInstallFlags installInterfaceFlags;
420     rpmQueryFlags qva_flags;    /*!< from --nodigest/--nosignature */
421     int numRelocations;
422     int noDeps;
423     int incldocs;
424     rpmRelocation * relocations;
425     char * prefix;
426     const char * rootdir;
427 };
428
429 /** \ingroup rpmcli
430  * Install/upgrade/freshen binary rpm package.
431  * @param ts            transaction set
432  * @param ia            mode flags and parameters
433  * @param fileArgv      array of package file names (NULL terminated)
434  * @return              0 on success
435  *
436  * @todo                fileArgv is modified on errors, should be ARGV_const_t
437  */
438 int rpmInstall(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_t fileArgv);
439
440 /** \ingroup rpmcli
441  * Erase binary rpm package.
442  * @param ts            transaction set
443  * @param ia            control args/bits
444  * @param argv          array of package file names (NULL terminated)
445  * @return              0 on success
446  */
447
448 int rpmErase(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_const_t argv);
449
450 /** \ingroup rpmcli
451  */
452 extern struct rpmInstallArguments_s rpmIArgs;
453
454 /** \ingroup rpmcli
455  */
456 extern struct poptOption rpmInstallPoptTable[];
457
458 /* ==================================================================== */
459 /** \name RPMDB */
460 /* --- database modes */
461
462 /** \ingroup rpmcli
463  * Describe database command line requests.
464  */
465 struct rpmDatabaseArguments_s {
466     int init;                   /*!< from --initdb */
467     int rebuild;                /*!< from --rebuilddb */
468     int verify;                 /*!< from --verifydb */
469 };
470
471 /** \ingroup rpmcli
472  */
473 extern struct rpmDatabaseArguments_s rpmDBArgs;
474
475 /** \ingroup rpmcli
476  */
477 extern struct poptOption rpmDatabasePoptTable[];
478
479 /* ==================================================================== */
480 /** \name RPMK */
481
482 /** \ingroup rpmcli
483  * Bit(s) to control rpmReSign() operation.
484  */
485 typedef enum rpmSignFlags_e {
486     RPMSIGN_NONE                = 0,
487     RPMSIGN_CHK_SIGNATURE       = 'K',  /*!< from --checksig */
488     RPMSIGN_NEW_SIGNATURE       = 'R',  /*!< from --resign */
489     RPMSIGN_ADD_SIGNATURE       = 'A',  /*!< from --addsign */
490     RPMSIGN_DEL_SIGNATURE       = 'D',  /*!< from --delsign */
491     RPMSIGN_IMPORT_PUBKEY       = 'I',  /*!< from --import */
492 } rpmSignFlags;
493
494 /** \ingroup rpmcli
495  */
496 extern struct poptOption rpmSignPoptTable[];
497
498 /** \ingroup rpmcli
499  * Create/Modify/Check elements from signature header.
500  * @param ts            transaction set
501  * @param qva           mode flags and parameters
502  * @param argv          array of arguments (NULL terminated)
503  * @return              0 on success
504  */
505 int rpmcliSign(rpmts ts, QVA_t qva, ARGV_const_t argv);
506
507 #ifdef __cplusplus
508 }
509 #endif
510
511 #endif  /* H_RPMCLI */