diff options
Diffstat (limited to 'lib/rpmcli.h')
-rw-r--r-- | lib/rpmcli.h | 401 |
1 files changed, 401 insertions, 0 deletions
diff --git a/lib/rpmcli.h b/lib/rpmcli.h new file mode 100644 index 0000000..15a4c4c --- /dev/null +++ b/lib/rpmcli.h @@ -0,0 +1,401 @@ +#ifndef H_RPMCLI +#define H_RPMCLI + +/** \ingroup rpmcli rpmbuild + * \file lib/rpmcli.h + */ + +#include <popt.h> + +#include <rpm/rpmlib.h> +#include <rpm/rpmurl.h> +#include <rpm/rpmmacro.h> +#include <rpm/rpmcallback.h> +#include <rpm/rpmts.h> +#include <rpm/rpmfi.h> +#include <rpm/rpmvf.h> +#include <rpm/argv.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** \ingroup rpmcli + * Popt option table for options shared by all modes and executables. + */ +extern struct poptOption rpmcliAllPoptTable[]; + +extern const char * rpmcliPipeOutput; + +extern const char * rpmcliRcfile; + +extern const char * rpmcliRootDir; + +/** \ingroup rpmcli + * Initialize most everything needed by an rpm CLI executable context. + * @param argc no. of args + * @param argv arg array + * @param optionsTable popt option table + * @return popt context (or NULL) + */ +poptContext +rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable); + +/** \ingroup rpmcli + * Make sure that rpm configuration has been read. + * @warning Options like --rcfile and --verbose must precede callers option. + */ +void rpmcliConfigured(void); + +/** \ingroup rpmcli + * Destroy most everything needed by an rpm CLI executable context. + * @param optCon popt context + * @return NULL always + */ +poptContext +rpmcliFini(poptContext optCon); + +/** + * Common/global popt tokens used for command line option tables. + */ +#define RPMCLI_POPT_NODEPS -1025 +#define RPMCLI_POPT_FORCE -1026 +#define RPMCLI_POPT_NOMD5 -1027 +#define RPMCLI_POPT_NOFILEDIGEST -1027 /* same as obsolete RPMCLI_POPT_NOMD5 */ +#define RPMCLI_POPT_NOSCRIPTS -1028 +#define RPMCLI_POPT_NOSIGNATURE -1029 +#define RPMCLI_POPT_NODIGEST -1030 +#define RPMCLI_POPT_NOHDRCHK -1031 +#define RPMCLI_POPT_NOCONTEXTS -1032 + +/* ==================================================================== */ +/** \name RPMQV */ + +/** \ingroup rpmcli + * Query/Verify argument qualifiers. + * @todo Reassign to tag values. + */ +enum rpmQVSources_e { + RPMQV_PACKAGE = 0, /*!< ... from package name db search. */ + RPMQV_PATH, /*!< ... from file path db search. */ + RPMQV_ALL, /*!< ... from each installed package. */ + RPMQV_RPM, /*!< ... from reading binary rpm package. */ + RPMQV_GROUP, /*!< ... from group db search. */ + RPMQV_WHATPROVIDES, /*!< ... from provides db search. */ + RPMQV_WHATREQUIRES, /*!< ... from requires db search. */ + RPMQV_TRIGGEREDBY, /*!< ... from trigger db search. */ + RPMQV_DBOFFSET, /*!< ... from database header instance. */ + RPMQV_SPECRPMS, /*!< ... from spec file binaries (query only). */ + RPMQV_SPECFILE = RPMQV_SPECRPMS, /*!< ... backwards compatibility */ + RPMQV_PKGID, /*!< ... from package id (header+payload MD5). */ + RPMQV_HDRID, /*!< ... from header id (immutable header SHA1). */ + RPMQV_TID, /*!< ... from install transaction id (time stamp). */ + RPMQV_SPECSRPM, /*!< ... from spec file source (query only). */ +}; + +typedef rpmFlags rpmQVSources; + +/** \ingroup rpmcli + * Bit(s) to control rpmQuery() operation, stored in qva_flags. + * @todo Merge rpmQueryFlags, rpmVerifyFlags, and rpmVerifyAttrs?. + */ +enum rpmQueryFlags_e { + QUERY_FOR_DEFAULT = 0, /*!< */ + QUERY_MD5 = (1 << 0), /*!< from --nomd5 */ + QUERY_FILEDIGEST = (1 << 0), /*!< from --nofiledigest, same as --nomd5 */ + QUERY_SIZE = (1 << 1), /*!< from --nosize */ + QUERY_LINKTO = (1 << 2), /*!< from --nolink */ + QUERY_USER = (1 << 3), /*!< from --nouser) */ + QUERY_GROUP = (1 << 4), /*!< from --nogroup) */ + QUERY_MTIME = (1 << 5), /*!< from --nomtime) */ + QUERY_MODE = (1 << 6), /*!< from --nomode) */ + QUERY_RDEV = (1 << 7), /*!< from --nodev */ + /* bits 8-14 unused, reserved for rpmVerifyAttrs */ + QUERY_CONTEXTS = (1 << 15), /*!< verify: from --nocontexts */ + QUERY_FILES = (1 << 16), /*!< verify: from --nofiles */ + QUERY_DEPS = (1 << 17), /*!< verify: from --nodeps */ + QUERY_SCRIPT = (1 << 18), /*!< verify: from --noscripts */ + QUERY_DIGEST = (1 << 19), /*!< verify: from --nodigest */ + QUERY_SIGNATURE = (1 << 20), /*!< verify: from --nosignature */ + QUERY_PATCHES = (1 << 21), /*!< verify: from --nopatches */ + QUERY_HDRCHK = (1 << 22), /*!< verify: from --nohdrchk */ + QUERY_FOR_LIST = (1 << 23), /*!< query: from --list */ + QUERY_FOR_STATE = (1 << 24), /*!< query: from --state */ + QUERY_FOR_DOCS = (1 << 25), /*!< query: from --docfiles */ + QUERY_FOR_CONFIG = (1 << 26), /*!< query: from --configfiles */ + QUERY_FOR_DUMPFILES = (1 << 27) /*!< query: from --dump */ +}; + +typedef rpmFlags rpmQueryFlags; + +#define _QUERY_FOR_BITS \ + (QUERY_FOR_LIST|QUERY_FOR_STATE|QUERY_FOR_DOCS|QUERY_FOR_CONFIG|\ + QUERY_FOR_DUMPFILES) + +/** \ingroup rpmcli + * Bit(s) from common command line options. + */ +extern rpmQueryFlags rpmcliQueryFlags; + +/** \ingroup rpmcli + */ +typedef struct rpmQVKArguments_s * QVA_t; + +/** \ingroup rpmcli + * Function to display iterator matches. + * + * @param qva parsed query/verify options + * @param ts transaction set + * @param h header to use for query/verify + * @return 0 on success + */ +typedef int (*QVF_t) (QVA_t qva, rpmts ts, Header h); + +/** \ingroup rpmcli + * Function to query spec file. + * + * @param ts transaction set + * @param qva parsed query/verify options + * @param arg query argument + * @return 0 on success + */ +typedef int (*QSpecF_t) (rpmts ts, QVA_t qva, const char * arg); + +/** \ingroup rpmcli + * Describe query/verify/signature command line operation. + */ +struct rpmQVKArguments_s { + rpmQVSources qva_source; /*!< Identify CLI arg type. */ + int qva_sourceCount;/*!< Exclusive option check (>1 is error). */ + rpmQueryFlags qva_flags; /*!< Bit(s) to control operation. */ + rpmfileAttrs qva_fflags; /*!< Bit(s) to filter on attribute. */ + + QVF_t qva_showPackage; /*!< Function to display iterator matches. */ + QSpecF_t qva_specQuery; /*!< Function to query spec file. */ + char * qva_queryFormat; /*!< Format for headerFormat(). */ + char qva_mode; + /*!< + - 'q' from --query, -q + - 'Q' from --querytags + - 'V' from --verify, -V + - 'I' from --import + - 'K' from --checksig, -K + */ +}; + +/** \ingroup rpmcli + */ +extern struct rpmQVKArguments_s rpmQVKArgs; + +/** \ingroup rpmcli + */ +extern struct poptOption rpmQVSourcePoptTable[]; + +/** \ingroup rpmcli + */ +extern struct poptOption rpmQueryPoptTable[]; + +/** \ingroup rpmcli + */ +extern struct poptOption rpmVerifyPoptTable[]; + +/** \ingroup rpmcli + * Display list of tags that can be used in --queryformat. + * @param fp file handle to use for display + */ +void rpmDisplayQueryTags(FILE * fp); + +/** \ingroup rpmcli + * Display results of package query. + * @todo Devise a meaningful return code. + * @param qva parsed query/verify options + * @param ts transaction set + * @param h header to use for query + * @return 0 always + */ +int showQueryPackage(QVA_t qva, rpmts ts, Header h); + +/** \ingroup rpmcli + * Iterate over query/verify arg list. + * @param ts transaction set + * @param qva parsed query/verify options + * @param argv query argument(s) (or NULL) + * @return 0 on success, else no. of failures + */ +int rpmcliArgIter(rpmts ts, QVA_t qva, ARGV_const_t argv); + +/** \ingroup rpmcli + * Display package information. + * @todo hack: RPMQV_ALL can pass char ** arglist = NULL, not char * arg. Union? + * @param ts transaction set + * @param qva parsed query/verify options + * @param argv query argument(s) (or NULL) + * @return 0 on success, else no. of failures + */ +int rpmcliQuery(rpmts ts, QVA_t qva, ARGV_const_t argv); + +/** \ingroup rpmcli + * Display results of package verify. + * @param qva parsed query/verify options + * @param ts transaction set + * @param h header to use for verify + * @return result of last non-zero verify return + */ +int showVerifyPackage(QVA_t qva, rpmts ts, Header h); + +/** + * Check package and header signatures. + * @param qva parsed query/verify options + * @param ts transaction set + * @param fd package file handle + * @param fn package file name + * @return 0 on success, 1 on failure + */ +int rpmVerifySignatures(QVA_t qva, rpmts ts, FD_t fd, const char * fn); + +/** \ingroup rpmcli + * Verify package install. + * @todo hack: RPMQV_ALL can pass char ** arglist = NULL, not char * arg. Union? + * @param ts transaction set + * @param qva parsed query/verify options + * @param argv verify argument(s) (or NULL) + * @return 0 on success, else no. of failures + */ +int rpmcliVerify(rpmts ts, QVA_t qva, ARGV_const_t argv); + +/* ==================================================================== */ +/** \name RPMEIU */ +/* --- install/upgrade/erase modes */ + +/** \ingroup rpmcli + * Bit(s) to control rpmInstall() operation. + */ +enum rpmInstallFlags_e { + INSTALL_NONE = 0, + INSTALL_PERCENT = (1 << 0), /*!< from --percent */ + INSTALL_HASH = (1 << 1), /*!< from --hash */ + INSTALL_NODEPS = (1 << 2), /*!< from --nodeps */ + INSTALL_NOORDER = (1 << 3), /*!< from --noorder */ + INSTALL_LABEL = (1 << 4), /*!< from --verbose (notify) */ + INSTALL_UPGRADE = (1 << 5), /*!< from --upgrade */ + INSTALL_FRESHEN = (1 << 6), /*!< from --freshen */ + INSTALL_INSTALL = (1 << 7), /*!< from --install */ + INSTALL_ERASE = (1 << 8), /*!< from --erase */ + INSTALL_ALLMATCHES = (1 << 9) /*!< from --allmatches */ +}; + +typedef rpmFlags rpmInstallFlags; + +/** \ingroup rpmcli + * Bit(s) to control rpmErase() operation. + */ +#define UNINSTALL_NONE INSTALL_NONE +#define UNINSTALL_NODEPS INSTALL_NODEPS +#define UNINSTALL_ALLMATCHES INSTALL_ALLMATCHES + +extern int rpmcliPackagesTotal; +extern int rpmcliHashesCurrent; +extern int rpmcliHashesTotal; +extern int rpmcliProgressCurrent; +extern int rpmcliProgressTotal; + +/** \ingroup rpmcli + * The rpm CLI generic transaction callback handler. + * @todo Remove headerFormat() from the progress callback. + * @deprecated Transaction callback arguments need to change, so don't rely on + * this routine in the rpmcli API. + * + * @param arg per-callback private data (e.g. an rpm header) + * @param what callback identifier + * @param amount per-callback progress info + * @param total per-callback progress info + * @param key opaque header key (e.g. file name or PyObject) + * @param data private data (e.g. rpmInstallInterfaceFlags) + * @return per-callback data (e.g. an opened FD_t) + */ +void * rpmShowProgress(const void * arg, + const rpmCallbackType what, + const rpm_loff_t amount, + const rpm_loff_t total, + fnpyKey key, + void * data); + +/** \ingroup rpmcli + * Install source rpm package. + * @param ts transaction set + * @param arg source rpm file name + * @retval *specFilePtr (installed) spec file name + * @retval *cookie + * @return 0 on success + */ +int rpmInstallSource(rpmts ts, const char * arg, + char ** specFilePtr, + char ** cookie); + + +/** \ingroup rpmcli + * Describe database command line requests. + */ +struct rpmInstallArguments_s { + rpmtransFlags transFlags; + rpmprobFilterFlags probFilter; + rpmInstallFlags installInterfaceFlags; + int numRelocations; + int noDeps; + int incldocs; + rpmRelocation * relocations; + char * prefix; +}; + +/** \ingroup rpmcli + * Install/upgrade/freshen binary rpm package. + * @param ts transaction set + * @param ia mode flags and parameters + * @param fileArgv array of package file names (NULL terminated) + * @return 0 on success + * + * @todo fileArgv is modified on errors, should be ARGV_const_t + */ +int rpmInstall(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_t fileArgv); + +/** \ingroup rpmcli + * Erase binary rpm package. + * @param ts transaction set + * @param ia control args/bits + * @param argv array of package file names (NULL terminated) + * @return 0 on success + */ + +int rpmErase(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_const_t argv); + +/** \ingroup rpmcli + */ +extern struct rpmInstallArguments_s rpmIArgs; + +/** \ingroup rpmcli + */ +extern struct poptOption rpmInstallPoptTable[]; + +/* ==================================================================== */ +/** \name RPMK */ + +/** Import public key(s) to rpm keyring + * @param ts transaction set + * @param argv array of pubkey path arguments (NULL terminated) + * @return 0 on success + */ +int rpmcliImportPubkeys(rpmts ts, ARGV_const_t argv); + +/** \ingroup rpmcli + * Verify package signatures + * @param ts transaction set + * @param argv array of package path arguments (NULL terminated) + * @return 0 on success + */ +int rpmcliVerifySignatures(rpmts ts, ARGV_const_t argv); + +#ifdef __cplusplus +} +#endif + +#endif /* H_RPMCLI */ |