Add macro %isu_package to generate ISU Package
[platform/upstream/rpm.git] / rpmqv.c
diff --git a/rpmqv.c b/rpmqv.c
old mode 100755 (executable)
new mode 100644 (file)
index ebb265a..f029d81
--- a/rpmqv.c
+++ b/rpmqv.c
@@ -1,34 +1,19 @@
 #include "system.h"
 
-#define        _AUTOHELP
-
-#if defined(IAM_RPM) || defined(__LCLINT__)
-#define        IAM_RPMBT
-#define        IAM_RPMDB
-#define        IAM_RPMEIU
-#define        IAM_RPMQV
-#define        IAM_RPMK
-#endif
-
-#include <rpmcli.h>
-#include <rpmbuild.h>
+#include <rpm/rpmcli.h>
+#include <rpm/rpmlib.h>                        /* RPMSIGTAG, rpmReadPackageFile .. */
+#include <rpm/rpmlog.h>
+#include <rpm/rpmps.h>
+#include <rpm/rpmts.h>
 
-#include "rpmdb.h"
-#include "rpmps.h"
-#include "rpmts.h"
+#include "cliutils.h"
 
-#ifdef IAM_RPMBT
-#include "build.h"
-#define GETOPT_REBUILD         1003
-#define GETOPT_RECOMPILE       1004
-#endif
+#include "debug.h"
 
-#if defined(IAM_RPMBT) || defined(IAM_RPMK)
-#include "signature.h"
+#if defined(IAM_RPMQ) || defined(IAM_RPMV)
+#define IAM_RPMQV
 #endif
 
-#include "debug.h"
-
 enum modes {
 
     MODE_QUERY         = (1 <<  0),
@@ -39,60 +24,32 @@ enum modes {
     MODE_ERASE         = (1 <<  2),
 #define        MODES_IE (MODE_INSTALL | MODE_ERASE)
 
-    MODE_BUILD         = (1 <<  4),
-    MODE_REBUILD       = (1 <<  5),
-    MODE_RECOMPILE     = (1 <<  8),
-    MODE_TARBUILD      = (1 << 11),
-#define        MODES_BT (MODE_BUILD | MODE_TARBUILD | MODE_REBUILD | MODE_RECOMPILE)
-
-    MODE_CHECKSIG      = (1 <<  6),
-    MODE_RESIGN                = (1 <<  7),
-#define        MODES_K  (MODE_CHECKSIG | MODE_RESIGN)
-
-    MODE_INITDB                = (1 << 10),
-    MODE_REBUILDDB     = (1 << 12),
-    MODE_VERIFYDB      = (1 << 13),
-#define        MODES_DB (MODE_INITDB | MODE_REBUILDDB | MODE_VERIFYDB)
-
-
     MODE_UNKNOWN       = 0
 };
 
-#define        MODES_FOR_DBPATH        (MODES_BT | MODES_IE | MODES_QV | MODES_DB)
-#define        MODES_FOR_NODEPS        (MODES_BT | MODES_IE | MODE_VERIFY)
-#define        MODES_FOR_TEST          (MODES_BT | MODES_IE)
-#define        MODES_FOR_ROOT          (MODES_BT | MODES_IE | MODES_QV | MODES_DB | MODES_K)
+#define        MODES_FOR_NODEPS        (MODES_IE | MODE_VERIFY)
+#define        MODES_FOR_TEST          (MODES_IE)
+
+static int quiet;
 
 /* the structure describing the options we take and the defaults */
-/*@unchecked@*/
 static struct poptOption optionsTable[] = {
 
 #ifdef IAM_RPMQV
+ { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
+        N_("Query/Verify package selection options:"),
+        NULL },
+#endif
+#ifdef IAM_RPMQ
  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQueryPoptTable, 0,
        N_("Query options (with -q or --query):"),
        NULL },
+#endif
+#ifdef IAM_RPMV
  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmVerifyPoptTable, 0,
        N_("Verify options (with -V or --verify):"),
        NULL },
-#endif /* IAM_RPMQV */
-
-#ifdef IAM_RPMK
- { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmSignPoptTable, 0,
-       N_("Signature options:"),
-       NULL },
-#endif /* IAM_RPMK */
-
-#ifdef IAM_RPMDB
- { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmDatabasePoptTable, 0,
-       N_("Database options:"),
-       NULL },
-#endif /* IAM_RPMDB */
-
-#ifdef IAM_RPMBT
- { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmBuildPoptTable, 0,
-       N_("Build options with [ <specfile> | <tarball> | <source package> ]:"),
-       NULL },
-#endif /* IAM_RPMBT */
+#endif
 
 #ifdef IAM_RPMEIU
  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmInstallPoptTable, 0,
@@ -100,8 +57,10 @@ static struct poptOption optionsTable[] = {
        NULL },
 #endif /* IAM_RPMEIU */
 
+ { "quiet", '\0', POPT_ARGFLAG_DOC_HIDDEN, &quiet, 0, NULL, NULL},
+
  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
-       N_("Common options for all rpm modes:"),
+       N_("Common options for all rpm modes and executables:"),
        NULL },
 
    POPT_AUTOALIAS
@@ -109,60 +68,7 @@ static struct poptOption optionsTable[] = {
    POPT_TABLEEND
 };
 
-#ifdef __MINT__
-/* MiNT cannot dynamically increase the stack.  */
-long _stksize = 64 * 1024L;
-#endif
-
-/*@exits@*/ static void argerror(const char * desc)
-       /*@globals __assert_program_name, fileSystem @*/
-       /*@modifies fileSystem @*/
-{
-    fprintf(stderr, _("%s: %s\n"), __progname, desc);
-    exit(EXIT_FAILURE);
-}
-
-static void printVersion(FILE * fp)
-       /*@globals rpmEVR, fileSystem @*/
-       /*@modifies *fp, fileSystem @*/
-{
-    fprintf(fp, _("RPM version %s\n"), rpmEVR);
-}
-
-static void printBanner(FILE * fp)
-       /*@globals fileSystem @*/
-       /*@modifies *fp, fileSystem @*/
-{
-    fprintf(fp, _("Copyright (C) 1998-2002 - Red Hat, Inc.\n"));
-    fprintf(fp, _("This program may be freely redistributed under the terms of the GNU GPL\n"));
-}
-
-static void printUsage(poptContext con, FILE * fp, int flags)
-       /*@globals rpmEVR, fileSystem, internalState @*/
-       /*@modifies *fp, fileSystem, internalState @*/
-{
-    printVersion(fp);
-    printBanner(fp);
-    fprintf(fp, "\n");
-
-    if (rpmIsVerbose())
-       poptPrintHelp(con, fp, flags);
-    else
-       poptPrintUsage(con, fp, flags);
-}
-
-/*@-bounds@*/ /* LCL: segfault */
-/*@-mods@*/ /* FIX: shrug */
-#if !defined(__GLIBC__) && !defined(__LCLINT__)
-int main(int argc, const char ** argv, /*@unused@*/ char ** envp)
-#else
-int main(int argc, const char ** argv)
-#endif
-       /*@globals __assert_program_name, rpmEVR, RPMVERSION,
-               rpmGlobalMacroContext, rpmCLIMacroContext,
-               h_errno, fileSystem, internalState@*/
-       /*@modifies __assert_program_name,
-               fileSystem, internalState@*/
+int main(int argc, char *argv[])
 {
     rpmts ts = NULL;
     enum modes bigMode = MODE_UNKNOWN;
@@ -171,184 +77,39 @@ int main(int argc, const char ** argv)
     QVA_t qva = &rpmQVKArgs;
 #endif
 
-#ifdef IAM_RPMBT
-    BTA_t ba = &rpmBTArgs;
-#endif
-
 #ifdef IAM_RPMEIU
    struct rpmInstallArguments_s * ia = &rpmIArgs;
 #endif
 
-#if defined(IAM_RPMDB)
-   struct rpmDatabaseArguments_s * da = &rpmDBArgs;
-#endif
-
-#if defined(IAM_RPMK)
-   QVA_t ka = &rpmQVKArgs;
-#endif
-
-#if defined(IAM_RPMBT) || defined(IAM_RPMK)
-    char * passPhrase = "";
-#endif
-
-    int arg;
-
-    const char * optArg;
-    pid_t pipeChild = 0;
     poptContext optCon;
     int ec = 0;
-    int status;
-    int p[2];
 #ifdef IAM_RPMEIU
     int i;
 #endif
-       
-#if HAVE_MCHECK_H && HAVE_MTRACE
-    /*@-noeffect@*/
-    mtrace();  /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
-    /*@=noeffect@*/
-#endif
-    setprogname(argv[0]);      /* Retrofit glibc __progname */
 
-#if !defined(__GLIBC__) && !defined(__LCLINT__)
-    environ = envp;
-#endif  
+    xsetprogname(argv[0]); /* Portability call -- see system.h */
 
-    /* XXX glibc churn sanity */
-    if (__progname == NULL) {
-       if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
-       else __progname = argv[0];
-    }
+    optCon = rpmcliInit(argc, argv, optionsTable);
 
     /* Set the major mode based on argv[0] */
-    /*@-nullpass@*/
-#ifdef IAM_RPMBT
-    if (!strcmp(__progname, "rpmb"))   bigMode = MODE_BUILD;
-    if (!strcmp(__progname, "lt-rpmb"))        bigMode = MODE_BUILD;
-    if (!strcmp(__progname, "rpmt"))   bigMode = MODE_TARBUILD;
-    if (!strcmp(__progname, "rpmbuild"))       bigMode = MODE_BUILD;
-#endif
 #ifdef IAM_RPMQV
-    if (!strcmp(__progname, "rpmq"))   bigMode = MODE_QUERY;
-    if (!strcmp(__progname, "lt-rpmq"))        bigMode = MODE_QUERY;
-    if (!strcmp(__progname, "rpmv"))   bigMode = MODE_VERIFY;
-    if (!strcmp(__progname, "rpmquery"))       bigMode = MODE_QUERY;
-    if (!strcmp(__progname, "rpmverify"))      bigMode = MODE_VERIFY;
+    if (rstreq(xgetprogname(), "rpmquery"))    bigMode = MODE_QUERY;
+    if (rstreq(xgetprogname(), "rpmverify")) bigMode = MODE_VERIFY;
 #endif
-#ifdef RPMEIU
-    if (!strcmp(__progname, "rpme"))   bigMode = MODE_ERASE;
-    if (!strcmp(__progname, "rpmi"))   bigMode = MODE_INSTALL;
-    if (!strcmp(__progname, "lt-rpmi"))        bigMode = MODE_INSTALL;
-    if (!strcmp(__progname, "rpmu"))   bigMode = MODE_INSTALL;
-#endif
-    /*@=nullpass@*/
 
 #if defined(IAM_RPMQV)
     /* Jumpstart option from argv[0] if necessary. */
     switch (bigMode) {
     case MODE_QUERY:   qva->qva_mode = 'q';    break;
     case MODE_VERIFY:  qva->qva_mode = 'V';    break;
-    case MODE_CHECKSIG:        qva->qva_mode = 'K';    break;
-    case MODE_RESIGN:  qva->qva_mode = 'R';    break;
     case MODE_INSTALL:
     case MODE_ERASE:
-    case MODE_BUILD:
-    case MODE_REBUILD:
-    case MODE_RECOMPILE:
-    case MODE_TARBUILD:
-    case MODE_INITDB:
-    case MODE_REBUILDDB:
-    case MODE_VERIFYDB:
     case MODE_UNKNOWN:
     default:
        break;
     }
 #endif
 
-#if defined(ENABLE_NLS)
-    /* set up the correct locale */
-    (void) setlocale(LC_ALL, "" );
-
-#ifdef __LCLINT__
-#define        LOCALEDIR       "/usr/share/locale"
-#endif
-    bindtextdomain(PACKAGE, LOCALEDIR);
-    textdomain(PACKAGE);
-#endif
-
-    rpmSetVerbosity(RPMMESS_NORMAL);   /* XXX silly use by showrc */
-
-    /* Make a first pass through the arguments, looking for --rcfile */
-    /* We need to handle that before dealing with the rest of the arguments. */
-    /*@-nullpass -temptrans@*/
-    optCon = poptGetContext(__progname, argc, argv, optionsTable, 0);
-    /*@=nullpass =temptrans@*/
-    (void) poptReadConfigFile(optCon, LIBRPMALIAS_FILENAME);
-    (void) poptReadDefaultConfig(optCon, 1);
-    poptSetExecPath(optCon, RPMCONFIGDIR, 1);
-
-    while ((arg = poptGetNextOpt(optCon)) > 0) {
-       optArg = poptGetOptArg(optCon);
-
-       switch (arg) {
-       default:
-           fprintf(stderr, _("Internal error in argument processing (%d) :-(\n"), arg);
-           exit(EXIT_FAILURE);
-       }
-    }
-
-    if (arg < -1) {
-       fprintf(stderr, "%s: %s\n", 
-               poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-               poptStrerror(arg));
-       exit(EXIT_FAILURE);
-    }
-
-    rpmcliConfigured();
-
-#ifdef IAM_RPMBT
-    switch (ba->buildMode) {
-    case 'b':  bigMode = MODE_BUILD;           break;
-    case 't':  bigMode = MODE_TARBUILD;        break;
-    case 'B':  bigMode = MODE_REBUILD;         break;
-    case 'C':  bigMode = MODE_RECOMPILE;       break;
-    }
-
-    if ((ba->buildAmount & RPMBUILD_RMSOURCE) && bigMode == MODE_UNKNOWN)
-       bigMode = MODE_BUILD;
-
-    if ((ba->buildAmount & RPMBUILD_RMSPEC) && bigMode == MODE_UNKNOWN)
-       bigMode = MODE_BUILD;
-
-    if (ba->buildRootOverride && bigMode != MODE_BUILD &&
-       bigMode != MODE_REBUILD && bigMode != MODE_TARBUILD) {
-       argerror("--buildroot may only be used during package builds");
-    }
-#endif /* IAM_RPMBT */
-    
-#ifdef IAM_RPMDB
-  if (bigMode == MODE_UNKNOWN || (bigMode & MODES_DB)) {
-    if (da->init) {
-       if (bigMode != MODE_UNKNOWN) 
-           argerror(_("only one major mode may be specified"));
-       else
-           bigMode = MODE_INITDB;
-    } else
-    if (da->rebuild) {
-       if (bigMode != MODE_UNKNOWN) 
-           argerror(_("only one major mode may be specified"));
-       else
-           bigMode = MODE_REBUILDDB;
-    } else
-    if (da->verify) {
-       if (bigMode != MODE_UNKNOWN) 
-           argerror(_("only one major mode may be specified"));
-       else
-           bigMode = MODE_VERIFYDB;
-    }
-  }
-#endif /* IAM_RPMDB */
-
 #ifdef IAM_RPMQV
   if (bigMode == MODE_UNKNOWN || (bigMode & MODES_QV)) {
     switch (qva->qva_mode) {
@@ -357,7 +118,7 @@ int main(int argc, const char ** argv)
     }
 
     if (qva->qva_sourceCount) {
-       if (qva->qva_sourceCount > 2)
+       if (qva->qva_sourceCount > 1)
            argerror(_("one type of query/verify may be performed at a "
                        "time"));
     }
@@ -375,7 +136,8 @@ int main(int argc, const char ** argv)
 #ifdef IAM_RPMEIU
   if (bigMode == MODE_UNKNOWN || (bigMode & MODES_IE))
     {  int iflags = (ia->installInterfaceFlags &
-               (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL));
+                       (INSTALL_UPGRADE|INSTALL_FRESHEN|
+                        INSTALL_INSTALL|INSTALL_REINSTALL));
        int eflags = (ia->installInterfaceFlags & INSTALL_ERASE);
 
        if (iflags & eflags)
@@ -387,30 +149,10 @@ int main(int argc, const char ** argv)
     }
 #endif /* IAM_RPMEIU */
 
-#ifdef IAM_RPMK
-  if (bigMode == MODE_UNKNOWN || (bigMode & MODES_K)) {
-       switch (ka->qva_mode) {
-       case RPMSIGN_NONE:
-           ka->sign = 0;
-           break;
-       case RPMSIGN_IMPORT_PUBKEY:
-       case RPMSIGN_CHK_SIGNATURE:
-           bigMode = MODE_CHECKSIG;
-           ka->sign = 0;
-           break;
-       case RPMSIGN_ADD_SIGNATURE:
-       case RPMSIGN_NEW_SIGNATURE:
-           bigMode = MODE_RESIGN;
-           ka->sign = 1;
-           break;
-       }
-  }
-#endif /* IAM_RPMK */
-
 #if defined(IAM_RPMEIU)
     if (!( bigMode == MODE_INSTALL ) &&
-(ia->probFilter & (RPMPROB_FILTER_REPLACEPKG | RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_REPLACENEWFILES | RPMPROB_FILTER_OLDPACKAGE)))
-       argerror(_("only installation, upgrading, rmsource and rmspec may be forced"));
+(ia->probFilter & (RPMPROB_FILTER_REPLACEPKG | RPMPROB_FILTER_OLDPACKAGE)))
+       argerror(_("only installation and upgrading may be forced"));
     if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_FORCERELOCATE))
        argerror(_("files may only be relocated during package installation"));
 
@@ -426,18 +168,13 @@ int main(int argc, const char ** argv)
     if (ia->prefix && ia->prefix[0] != '/') 
        argerror(_("arguments to --prefix must begin with a /"));
 
-    if (bigMode != MODE_INSTALL && (ia->installInterfaceFlags & INSTALL_HASH))
+    if (!(bigMode & MODES_IE) && (ia->installInterfaceFlags & INSTALL_HASH))
        argerror(_("--hash (-h) may only be specified during package "
-                       "installation"));
+                       "installation and erasure"));
 
-    if (bigMode != MODE_INSTALL && (ia->installInterfaceFlags & INSTALL_PERCENT))
+    if (!(bigMode & MODES_IE) && (ia->installInterfaceFlags & INSTALL_PERCENT))
        argerror(_("--percent may only be specified during package "
-                       "installation"));
-
-    if (bigMode != MODE_INSTALL &&
- (ia->probFilter & (RPMPROB_FILTER_REPLACEOLDFILES|RPMPROB_FILTER_REPLACENEWFILES)))
-       argerror(_("--replacefiles may only be specified during package "
-                       "installation"));
+                       "installation and erasure"));
 
     if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_REPLACEPKG))
        argerror(_("--replacepkgs may only be specified during package "
@@ -463,12 +200,12 @@ int main(int argc, const char ** argv)
        argerror(_("--ignoreos may only be specified during package "
                   "installation"));
 
-    if (bigMode != MODE_INSTALL &&
+    if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE &&
        (ia->probFilter & (RPMPROB_FILTER_DISKSPACE|RPMPROB_FILTER_DISKNODES)))
        argerror(_("--ignoresize may only be specified during package "
                   "installation"));
 
-    if ((ia->eraseInterfaceFlags & UNINSTALL_ALLMATCHES) && bigMode != MODE_ERASE)
+    if ((ia->installInterfaceFlags & UNINSTALL_ALLMATCHES) && bigMode != MODE_ERASE)
        argerror(_("--allmatches may only be specified during package "
                   "erasure"));
 
@@ -481,263 +218,46 @@ int main(int argc, const char ** argv)
        argerror(_("--justdb may only be specified during package "
                   "installation and erasure"));
 
-    if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE &&
+    if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE && bigMode != MODE_VERIFY &&
        (ia->transFlags & (RPMTRANS_FLAG_NOSCRIPTS | _noTransScripts | _noTransTriggers)))
        argerror(_("script disabling options may only be specified during "
                   "package installation and erasure"));
 
-    if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE &&
+    if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE && bigMode != MODE_VERIFY &&
        (ia->transFlags & (RPMTRANS_FLAG_NOTRIGGERS | _noTransTriggers)))
        argerror(_("trigger disabling options may only be specified during "
                   "package installation and erasure"));
 
     if (ia->noDeps & (bigMode & ~MODES_FOR_NODEPS))
        argerror(_("--nodeps may only be specified during package "
-                  "building, rebuilding, recompilation, installation,"
-                  "erasure, and verification"));
+                  "installation, erasure, and verification"));
 
     if ((ia->transFlags & RPMTRANS_FLAG_TEST) && (bigMode & ~MODES_FOR_TEST))
-       argerror(_("--test may only be specified during package installation, "
-                "erasure, and building"));
+       argerror(_("--test may only be specified during package installation "
+                "and erasure"));
 #endif /* IAM_RPMEIU */
 
-    if (rpmcliRootDir && rpmcliRootDir[1] && (bigMode & ~MODES_FOR_ROOT))
-       argerror(_("--root (-r) may only be specified during "
-                "installation, erasure, querying, and "
-                "database rebuilds"));
-
-    if (rpmcliRootDir) {
-       switch (urlIsURL(rpmcliRootDir)) {
-       default:
-           if (bigMode & MODES_FOR_ROOT)
-               break;
-           /*@fallthrough@*/
-       case URL_IS_UNKNOWN:
-           if (rpmcliRootDir[0] != '/')
-               argerror(_("arguments to --root (-r) must begin with a /"));
-           break;
-       }
+    if (rpmcliRootDir && rpmcliRootDir[0] != '/') {
+       argerror(_("arguments to --root (-r) must begin with a /"));
     }
 
-#if defined(IAM_RPMBT) || defined(IAM_RPMK)
-    if (0
-#if defined(IAM_RPMBT)
-    || ba->sign 
-#endif
-#if defined(IAM_RPMK)
-    || ka->sign
-#endif
-    )
-    /*@-branchstate@*/
-    {
-        if (bigMode == MODE_REBUILD || bigMode == MODE_BUILD ||
-           bigMode == MODE_RESIGN || bigMode == MODE_TARBUILD)
-       {
-           const char ** av;
-           struct stat sb;
-           int errors = 0;
-
-           if ((av = poptGetArgs(optCon)) == NULL) {
-               fprintf(stderr, _("no files to sign\n"));
-               errors++;
-           } else
-           while (*av) {
-               if (stat(*av, &sb)) {
-                   fprintf(stderr, _("cannot access file %s\n"), *av);
-                   errors++;
-               }
-               av++;
-           }
-
-           if (errors) {
-               ec = errors;
-               goto exit;
-           }
-
-            if (poptPeekArg(optCon)) {
-               int sigTag;
-               switch (sigTag = rpmLookupSignatureType(RPMLOOKUPSIG_QUERY)) {
-                 case 0:
-                   break;
-                 case RPMSIGTAG_PGP:
-                   if ((sigTag == RPMSIGTAG_PGP || sigTag == RPMSIGTAG_PGP5) &&
-                       !rpmDetectPGPVersion(NULL)) {
-                       fprintf(stderr, _("pgp not found: "));
-                       ec = EXIT_FAILURE;
-                       goto exit;
-                   }   /*@fallthrough@*/
-                 case RPMSIGTAG_GPG:
-                   passPhrase = rpmGetPassPhrase(_("Enter pass phrase: "), sigTag);
-                   if (passPhrase == NULL) {
-                       fprintf(stderr, _("Pass phrase check failed\n"));
-                       ec = EXIT_FAILURE;
-                       goto exit;
-                   }
-                   fprintf(stderr, _("Pass phrase is good.\n"));
-                   passPhrase = xstrdup(passPhrase);
-                   break;
-                 default:
-                   fprintf(stderr,
-                           _("Invalid %%_signature spec in macro file.\n"));
-                   ec = EXIT_FAILURE;
-                   goto exit;
-                   /*@notreached@*/ break;
-               }
-           }
-       } else {
-           argerror(_("--sign may only be used during package building"));
-       }
-    } else {
-       /* Make rpmLookupSignatureType() return 0 ("none") from now on */
-        (void) rpmLookupSignatureType(RPMLOOKUPSIG_DISABLE);
-    }
-    /*@=branchstate@*/
-#endif /* IAM_RPMBT || IAM_RPMK */
-
-    if (rpmcliPipeOutput) {
-       (void) pipe(p);
-
-       if (!(pipeChild = fork())) {
-           (void) close(p[1]);
-           (void) dup2(p[0], STDIN_FILENO);
-           (void) close(p[0]);
-           (void) execl("/bin/sh", "/bin/sh", "-c", rpmcliPipeOutput, NULL);
-           fprintf(stderr, _("exec failed\n"));
-       }
+    if (quiet)
+       rpmSetVerbosity(RPMLOG_WARNING);
 
-       (void) close(p[0]);
-       (void) dup2(p[1], STDOUT_FILENO);
-       (void) close(p[1]);
-    }
+    if (rpmcliPipeOutput && initPipe())
+       exit(EXIT_FAILURE);
        
     ts = rpmtsCreate();
     (void) rpmtsSetRootDir(ts, rpmcliRootDir);
     switch (bigMode) {
-#ifdef IAM_RPMDB
-    case MODE_INITDB:
-       (void) rpmtsInitDB(ts, 0644);
-       break;
-
-    case MODE_REBUILDDB:
-    {   rpmVSFlags vsflags = rpmExpandNumeric("%{_vsflags_rebuilddb}");
-       rpmVSFlags ovsflags = rpmtsSetVSFlags(ts, vsflags);
-       ec = rpmtsRebuildDB(ts);
-       vsflags = rpmtsSetVSFlags(ts, ovsflags);
-    }  break;
-    case MODE_VERIFYDB:
-       ec = rpmtsVerifyDB(ts);
-       break;
-#endif /* IAM_RPMDB */
-
-#ifdef IAM_RPMBT
-    case MODE_REBUILD:
-    case MODE_RECOMPILE:
-    {  const char * pkg;
-
-        while (!rpmIsVerbose())
-           rpmIncreaseVerbosity();
-
-       if (!poptPeekArg(optCon))
-           argerror(_("no packages files given for rebuild"));
-
-       ba->buildAmount =
-           RPMBUILD_PREP | RPMBUILD_BUILD | RPMBUILD_INSTALL | RPMBUILD_CHECK;
-       if (bigMode == MODE_REBUILD) {
-           ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
-           ba->buildAmount |= RPMBUILD_RMSOURCE;
-           ba->buildAmount |= RPMBUILD_RMSPEC;
-           ba->buildAmount |= RPMBUILD_CLEAN;
-           ba->buildAmount |= RPMBUILD_RMBUILD;
-       }
-
-       while ((pkg = poptGetArg(optCon))) {
-           const char * specFile = NULL;
-
-           ba->cookie = NULL;
-           ec = rpmInstallSource(ts, pkg, &specFile, &ba->cookie);
-           if (ec == 0) {
-               ba->rootdir = rpmcliRootDir;
-               ba->passPhrase = passPhrase;
-               ec = build(ts, specFile, ba, rpmcliRcfile);
-           }
-           ba->cookie = _free(ba->cookie);
-           specFile = _free(specFile);
-
-           if (ec)
-               /*@loopbreak@*/ break;
-       }
-
-    }  break;
-
-    case MODE_BUILD:
-    case MODE_TARBUILD:
-    {  const char * pkg;
-        while (!rpmIsVerbose())
-           rpmIncreaseVerbosity();
-       
-       switch (ba->buildChar) {
-       case 'a':
-           ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
-           /*@fallthrough@*/
-       case 'b':
-           ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
-           ba->buildAmount |= RPMBUILD_CLEAN;
-           /*@fallthrough@*/
-       case 'i':
-           ba->buildAmount |= RPMBUILD_INSTALL;
-           ba->buildAmount |= RPMBUILD_CHECK;
-           if ((ba->buildChar == 'i') && ba->shortCircuit)
-               /*@innerbreak@*/ break;
-           /*@fallthrough@*/
-       case 'c':
-           ba->buildAmount |= RPMBUILD_BUILD;
-           if ((ba->buildChar == 'c') && ba->shortCircuit)
-               /*@innerbreak@*/ break;
-           /*@fallthrough@*/
-       case 'p':
-           ba->buildAmount |= RPMBUILD_PREP;
-           /*@innerbreak@*/ break;
-           
-       case 'l':
-           ba->buildAmount |= RPMBUILD_FILECHECK;
-           /*@innerbreak@*/ break;
-       case 's':
-           ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
-           /*@innerbreak@*/ break;
-       }
-
-       if (!poptPeekArg(optCon)) {
-           if (bigMode == MODE_BUILD)
-               argerror(_("no spec files given for build"));
-           else
-               argerror(_("no tar files given for build"));
-       }
-
-       while ((pkg = poptGetArg(optCon))) {
-           ba->rootdir = rpmcliRootDir;
-           ba->passPhrase = passPhrase;
-           ba->cookie = NULL;
-           ec = build(ts, pkg, ba, rpmcliRcfile);
-           if (ec)
-               /*@loopbreak@*/ break;
-           rpmFreeMacros(NULL);
-           (void) rpmReadConfigFiles(rpmcliRcfile, NULL);
-       }
-    }  break;
-#endif /* IAM_RPMBT */
-
 #ifdef IAM_RPMEIU
     case MODE_ERASE:
-       if (ia->noDeps) ia->eraseInterfaceFlags |= UNINSTALL_NODEPS;
+       if (ia->noDeps) ia->installInterfaceFlags |= UNINSTALL_NODEPS;
 
        if (!poptPeekArg(optCon)) {
-           if (ia->rbtid == 0)
-               argerror(_("no packages given for erase"));
-ia->transFlags |= RPMTRANS_FLAG_NOMD5;
-ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
-           ec += rpmRollback(ts, ia, NULL);
+           argerror(_("no packages given for erase"));
        } else {
-           ec += rpmErase(ts, ia, (const char **) poptGetArgs(optCon));
+           ec += rpmErase(ts, ia, (ARGV_const_t) poptGetArgs(optCon));
        }
        break;
 
@@ -755,7 +275,6 @@ ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
        if (ia->noDeps) ia->installInterfaceFlags |= INSTALL_NODEPS;
 
        /* we've already ensured !(!ia->prefix && !ia->relocations) */
-       /*@-branchstate@*/
        if (ia->prefix) {
            ia->relocations = xmalloc(2 * sizeof(*ia->relocations));
            ia->relocations[0].oldPath = NULL;   /* special case magic */
@@ -768,18 +287,12 @@ ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
            ia->relocations[ia->numRelocations].oldPath = NULL;
            ia->relocations[ia->numRelocations].newPath = NULL;
        }
-       /*@=branchstate@*/
 
        if (!poptPeekArg(optCon)) {
-           if (ia->rbtid == 0)
-               argerror(_("no packages given for install"));
-ia->transFlags |= RPMTRANS_FLAG_NOMD5;
-ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
-/*@i@*/            ec += rpmRollback(ts, ia, NULL);
+           argerror(_("no packages given for install"));
        } else {
-           /*@-compdef -compmempass@*/ /* FIX: ia->relocations[0].newPath undefined */
-           ec += rpmInstall(ts, ia, (const char **)poptGetArgs(optCon));
-           /*@=compdef =compmempass@*/
+           /* FIX: ia->relocations[0].newPath undefined */
+           ec += rpmInstall(ts, ia, (ARGV_t) poptGetArgs(optCon));
        }
        break;
 
@@ -787,12 +300,10 @@ ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
 
 #ifdef IAM_RPMQV
     case MODE_QUERY:
-       if (qva->qva_source != RPMQV_ALL && !poptPeekArg(optCon))
+       if (!poptPeekArg(optCon) && !(qva->qva_source == RPMQV_ALL))
            argerror(_("no arguments given for query"));
 
-       qva->qva_specQuery = rpmspecQuery;
-       ec = rpmcliQuery(ts, qva, (const char **) poptGetArgs(optCon));
-       qva->qva_specQuery = NULL;
+       ec = rpmcliQuery(ts, qva, (ARGV_const_t) poptGetArgs(optCon));
        break;
 
     case MODE_VERIFY:
@@ -801,110 +312,49 @@ ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
        verifyFlags &= ~qva->qva_flags;
        qva->qva_flags = (rpmQueryFlags) verifyFlags;
 
-       if (qva->qva_source != RPMQV_ALL && !poptPeekArg(optCon))
+       rpmtsSetFlags(ts, rpmtsFlags(ts) | (ia->transFlags & RPMTRANS_FLAG_NOPLUGINS));
+
+       if (!poptPeekArg(optCon) && !(qva->qva_source == RPMQV_ALL))
            argerror(_("no arguments given for verify"));
-       ec = rpmcliVerify(ts, qva, (const char **) poptGetArgs(optCon));
+       ec = rpmcliVerify(ts, qva, (ARGV_const_t) poptGetArgs(optCon));
     }  break;
 #endif /* IAM_RPMQV */
 
-#ifdef IAM_RPMK
-    case MODE_CHECKSIG:
-    {  rpmVerifyFlags verifyFlags =
-               (VERIFY_MD5|VERIFY_DIGEST|VERIFY_SIGNATURE);
-
-       verifyFlags &= ~ka->qva_flags;
-       ka->qva_flags = (rpmQueryFlags) verifyFlags;
-    }   /*@fallthrough@*/
-    case MODE_RESIGN:
-       if (!poptPeekArg(optCon))
-           argerror(_("no arguments given"));
-       ka->passPhrase = passPhrase;
-       ec = rpmcliSign(ts, ka, (const char **)poptGetArgs(optCon));
-       break;
-#endif /* IAM_RPMK */
-       
 #if !defined(IAM_RPMQV)
     case MODE_QUERY:
     case MODE_VERIFY:
 #endif
-#if !defined(IAM_RPMK)
-    case MODE_CHECKSIG:
-    case MODE_RESIGN:
-#endif
-#if !defined(IAM_RPMDB)
-    case MODE_INITDB:
-    case MODE_REBUILDDB:
-    case MODE_VERIFYDB:
-#endif
-#if !defined(IAM_RPMBT)
-    case MODE_BUILD:
-    case MODE_REBUILD:
-    case MODE_RECOMPILE:
-    case MODE_TARBUILD:
-#endif
 #if !defined(IAM_RPMEIU)
     case MODE_INSTALL:
     case MODE_ERASE:
 #endif
     case MODE_UNKNOWN:
-       if (poptPeekArg(optCon) != NULL || argc <= 1 || rpmIsVerbose()) {
-           printUsage(optCon, stdout, 0);
+       if (poptPeekArg(optCon) != NULL || argc <= 1) {
+           printUsage(optCon, stderr, 0);
            ec = argc;
        }
        break;
     }
 
-#if defined(IAM_RPMBT) || defined(IAM_RPMK)
-exit:
-#endif /* IAM_RPMBT || IAM_RPMK */
-
-    ts = rpmtsFree(ts);
-
-    optCon = poptFreeContext(optCon);
-    rpmFreeMacros(NULL);
-/*@i@*/        rpmFreeMacros(rpmCLIMacroContext);
-    rpmFreeRpmrc();
-
-    if (pipeChild) {
-       (void) fclose(stdout);
-       (void) waitpid(pipeChild, &status, 0);
-    }
-
-    /* keeps memory leak checkers quiet */
-    freeFilesystems();
-/*@i@*/        urlFreeCache();
-    rpmlogClose();
-    dbiTags = _free(dbiTags);
+    rpmtsFree(ts);
+    if (finishPipe())
+       ec = EXIT_FAILURE;
 
 #ifdef IAM_RPMQV
-    qva->qva_queryFormat = _free(qva->qva_queryFormat);
-#endif
-
-#ifdef IAM_RPMBT
-    freeNames();
-    ba->buildRootOverride = _free(ba->buildRootOverride);
-    ba->targets = _free(ba->targets);
+    free(qva->qva_queryFormat);
 #endif
 
 #ifdef IAM_RPMEIU
-    if (ia->relocations != NULL)
-    for (i = 0; i < ia->numRelocations; i++)
-       ia->relocations[i].oldPath = _free(ia->relocations[i].oldPath);
-    ia->relocations = _free(ia->relocations);
+    if (ia->relocations != NULL) {
+       for (i = 0; i < ia->numRelocations; i++)
+           free(ia->relocations[i].oldPath);
+       free(ia->relocations);
+    }
 #endif
 
-#if HAVE_MCHECK_H && HAVE_MTRACE
-    /*@-noeffect@*/
-    muntrace();   /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
-    /*@=noeffect@*/
-#endif
+    rpmcliFini(optCon);
 
-    /* XXX don't overflow single byte exit status */
-    if (ec > 255) ec = 255;
+    rpmlog(RPMLOG_DEBUG, "Exit status: %d\n", ec);
 
-    /*@-globstate@*/
-    return ec;
-    /*@=globstate@*/
+    return RETVAL(ec);
 }
-/*@=mods@*/
-/*@=bounds@*/