4 /** \ingroup rpmcli rpmbuild
13 * Should version 3 packages be produced?
17 extern int _noDirTokens;
25 * Popt option table for options shared by all modes and executables.
28 extern struct poptOption rpmcliAllPoptTable[];
31 * Initialize most everything needed by an rpm CLI executable context.
32 * @param argc no. of args
33 * @param argv arg array
34 * @param optionsTable popt option table
35 * @return popt context (or NULL)
39 rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
40 /*@globals rpmCLIMacroContext, rpmGlobalMacroContext, stderr,
41 fileSystem, internalState @*/
42 /*@modifies rpmCLIMacroContext, rpmGlobalMacroContext, stderr,
43 fileSystem, internalState @*/;
46 * Destroy most everything needed by an rpm CLI executable context.
47 * @param optCon popt context
51 rpmcliFini(/*@only@*/ /*@null@*/ poptContext optCon)
52 /*@modifies optCon @*/;
54 /* ==================================================================== */
59 * Describe build command line request.
61 struct rpmBuildArguments_s {
62 int buildAmount; /*!< Bit(s) to control operation. */
64 const char * buildRootOverride; /*!< from --buildroot */
66 char * targets; /*!< Target platform(s), comma separated. */
68 const char * passPhrase; /*!< Pass phrase. */
70 const char * cookie; /*!< NULL for binary, ??? for source, rpm's */
71 int force; /*!< from --force */
72 int noBuild; /*!< from --nobuild */
73 int noDeps; /*!< from --nodeps */
74 int noLang; /*!< from --nolang */
75 int shortCircuit; /*!< from --short-circuit */
76 int sign; /*!< from --sign */
77 int useCatalog; /*!< from --usecatalog */
78 char buildMode; /*!< Build mode (one of "btBC") */
79 char buildChar; /*!< Build stage (one of "abcilps ") */
80 /*@observer@*/ /*@null@*/
86 typedef struct rpmBuildArguments_s * BTA_t;
91 extern struct rpmBuildArguments_s rpmBTArgs;
96 extern struct poptOption rpmBuildPoptTable[];
99 /* ==================================================================== */
104 * Query/Verify argument qualifiers.
105 * @todo Reassign to tag values.
107 typedef enum rpmQVSources_e {
108 RPMQV_PACKAGE = 0, /*!< ... from package name db search. */
109 RPMQV_PATH, /*!< ... from file path db search. */
110 RPMQV_ALL, /*!< ... from each installed package. */
111 RPMQV_RPM, /*!< ... from reading binary rpm package. */
112 RPMQV_GROUP, /*!< ... from group db search. */
113 RPMQV_WHATPROVIDES, /*!< ... from provides db search. */
114 RPMQV_WHATREQUIRES, /*!< ... from requires db search. */
115 RPMQV_TRIGGEREDBY, /*!< ... from trigger db search. */
116 RPMQV_DBOFFSET, /*!< ... from database header instance. */
117 RPMQV_SPECFILE, /*!< ... from spec file parse (query only). */
118 RPMQV_PKGID, /*!< ... from package id (header+payload MD5). */
119 RPMQV_HDRID, /*!< ... from header id (immutable header SHA1). */
120 RPMQV_FILEID, /*!< ... from file id (file MD5). */
121 RPMQV_TID /*!< ... from install transaction id (time stamp). */
125 * Bit(s) for rpmVerifyFile() attributes and result.
127 typedef enum rpmVerifyAttrs_e {
128 RPMVERIFY_NONE = 0, /*!< */
129 RPMVERIFY_MD5 = (1 << 0), /*!< from %verify(md5) */
130 RPMVERIFY_FILESIZE = (1 << 1), /*!< from %verify(size) */
131 RPMVERIFY_LINKTO = (1 << 2), /*!< from %verify(link) */
132 RPMVERIFY_USER = (1 << 3), /*!< from %verify(user) */
133 RPMVERIFY_GROUP = (1 << 4), /*!< from %verify(group) */
134 RPMVERIFY_MTIME = (1 << 5), /*!< from %verify(mtime) */
135 RPMVERIFY_MODE = (1 << 6), /*!< from %verify(mode) */
136 RPMVERIFY_RDEV = (1 << 7), /*!< from %verify(rdev) */
137 /* bits 8-15 unused, reserved for rpmVerifyAttrs */
138 /* bits 16-20 used in rpmVerifyFlags */
139 /* bits 21-22 unused */
140 /* bits 23-27 used in rpmQueryFlags */
141 RPMVERIFY_READLINKFAIL= (1 << 28), /*!< */
142 RPMVERIFY_READFAIL = (1 << 29), /*!< */
143 RPMVERIFY_LSTATFAIL = (1 << 30) /*!< */
146 #define RPMVERIFY_ALL ~(RPMVERIFY_NONE)
149 * Bit(s) to control rpmQuery() operation, stored in qva_flags.
150 * @todo Merge rpmQueryFlags, rpmVerifyFlags, and rpmVerifyAttrs?.
152 typedef enum rpmQueryFlags_e {
154 QUERY_FOR_DEFAULT = 0, /*!< */
155 QUERY_MD5 = (1 << 0), /*!< from --nomd5 */
156 QUERY_SIZE = (1 << 1), /*!< from --nosize */
157 QUERY_LINKTO = (1 << 2), /*!< from --nolink */
158 QUERY_USER = (1 << 3), /*!< from --nouser) */
159 QUERY_GROUP = (1 << 4), /*!< from --nogroup) */
160 QUERY_MTIME = (1 << 5), /*!< from --nomtime) */
161 QUERY_MODE = (1 << 6), /*!< from --nomode) */
162 QUERY_RDEV = (1 << 7), /*!< from --nodev */
163 /* bits 8-15 unused, reserved for rpmVerifyAttrs */
164 QUERY_FILES = (1 << 16), /*!< verify: from --nofiles */
165 QUERY_DEPS = (1 << 17), /*!< verify: from --nodeps */
166 QUERY_SCRIPT = (1 << 18), /*!< verify: from --noscripts */
167 QUERY_DIGEST = (1 << 19), /*!< verify: from --nodigest */
168 QUERY_SIGNATURE = (1 << 20), /*!< verify: from --nosignature */
169 QUERY_PATCHES = (1 << 21), /*!< placeholder (SuSE) */
170 QUERY_HDRCHK = (1 << 22), /*!< verify: from --nohdrchk */
172 QUERY_FOR_LIST = (1 << 23), /*!< query: from --list */
173 QUERY_FOR_STATE = (1 << 24), /*!< query: from --state */
174 QUERY_FOR_DOCS = (1 << 25), /*!< query: from --docfiles */
175 QUERY_FOR_CONFIG = (1 << 26), /*!< query: from --configfiles */
176 QUERY_FOR_DUMPFILES = (1 << 27) /*!< query: from --dump */
179 #define _QUERY_FOR_BITS \
180 (QUERY_FOR_LIST|QUERY_FOR_STATE|QUERY_FOR_DOCS|QUERY_FOR_CONFIG|\
184 * Bit(s) to control rpmVerify() operation, stored in qva_flags.
185 * @todo Merge rpmQueryFlags, rpmVerifyFlags, and rpmVerifyAttrs values?.
187 typedef enum rpmVerifyFlags_e {
189 VERIFY_DEFAULT = 0, /*!< */
191 VERIFY_MD5 = (1 << 0), /*!< from --nomd5 */
192 VERIFY_SIZE = (1 << 1), /*!< from --nosize */
193 VERIFY_LINKTO = (1 << 2), /*!< from --nolinkto */
194 VERIFY_USER = (1 << 3), /*!< from --nouser */
195 VERIFY_GROUP = (1 << 4), /*!< from --nogroup */
196 VERIFY_MTIME = (1 << 5), /*!< from --nomtime */
197 VERIFY_MODE = (1 << 6), /*!< from --nomode */
198 VERIFY_RDEV = (1 << 7), /*!< from --nodev */
199 /* bits 8-15 unused, reserved for rpmVerifyAttrs */
200 VERIFY_FILES = (1 << 16), /*!< verify: from --nofiles */
201 VERIFY_DEPS = (1 << 17), /*!< verify: from --nodeps */
202 VERIFY_SCRIPT = (1 << 18), /*!< verify: from --noscripts */
203 VERIFY_DIGEST = (1 << 19), /*!< verify: from --nodigest */
204 VERIFY_SIGNATURE = (1 << 20), /*!< verify: from --nosignature */
205 VERIFY_PATCHES = (1 << 21), /*!< placeholder (SuSE) */
206 VERIFY_HDRCHK = (1 << 22), /*!< verify: from --nohdrchk */
208 VERIFY_FOR_LIST = (1 << 23), /*!< query: from --list */
209 VERIFY_FOR_STATE = (1 << 24), /*!< query: from --state */
210 VERIFY_FOR_DOCS = (1 << 25), /*!< query: from --docfiles */
211 VERIFY_FOR_CONFIG = (1 << 26), /*!< query: from --configfiles */
212 VERIFY_FOR_DUMPFILES= (1 << 27) /*!< query: from --dump */
214 /* bits 28-30 used in rpmVerifyAttrs */
217 #define VERIFY_ATTRS \
218 ( VERIFY_MD5 | VERIFY_SIZE | VERIFY_LINKTO | VERIFY_USER | VERIFY_GROUP | \
219 VERIFY_MTIME | VERIFY_MODE | VERIFY_RDEV )
221 ( VERIFY_ATTRS | VERIFY_FILES | VERIFY_DEPS | VERIFY_SCRIPT | VERIFY_DIGEST |\
222 VERIFY_SIGNATURE | VERIFY_HDRCHK )
226 typedef struct rpmQVKArguments_s * QVA_t;
229 * Function to display iterator matches.
231 * @param qva parsed query/verify options
232 * @param ts transaction set
233 * @param h header to use for query/verify
235 typedef int (*QVF_t) (QVA_t qva, rpmts ts, Header h)
236 /*@globals fileSystem@*/
237 /*@modifies qva, ts, fileSystem @*/;
240 * Describe query/verify/signature command line operation.
242 struct rpmQVKArguments_s {
243 rpmQVSources qva_source; /*!< Identify CLI arg type. */
244 int qva_sourceCount;/*!< Exclusive option check (>1 is error). */
245 rpmQueryFlags qva_flags; /*!< Bit(s) to control operation. */
246 rpmfileAttrs qva_fflags; /*!< Bit(s) to filter on attribute. */
247 /*@only@*/ /*@null@*/
248 rpmdbMatchIterator qva_mi; /*!< Match iterator on selected headers. */
250 QVF_t qva_showPackage; /*!< Function to display iterator matches. */
252 int qva_verbose; /*!< (unused) */
253 /*@only@*/ /*@null@*/
254 const char * qva_queryFormat;/*!< Format for headerSprintf(). */
255 int sign; /*!< Is a passphrase needed? */
257 const char * passPhrase; /*!< Pass phrase. */
258 /*@observer@*/ /*@null@*/
259 const char * qva_prefix; /*!< Path to top of install tree. */
262 - 'q' from --query, -q
263 - 'Q' from --querytags
264 - 'V' from --verify, -V
267 - 'K' from --checksig, -K
270 char qva_char; /*!< (unused) always ' ' */
276 extern struct rpmQVKArguments_s rpmQVKArgs;
281 extern struct poptOption rpmQVSourcePoptTable[];
291 extern struct poptOption rpmQueryPoptTable[];
296 extern struct poptOption rpmVerifyPoptTable[];
299 * Display query/verify information for each header in iterator.
302 * - qva->qva_mi rpm database iterator
303 * - qva->qva_showPackage query/verify display routine
305 * @param qva parsed query/verify options
306 * @param ts transaction set
307 * @return result of last non-zero showPackage() return
309 int showMatches(QVA_t qva, rpmts ts)
310 /*@globals fileSystem@*/
311 /*@modifies qva, fileSystem @*/;
314 * Display list of tags that can be used in --queryformat.
315 * @param fp file handle to use for display
317 void rpmDisplayQueryTags(FILE * fp)
318 /*@globals fileSystem@*/
319 /*@modifies *fp, fileSystem @*/;
322 * Common query/verify source interface, called once for each CLI arg.
325 * - qva->qva_mi rpm database iterator
326 * - qva->qva_showPackage query/verify display routine
328 * @param qva parsed query/verify options
329 * @param ts transaction set
330 * @param arg name of source to query/verify
331 * @return showPackage() result, 1 if rpmdbInitIterator() is NULL
333 int rpmQueryVerify(QVA_t qva, rpmts ts, const char * arg)
334 /*@globals rpmGlobalMacroContext,
335 fileSystem, internalState @*/
336 /*@modifies qva, ts, rpmGlobalMacroContext,
337 fileSystem, internalState @*/;
340 * Display results of package query.
341 * @todo Devise a meaningful return code.
342 * @param qva parsed query/verify options
343 * @param ts transaction set
344 * @param h header to use for query
347 int showQueryPackage(QVA_t qva, rpmts ts, Header h)
348 /*@globals internalState @*/
349 /*@modifies ts, h, internalState @*/;
352 * Display package information.
353 * @todo hack: RPMQV_ALL can pass char ** arglist = NULL, not char * arg. Union?
354 * @param ts transaction set
355 * @param qva parsed query/verify options
356 * @param argv query argument(s) (or NULL)
357 * @return 0 on success, else no. of failures
359 int rpmcliQuery(rpmts ts, QVA_t qva, /*@null@*/ const char ** argv)
360 /*@globals rpmGlobalMacroContext,
361 fileSystem, internalState @*/
362 /*@modifies ts, qva, rpmGlobalMacroContext,
363 fileSystem, internalState @*/;
366 * Verify file attributes (including MD5 sum).
367 * @todo gnorpm and python bindings prevent this from being static.
368 * @param ts transaction set
369 * @param fi file info (with linked header and current file index)
370 * @retval res address of bit(s) returned to indicate failure
371 * @param omitMask bit(s) to disable verify checks
372 * @return 0 on success (or not installed), 1 on error
375 int rpmVerifyFile(const rpmts ts, rpmfi fi,
376 /*@out@*/ rpmVerifyAttrs * res, rpmVerifyAttrs omitMask)
377 /*@globals fileSystem, internalState @*/
378 /*@modifies fi, *res, fileSystem, internalState @*/
379 /*@requires maxSet(res) >= 0 @*/;
383 * Display results of package verify.
384 * @param qva parsed query/verify options
385 * @param ts transaction set
386 * @param h header to use for verify
387 * @return result of last non-zero verify return
389 int showVerifyPackage(QVA_t qva, rpmts ts, Header h)
390 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
391 /*@modifies ts, h, rpmGlobalMacroContext, fileSystem, internalState @*/;
394 * Check package and header signatures.
395 * @param qva parsed query/verify options
396 * @param ts transaction set
397 * @param fd package file handle
398 * @param fn package file name
399 * @return 0 on success, 1 on failure
401 int rpmVerifySignatures(QVA_t qva, rpmts ts, FD_t fd, const char * fn)
402 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
403 /*@modifies qva, ts, fd, rpmGlobalMacroContext,
404 fileSystem, internalState @*/;
407 * Verify package install.
408 * @todo hack: RPMQV_ALL can pass char ** arglist = NULL, not char * arg. Union?
409 * @param ts transaction set
410 * @param qva parsed query/verify options
411 * @param argv verify argument(s) (or NULL)
412 * @return 0 on success, else no. of failures
414 int rpmcliVerify(rpmts ts, QVA_t qva, /*@null@*/ const char ** argv)
415 /*@globals rpmGlobalMacroContext,
416 fileSystem, internalState @*/
417 /*@modifies ts, qva, rpmGlobalMacroContext,
418 fileSystem, internalState @*/;
421 /* ==================================================================== */
424 /* --- install/upgrade/erase modes */
427 extern int packagesTotal;
430 * The rpm CLI generic transaction callback.
431 * @deprecated Transaction callback arguments need to change, so don't rely on
432 * this routine in the rpmcli API.
434 * @param arg per-callback private data (e.g. an rpm header)
435 * @param what callback identifier
436 * @param amount per-callback progress info
437 * @param total per-callback progress info
438 * @param key opaque header key (e.g. file name or PyObject)
439 * @param data private data (e.g. rpmInstallInterfaceFlags)
440 * @return per-callback data (e.g. an opened FD_t)
442 /*@null@*/ void * rpmShowProgress(/*@null@*/ const void * arg,
443 const rpmCallbackType what,
444 const unsigned long amount,
445 const unsigned long total,
446 /*@null@*/ fnpyKey key,
447 /*@null@*/ void * data)
448 /*@globals fileSystem, internalState @*/
449 /*@modifies fileSystem, internalState @*/;
452 * Install source rpm package.
453 * @param ts transaction set
454 * @param arg source rpm file name
455 * @retval specFilePtr address of (installed) spec file name
457 * @return 0 on success
459 int rpmInstallSource(rpmts ts, const char * arg,
460 /*@null@*/ /*@out@*/ const char ** specFilePtr,
461 /*@null@*/ /*@out@*/ const char ** cookie)
462 /*@globals rpmGlobalMacroContext,
463 fileSystem, internalState@*/
464 /*@modifies ts, *specFilePtr, *cookie, rpmGlobalMacroContext,
465 fileSystem, internalState @*/;
468 * Describe database command line requests.
470 struct rpmInstallArguments_s {
471 rpmtransFlags transFlags;
472 rpmprobFilterFlags probFilter;
473 rpmInstallInterfaceFlags installInterfaceFlags;
474 rpmEraseInterfaceFlags eraseInterfaceFlags;
475 /*@owned@*/ /*@null@*/
476 rpmRelocation * relocations;
480 rpmQueryFlags qva_flags; /*!< from --nodigest/--nosignature */
483 /*@observer@*/ /*@null@*/
484 const char * rootdir;
485 uint_32 rbtid; /*!< from --rollback */
489 * Install/upgrade/freshen binary rpm package.
490 * @param ts transaction set
491 * @param ia mode flags and parameters
492 * @param fileArgv array of package file names (NULL terminated)
493 * @return 0 on success
495 int rpmInstall(rpmts ts, struct rpmInstallArguments_s * ia,
496 /*@null@*/ const char ** fileArgv)
497 /*@globals packagesTotal, rpmGlobalMacroContext,
498 fileSystem, internalState@*/
499 /*@modifies ts, ia, packagesTotal, rpmGlobalMacroContext,
500 fileSystem, internalState @*/;
503 * Erase binary rpm package.
504 * @param ts transaction set
505 * @param ia control args/bits
506 * @param argv array of package file names (NULL terminated)
507 * @return 0 on success
509 int rpmErase(rpmts ts, const struct rpmInstallArguments_s * ia,
510 /*@null@*/ const char ** argv)
511 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
512 /*@modifies ts, rpmGlobalMacroContext, fileSystem, internalState @*/;
515 * A rollback transaction id element.
518 typedef /*@abstract@*/ struct IDT_s {
519 unsigned int instance; /*!< installed package transaction id. */
520 /*@owned@*/ /*@null@*/
521 const char * key; /*! removed package file name. */
522 Header h; /*!< removed package header. */
524 uint_32 u32; /*!< install/remove transaction id */
530 * A rollback transaction id index.
532 typedef /*@abstract@*/ struct IDTindex_s {
533 int delta; /*!< no. elements to realloc as a chunk. */
534 int size; /*!< size of id index element. */
535 int alloced; /*!< current number of elements allocated. */
536 int nidt; /*!< current number of elements initialized. */
537 /*@only@*/ /*@null@*/
538 IDT idt; /*!< id index elements. */
543 * @param idtx id index
544 * @return NULL always
546 /*@null@*/ IDTX IDTXfree(/*@only@*/ /*@null@*/ IDTX idtx)
547 /*@modifies idtx @*/;
551 * @return new id index
553 /*@only@*/ IDTX IDTXnew(void)
557 * Insure that index has room for "need" elements.
558 * @param idtx id index
559 * @param need additional no. of elements needed
560 * @return id index (with room for "need" elements)
562 /*@only@*/ /*@null@*/ IDTX IDTXgrow(/*@only@*/ /*@null@*/ IDTX idtx, int need)
563 /*@modifies idtx @*/;
566 * Sort tag (instance,value) pairs.
567 * @param idtx id index
570 /*@only@*/ /*@null@*/ IDTX IDTXsort(/*@only@*/ /*@null@*/ IDTX idtx)
571 /*@modifies idtx @*/;
574 * Load tag (instance,value) pairs from rpm databse, and return sorted id index.
575 * @param ts transaction set
579 /*@only@*/ /*@null@*/ IDTX IDTXload(rpmts ts, rpmTag tag)
580 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
581 /*@modifies ts, rpmGlobalMacroContext, fileSystem, internalState @*/;
584 * Load tag (instance,value) pairs from packages, and return sorted id index.
585 * @param ts transaction set
586 * @param globstr glob expression
590 /*@only@*/ /*@null@*/ IDTX IDTXglob(rpmts ts,
591 const char * globstr, rpmTag tag)
592 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
593 /*@modifies ts, rpmGlobalMacroContext, fileSystem, internalState @*/;
596 * Rollback transactions, erasing new, reinstalling old, package(s).
597 * @param ts transaction set
598 * @param ia mode flags and parameters
599 * @param argv array of arguments (NULL terminated)
600 * @return 0 on success
602 int rpmRollback(rpmts ts, struct rpmInstallArguments_s * ia,
603 /*@null@*/ const char ** argv)
604 /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/
605 /*@modifies ts, rpmGlobalMacroContext, fileSystem, internalState @*/;
610 extern struct rpmInstallArguments_s rpmIArgs;
615 extern struct poptOption rpmInstallPoptTable[];
618 /* ==================================================================== */
621 /* --- database modes */
624 * Describe database command line requests.
626 struct rpmDatabaseArguments_s {
627 int init; /*!< from --initdb */
628 int rebuild; /*!< from --rebuilddb */
629 int verify; /*!< from --verifydb */
635 extern struct rpmDatabaseArguments_s rpmDBArgs;
640 extern struct poptOption rpmDatabasePoptTable[];
643 /* ==================================================================== */
648 * Bit(s) to control rpmReSign() operation.
651 typedef enum rpmSignFlags_e {
653 RPMSIGN_CHK_SIGNATURE = 'K', /*!< from --checksig */
654 RPMSIGN_NEW_SIGNATURE = 'R', /*!< from --resign */
655 RPMSIGN_ADD_SIGNATURE = 'A', /*!< from --addsign */
656 RPMSIGN_IMPORT_PUBKEY = 'I', /*!< from --import */
663 extern struct poptOption rpmSignPoptTable[];
666 * Create/Modify/Check elements from signature header.
667 * @param ts transaction set
668 * @param qva mode flags and parameters
669 * @param argv array of arguments (NULL terminated)
670 * @return 0 on success
672 int rpmcliSign(rpmts ts, QVA_t qva, /*@null@*/ const char ** argv)
673 /*@globals RPMVERSION, rpmGlobalMacroContext,
674 fileSystem, internalState @*/
675 /*@modifies ts, qva, rpmGlobalMacroContext,
676 fileSystem, internalState @*/;
684 #endif /* H_RPMCLI */