4 /** \ingroup rpmcli rpmbuild
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>
24 * Should version 3 packages be produced?
26 extern int _noDirTokens;
29 * Popt option table for options shared by all modes and executables.
31 extern struct poptOption rpmcliAllPoptTable[];
35 extern struct poptOption rpmcliFtsPoptTable[];
37 extern const char * rpmcliPipeOutput;
39 extern const char * rpmcliRcfile;
41 extern const char * rpmcliRootDir;
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)
51 rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable);
54 * Make sure that rpm configuration has been read.
55 * @warning Options like --rcfile and --verbose must precede callers option.
57 void rpmcliConfigured(void);
60 * Destroy most everything needed by an rpm CLI executable context.
61 * @param optCon popt context
65 rpmcliFini(poptContext optCon);
68 * Common/global popt tokens used for command line option tables.
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
80 /* ==================================================================== */
84 * Query/Verify argument qualifiers.
85 * @todo Reassign to tag values.
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. */
107 * Bit(s) to control rpmQuery() operation, stored in qva_flags.
108 * @todo Merge rpmQueryFlags, rpmVerifyFlags, and rpmVerifyAttrs?.
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 */
137 #define _QUERY_FOR_BITS \
138 (QUERY_FOR_LIST|QUERY_FOR_STATE|QUERY_FOR_DOCS|QUERY_FOR_CONFIG|\
142 * Bit(s) from common command line options.
144 extern rpmQueryFlags rpmcliQueryFlags;
148 typedef struct rpmQVKArguments_s * QVA_t;
151 * Function to display iterator matches.
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
158 typedef int (*QVF_t) (QVA_t qva, rpmts ts, Header h);
161 * Function to query spec file.
163 * @param ts transaction set
164 * @param qva parsed query/verify options
165 * @param arg query argument
166 * @return 0 on success
168 typedef int (*QSpecF_t) (rpmts ts, QVA_t qva, const char * arg);
171 * Describe query/verify/signature command line operation.
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. */
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. */
191 - 'q' from --query, -q
192 - 'Q' from --querytags
193 - 'V' from --verify, -V
196 - 'K' from --checksig, -K
199 char qva_char; /*!< (unused) always ' ' */
204 extern struct rpmQVKArguments_s rpmQVKArgs;
208 extern struct poptOption rpmQVSourcePoptTable[];
212 extern struct poptOption rpmQueryPoptTable[];
216 extern struct poptOption rpmVerifyPoptTable[];
219 * Display query/verify information for each header in iterator.
222 * - qva->qva_mi rpm database iterator
223 * - qva->qva_showPackage query/verify display routine
225 * @param qva parsed query/verify options
226 * @param ts transaction set
227 * @return result of last non-zero showPackage() return
229 int rpmcliShowMatches(QVA_t qva, rpmts ts);
232 * Display list of tags that can be used in --queryformat.
233 * @param fp file handle to use for display
235 void rpmDisplayQueryTags(FILE * fp);
238 * Common query/verify source interface, called once for each CLI arg.
241 * - qva->qva_mi rpm database iterator
242 * - qva->qva_showPackage query/verify display routine
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
249 int rpmQueryVerify(QVA_t qva, rpmts ts, const char * arg);
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
259 int showQueryPackage(QVA_t qva, rpmts ts, Header h);
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
268 int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_const_t argv);
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
278 int rpmcliQuery(rpmts ts, QVA_t qva, ARGV_const_t argv);
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
287 int showVerifyPackage(QVA_t qva, rpmts ts, Header h);
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
297 int rpmVerifySignatures(QVA_t qva, rpmts ts, FD_t fd, const char * fn);
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
307 int rpmcliVerify(rpmts ts, QVA_t qva, ARGV_const_t argv);
309 /* ==================================================================== */
313 * Describe build command line request.
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;
335 typedef struct rpmBuildArguments_s * BTA_t;
339 extern struct rpmBuildArguments_s rpmBTArgs;
343 extern struct poptOption rpmBuildPoptTable[];
345 /* ==================================================================== */
347 /* --- install/upgrade/erase modes */
350 * Bit(s) to control rpmInstall() operation.
352 typedef enum rpmInstallFlags_e {
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 */
367 * Bit(s) to control rpmErase() operation.
369 #define UNINSTALL_NONE INSTALL_NONE
370 #define UNINSTALL_NODEPS INSTALL_NODEPS
371 #define UNINSTALL_ALLMATCHES INSTALL_ALLMATCHES
373 extern int rpmcliPackagesTotal;
374 extern int rpmcliHashesCurrent;
375 extern int rpmcliHashesTotal;
376 extern int rpmcliProgressCurrent;
377 extern int rpmcliProgressTotal;
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.
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)
393 void * rpmShowProgress(const void * arg,
394 const rpmCallbackType what,
395 const rpm_loff_t amount,
396 const rpm_loff_t total,
401 * Install source rpm package.
402 * @param ts transaction set
403 * @param arg source rpm file name
404 * @retval *specFilePtr (installed) spec file name
406 * @return 0 on success
408 int rpmInstallSource(rpmts ts, const char * arg,
414 * Describe database command line requests.
416 struct rpmInstallArguments_s {
417 rpmtransFlags transFlags;
418 rpmprobFilterFlags probFilter;
419 rpmInstallFlags installInterfaceFlags;
420 rpmQueryFlags qva_flags; /*!< from --nodigest/--nosignature */
424 rpmRelocation * relocations;
426 const char * rootdir;
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
436 * @todo fileArgv is modified on errors, should be ARGV_const_t
438 int rpmInstall(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_t fileArgv);
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
448 int rpmErase(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_const_t argv);
452 extern struct rpmInstallArguments_s rpmIArgs;
456 extern struct poptOption rpmInstallPoptTable[];
458 /* ==================================================================== */
460 /* --- database modes */
463 * Describe database command line requests.
465 struct rpmDatabaseArguments_s {
466 int init; /*!< from --initdb */
467 int rebuild; /*!< from --rebuilddb */
468 int verify; /*!< from --verifydb */
473 extern struct rpmDatabaseArguments_s rpmDBArgs;
477 extern struct poptOption rpmDatabasePoptTable[];
479 /* ==================================================================== */
483 * Bit(s) to control rpmReSign() operation.
485 typedef enum rpmSignFlags_e {
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 */
496 extern struct poptOption rpmSignPoptTable[];
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
505 int rpmcliSign(rpmts ts, QVA_t qva, ARGV_const_t argv);
511 #endif /* H_RPMCLI */