# rpmqv.c

Go to the documentation of this file.

    00001 #include "system.h"
    00002
    00003 #define _AUTOHELP
    00004
    00005 #if defined(IAM_RPM) || defined(__LCLINT__)
    00006 #define IAM_RPMBT
    00007 #define IAM_RPMDB
    00008 #define IAM_RPMEIU
    00009 #define IAM_RPMQV
    00010 #define IAM_RPMK
    00011 #endif
    00012
    00013 #include <rpmcli.h>
    00014 #include <rpmbuild.h>
    00015
    00016 #define POPT_NODEPS             1025
    00017 #define POPT_FORCE              1026
    00018 #define POPT_NOMD5              1027
    00019 #define POPT_NOSCRIPTS          1028
    00020
    00021 #ifdef  IAM_RPMBT
    00022 #include "build.h"
    00023 #define GETOPT_REBUILD          1003
    00024 #define GETOPT_RECOMPILE        1004
    00025 #endif
    00026
    00027 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
    00028 #include "signature.h"
    00029 #endif
    00030
    00031 #include "debug.h"
    00032
    00033 #define GETOPT_DBPATH           1010
    00034 #define GETOPT_SHOWRC           1018
    00035 #define GETOPT_DEFINEMACRO      1020
    00036 #define GETOPT_EVALMACRO        1021
    00037 #ifdef  NOTYET
    00038 #define GETOPT_RCFILE           1022
    00039 #endif
    00040
    00041 enum modes {
    00042
    00043     MODE_QUERY          = (1 <<  0),
    00044     MODE_VERIFY         = (1 <<  3),
    00045     MODE_QUERYTAGS      = (1 <<  9),
    00046 #define MODES_QV (MODE_QUERY | MODE_VERIFY)
    00047
    00048     MODE_INSTALL        = (1 <<  1),
    00049     MODE_ERASE          = (1 <<  2),
    00050 #define MODES_IE (MODE_INSTALL | MODE_ERASE)
    00051
    00052     MODE_BUILD          = (1 <<  4),
    00053     MODE_REBUILD        = (1 <<  5),
    00054     MODE_RECOMPILE      = (1 <<  8),
    00055     MODE_TARBUILD       = (1 << 11),
    00056 #define MODES_BT (MODE_BUILD | MODE_TARBUILD | MODE_REBUILD | MODE_RECOMPILE)
    00057
    00058     MODE_CHECKSIG       = (1 <<  6),
    00059     MODE_RESIGN         = (1 <<  7),
    00060 #define MODES_K  (MODE_CHECKSIG | MODE_RESIGN)
    00061
    00062     MODE_INITDB         = (1 << 10),
    00063     MODE_REBUILDDB      = (1 << 12),
    00064     MODE_VERIFYDB       = (1 << 13),
    00065 #define MODES_DB (MODE_INITDB | MODE_REBUILDDB | MODE_VERIFYDB)
    00066
    00067
    00068     MODE_UNKNOWN        = 0
    00069 };
    00070
    00071 #define MODES_FOR_DBPATH        (MODES_BT | MODES_IE | MODES_QV | MODES_DB)
    00072 #define MODES_FOR_NODEPS        (MODES_BT | MODES_IE | MODE_VERIFY)
    00073 #define MODES_FOR_TEST          (MODES_BT | MODES_IE)
    00074 #define MODES_FOR_ROOT          (MODES_BT | MODES_IE | MODES_QV | MODES_DB)
    00075
    00076 /*@-exportheadervar@*/
    00077 /*@unchecked@*/
    00078 extern int _ftp_debug;
    00079 /*@unchecked@*/
    00080 extern int noLibio;
    00081 /*@unchecked@*/
    00082 extern int _rpmio_debug;
    00083 /*@-redecl@*/
    00084 /*@unchecked@*/
    00085 extern int _url_debug;
    00086 /*@=redecl@*/
    00087
    00088 /*@=exportheadervar@*/
    00089
    00090 /* options for all executables */
    00091
    00092 /*@unchecked@*/
    00093 static int help = 0;
    00094 /*@unchecked@*/
    00095 static int noUsageMsg = 0;
    00096 /*@unchecked@*/ /*@observer@*/ /*@null@*/
    00097 static const char * pipeOutput = NULL;
    00098 /*@unchecked@*/
    00099 static int quiet = 0;
    00100 /*@unchecked@*/ /*@observer@*/ /*@null@*/
    00101 static const char * rcfile = NULL;
    00102 /*@unchecked@*/ /*@observer@*/ /*@null@*/
    00103 static char * rootdir = "/";
    00104 /*@unchecked@*/
    00105 static int showrc = 0;
    00106 /*@unchecked@*/
    00107 static int showVersion = 0;
    00108
    00109 /*@unchecked@*/
    00110 static struct poptOption rpmAllPoptTable[] = {
    00111  { "version", '\0', 0, &showVersion, 0,
    00112         N_("print the version of rpm being used"),
    00113         NULL },
    00114  { "quiet", '\0', 0, &quiet, 0,
    00115         N_("provide less detailed output"), NULL},
    00116  { "verbose", 'v', 0, 0, 'v',
    00117         N_("provide more detailed output"), NULL},
    00118  { "define", '\0', POPT_ARG_STRING, 0, GETOPT_DEFINEMACRO,
    00119         N_("define macro <name> with value <body>"),
    00120         N_("'<name> <body>'") },
    00121  { "eval", '\0', POPT_ARG_STRING, 0, GETOPT_EVALMACRO,
    00122         N_("print macro expansion of <expr>+"),
    00123         N_("<expr>+") },
    00124  { "pipe", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &pipeOutput, 0,
    00125         N_("send stdout to <cmd>"),
    00126         N_("<cmd>") },
    00127  { "root", 'r', POPT_ARG_STRING | POPT_ARGFLAG_SHOW_DEFAULT, &rootdir, 0,
    00128         N_("use <dir> as the top level directory"),
    00129         N_("<dir>") },
    00130  { "macros", '\0', POPT_ARG_STRING, &macrofiles, 0,
    00131         N_("read <file:...> instead of default macro file(s)"),
    00132         N_("<file:...>") },
    00133 #if !defined(GETOPT_RCFILE)
    00134  { "rcfile", '\0', POPT_ARG_STRING, &rcfile, 0,
    00135         N_("read <file:...> instead of default rpmrc file(s)"),
    00136         N_("<file:...>") },
    00137 #else
    00138  { "rcfile", '\0', 0, 0, GETOPT_RCFILE,
    00139         N_("read <file:...> instead of default rpmrc file(s)"),
    00140         N_("<file:...>") },
    00141 #endif
    00142  { "showrc", '\0', 0, &showrc, GETOPT_SHOWRC,
    00143         N_("display final rpmrc and macro configuration"),
    00144         NULL },
    00145
    00146 #if HAVE_LIBIO_H && defined(_G_IO_IO_FILE_VERSION)
    00147  { "nolibio", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &noLibio, 1,
    00148         N_("disable use of libio(3) API"), NULL},
    00149 #endif
    00150  { "ftpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ftp_debug, -1,
    00151         N_("debug protocol data stream"), NULL},
    00152  { "rpmiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmio_debug, -1,
    00153         N_("debug rpmio I/O"), NULL},
    00154  { "urldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_url_debug, -1,
    00155         N_("debug URL cache handling"), NULL},
    00156
    00157    POPT_TABLEEND
    00158 };
    00159
    00160 /* the structure describing the options we take and the defaults */
    00161 /*@unchecked@*/
    00162 static struct poptOption optionsTable[] = {
    00163
    00164  /* XXX colliding options */
    00165 #if defined(IAM_RPMQV) || defined(IAM_RPMEIU) || defined(IAM_RPMBT)
    00166  {  NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',                 NULL, NULL},
    00167  {  "nodeps", 0, POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_NODEPS,       NULL, NULL},
    00168  {  "noscripts", 0, POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_NOSCRIPTS, NULL, NULL},
    00169  {  "nomd5", 0, POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_NOMD5,         NULL, NULL},
    00170  {  "force", 0, POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_FORCE,         NULL, NULL},
    00171 #endif
    00172
    00173 #ifdef  IAM_RPMQV
    00174  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQueryPoptTable, 0,
    00175         N_("Query options (with -q or --query):"),
    00176         NULL },
    00177  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmVerifyPoptTable, 0,
    00178         N_("Verify options (with -V or --verify):"),
    00179         NULL },
    00180 #endif  /* IAM_RPMQV */
    00181
    00182 #ifdef  IAM_RPMK
    00183  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmSignPoptTable, 0,
    00184         N_("Signature options:"),
    00185         NULL },
    00186 #endif  /* IAM_RPMK */
    00187
    00188 #ifdef  IAM_RPMDB
    00189  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmDatabasePoptTable, 0,
    00190         N_("Database options:"),
    00191         NULL },
    00192 #endif  /* IAM_RPMDB */
    00193
    00194 #ifdef  IAM_RPMBT
    00195  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmBuildPoptTable, 0,
    00196         N_("Build options with [ <specfile> | <tarball> | <source package> ]:"),
    00197         NULL },
    00198 #endif  /* IAM_RPMBT */
    00199
    00200 #ifdef  IAM_RPMEIU
    00201  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmInstallPoptTable, 0,
    00202         N_("Install/Upgrade/Erase options:"),
    00203         NULL },
    00204 #endif  /* IAM_RPMEIU */
    00205
    00206  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmAllPoptTable, 0,
    00207         N_("Common options for all rpm modes:"),
    00208         NULL },
    00209
    00210    POPT_AUTOALIAS
    00211    POPT_AUTOHELP
    00212    POPT_TABLEEND
    00213 };
    00214
    00215 #ifdef __MINT__
    00216 /* MiNT cannot dynamically increase the stack.  */
    00217 long _stksize = 64 * 1024L;
    00218 #endif
    00219
    00220 /*@exits@*/ static void argerror(const char * desc)
    00221         /*@globals fileSystem @*/
    00222         /*@modifies fileSystem @*/
    00223 {
    00224     fprintf(stderr, _("%s: %s\n"), __progname, desc);
    00225     exit(EXIT_FAILURE);
    00226 }
    00227
    00228 static void printVersion(void)
    00229         /*@globals rpmEVR, fileSystem @*/
    00230         /*@modifies fileSystem @*/
    00231 {
    00232     fprintf(stdout, _("RPM version %s\n"), rpmEVR);
    00233 }
    00234
    00235 static void printBanner(void)
    00236         /*@globals fileSystem @*/
    00237         /*@modifies fileSystem @*/
    00238 {
    00239     (void) puts(_("Copyright (C) 1998-2000 - Red Hat, Inc."));
    00240     (void) puts(_("This program may be freely redistributed under the terms of the GNU GPL"));
    00241 }
    00242
    00243 static void printUsage(void)
    00244         /*@globals fileSystem @*/
    00245         /*@modifies fileSystem @*/
    00246 {
    00247     FILE * fp = stdout;
    00248     printVersion();
    00249     printBanner();
    00250     (void) puts("");
    00251
    00252     fprintf(fp, _("Usage: %s {--help}\n"), __progname);
    00253     fprintf(fp,   "       %s {--version}\n" , __progname);
    00254
    00255 #ifdef  IAM_RPMEIU
    00256 #ifdef  DYING
    00257 --dbpath        all
    00258 --ftpproxy etc  all
    00259 --force         alias for --replacepkgs --replacefiles
    00260 --includedocs   handle as option in table
    00261                 --erase forbids many options
    00262 #endif  /* DYING */
    00263 #endif  /* IAM_RPMEIU */
    00264
    00265 #ifdef  IAM_RPMQV
    00266 #ifdef  DYING   /* XXX popt glue needing --help doco. */
    00267 --dbpath        all
    00268 --ftpproxy etc  all
    00269 -i,--info       Q
    00270 -R,--requires   Q
    00271 -P,--provides   Q
    00272 --scripts       Q
    00273 --triggeredby   Q
    00274 --changelog     Q
    00275 --triggers      Q
    00276 --querytags     !V
    00277 --setperms      V
    00278 --setugids      V
    00279 #endif  /* DYING */
    00280 #endif  /* IAM_RPMQV */
    00281
    00282 }
    00283
    00284 int main(int argc, const char ** argv)
    00285 {
    00286     enum modes bigMode = MODE_UNKNOWN;
    00287
    00288 #ifdef  IAM_RPMQV
    00289     QVA_t qva = &rpmQVArgs;
    00290 #endif
    00291
    00292 #ifdef  IAM_RPMBT
    00293     BTA_t ba = &rpmBTArgs;
    00294 #endif
    00295
    00296 #ifdef  IAM_RPMEIU
    00297    struct rpmInstallArguments_s * ia = &rpmIArgs;
    00298 #endif
    00299
    00300 #if defined(IAM_RPMDB)
    00301    struct rpmDatabaseArguments_s * da = &rpmDBArgs;
    00302 #endif
    00303
    00304 #if defined(IAM_RPMK)
    00305    struct rpmSignArguments_s * ka = &rpmKArgs;
    00306 #endif
    00307
    00308 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
    00309     char * passPhrase = "";
    00310 #endif
    00311
    00312     int arg;
    00313     int gotDbpath = 0;
    00314
    00315     const char * optArg;
    00316     pid_t pipeChild = 0;
    00317     poptContext optCon;
    00318     int ec = 0;
    00319     int status;
    00320     int p[2];
    00321
    00322 #if HAVE_MCHECK_H && HAVE_MTRACE
    00323     mtrace();   /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
    00324 #endif
    00325     setprogname(argv[0]);       /* Retrofit glibc __progname */
    00326
    00327     /* XXX glibc churn sanity */
    00328     if (__progname == NULL) {
    00329         if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
    00330         else __progname = argv[0];
    00331     }
    00332
    00333     /* Set the major mode based on argv[0] */
    00334     /*@-nullpass@*/
    00335 #ifdef  IAM_RPMBT
    00336     if (!strcmp(__progname, "rpmb"))    bigMode = MODE_BUILD;
    00337     if (!strcmp(__progname, "rpmt"))    bigMode = MODE_TARBUILD;
    00338     if (!strcmp(__progname, "rpmbuild"))        bigMode = MODE_BUILD;
    00339 #endif
    00340 #ifdef  IAM_RPMQV
    00341     if (!strcmp(__progname, "rpmq"))    bigMode = MODE_QUERY;
    00342     if (!strcmp(__progname, "rpmv"))    bigMode = MODE_VERIFY;
    00343     if (!strcmp(__progname, "rpmquery"))        bigMode = MODE_QUERY;
    00344     if (!strcmp(__progname, "rpmverify"))       bigMode = MODE_VERIFY;
    00345 #endif
    00346 #ifdef  RPMEIU
    00347     if (!strcmp(__progname, "rpme"))    bigMode = MODE_ERASE;
    00348     if (!strcmp(__progname, "rpmi"))    bigMode = MODE_INSTALL;
    00349     if (!strcmp(__progname, "rpmu"))    bigMode = MODE_INSTALL;
    00350 #endif
    00351     /*@=nullpass@*/
    00352
    00353     /* set the defaults for the various command line options */
    00354     _ftp_debug = 0;
    00355
    00356 #if HAVE_LIBIO_H && defined(_G_IO_IO_FILE_VERSION)
    00357     noLibio = 0;
    00358 #else
    00359     noLibio = 1;
    00360 #endif
    00361     _rpmio_debug = 0;
    00362     _url_debug = 0;
    00363
    00364     /* XXX Eliminate query linkage loop */
    00365     specedit = 0;
    00366     parseSpecVec = parseSpec;
    00367     freeSpecVec = freeSpec;
    00368
    00369     /* set up the correct locale */
    00370     (void) setlocale(LC_ALL, "" );
    00371
    00372 #ifdef  __LCLINT__
    00373 #define LOCALEDIR       "/usr/share/locale"
    00374 #endif
    00375     bindtextdomain(PACKAGE, LOCALEDIR);
    00376     textdomain(PACKAGE);
    00377
    00378     rpmSetVerbosity(RPMMESS_NORMAL);    /* XXX silly use by showrc */
    00379
    00380     /* Make a first pass through the arguments, looking for --rcfile */
    00381     /* We need to handle that before dealing with the rest of the arguments. */
    00382     /*@-nullpass -temptrans@*/
    00383     optCon = poptGetContext(__progname, argc, argv, optionsTable, 0);
    00384     /*@=nullpass =temptrans@*/
    00385     (void) poptReadConfigFile(optCon, LIBRPMALIAS_FILENAME);
    00386     (void) poptReadDefaultConfig(optCon, 1);
    00387     poptSetExecPath(optCon, RPMCONFIGDIR, 1);
    00388
    00389     /* reading rcfile early makes it easy to override */
    00390     /* XXX only --rcfile (and --showrc) need this pre-parse */
    00391
    00392     while ((arg = poptGetNextOpt(optCon)) > 0) {
    00393         switch(arg) {
    00394         case 'v':
    00395             rpmIncreaseVerbosity();     /* XXX silly use by showrc */
    00396             break;
    00397         default:
    00398             break;
    00399       }
    00400     }
    00401
    00402     if (rpmReadConfigFiles(rcfile, NULL))
    00403         exit(EXIT_FAILURE);
    00404
    00405     if (showrc) {
    00406         (void) rpmShowRC(stdout);
    00407         exit(EXIT_SUCCESS);
    00408     }
    00409
    00410     rpmSetVerbosity(RPMMESS_NORMAL);    /* XXX silly use by showrc */
    00411
    00412     poptResetContext(optCon);
    00413
    00414 #ifdef  IAM_RPMQV
    00415     qva->qva_queryFormat = _free(qva->qva_queryFormat);
    00416     memset(qva, 0, sizeof(*qva));
    00417     qva->qva_source = RPMQV_PACKAGE;
    00418     qva->qva_fflags = RPMFILE_ALL;
    00419     qva->qva_mode = ' ';
    00420     qva->qva_char = ' ';
    00421 #endif
    00422
    00423 #ifdef  IAM_RPMBT
    00424     ba->buildRootOverride = _free(ba->buildRootOverride);
    00425     ba->targets = _free(ba->targets);
    00426     memset(ba, 0, sizeof(*ba));
    00427     ba->buildMode = ' ';
    00428     ba->buildChar = ' ';
    00429 #endif
    00430
    00431 #ifdef  IAM_RPMDB
    00432     memset(da, 0, sizeof(*da));
    00433 #endif
    00434
    00435 #ifdef  IAM_RPMK
    00436     memset(ka, 0, sizeof(*ka));
    00437     ka->addSign = RESIGN_NONE;
    00438     ka->checksigFlags = CHECKSIG_ALL;
    00439 #endif
    00440
    00441 #ifdef  IAM_RPMEIU
    00442     ia->relocations = _free(ia->relocations);
    00443     memset(ia, 0, sizeof(*ia));
    00444     ia->transFlags = RPMTRANS_FLAG_NONE;
    00445     ia->probFilter = RPMPROB_FILTER_NONE;
    00446     ia->installInterfaceFlags = INSTALL_NONE;
    00447     ia->eraseInterfaceFlags = UNINSTALL_NONE;
    00448 #endif
    00449
    00450     while ((arg = poptGetNextOpt(optCon)) > 0) {
    00451         optArg = poptGetOptArg(optCon);
    00452
    00453         switch (arg) {
    00454
    00455         case 'v':
    00456             rpmIncreaseVerbosity();
    00457             break;
    00458
    00459 /* XXX options used in multiple rpm modes */
    00460 #if defined(IAM_RPMQV) || defined(IAM_RPMK)
    00461         case POPT_NOMD5:
    00462 #ifdef  IAM_RPMQV
    00463             if (bigMode == MODE_VERIFY || qva->qva_mode == 'V')
    00464                 qva->qva_flags |= VERIFY_MD5;
    00465             else
    00466 #endif
    00467 #ifdef  IAM_RPMK
    00468             if (bigMode & MODES_K)
    00469                 ka->checksigFlags &= ~CHECKSIG_MD5;
    00470             else
    00471 #endif
    00472 #ifdef  IAM_RPMEIU
    00473             if (bigMode & MODES_IE)
    00474                 ia->transFlags |= RPMTRANS_FLAG_NOMD5;
    00475             else
    00476 #endif
    00477                 {};
    00478             break;
    00479 #endif  /* IAM_RPMQV || IAM_RPMK */
    00480
    00481 #if defined(IAM_RPMQV) || defined(IAM_RPMEIU) || defined(IAM_RPMBT)
    00482         case POPT_NODEPS:
    00483 #ifdef  IAM_RPMQV
    00484             if (bigMode == MODE_VERIFY || qva->qva_mode == 'V')
    00485                 qva->qva_flags |= VERIFY_DEPS;
    00486             else
    00487 #endif
    00488 #ifdef  IAM_RPMEIU
    00489             if ((bigMode & MODES_IE) ||
    00490                 (ia->installInterfaceFlags &
    00491             (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL|INSTALL_ERASE)))
    00492                 ia->noDeps = 1;
    00493             else
    00494 #endif
    00495 #ifdef  IAM_RPMBT
    00496             if ((bigMode & MODES_BT) || ba->buildMode != ' ')
    00497                 ba->noDeps = 1;
    00498             else
    00499 #endif
    00500                 /*@-ifempty@*/ ;
    00501             break;
    00502
    00503         case POPT_FORCE:
    00504 #ifdef  IAM_RPMEIU
    00505             if ((bigMode & MODES_IE) ||
    00506                 (ia->installInterfaceFlags &
    00507             (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL|INSTALL_ERASE)))
    00508                 ia->probFilter |=
    00509                         ( RPMPROB_FILTER_REPLACEPKG
    00510                         | RPMPROB_FILTER_REPLACEOLDFILES
    00511                         | RPMPROB_FILTER_REPLACENEWFILES
    00512                         | RPMPROB_FILTER_OLDPACKAGE);
    00513             else
    00514 #endif
    00515 #ifdef  IAM_RPMBT
    00516             if ((bigMode & MODES_BT) || ba->buildMode != ' ')
    00517                 ba->force = 1;
    00518             else
    00519 #endif
    00520                 /*@-ifempty@*/ ;
    00521             break;
    00522
    00523         case 'i':
    00524 #ifdef  IAM_RPMQV
    00525             if (bigMode == MODE_QUERY || qva->qva_mode == 'q') {
    00526                 /*@-nullassign -readonlytrans@*/
    00527                 const char * infoCommand[] = { "--info", NULL };
    00528                 /*@=nullassign =readonlytrans@*/
    00529                 (void) poptStuffArgs(optCon, infoCommand);
    00530             } else
    00531 #endif
    00532 #ifdef  IAM_RPMEIU
    00533             if (bigMode == MODE_INSTALL ||
    00534                 (ia->installInterfaceFlags &
    00535                     (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL)))
    00536                 /*@-ifempty@*/ ;
    00537             else if (bigMode == MODE_UNKNOWN) {
    00538                 /*@-nullassign -readonlytrans@*/
    00539                 const char * installCommand[] = { "--install", NULL };
    00540                 /*@=nullassign =readonlytrans@*/
    00541                 (void) poptStuffArgs(optCon, installCommand);
    00542             } else
    00543 #endif
    00544                 /*@-ifempty@*/ ;
    00545             break;
    00546
    00547         case POPT_NOSCRIPTS:
    00548 #ifdef  IAM_RPMQV
    00549             if (bigMode == MODE_VERIFY || qva->qva_mode == 'V')
    00550                 qva->qva_flags |= VERIFY_SCRIPT;
    00551             else
    00552 #endif
    00553 #ifdef  IAM_RPMEIU
    00554             if ((bigMode & MODES_IE) ||
    00555                 (ia->installInterfaceFlags &
    00556             (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL|INSTALL_ERASE)))
    00557                 ia->transFlags |= (_noTransScripts | _noTransTriggers);
    00558             else
    00559 #endif
    00560                 /*@-ifempty@*/ ;
    00561             break;
    00562
    00563 #endif  /* IAM_RPMQV || IAM_RPMEIU || IAM_RPMBT */
    00564
    00565         case GETOPT_DEFINEMACRO:
    00566             if (optArg) {
    00567                 (void) rpmDefineMacro(NULL, optArg, RMIL_CMDLINE);
    00568                 (void) rpmDefineMacro(rpmCLIMacroContext, optArg,RMIL_CMDLINE);
    00569             }
    00570             noUsageMsg = 1;
    00571             break;
    00572
    00573         case GETOPT_EVALMACRO:
    00574             if (optArg) {
    00575                 const char *val = rpmExpand(optArg, NULL);
    00576                 fprintf(stdout, "%s\n", val);
    00577                 val = _free(val);
    00578             }
    00579             noUsageMsg = 1;
    00580             break;
    00581
    00582 #if defined(GETOPT_RCFILE)
    00583         case GETOPT_RCFILE:
    00584             fprintf(stderr, _("The --rcfile option has been eliminated.\n"));
    00585             fprintf(stderr, _("Use \"--macros <file:...>\" instead.\n"));
    00586             exit(EXIT_FAILURE);
    00587             /*@notreached@*/ break;
    00588 #endif
    00589
    00590         default:
    00591             fprintf(stderr, _("Internal error in argument processing (%d) :-(\n"), arg);
    00592             exit(EXIT_FAILURE);
    00593         }
    00594     }
    00595
    00596     if (quiet)
    00597         rpmSetVerbosity(RPMMESS_QUIET);
    00598
    00599     if (showVersion) printVersion();
    00600
    00601     if (arg < -1) {
    00602         fprintf(stderr, "%s: %s\n",
    00603                 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
    00604                 poptStrerror(arg));
    00605         exit(EXIT_FAILURE);
    00606     }
    00607
    00608 #ifdef  IAM_RPMBT
    00609     switch (ba->buildMode) {
    00610     case 'b':   bigMode = MODE_BUILD;           break;
    00611     case 't':   bigMode = MODE_TARBUILD;        break;
    00612     case 'B':   bigMode = MODE_REBUILD;         break;
    00613     case 'C':   bigMode = MODE_RECOMPILE;       break;
    00614     }
    00615
    00616     if ((ba->buildAmount & RPMBUILD_RMSOURCE) && bigMode == MODE_UNKNOWN)
    00617         bigMode = MODE_BUILD;
    00618
    00619     if ((ba->buildAmount & RPMBUILD_RMSPEC) && bigMode == MODE_UNKNOWN)
    00620         bigMode = MODE_BUILD;
    00621
    00622     if (ba->buildRootOverride && bigMode != MODE_BUILD &&
    00623         bigMode != MODE_REBUILD && bigMode != MODE_TARBUILD) {
    00624         argerror("--buildroot may only be used during package builds");
    00625     }
    00626 #endif  /* IAM_RPMBT */
    00627
    00628 #ifdef  IAM_RPMDB
    00629   if (bigMode == MODE_UNKNOWN || (bigMode & MODES_DB)) {
    00630     if (da->init) {
    00631         if (bigMode != MODE_UNKNOWN)
    00632             argerror(_("only one major mode may be specified"));
    00633         else
    00634             bigMode = MODE_INITDB;
    00635     } else
    00636     if (da->rebuild) {
    00637         if (bigMode != MODE_UNKNOWN)
    00638             argerror(_("only one major mode may be specified"));
    00639         else
    00640             bigMode = MODE_REBUILDDB;
    00641     } else
    00642     if (da->verify) {
    00643         if (bigMode != MODE_UNKNOWN)
    00644             argerror(_("only one major mode may be specified"));
    00645         else
    00646             bigMode = MODE_VERIFYDB;
    00647     }
    00648   }
    00649 #endif  /* IAM_RPMDB */
    00650
    00651 #ifdef  IAM_RPMQV
    00652   if (bigMode == MODE_UNKNOWN || (bigMode & MODES_QV)) {
    00653     switch (qva->qva_mode) {
    00654     case 'q':   bigMode = MODE_QUERY;           break;
    00655     case 'V':   bigMode = MODE_VERIFY;          break;
    00656     case 'Q':   bigMode = MODE_QUERYTAGS;       break;
    00657     }
    00658
    00659     if (qva->qva_sourceCount) {
    00660         if (qva->qva_sourceCount > 2)
    00661             argerror(_("one type of query/verify may be performed at a "
    00662                         "time"));
    00663     }
    00664     if (qva->qva_flags && (bigMode & ~MODES_QV))
    00665         argerror(_("unexpected query flags"));
    00666
    00667     if (qva->qva_queryFormat && (bigMode & ~MODES_QV))
    00668         argerror(_("unexpected query format"));
    00669
    00670     if (qva->qva_source != RPMQV_PACKAGE && (bigMode & ~MODES_QV))
    00671         argerror(_("unexpected query source"));
    00672   }
    00673 #endif  /* IAM_RPMQV */
    00674
    00675 #ifdef  IAM_RPMEIU
    00676   if (bigMode == MODE_UNKNOWN || (bigMode & MODES_IE))
    00677     {   int iflags = (ia->installInterfaceFlags &
    00678                 (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL));
    00679         int eflags = (ia->installInterfaceFlags & INSTALL_ERASE);
    00680
    00681         if (iflags & eflags)
    00682             argerror(_("only one major mode may be specified"));
    00683         else if (iflags)
    00684             bigMode = MODE_INSTALL;
    00685         else if (eflags)
    00686             bigMode = MODE_ERASE;
    00687     }
    00688 #endif  /* IAM_RPMQV */
    00689
    00690 #ifdef  IAM_RPMK
    00691   if (bigMode == MODE_UNKNOWN || (bigMode & MODES_K)) {
    00692         switch (ka->addSign) {
    00693         case RESIGN_NONE:
    00694             break;
    00695         case RESIGN_CHK_SIGNATURE:
    00696             bigMode = MODE_CHECKSIG;
    00697             break;
    00698         case RESIGN_ADD_SIGNATURE:
    00699         case RESIGN_NEW_SIGNATURE:
    00700             bigMode = MODE_RESIGN;
    00701             break;
    00702
    00703         }
    00704   }
    00705 #endif  /* IAM_RPMK */
    00706
    00707     /* XXX TODO: never happens. */
    00708     if (gotDbpath && (bigMode & ~MODES_FOR_DBPATH))
    00709         argerror(_("--dbpath given for operation that does not use a "
    00710                         "database"));
    00711
    00712 #if defined(IAM_RPMEIU)
    00713     if (!( bigMode == MODE_INSTALL ) &&
    00714 (ia->probFilter & (RPMPROB_FILTER_REPLACEPKG | RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_REPLACENEWFILES | RPMPROB_FILTER_OLDPACKAGE)))
    00715         argerror(_("only installation, upgrading, rmsource and rmspec may be forced"));
    00716     if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_FORCERELOCATE))
    00717         argerror(_("files may only be relocated during package installation"));
    00718
    00719     if (ia->relocations && ia->prefix)
    00720         argerror(_("only one of --prefix or --relocate may be used"));
    00721
    00722     if (bigMode != MODE_INSTALL && ia->relocations)
    00723         argerror(_("--relocate and --excludepath may only be used when installing new packages"));
    00724
    00725     if (bigMode != MODE_INSTALL && ia->prefix)
    00726         argerror(_("--prefix may only be used when installing new packages"));
    00727
    00728     if (ia->prefix && ia->prefix[0] != '/')
    00729         argerror(_("arguments to --prefix must begin with a /"));
    00730
    00731     if (bigMode != MODE_INSTALL && (ia->installInterfaceFlags & INSTALL_HASH))
    00732         argerror(_("--hash (-h) may only be specified during package "
    00733                         "installation"));
    00734
    00735     if (bigMode != MODE_INSTALL && (ia->installInterfaceFlags & INSTALL_PERCENT))
    00736         argerror(_("--percent may only be specified during package "
    00737                         "installation"));
    00738
    00739     if (bigMode != MODE_INSTALL &&
    00740  (ia->probFilter & (RPMPROB_FILTER_REPLACEOLDFILES|RPMPROB_FILTER_REPLACENEWFILES)))
    00741         argerror(_("--replacefiles may only be specified during package "
    00742                         "installation"));
    00743
    00744     if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_REPLACEPKG))
    00745         argerror(_("--replacepkgs may only be specified during package "
    00746                         "installation"));
    00747
    00748     if (bigMode != MODE_INSTALL && (ia->transFlags & RPMTRANS_FLAG_NODOCS))
    00749         argerror(_("--excludedocs may only be specified during package "
    00750                    "installation"));
    00751
    00752     if (bigMode != MODE_INSTALL && ia->incldocs)
    00753         argerror(_("--includedocs may only be specified during package "
    00754                    "installation"));
    00755
    00756     if (ia->incldocs && (ia->transFlags & RPMTRANS_FLAG_NODOCS))
    00757         argerror(_("only one of --excludedocs and --includedocs may be "
    00758                  "specified"));
    00759
    00760     if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_IGNOREARCH))
    00761         argerror(_("--ignorearch may only be specified during package "
    00762                    "installation"));
    00763
    00764     if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_IGNOREOS))
    00765         argerror(_("--ignoreos may only be specified during package "
    00766                    "installation"));
    00767
    00768     if (bigMode != MODE_INSTALL &&
    00769         (ia->probFilter & (RPMPROB_FILTER_DISKSPACE|RPMPROB_FILTER_DISKNODES)))
    00770         argerror(_("--ignoresize may only be specified during package "
    00771                    "installation"));
    00772
    00773     if ((ia->eraseInterfaceFlags & UNINSTALL_ALLMATCHES) && bigMode != MODE_ERASE)
    00774         argerror(_("--allmatches may only be specified during package "
    00775                    "erasure"));
    00776
    00777     if ((ia->transFlags & RPMTRANS_FLAG_ALLFILES) && bigMode != MODE_INSTALL)
    00778         argerror(_("--allfiles may only be specified during package "
    00779                    "installation"));
    00780
    00781     if ((ia->transFlags & RPMTRANS_FLAG_JUSTDB) &&
    00782         bigMode != MODE_INSTALL && bigMode != MODE_ERASE)
    00783         argerror(_("--justdb may only be specified during package "
    00784                    "installation and erasure"));
    00785
    00786     if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE &&
    00787         (ia->transFlags & (RPMTRANS_FLAG_NOSCRIPTS | _noTransScripts | _noTransTriggers)))
    00788         argerror(_("script disabling options may only be specified during "
    00789                    "package installation and erasure"));
    00790
    00791     if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE &&
    00792         (ia->transFlags & (RPMTRANS_FLAG_NOTRIGGERS | _noTransTriggers)))
    00793         argerror(_("trigger disabling options may only be specified during "
    00794                    "package installation and erasure"));
    00795
    00796     if (ia->noDeps & (bigMode & ~MODES_FOR_NODEPS))
    00797         argerror(_("--nodeps may only be specified during package "
    00798                    "building, rebuilding, recompilation, installation,"
    00799                    "erasure, and verification"));
    00800
    00801     if ((ia->transFlags & RPMTRANS_FLAG_TEST) && (bigMode & ~MODES_FOR_TEST))
    00802         argerror(_("--test may only be specified during package installation, "
    00803                  "erasure, and building"));
    00804 #endif  /* IAM_RPMEIU */
    00805
    00806     if (rootdir && rootdir[1] && (bigMode & ~MODES_FOR_ROOT))
    00807         argerror(_("--root (-r) may only be specified during "
    00808                  "installation, erasure, querying, and "
    00809                  "database rebuilds"));
    00810
    00811     if (rootdir) {
    00812         switch (urlIsURL(rootdir)) {
    00813         default:
    00814             if (bigMode & MODES_FOR_ROOT)
    00815                 break;
    00816             /*@fallthrough@*/
    00817         case URL_IS_UNKNOWN:
    00818             if (rootdir[0] != '/')
    00819                 argerror(_("arguments to --root (-r) must begin with a /"));
    00820             break;
    00821         }
    00822     }
    00823
    00824 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
    00825     if (0
    00826 #if defined(IAM_RPMBT)
    00827     || ba->sign
    00828 #endif
    00829 #if defined(IAM_RPMK)
    00830     || ka->sign
    00831 #endif
    00832     ) {
    00833         if (bigMode == MODE_REBUILD || bigMode == MODE_BUILD ||
    00834             bigMode == MODE_RESIGN || bigMode == MODE_TARBUILD) {
    00835             const char ** av;
    00836             struct stat sb;
    00837             int errors = 0;
    00838
    00839             if ((av = poptGetArgs(optCon)) == NULL) {
    00840                 fprintf(stderr, _("no files to sign\n"));
    00841                 errors++;
    00842             } else
    00843             while (*av) {
    00844                 if (stat(*av, &sb)) {
    00845                     fprintf(stderr, _("cannot access file %s\n"), *av);
    00846                     errors++;
    00847                 }
    00848                 av++;
    00849             }
    00850
    00851             if (errors) {
    00852                 ec = errors;
    00853                 goto exit;
    00854             }
    00855
    00856             if (poptPeekArg(optCon)) {
    00857                 int sigTag;
    00858                 switch (sigTag = rpmLookupSignatureType(RPMLOOKUPSIG_QUERY)) {
    00859                   case 0:
    00860                     break;
    00861                   case RPMSIGTAG_PGP:
    00862                     if ((sigTag == RPMSIGTAG_PGP || sigTag == RPMSIGTAG_PGP5) &&
    00863                         !rpmDetectPGPVersion(NULL)) {
    00864                         fprintf(stderr, _("pgp not found: "));
    00865                         ec = EXIT_FAILURE;
    00866                         goto exit;
    00867                     }   /*@fallthrough@*/
    00868                   case RPMSIGTAG_GPG:
    00869                     passPhrase = rpmGetPassPhrase(_("Enter pass phrase: "), sigTag);
    00870                     if (passPhrase == NULL) {
    00871                         fprintf(stderr, _("Pass phrase check failed\n"));
    00872                         ec = EXIT_FAILURE;
    00873                         goto exit;
    00874                     }
    00875                     fprintf(stderr, _("Pass phrase is good.\n"));
    00876                     passPhrase = xstrdup(passPhrase);
    00877                     break;
    00878                   default:
    00879                     fprintf(stderr,
    00880                             _("Invalid %%_signature spec in macro file.\n"));
    00881                     ec = EXIT_FAILURE;
    00882                     goto exit;
    00883                     /*@notreached@*/ break;
    00884                 }
    00885             }
    00886         } else {
    00887             argerror(_("--sign may only be used during package building"));
    00888         }
    00889     } else {
    00890         /* Make rpmLookupSignatureType() return 0 ("none") from now on */
    00891         (void) rpmLookupSignatureType(RPMLOOKUPSIG_DISABLE);
    00892     }
    00893 #endif  /* IAM_RPMBT || IAM_RPMK */
    00894
    00895     if (pipeOutput) {
    00896         (void) pipe(p);
    00897
    00898         if (!(pipeChild = fork())) {
    00899             (void) close(p[1]);
    00900             (void) dup2(p[0], STDIN_FILENO);
    00901             (void) close(p[0]);
    00902             (void) execl("/bin/sh", "/bin/sh", "-c", pipeOutput, NULL);
    00903             fprintf(stderr, _("exec failed\n"));
    00904         }
    00905
    00906         (void) close(p[0]);
    00907         (void) dup2(p[1], STDOUT_FILENO);
    00908         (void) close(p[1]);
    00909     }
    00910
    00911     switch (bigMode) {
    00912 #ifdef  IAM_RPMDB
    00913     case MODE_INITDB:
    00914         (void) rpmdbInit(rootdir, 0644);
    00915         break;
    00916
    00917     case MODE_REBUILDDB:
    00918         ec = rpmdbRebuild(rootdir);
    00919         break;
    00920     case MODE_VERIFYDB:
    00921         ec = rpmdbVerify(rootdir);
    00922         break;
    00923 #endif  /* IAM_RPMDB */
    00924
    00925 #ifdef  IAM_RPMBT
    00926     case MODE_REBUILD:
    00927     case MODE_RECOMPILE:
    00928       { const char * pkg;
    00929         while (!rpmIsVerbose())
    00930             rpmIncreaseVerbosity();
    00931
    00932         if (!poptPeekArg(optCon))
    00933             argerror(_("no packages files given for rebuild"));
    00934
    00935         ba->buildAmount = RPMBUILD_PREP | RPMBUILD_BUILD | RPMBUILD_INSTALL;
    00936         if (bigMode == MODE_REBUILD) {
    00937             ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
    00938             ba->buildAmount |= RPMBUILD_RMSOURCE;
    00939             ba->buildAmount |= RPMBUILD_RMSPEC;
    00940             ba->buildAmount |= RPMBUILD_CLEAN;
    00941             ba->buildAmount |= RPMBUILD_RMBUILD;
    00942         }
    00943
    00944         while ((pkg = poptGetArg(optCon))) {
    00945             const char * specFile = NULL;
    00946             char * cookie = NULL;
    00947
    00948             ec = rpmInstallSource("", pkg, &specFile, &cookie);
    00949             if (ec)
    00950                 /*@loopbreak@*/ break;
    00951
    00952             ba->rootdir = rootdir;
    00953             ec = build(specFile, ba, passPhrase, cookie, rcfile);
    00954             free(cookie);
    00955             cookie = NULL;
    00956             free((void *)specFile);
    00957             specFile = NULL;
    00958
    00959             if (ec)
    00960                 /*@loopbreak@*/ break;
    00961         }
    00962       } break;
    00963
    00964       case MODE_BUILD:
    00965       case MODE_TARBUILD:
    00966       { const char * pkg;
    00967         while (!rpmIsVerbose())
    00968             rpmIncreaseVerbosity();
    00969
    00970         switch (ba->buildChar) {
    00971         case 'a':
    00972             ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
    00973             /*@fallthrough@*/
    00974         case 'b':
    00975             ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
    00976             ba->buildAmount |= RPMBUILD_CLEAN;
    00977             /*@fallthrough@*/
    00978         case 'i':
    00979             ba->buildAmount |= RPMBUILD_INSTALL;
    00980             if ((ba->buildChar == 'i') && ba->shortCircuit)
    00981                 break;
    00982             /*@fallthrough@*/
    00983         case 'c':
    00984             ba->buildAmount |= RPMBUILD_BUILD;
    00985             if ((ba->buildChar == 'c') && ba->shortCircuit)
    00986                 break;
    00987             /*@fallthrough@*/
    00988         case 'p':
    00989             ba->buildAmount |= RPMBUILD_PREP;
    00990             break;
    00991
    00992         case 'l':
    00993             ba->buildAmount |= RPMBUILD_FILECHECK;
    00994             break;
    00995         case 's':
    00996             ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
    00997             break;
    00998         }
    00999
    01000         if (!poptPeekArg(optCon)) {
    01001             if (bigMode == MODE_BUILD)
    01002                 argerror(_("no spec files given for build"));
    01003             else
    01004                 argerror(_("no tar files given for build"));
    01005         }
    01006
    01007         while ((pkg = poptGetArg(optCon))) {
    01008             ba->rootdir = rootdir;
    01009             ec = build(pkg, ba, passPhrase, NULL, rcfile);
    01010             if (ec)
    01011                 /*@loopbreak@*/ break;
    01012             rpmFreeMacros(NULL);
    01013             (void) rpmReadConfigFiles(rcfile, NULL);
    01014         }
    01015       } break;
    01016 #endif  /* IAM_RPMBT */
    01017
    01018 #ifdef  IAM_RPMEIU
    01019     case MODE_ERASE:
    01020         ia->rootdir = rootdir;
    01021         if (ia->noDeps) ia->eraseInterfaceFlags |= UNINSTALL_NODEPS;
    01022
    01023         if (!poptPeekArg(optCon)) {
    01024             if (ia->rbtid == 0)
    01025                 argerror(_("no packages given for erase"));
    01026 ia->transFlags |= RPMTRANS_FLAG_NOMD5;
    01027 ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
    01028             ec += rpmRollback(ia, NULL);
    01029         } else {
    01030             ec += rpmErase(rootdir, (const char **)poptGetArgs(optCon),
    01031                          ia->transFlags, ia->eraseInterfaceFlags);
    01032         }
    01033         break;
    01034
    01035     case MODE_INSTALL:
    01036         /* RPMTRANS_FLAG_BUILD_PROBS */
    01037         /* RPMTRANS_FLAG_KEEPOBSOLETE */
    01038         ia->rootdir = rootdir;
    01039         if (!ia->incldocs) {
    01040             if (ia->transFlags & RPMTRANS_FLAG_NODOCS)
    01041                 ;
    01042             else if (rpmExpandNumeric("%{_excludedocs}"))
    01043                 ia->transFlags |= RPMTRANS_FLAG_NODOCS;
    01044         }
    01045
    01046         if (ia->noDeps) ia->installInterfaceFlags |= INSTALL_NODEPS;
    01047
    01048         /* we've already ensured !(!ia->prefix && !ia->relocations) */
    01049         if (ia->prefix) {
    01050             ia->relocations = xmalloc(2 * sizeof(*ia->relocations));
    01051             ia->relocations[0].oldPath = NULL;   /* special case magic */
    01052             ia->relocations[0].newPath = ia->prefix;
    01053             ia->relocations[1].oldPath = ia->relocations[1].newPath = NULL;
    01054         } else if (ia->relocations) {
    01055             ia->relocations = xrealloc(ia->relocations,
    01056                         sizeof(*ia->relocations) * (ia->numRelocations + 1));
    01057             ia->relocations[ia->numRelocations].oldPath = NULL;
    01058             ia->relocations[ia->numRelocations].newPath = NULL;
    01059         }
    01060
    01061         if (!poptPeekArg(optCon)) {
    01062             if (ia->rbtid == 0)
    01063                 argerror(_("no packages given for install"));
    01064 ia->transFlags |= RPMTRANS_FLAG_NOMD5;
    01065 ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
    01066             ec += rpmRollback(ia, NULL);
    01067         } else {
    01068
    01069             /*@-compdef@*/ /* FIX: ia->relocations[0].newPath undefined */
    01070             ec += rpmInstall(rootdir, (const char **)poptGetArgs(optCon),
    01071                         ia->transFlags, ia->installInterfaceFlags,
    01072                         ia->probFilter, ia->relocations);
    01073         }
    01074         /*@=compdef@*/
    01075         break;
    01076 #endif  /* IAM_RPMEIU */
    01077
    01078 #ifdef  IAM_RPMQV
    01079     case MODE_QUERY:
    01080       { const char * pkg;
    01081
    01082         qva->qva_prefix = rootdir;
    01083         if (qva->qva_source == RPMQV_ALL) {
    01084 #ifdef  DYING
    01085             if (poptPeekArg(optCon))
    01086                 argerror(_("extra arguments given for query of all packages"));
    01087 #else
    01088             const char ** av = poptGetArgs(optCon);
    01089 #endif
    01090             /*@-nullpass@*/     /* FIX: av can be NULL */
    01091             ec = rpmQuery(qva, RPMQV_ALL, (const char *) av);
    01092             /*@=nullpass@*/
    01093         } else {
    01094             if (!poptPeekArg(optCon))
    01095                 argerror(_("no arguments given for query"));
    01096             while ((pkg = poptGetArg(optCon)))
    01097                 ec += rpmQuery(qva, qva->qva_source, pkg);
    01098         }
    01099       } break;
    01100
    01101     case MODE_VERIFY:
    01102       { const char * pkg;
    01103         rpmVerifyFlags verifyFlags = VERIFY_ALL;
    01104
    01105         verifyFlags &= ~qva->qva_flags;
    01106         qva->qva_flags = (rpmQueryFlags) verifyFlags;
    01107         qva->qva_prefix = rootdir;
    01108
    01109         if (qva->qva_source == RPMQV_ALL) {
    01110             if (poptPeekArg(optCon))
    01111                 argerror(_("extra arguments given for verify of all packages"));
    01112             ec = rpmVerify(qva, RPMQV_ALL, NULL);
    01113         } else {
    01114             if (!poptPeekArg(optCon))
    01115                 argerror(_("no arguments given for verify"));
    01116             while ((pkg = poptGetArg(optCon)))
    01117                 ec += rpmVerify(qva, qva->qva_source, pkg);
    01118         }
    01119       } break;
    01120
    01121     case MODE_QUERYTAGS:
    01122         if (argc != 2)
    01123             argerror(_("unexpected arguments to --querytags "));
    01124
    01125         rpmDisplayQueryTags(stdout);
    01126         break;
    01127 #endif  /* IAM_RPMQV */
    01128
    01129 #ifdef IAM_RPMK
    01130     case MODE_CHECKSIG:
    01131         if (!poptPeekArg(optCon))
    01132             argerror(_("no packages given for signature check"));
    01133         ec = rpmCheckSig(ka->checksigFlags,
    01134                         (const char **)poptGetArgs(optCon));
    01135         /* XXX don't overflow single byte exit status */
    01136         if (ec > 255) ec = 255;
    01137         break;
    01138
    01139     case MODE_RESIGN:
    01140         if (!poptPeekArg(optCon))
    01141             argerror(_("no packages given for signing"));
    01142         ec = rpmReSign(ka->addSign, passPhrase,
    01143                         (const char **)poptGetArgs(optCon));
    01144         /* XXX don't overflow single byte exit status */
    01145         if (ec > 255) ec = 255;
    01146         break;
    01147 #endif  /* IAM_RPMK */
    01148
    01149 #if !defined(IAM_RPMQV)
    01150     case MODE_QUERY:
    01151     case MODE_VERIFY:
    01152     case MODE_QUERYTAGS:
    01153 #endif
    01154 #if !defined(IAM_RPMK)
    01155     case MODE_CHECKSIG:
    01156     case MODE_RESIGN:
    01157 #endif
    01158 #if !defined(IAM_RPMDB)
    01159     case MODE_INITDB:
    01160     case MODE_REBUILDDB:
    01161     case MODE_VERIFYDB:
    01162 #endif
    01163 #if !defined(IAM_RPMBT)
    01164     case MODE_BUILD:
    01165     case MODE_REBUILD:
    01166     case MODE_RECOMPILE:
    01167     case MODE_TARBUILD:
    01168 #endif
    01169 #if !defined(IAM_RPMEIU)
    01170     case MODE_INSTALL:
    01171     case MODE_ERASE:
    01172 #endif
    01173     case MODE_UNKNOWN:
    01174         if (!showVersion && !help && !noUsageMsg) printUsage();
    01175         break;
    01176     }
    01177
    01178 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
    01179 exit:
    01180 #endif  /* IAM_RPMBT || IAM_RPMK */
    01181     optCon = poptFreeContext(optCon);
    01182     rpmFreeMacros(NULL);
    01183     rpmFreeMacros(rpmCLIMacroContext);
    01184     rpmFreeRpmrc();
    01185
    01186     if (pipeChild) {
    01187         (void) fclose(stdout);
    01188         (void) waitpid(pipeChild, &status, 0);
    01189     }
    01190
    01191     /* keeps memory leak checkers quiet */
    01192     freeNames();
    01193     freeFilesystems();
    01194     urlFreeCache();
    01195     rpmlogClose();
    01196     dbiTags = _free(dbiTags);
    01197
    01198 #ifdef  IAM_RPMQV
    01199     qva->qva_queryFormat = _free(qva->qva_queryFormat);
    01200 #endif
    01201
    01202 #ifdef  IAM_RPMBT
    01203     ba->buildRootOverride = _free(ba->buildRootOverride);
    01204     ba->targets = _free(ba->targets);
    01205 #endif
    01206
    01207 #ifdef  IAM_RPMEIU
    01208     ia->relocations = _free(ia->relocations);
    01209 #endif
    01210
    01211 #if HAVE_MCHECK_H && HAVE_MTRACE
    01212     muntrace();   /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
    01213 #endif
    01214     /*@-globstate@*/
    01215     return ec;
    01216     /*@=globstate@*/
    01217 }