#ifndef H_RPMCLI #define H_RPMCLI /** \ingroup rpmcli rpmbuild * \file lib/rpmcli.h */ #include #include #include #include #include #include #include #include #include #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 */