Blame lib/poptI.c

2ff057
/** \ingroup rpmcli
2ff057
 * \file lib/poptI.c
2ff057
 *  Popt tables for install modes.
2ff057
 */
2ff057
2ff057
#include "system.h"
2ff057
2ff057
#include <rpm/rpmcli.h>
2ff057
2ff057
#include "debug.h"
2ff057
2ff057
struct rpmInstallArguments_s rpmIArgs = {
2ff057
    0,			/* transFlags */
2ff057
    0,			/* probFilter */
2ff057
    0,			/* installInterfaceFlags */
2ff057
    0,			/* numRelocations */
2ff057
    0,			/* noDeps */
2ff057
    0,			/* incldocs */
2ff057
    NULL,		/* relocations */
2ff057
    NULL,		/* prefix */
2ff057
};
2ff057
2ff057
#define	POPT_RELOCATE		-1021
2ff057
#define	POPT_EXCLUDEPATH	-1022
2ff057
2ff057
RPM_GNUC_NORETURN
2ff057
static void argerror(const char * desc)
2ff057
{
2ff057
    fprintf(stderr, _("%s: %s\n"), xgetprogname(), desc);
2ff057
    exit(EXIT_FAILURE);
2ff057
}
2ff057
2ff057
/**
2ff057
 */
2ff057
static void installArgCallback( poptContext con,
2ff057
		enum poptCallbackReason reason,
2ff057
		const struct poptOption * opt, const char * arg,
2ff057
		const void * data)
2ff057
{
2ff057
    struct rpmInstallArguments_s * ia = &rpmIArgs;
2ff057
2ff057
    /* XXX avoid accidental collisions with POPT_BIT_SET for flags */
2ff057
    if (opt->arg == NULL)
2ff057
    switch (opt->val) {
2ff057
2ff057
    case 'i':
2ff057
	ia->installInterfaceFlags |= INSTALL_INSTALL;
2ff057
	break;
2ff057
2ff057
    case POPT_EXCLUDEPATH:
2ff057
	if (arg == NULL || *arg != '/') 
2ff057
	    argerror(_("exclude paths must begin with a /"));
2ff057
	ia->relocations = xrealloc(ia->relocations, 
2ff057
			sizeof(*ia->relocations) * (ia->numRelocations + 1));
2ff057
	ia->relocations[ia->numRelocations].oldPath = xstrdup(arg);
2ff057
	ia->relocations[ia->numRelocations].newPath = NULL;
2ff057
	ia->numRelocations++;
2ff057
	break;
2ff057
    case POPT_RELOCATE:
2ff057
      { char * oldPath = NULL;
2ff057
	char * newPath = NULL;
2ff057
	
2ff057
	if (arg == NULL || *arg != '/') 
2ff057
	    argerror(_("relocations must begin with a /"));
2ff057
	oldPath = xstrdup(arg);
2ff057
	if (!(newPath = strchr(oldPath, '=')))
2ff057
	    argerror(_("relocations must contain a ="));
2ff057
	*newPath++ = '\0';
2ff057
	if (*newPath != '/') 
2ff057
	    argerror(_("relocations must have a / following the ="));
2ff057
	ia->relocations = xrealloc(ia->relocations, 
2ff057
			sizeof(*ia->relocations) * (ia->numRelocations + 1));
2ff057
	ia->relocations[ia->numRelocations].oldPath = oldPath;
2ff057
	ia->relocations[ia->numRelocations].newPath = newPath;
2ff057
	ia->numRelocations++;
2ff057
      }	break;
2ff057
2ff057
    case RPMCLI_POPT_NODEPS:
2ff057
	ia->noDeps = 1;
2ff057
	break;
2ff057
2ff057
    case RPMCLI_POPT_NOFILEDIGEST:
2ff057
	ia->transFlags |= RPMTRANS_FLAG_NOFILEDIGEST;
2ff057
	break;
2ff057
2ff057
    case RPMCLI_POPT_NOCONTEXTS:
2ff057
	ia->transFlags |= RPMTRANS_FLAG_NOCONTEXTS;
2ff057
	break;
2ff057
2ff057
    case RPMCLI_POPT_NOCAPS:
2ff057
	ia->transFlags |= RPMTRANS_FLAG_NOCAPS;
2ff057
	break;
2ff057
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
2ff057
    case RPMCLI_POPT_NOSCRIPTS:
2ff057
	ia->transFlags |= (_noTransScripts | _noTransTriggers);
2ff057
	break;
2ff057
2ff057
    }
2ff057
}
2ff057
2ff057
/**
2ff057
 */
2ff057
struct poptOption rpmInstallPoptTable[] = {
2ff057
/* FIX: cast? */
2ff057
 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
2ff057
	installArgCallback, 0, NULL, NULL },
2ff057
2ff057
 { "allfiles", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_ALLFILES,
2ff057
  N_("install all files, even configurations which might otherwise be skipped"),
2ff057
	NULL},
2ff057
 { "allmatches", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.installInterfaceFlags, UNINSTALL_ALLMATCHES,
2ff057
	N_("remove all packages which match <package> (normally an error is generated if <package> specified multiple packages)"),
2ff057
	NULL},
2ff057
2ff057
 { "badreloc", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.probFilter, RPMPROB_FILTER_FORCERELOCATE,
2ff057
	N_("relocate files in non-relocatable package"), NULL},
2ff057
2ff057
 { "deploops", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
 	&rpmIArgs.transFlags, RPMTRANS_FLAG_DEPLOOPS,
2ff057
	N_("print dependency loops as warning"), NULL},
2ff057
2ff057
 { "erase", 'e', POPT_BIT_SET,
2ff057
	&rpmIArgs.installInterfaceFlags, INSTALL_ERASE,
2ff057
	N_("erase (uninstall) package"), N_("<package>+") },
2ff057
 { "excludeconfigs", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NOCONFIGS,
2ff057
	N_("do not install configuration files"), NULL},
2ff057
 { "excludedocs", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NODOCS,
2ff057
	N_("do not install documentation"), NULL},
2ff057
 { "excludepath", '\0', POPT_ARG_STRING, 0, POPT_EXCLUDEPATH,
2ff057
	N_("skip files with leading component <path> "),
2ff057
	N_("<path>") },
2ff057
2ff057
 { "force", '\0', 0, NULL, RPMCLI_POPT_FORCE,
2ff057
	N_("short hand for --replacepkgs --replacefiles"), NULL},
2ff057
2ff057
 { "freshen", 'F', POPT_BIT_SET, &rpmIArgs.installInterfaceFlags,
2ff057
	(INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL),
2ff057
	N_("upgrade package(s) if already installed"),
2ff057
	N_("<packagefile>+") },
2ff057
 { "hash", 'h', POPT_BIT_SET, &rpmIArgs.installInterfaceFlags, INSTALL_HASH,
2ff057
	N_("print hash marks as package installs (good with -v)"), NULL},
2ff057
 { "ignorearch", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.probFilter, RPMPROB_FILTER_IGNOREARCH,
2ff057
	N_("don't verify package architecture"), NULL},
2ff057
 { "ignoreos", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.probFilter, RPMPROB_FILTER_IGNOREOS,
2ff057
	N_("don't verify package operating system"), NULL},
2ff057
 { "ignoresize", '\0', POPT_BIT_SET, &rpmIArgs.probFilter,
2ff057
	(RPMPROB_FILTER_DISKSPACE|RPMPROB_FILTER_DISKNODES),
2ff057
	N_("don't check disk space before installing"), NULL},
2ff057
 { "noverify", '\0', POPT_BIT_SET, &rpmIArgs.probFilter,
2ff057
	(RPMPROB_FILTER_VERIFY),
2ff057
	N_("short hand for --ignorepayload --ignoresignature"), NULL},
2ff057
 { "includedocs", '\0', POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.incldocs, 0,
2ff057
	N_("install documentation"), NULL},
2ff057
2ff057
 { "install", 'i', 0, NULL, 'i',
2ff057
	N_("install package(s)"), N_("<packagefile>+") },
2ff057
2ff057
 { "justdb", '\0', POPT_BIT_SET, &rpmIArgs.transFlags, RPMTRANS_FLAG_JUSTDB,
2ff057
	N_("update the database, but do not modify the filesystem"), NULL},
2ff057
2ff057
 { "noconfigs", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NOCONFIGS,
2ff057
	N_("do not install configuration files"), NULL},
2ff057
 { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
2ff057
	N_("do not verify package dependencies"), NULL },
2ff057
 { "nodocs", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NODOCS,
2ff057
	N_("do not install documentation"), 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 (obsolete)"), NULL },
2ff057
 { "nocontexts", '\0',0,  NULL, RPMCLI_POPT_NOCONTEXTS,
2ff057
	N_("don't install file security contexts"), NULL},
2ff057
 { "nocaps", '\0',0,  NULL, RPMCLI_POPT_NOCAPS,
2ff057
	N_("don't install file capabilities"), NULL},
2ff057
2ff057
 { "noorder", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.installInterfaceFlags, INSTALL_NOORDER,
2ff057
	N_("do not reorder package installation to satisfy dependencies"),
2ff057
	NULL},
2ff057
2ff057
 { "noscripts", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
2ff057
	N_("do not execute package scriptlet(s)"), NULL },
2ff057
2ff057
 { "nopre", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
2ff057
	RPMTRANS_FLAG_NOPRE,
2ff057
	N_("do not execute %%pre scriptlet (if any)"), NULL },
2ff057
 { "nopost", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
2ff057
	RPMTRANS_FLAG_NOPOST,
2ff057
	N_("do not execute %%post scriptlet (if any)"), NULL },
2ff057
 { "nopreun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
2ff057
	RPMTRANS_FLAG_NOPREUN,
2ff057
	N_("do not execute %%preun scriptlet (if any)"), NULL },
2ff057
 { "nopostun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
2ff057
	RPMTRANS_FLAG_NOPOSTUN,
2ff057
	N_("do not execute %%postun scriptlet (if any)"), NULL },
2ff057
 { "nopretrans", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
2ff057
	RPMTRANS_FLAG_NOPRETRANS,
2ff057
	N_("do not execute %%pretrans scriptlet (if any)"), NULL },
2ff057
 { "noposttrans", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &rpmIArgs.transFlags,
2ff057
	RPMTRANS_FLAG_NOPOSTTRANS,
2ff057
	N_("do not execute %%posttrans scriptlet (if any)"), NULL },
2ff057
2ff057
 { "notriggers", '\0', POPT_BIT_SET, &rpmIArgs.transFlags, _noTransTriggers,
2ff057
	N_("do not execute any scriptlet(s) triggered by this package"), NULL},
2ff057
 { "notriggerprein", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERPREIN,
2ff057
	N_("do not execute any %%triggerprein scriptlet(s)"), NULL},
2ff057
 { "notriggerin", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERIN,
2ff057
	N_("do not execute any %%triggerin scriptlet(s)"), NULL},
2ff057
 { "notriggerun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERUN,
2ff057
	N_("do not execute any %%triggerun scriptlet(s)"), NULL},
2ff057
 { "notriggerpostun", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
2ff057
	&rpmIArgs.transFlags, RPMTRANS_FLAG_NOTRIGGERPOSTUN,
2ff057
	N_("do not execute any %%triggerpostun scriptlet(s)"), NULL},
2ff057
2ff057
 { "oldpackage", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.probFilter, RPMPROB_FILTER_OLDPACKAGE,
2ff057
	N_("upgrade to an old version of the package (--force on upgrades does this automatically)"),
2ff057
	NULL},
2ff057
 { "percent", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.installInterfaceFlags, INSTALL_PERCENT,
2ff057
	N_("print percentages as package installs"), NULL},
2ff057
 { "prefix", '\0', POPT_ARG_STRING, &rpmIArgs.prefix, 0,
2ff057
	N_("relocate the package to <dir>, if relocatable"),
2ff057
	N_("<dir>") },
2ff057
 { "relocate", '\0', POPT_ARG_STRING, 0, POPT_RELOCATE,
2ff057
	N_("relocate files from path <old> to <new>"),
2ff057
	N_("<old>=<new>") },
2ff057
 { "replacefiles", '\0', POPT_BIT_SET, &rpmIArgs.probFilter,
2ff057
	(RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_REPLACENEWFILES),
2ff057
	N_("ignore file conflicts between packages"), NULL},
2ff057
 { "replacepkgs", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.probFilter, RPMPROB_FILTER_REPLACEPKG,
2ff057
	N_("reinstall if the package is already present"), NULL},
2ff057
 { "test", '\0', POPT_BIT_SET, &rpmIArgs.transFlags, RPMTRANS_FLAG_TEST,
2ff057
	N_("don't install, but tell if it would work or not"), NULL},
2ff057
 { "upgrade", 'U', POPT_BIT_SET,
2ff057
	&rpmIArgs.installInterfaceFlags, (INSTALL_UPGRADE|INSTALL_INSTALL),
2ff057
	N_("upgrade package(s)"),
2ff057
	N_("<packagefile>+") },
2ff057
 { "reinstall", '\0', POPT_BIT_SET,
2ff057
	&rpmIArgs.installInterfaceFlags, (INSTALL_REINSTALL|INSTALL_INSTALL),
2ff057
	N_("reinstall package(s)"),
2ff057
	N_("<packagefile>+") },
2ff057
2ff057
   POPT_TABLEEND
2ff057
};