csomh / source-git / rpm

Forked from source-git/rpm 4 years ago
Clone
2ff057
/** \ingroup rpmcli
2ff057
 * \file lib/poptQV.c
2ff057
 *  Popt tables for query/verify modes.
2ff057
 */
2ff057
2ff057
#include "system.h"
2ff057
2ff057
#include <rpm/rpmcli.h>
2ff057
#include "lib/rpmgi.h"	/* XXX for giFlags */
2ff057
2ff057
#include "debug.h"
2ff057
2ff057
struct rpmQVKArguments_s rpmQVKArgs;
2ff057
2ff057
#define POPT_QUERYFORMAT	-1000
2ff057
#define POPT_WHATREQUIRES	-1001
2ff057
#define POPT_WHATPROVIDES	-1002
2ff057
#define POPT_QUERYBYNUMBER	-1003
2ff057
#define POPT_TRIGGEREDBY	-1004
2ff057
#define POPT_DUMP		-1005
2ff057
#define POPT_QUERYBYPKGID	-1007
2ff057
#define POPT_QUERYBYHDRID	-1008
2ff057
#define POPT_QUERYBYTID		-1010
2ff057
#define POPT_WHATRECOMMENDS	-1011
2ff057
#define POPT_WHATSUGGESTS	-1012
2ff057
#define POPT_WHATSUPPLEMENTS	-1013
2ff057
#define POPT_WHATENHANCES	-1014
2ff057
#define POPT_WHATOBSOLETES	-1015
2ff057
#define POPT_WHATCONFLICTS	-1016
2ff057
2ff057
/* ========== Query/Verify/Signature source args */
2ff057
static void rpmQVSourceArgCallback( poptContext con,
2ff057
		enum poptCallbackReason reason,
2ff057
		const struct poptOption * opt, const char * arg, 
2ff057
		const void * data)
2ff057
{
2ff057
    QVA_t qva = &rpmQVKArgs;
2ff057
    rpmQVSources sources = qva->qva_source;;
2ff057
2ff057
    switch (opt->val) {
2ff057
    case 'q':	/* from --query, -q */
2ff057
    case 'Q':	/* from --querytags (handled by poptALL) */
2ff057
    case 'V':	/* from --verify, -V */
2ff057
	if (qva->qva_mode == '\0' || strchr("qQ ", qva->qva_mode)) {
2ff057
	    qva->qva_mode = opt->val;
2ff057
	}
2ff057
	break;
2ff057
    case 'a': qva->qva_source |= RPMQV_ALL; break;
2ff057
    case 'f': qva->qva_source |= RPMQV_PATH; break;
2ff057
    case 'g': qva->qva_source |= RPMQV_GROUP; break;
2ff057
    case 'p': qva->qva_source |= RPMQV_RPM; break;
2ff057
    case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES; break;
2ff057
    case POPT_WHATOBSOLETES: qva->qva_source |= RPMQV_WHATOBSOLETES; break;
2ff057
    case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES; break;
2ff057
    case POPT_WHATCONFLICTS: qva->qva_source |= RPMQV_WHATCONFLICTS; break;
2ff057
    case POPT_WHATRECOMMENDS: qva->qva_source |= RPMQV_WHATRECOMMENDS; break;
2ff057
    case POPT_WHATSUGGESTS: qva->qva_source |= RPMQV_WHATSUGGESTS; break;
2ff057
    case POPT_WHATSUPPLEMENTS: qva->qva_source |= RPMQV_WHATSUPPLEMENTS; break;
2ff057
    case POPT_WHATENHANCES: qva->qva_source |= RPMQV_WHATENHANCES; break;
2ff057
    case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY; break;
2ff057
    case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID; break;
2ff057
    case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID; break;
2ff057
    case POPT_QUERYBYTID: qva->qva_source |= RPMQV_TID; break;
2ff057
    case POPT_QUERYBYNUMBER: qva->qva_source |= RPMQV_DBOFFSET; break;
2ff057
    }
2ff057
2ff057
    if (sources != qva->qva_source)
2ff057
	qva->qva_sourceCount++;
2ff057
}
2ff057
2ff057
/**
2ff057
 * Common query/verify mode options.
2ff057
 */
2ff057
struct poptOption rpmQVSourcePoptTable[] = {
2ff057
/* FIX: cast? */
2ff057
 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
2ff057
	rpmQVSourceArgCallback, 0, NULL, NULL },
2ff057
 { "all", 'a', 0, 0, 'a',
2ff057
	N_("query/verify all packages"), NULL },
2ff057
 { "checksig", 'K', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'K',
2ff057
	N_("rpm checksig mode"), NULL },
2ff057
 { "file", 'f', 0, 0, 'f',
2ff057
	N_("query/verify package(s) owning file"), "FILE" },
2ff057
 { "group", 'g', 0, 0, 'g',
2ff057
	N_("query/verify package(s) in group"), "GROUP" },
2ff057
 { "package", 'p', 0, 0, 'p',
2ff057
	N_("query/verify a package file"), NULL },
2ff057
2ff057
 { "pkgid", '\0', 0, 0, POPT_QUERYBYPKGID,
2ff057
	N_("query/verify package(s) with package identifier"), "MD5" },
2ff057
 { "hdrid", '\0', 0, 0, POPT_QUERYBYHDRID,
2ff057
	N_("query/verify package(s) with header identifier"), "SHA1" },
2ff057
2ff057
 { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
2ff057
	N_("rpm query mode"), NULL },
2ff057
 { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYNUMBER,
2ff057
	N_("query/verify a header instance"), "HDRNUM" },
2ff057
 { "tid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYTID,
2ff057
	N_("query/verify package(s) from install transaction"), "TID" },
2ff057
 { "triggeredby", '\0', 0, 0, POPT_TRIGGEREDBY, 
2ff057
	N_("query the package(s) triggered by the package"), "PACKAGE" },
2ff057
 { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
2ff057
	N_("rpm verify mode"), NULL },
2ff057
 { "whatconflicts", '\0', 0, 0, POPT_WHATCONFLICTS, 
2ff057
	N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
2ff057
 { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES, 
2ff057
	N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
2ff057
 { "whatobsoletes", '\0', 0, 0, POPT_WHATOBSOLETES,
2ff057
	N_("query/verify the package(s) which obsolete a dependency"), "CAPABILITY" },
2ff057
 { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES, 
2ff057
	N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
2ff057
 { "whatrecommends", '\0', 0, 0, POPT_WHATRECOMMENDS,
2ff057
	N_("query/verify the package(s) which recommends a dependency"), "CAPABILITY" },
2ff057
 { "whatsuggests", '\0', 0, 0, POPT_WHATSUGGESTS,
2ff057
	N_("query/verify the package(s) which suggests a dependency"), "CAPABILITY" },
2ff057
 { "whatsupplements", '\0', 0, 0, POPT_WHATSUPPLEMENTS,
2ff057
	N_("query/verify the package(s) which supplements a dependency"), "CAPABILITY" },
2ff057
 { "whatenhances", '\0', 0, 0, POPT_WHATENHANCES,
2ff057
	N_("query/verify the package(s) which enhances a dependency"), "CAPABILITY" },
2ff057
2ff057
 { "noglob", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOGLOB,
2ff057
	N_("do not glob arguments"), NULL},
2ff057
 { "nomanifest", '\0', POPT_BIT_SET, &giFlags, RPMGI_NOMANIFEST,
2ff057
	N_("do not process non-package files as manifests"), NULL},
2ff057
2ff057
   POPT_TABLEEND
2ff057
};
2ff057
2ff057
/* ========== Query specific popt args */
2ff057
2ff057
static void queryArgCallback(poptContext con,
2ff057
		enum poptCallbackReason reason,
2ff057
		const struct poptOption * opt, const char * arg, 
2ff057
		const void * data)
2ff057
{
2ff057
    QVA_t qva = &rpmQVKArgs;
2ff057
2ff057
    switch (opt->val) {
2ff057
    case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
2ff057
    case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
2ff057
    case 'L': qva->qva_flags |= QUERY_FOR_LICENSE | QUERY_FOR_LIST; break;
2ff057
    case 'A': qva->qva_flags |= QUERY_FOR_ARTIFACT | QUERY_FOR_LIST; break;
2ff057
    case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
2ff057
    case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
2ff057
	break;
2ff057
    case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST;
2ff057
	break;
2ff057
2ff057
    case POPT_QUERYFORMAT:
2ff057
	rstrcat(&qva->qva_queryFormat, arg);
2ff057
	break;
2ff057
2ff057
    case 'i':
2ff057
	if (qva->qva_mode == 'q') {
2ff057
	    const char * infoCommand[] = { "--info", NULL };
2ff057
	    (void) poptStuffArgs(con, infoCommand);
2ff057
	}
2ff057
	break;
2ff057
2ff057
    case RPMCLI_POPT_NODEPS:
2ff057
	qva->qva_flags |= VERIFY_DEPS;
2ff057
	break;
2ff057
2ff057
    case RPMCLI_POPT_NOFILEDIGEST:
2ff057
	qva->qva_flags |= VERIFY_FILEDIGEST;
2ff057
	break;
2ff057
2ff057
    case RPMCLI_POPT_NOCONTEXTS:
2ff057
	qva->qva_flags |= VERIFY_CONTEXTS;
2ff057
	break;
2ff057
2ff057
    case RPMCLI_POPT_NOCAPS:
2ff057
	qva->qva_flags |= VERIFY_CAPS;
2ff057
	break;
2ff057
2ff057
#ifdef	NOTYET
2ff057
    case RPMCLI_POPT_FORCE:
2ff057
	ia->probFilter |=
2ff057
		( RPMPROB_FILTER_REPLACEPKG
2ff057
		| RPMPROB_FILTER_REPLACEOLDFILES
2ff057
		| RPMPROB_FILTER_REPLACENEWFILES
2ff057
		| RPMPROB_FILTER_OLDPACKAGE );
2ff057
	break;
2ff057
#endif
2ff057
2ff057
    case RPMCLI_POPT_NOSCRIPTS:
2ff057
	qva->qva_flags |= VERIFY_SCRIPT;
2ff057
	break;
2ff057
2ff057
    }
2ff057
}
2ff057
2ff057
/**
2ff057
 * Query mode options.
2ff057
 */
2ff057
struct poptOption rpmQueryPoptTable[] = {
2ff057
/* FIX: cast? */
2ff057
 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
2ff057
	queryArgCallback, 0, NULL, NULL },
2ff057
 { "configfiles", 'c', 0, 0, 'c',
2ff057
	N_("list all configuration files"), NULL },
2ff057
 { "docfiles", 'd', 0, 0, 'd',
2ff057
	N_("list all documentation files"), NULL },
2ff057
 { "licensefiles", 'L', 0, 0, 'L',
2ff057
	N_("list all license files"), NULL },
2ff057
 { "artifactfiles", 'A', 0, 0, 'A',
2ff057
	N_("list all artifact files"), NULL },
2ff057
 { "dump", '\0', 0, 0, POPT_DUMP,
2ff057
	N_("dump basic file information"), NULL },
2ff057
 { NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',
2ff057
	NULL, NULL },
2ff057
 { "list", 'l', 0, 0, 'l',
2ff057
	N_("list files in package"), NULL },
2ff057
2ff057
 /* Duplicate file attr flags from packages into command line options. */
2ff057
 { "noghost", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_fflags, RPMFILE_GHOST,
2ff057
        N_("skip %%ghost files"), NULL },
2ff057
 { "noconfig", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_fflags, RPMFILE_CONFIG,
2ff057
        N_("skip %%config files"), NULL },
2ff057
 { "noartifact", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_fflags, RPMFILE_ARTIFACT,
2ff057
        N_("skip %%artifact files"), NULL },
2ff057
2ff057
 { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0, 
2ff057
	POPT_QUERYFORMAT, NULL, NULL },
2ff057
 { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
2ff057
	N_("use the following query format"), "QUERYFORMAT" },
2ff057
 { "state", 's', 0, 0, 's',
2ff057
	N_("display the states of the listed files"), NULL },
2ff057
   POPT_TABLEEND
2ff057
};
2ff057
2ff057
/**
2ff057
 * Verify mode options.
2ff057
 */
2ff057
struct poptOption rpmVerifyPoptTable[] = {
2ff057
/* FIX: cast? */
2ff057
 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
2ff057
	queryArgCallback, 0, NULL, NULL },
2ff057
2ff057
 { "nofiledigest", '\0', 0, NULL, RPMCLI_POPT_NOFILEDIGEST,
2ff057
	N_("don't verify digest of files"), NULL },
2ff057
 { "nomd5", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOFILEDIGEST,
2ff057
	N_("don't verify digest of files"), NULL },
2ff057
 { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_flags, VERIFY_SIZE,
2ff057
        N_("don't verify size of files"), NULL },
2ff057
 { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_flags, VERIFY_LINKTO,
2ff057
        N_("don't verify symlink path of files"), NULL },
2ff057
 { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_flags, VERIFY_USER,
2ff057
        N_("don't verify owner of files"), NULL },
2ff057
 { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_flags, VERIFY_GROUP,
2ff057
        N_("don't verify group of files"), NULL },
2ff057
 { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_flags, VERIFY_MTIME,
2ff057
        N_("don't verify modification time of files"), NULL },
2ff057
 { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_flags, VERIFY_MODE,
2ff057
        N_("don't verify mode of files"), NULL },
2ff057
 { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmQVKArgs.qva_flags, VERIFY_RDEV,
2ff057
        N_("don't verify mode of files"), NULL },
2ff057
2ff057
 { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
2ff057
	N_("don't verify file security contexts"), NULL },
2ff057
 { "nocaps", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCAPS,
2ff057
	N_("don't verify capabilities of files"), NULL },
2ff057
 { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
2ff057
	N_("don't verify files in package"), NULL},
2ff057
 { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
2ff057
	N_("don't verify package dependencies"), NULL },
2ff057
2ff057
 { "noscript", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
2ff057
        N_("don't execute verify script(s)"), NULL },
2ff057
 /* XXX legacy had a trailing s on --noscript */
2ff057
 { "noscripts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOSCRIPTS,
2ff057
        N_("don't execute verify script(s)"), NULL },
2ff057
2ff057
    POPT_TABLEEND
2ff057
};