Blame lib/rpmcli.h

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