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 #include "rpmdb.h"
00017 #include "rpmps.h"
00018 #include "rpmts.h"
00019
00020 #ifdef IAM_RPMBT
00021 #include "build.h"
00022 #define GETOPT_REBUILD 1003
00023 #define GETOPT_RECOMPILE 1004
00024 #endif
00025
00026 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
00027 #include "signature.h"
00028 #endif
00029
00030 #include "debug.h"
00031
00032 enum modes {
00033
00034 MODE_QUERY = (1 << 0),
00035 MODE_VERIFY = (1 << 3),
00036 #define MODES_QV (MODE_QUERY | MODE_VERIFY)
00037
00038 MODE_INSTALL = (1 << 1),
00039 MODE_ERASE = (1 << 2),
00040 #define MODES_IE (MODE_INSTALL | MODE_ERASE)
00041
00042 MODE_BUILD = (1 << 4),
00043 MODE_REBUILD = (1 << 5),
00044 MODE_RECOMPILE = (1 << 8),
00045 MODE_TARBUILD = (1 << 11),
00046 #define MODES_BT (MODE_BUILD | MODE_TARBUILD | MODE_REBUILD | MODE_RECOMPILE)
00047
00048 MODE_CHECKSIG = (1 << 6),
00049 MODE_RESIGN = (1 << 7),
00050 #define MODES_K (MODE_CHECKSIG | MODE_RESIGN)
00051
00052 MODE_INITDB = (1 << 10),
00053 MODE_REBUILDDB = (1 << 12),
00054 MODE_VERIFYDB = (1 << 13),
00055 #define MODES_DB (MODE_INITDB | MODE_REBUILDDB | MODE_VERIFYDB)
00056
00057
00058 MODE_UNKNOWN = 0
00059 };
00060
00061 #define MODES_FOR_DBPATH (MODES_BT | MODES_IE | MODES_QV | MODES_DB)
00062 #define MODES_FOR_NODEPS (MODES_BT | MODES_IE | MODE_VERIFY)
00063 #define MODES_FOR_TEST (MODES_BT | MODES_IE)
00064 #define MODES_FOR_ROOT (MODES_BT | MODES_IE | MODES_QV | MODES_DB | MODES_K)
00065
00066
00067
00068 static struct poptOption optionsTable[] = {
00069
00070 #ifdef IAM_RPMQV
00071 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQueryPoptTable, 0,
00072 N_("Query options (with -q or --query):"),
00073 NULL },
00074 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmVerifyPoptTable, 0,
00075 N_("Verify options (with -V or --verify):"),
00076 NULL },
00077 #endif
00078
00079 #ifdef IAM_RPMK
00080 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmSignPoptTable, 0,
00081 N_("Signature options:"),
00082 NULL },
00083 #endif
00084
00085 #ifdef IAM_RPMDB
00086 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmDatabasePoptTable, 0,
00087 N_("Database options:"),
00088 NULL },
00089 #endif
00090
00091 #ifdef IAM_RPMBT
00092 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmBuildPoptTable, 0,
00093 N_("Build options with [ <specfile> | <tarball> | <source package> ]:"),
00094 NULL },
00095 #endif
00096
00097 #ifdef IAM_RPMEIU
00098 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmInstallPoptTable, 0,
00099 N_("Install/Upgrade/Erase options:"),
00100 NULL },
00101 #endif
00102
00103 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
00104 N_("Common options for all rpm modes:"),
00105 NULL },
00106
00107 POPT_AUTOALIAS
00108 POPT_AUTOHELP
00109 POPT_TABLEEND
00110 };
00111
00112 #ifdef __MINT__
00113
00114 long _stksize = 64 * 1024L;
00115 #endif
00116
00117 static void argerror(const char * desc)
00118
00119
00120 {
00121 fprintf(stderr, _("%s: %s\n"), __progname, desc);
00122 exit(EXIT_FAILURE);
00123 }
00124
00125 static void printVersion(FILE * fp)
00126
00127
00128 {
00129 fprintf(fp, _("RPM version %s\n"), rpmEVR);
00130 }
00131
00132 static void printBanner(FILE * fp)
00133
00134
00135 {
00136 fprintf(fp, _("Copyright (C) 1998-2002 - Red Hat, Inc.\n"));
00137 fprintf(fp, _("This program may be freely redistributed under the terms of the GNU GPL\n"));
00138 }
00139
00140 static void printUsage(poptContext con, FILE * fp, int flags)
00141
00142
00143 {
00144 printVersion(fp);
00145 printBanner(fp);
00146 fprintf(fp, "\n");
00147
00148 if (rpmIsVerbose())
00149 poptPrintHelp(con, fp, flags);
00150 else
00151 poptPrintUsage(con, fp, flags);
00152 }
00153
00154
00155
00156 #if !defined(__GLIBC__) && !defined(__LCLINT__)
00157 int main(int argc, const char ** argv, char ** envp)
00158 #else
00159 int main(int argc, const char ** argv)
00160 #endif
00161
00162
00163
00164
00165
00166 {
00167 rpmts ts = NULL;
00168 enum modes bigMode = MODE_UNKNOWN;
00169
00170 #if defined(IAM_RPMQV)
00171 QVA_t qva = &rpmQVKArgs;
00172 #endif
00173
00174 #ifdef IAM_RPMBT
00175 BTA_t ba = &rpmBTArgs;
00176 #endif
00177
00178 #ifdef IAM_RPMEIU
00179 struct rpmInstallArguments_s * ia = &rpmIArgs;
00180 #endif
00181
00182 #if defined(IAM_RPMDB)
00183 struct rpmDatabaseArguments_s * da = &rpmDBArgs;
00184 #endif
00185
00186 #if defined(IAM_RPMK)
00187 QVA_t ka = &rpmQVKArgs;
00188 #endif
00189
00190 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
00191 char * passPhrase = "";
00192 #endif
00193
00194 int arg;
00195
00196 const char * optArg;
00197 pid_t pipeChild = 0;
00198 poptContext optCon;
00199 int ec = 0;
00200 int status;
00201 int p[2];
00202 #ifdef IAM_RPMEIU
00203 int i;
00204 #endif
00205
00206 #if defined(__GLIBC__)
00207
00212 {
00213 if (getenv("LD_ASSUME_KERNEL") != NULL && getenv("RPM_ALLOW_LD_ASSUME_KERNEL") == NULL)
00214 {
00215 char* bypassVar = (char*)malloc(1024*sizeof(char));
00216 if (bypassVar != NULL)
00217 {
00218 rpmMessage(RPMMESS_DEBUG, _("Enabling bypass of LD_ASSUME_KERNEL.\n"));
00219 snprintf(bypassVar, 1024, "__PASSTHROUGH_LD_ASSUME_KERNEL_%d=%s", getpid(), getenv("LD_ASSUME_KERNEL"));
00220 bypassVar[1023] = '\0';
00221 unsetenv("LD_ASSUME_KERNEL");
00222 putenv(bypassVar);
00223 execvp(argv[0], argv);
00224 }
00225 }
00226 }
00227 #endif
00228
00229 #if HAVE_MCHECK_H && HAVE_MTRACE
00230
00231 mtrace();
00232
00233 #endif
00234 setprogname(argv[0]);
00235
00236 #if !defined(__GLIBC__) && !defined(__LCLINT__)
00237 environ = envp;
00238 #endif
00239
00240
00241 if (__progname == NULL) {
00242 if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
00243 else __progname = argv[0];
00244 }
00245
00246
00247
00248 #ifdef IAM_RPMBT
00249 if (!strcmp(__progname, "rpmb")) bigMode = MODE_BUILD;
00250 if (!strcmp(__progname, "lt-rpmb")) bigMode = MODE_BUILD;
00251 if (!strcmp(__progname, "rpmt")) bigMode = MODE_TARBUILD;
00252 if (!strcmp(__progname, "rpmbuild")) bigMode = MODE_BUILD;
00253 #endif
00254 #ifdef IAM_RPMQV
00255 if (!strcmp(__progname, "rpmq")) bigMode = MODE_QUERY;
00256 if (!strcmp(__progname, "lt-rpmq")) bigMode = MODE_QUERY;
00257 if (!strcmp(__progname, "rpmv")) bigMode = MODE_VERIFY;
00258 if (!strcmp(__progname, "rpmquery")) bigMode = MODE_QUERY;
00259 if (!strcmp(__progname, "rpmverify")) bigMode = MODE_VERIFY;
00260 #endif
00261 #ifdef RPMEIU
00262 if (!strcmp(__progname, "rpme")) bigMode = MODE_ERASE;
00263 if (!strcmp(__progname, "rpmi")) bigMode = MODE_INSTALL;
00264 if (!strcmp(__progname, "lt-rpmi")) bigMode = MODE_INSTALL;
00265 if (!strcmp(__progname, "rpmu")) bigMode = MODE_INSTALL;
00266 #endif
00267
00268
00269 #if defined(IAM_RPMQV)
00270
00271 switch (bigMode) {
00272 case MODE_QUERY: qva->qva_mode = 'q'; break;
00273 case MODE_VERIFY: qva->qva_mode = 'V'; break;
00274 case MODE_CHECKSIG: qva->qva_mode = 'K'; break;
00275 case MODE_RESIGN: qva->qva_mode = 'R'; break;
00276 case MODE_INSTALL:
00277 case MODE_ERASE:
00278 case MODE_BUILD:
00279 case MODE_REBUILD:
00280 case MODE_RECOMPILE:
00281 case MODE_TARBUILD:
00282 case MODE_INITDB:
00283 case MODE_REBUILDDB:
00284 case MODE_VERIFYDB:
00285 case MODE_UNKNOWN:
00286 default:
00287 break;
00288 }
00289 #endif
00290
00291 #if defined(ENABLE_NLS)
00292
00293 (void) setlocale(LC_ALL, "" );
00294
00295 #ifdef __LCLINT__
00296 #define LOCALEDIR "/usr/share/locale"
00297 #endif
00298 bindtextdomain(PACKAGE, LOCALEDIR);
00299 textdomain(PACKAGE);
00300 #endif
00301
00302 rpmSetVerbosity(RPMMESS_NORMAL);
00303
00304
00305
00306
00307 optCon = poptGetContext(__progname, argc, argv, optionsTable, 0);
00308
00309 (void) poptReadConfigFile(optCon, LIBRPMALIAS_FILENAME);
00310 (void) poptReadDefaultConfig(optCon, 1);
00311 poptSetExecPath(optCon, RPMCONFIGDIR, 1);
00312
00313 while ((arg = poptGetNextOpt(optCon)) > 0) {
00314 optArg = poptGetOptArg(optCon);
00315
00316 switch (arg) {
00317 default:
00318 fprintf(stderr, _("Internal error in argument processing (%d) :-(\n"), arg);
00319 exit(EXIT_FAILURE);
00320 }
00321 }
00322
00323 if (arg < -1) {
00324 fprintf(stderr, "%s: %s\n",
00325 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
00326 poptStrerror(arg));
00327 exit(EXIT_FAILURE);
00328 }
00329
00330 rpmcliConfigured();
00331
00332 #ifdef IAM_RPMBT
00333 switch (ba->buildMode) {
00334 case 'b': bigMode = MODE_BUILD; break;
00335 case 't': bigMode = MODE_TARBUILD; break;
00336 case 'B': bigMode = MODE_REBUILD; break;
00337 case 'C': bigMode = MODE_RECOMPILE; break;
00338 }
00339
00340 if ((ba->buildAmount & RPMBUILD_RMSOURCE) && bigMode == MODE_UNKNOWN)
00341 bigMode = MODE_BUILD;
00342
00343 if ((ba->buildAmount & RPMBUILD_RMSPEC) && bigMode == MODE_UNKNOWN)
00344 bigMode = MODE_BUILD;
00345
00346 if (ba->buildRootOverride && bigMode != MODE_BUILD &&
00347 bigMode != MODE_REBUILD && bigMode != MODE_TARBUILD) {
00348 argerror("--buildroot may only be used during package builds");
00349 }
00350 #endif
00351
00352 #ifdef IAM_RPMDB
00353 if (bigMode == MODE_UNKNOWN || (bigMode & MODES_DB)) {
00354 if (da->init) {
00355 if (bigMode != MODE_UNKNOWN)
00356 argerror(_("only one major mode may be specified"));
00357 else
00358 bigMode = MODE_INITDB;
00359 } else
00360 if (da->rebuild) {
00361 if (bigMode != MODE_UNKNOWN)
00362 argerror(_("only one major mode may be specified"));
00363 else
00364 bigMode = MODE_REBUILDDB;
00365 } else
00366 if (da->verify) {
00367 if (bigMode != MODE_UNKNOWN)
00368 argerror(_("only one major mode may be specified"));
00369 else
00370 bigMode = MODE_VERIFYDB;
00371 }
00372 }
00373 #endif
00374
00375 #ifdef IAM_RPMQV
00376 if (bigMode == MODE_UNKNOWN || (bigMode & MODES_QV)) {
00377 switch (qva->qva_mode) {
00378 case 'q': bigMode = MODE_QUERY; break;
00379 case 'V': bigMode = MODE_VERIFY; break;
00380 }
00381
00382 if (qva->qva_sourceCount) {
00383 if (qva->qva_sourceCount > 2)
00384 argerror(_("one type of query/verify may be performed at a "
00385 "time"));
00386 }
00387 if (qva->qva_flags && (bigMode & ~MODES_QV))
00388 argerror(_("unexpected query flags"));
00389
00390 if (qva->qva_queryFormat && (bigMode & ~MODES_QV))
00391 argerror(_("unexpected query format"));
00392
00393 if (qva->qva_source != RPMQV_PACKAGE && (bigMode & ~MODES_QV))
00394 argerror(_("unexpected query source"));
00395 }
00396 #endif
00397
00398 #ifdef IAM_RPMEIU
00399 if (bigMode == MODE_UNKNOWN || (bigMode & MODES_IE))
00400 { int iflags = (ia->installInterfaceFlags &
00401 (INSTALL_UPGRADE|INSTALL_FRESHEN|INSTALL_INSTALL));
00402 int eflags = (ia->installInterfaceFlags & INSTALL_ERASE);
00403
00404 if (iflags & eflags)
00405 argerror(_("only one major mode may be specified"));
00406 else if (iflags)
00407 bigMode = MODE_INSTALL;
00408 else if (eflags)
00409 bigMode = MODE_ERASE;
00410 }
00411 #endif
00412
00413 #ifdef IAM_RPMK
00414 if (bigMode == MODE_UNKNOWN || (bigMode & MODES_K)) {
00415 switch (ka->qva_mode) {
00416 case RPMSIGN_NONE:
00417 ka->sign = 0;
00418 break;
00419 case RPMSIGN_IMPORT_PUBKEY:
00420 case RPMSIGN_CHK_SIGNATURE:
00421 bigMode = MODE_CHECKSIG;
00422 ka->sign = 0;
00423 break;
00424 case RPMSIGN_ADD_SIGNATURE:
00425 case RPMSIGN_NEW_SIGNATURE:
00426 bigMode = MODE_RESIGN;
00427 ka->sign = 1;
00428 break;
00429 }
00430 }
00431 #endif
00432
00433 #if defined(IAM_RPMEIU)
00434 if (!( bigMode == MODE_INSTALL ) &&
00435 (ia->probFilter & (RPMPROB_FILTER_REPLACEPKG | RPMPROB_FILTER_OLDPACKAGE)))
00436 argerror(_("only installation, upgrading, rmsource and rmspec may be forced"));
00437 if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_FORCERELOCATE))
00438 argerror(_("files may only be relocated during package installation"));
00439
00440 if (ia->relocations && ia->prefix)
00441 argerror(_("cannot use --prefix with --relocate or --excludepath"));
00442
00443 if (bigMode != MODE_INSTALL && ia->relocations)
00444 argerror(_("--relocate and --excludepath may only be used when installing new packages"));
00445
00446 if (bigMode != MODE_INSTALL && ia->prefix)
00447 argerror(_("--prefix may only be used when installing new packages"));
00448
00449 if (ia->prefix && ia->prefix[0] != '/')
00450 argerror(_("arguments to --prefix must begin with a /"));
00451
00452 if (bigMode != MODE_INSTALL && (ia->installInterfaceFlags & INSTALL_HASH))
00453 argerror(_("--hash (-h) may only be specified during package "
00454 "installation"));
00455
00456 if (bigMode != MODE_INSTALL && (ia->installInterfaceFlags & INSTALL_PERCENT))
00457 argerror(_("--percent may only be specified during package "
00458 "installation"));
00459
00460 if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_REPLACEPKG))
00461 argerror(_("--replacepkgs may only be specified during package "
00462 "installation"));
00463
00464 if (bigMode != MODE_INSTALL && (ia->transFlags & RPMTRANS_FLAG_NODOCS))
00465 argerror(_("--excludedocs may only be specified during package "
00466 "installation"));
00467
00468 if (bigMode != MODE_INSTALL && ia->incldocs)
00469 argerror(_("--includedocs may only be specified during package "
00470 "installation"));
00471
00472 if (ia->incldocs && (ia->transFlags & RPMTRANS_FLAG_NODOCS))
00473 argerror(_("only one of --excludedocs and --includedocs may be "
00474 "specified"));
00475
00476 if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_IGNOREARCH))
00477 argerror(_("--ignorearch may only be specified during package "
00478 "installation"));
00479
00480 if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_IGNOREOS))
00481 argerror(_("--ignoreos may only be specified during package "
00482 "installation"));
00483
00484 if (bigMode != MODE_INSTALL &&
00485 (ia->probFilter & (RPMPROB_FILTER_DISKSPACE|RPMPROB_FILTER_DISKNODES)))
00486 argerror(_("--ignoresize may only be specified during package "
00487 "installation"));
00488
00489 if ((ia->eraseInterfaceFlags & UNINSTALL_ALLMATCHES) && bigMode != MODE_ERASE)
00490 argerror(_("--allmatches may only be specified during package "
00491 "erasure"));
00492
00493 if ((ia->transFlags & RPMTRANS_FLAG_ALLFILES) && bigMode != MODE_INSTALL)
00494 argerror(_("--allfiles may only be specified during package "
00495 "installation"));
00496
00497 if ((ia->transFlags & RPMTRANS_FLAG_JUSTDB) &&
00498 bigMode != MODE_INSTALL && bigMode != MODE_ERASE)
00499 argerror(_("--justdb may only be specified during package "
00500 "installation and erasure"));
00501
00502 if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE &&
00503 (ia->transFlags & (RPMTRANS_FLAG_NOSCRIPTS | _noTransScripts | _noTransTriggers)))
00504 argerror(_("script disabling options may only be specified during "
00505 "package installation and erasure"));
00506
00507 if (bigMode != MODE_INSTALL && bigMode != MODE_ERASE &&
00508 (ia->transFlags & (RPMTRANS_FLAG_NOTRIGGERS | _noTransTriggers)))
00509 argerror(_("trigger disabling options may only be specified during "
00510 "package installation and erasure"));
00511
00512 if (ia->noDeps & (bigMode & ~MODES_FOR_NODEPS))
00513 argerror(_("--nodeps may only be specified during package "
00514 "building, rebuilding, recompilation, installation,"
00515 "erasure, and verification"));
00516
00517 if ((ia->transFlags & RPMTRANS_FLAG_TEST) && (bigMode & ~MODES_FOR_TEST))
00518 argerror(_("--test may only be specified during package installation, "
00519 "erasure, and building"));
00520 #endif
00521
00522 if (rpmcliRootDir && rpmcliRootDir[1] && (bigMode & ~MODES_FOR_ROOT))
00523 argerror(_("--root (-r) may only be specified during "
00524 "installation, erasure, querying, and "
00525 "database rebuilds"));
00526
00527 if (rpmcliRootDir) {
00528 switch (urlIsURL(rpmcliRootDir)) {
00529 default:
00530 if (bigMode & MODES_FOR_ROOT)
00531 break;
00532
00533 case URL_IS_UNKNOWN:
00534 if (rpmcliRootDir[0] != '/')
00535 argerror(_("arguments to --root (-r) must begin with a /"));
00536 break;
00537 }
00538 }
00539
00540 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
00541 if (0
00542 #if defined(IAM_RPMBT)
00543 || ba->sign
00544 #endif
00545 #if defined(IAM_RPMK)
00546 || ka->sign
00547 #endif
00548 )
00549
00550 {
00551 if (bigMode == MODE_REBUILD || bigMode == MODE_BUILD ||
00552 bigMode == MODE_RESIGN || bigMode == MODE_TARBUILD)
00553 {
00554 const char ** av;
00555 struct stat sb;
00556 int errors = 0;
00557
00558 if ((av = poptGetArgs(optCon)) == NULL) {
00559 fprintf(stderr, _("no files to sign\n"));
00560 errors++;
00561 } else
00562 while (*av) {
00563 if (stat(*av, &sb)) {
00564 fprintf(stderr, _("cannot access file %s\n"), *av);
00565 errors++;
00566 }
00567 av++;
00568 }
00569
00570 if (errors) {
00571 ec = errors;
00572 goto exit;
00573 }
00574
00575 if (poptPeekArg(optCon)) {
00576 int sigTag;
00577 switch (sigTag = rpmLookupSignatureType(RPMLOOKUPSIG_QUERY)) {
00578 case 0:
00579 break;
00580 case RPMSIGTAG_PGP:
00581 if ((sigTag == RPMSIGTAG_PGP || sigTag == RPMSIGTAG_PGP5) &&
00582 !rpmDetectPGPVersion(NULL)) {
00583 fprintf(stderr, _("pgp not found: "));
00584 ec = EXIT_FAILURE;
00585 goto exit;
00586 }
00587 case RPMSIGTAG_GPG:
00588 passPhrase = rpmGetPassPhrase(_("Enter pass phrase: "), sigTag);
00589 if (passPhrase == NULL) {
00590 fprintf(stderr, _("Pass phrase check failed\n"));
00591 ec = EXIT_FAILURE;
00592 goto exit;
00593 }
00594 fprintf(stderr, _("Pass phrase is good.\n"));
00595 passPhrase = xstrdup(passPhrase);
00596 break;
00597 default:
00598 fprintf(stderr,
00599 _("Invalid %%_signature spec in macro file.\n"));
00600 ec = EXIT_FAILURE;
00601 goto exit;
00602 break;
00603 }
00604 }
00605 } else {
00606 argerror(_("--sign may only be used during package building"));
00607 }
00608 } else {
00609
00610 (void) rpmLookupSignatureType(RPMLOOKUPSIG_DISABLE);
00611 }
00612
00613 #endif
00614
00615 if (rpmcliPipeOutput) {
00616 (void) pipe(p);
00617
00618 if (!(pipeChild = fork())) {
00619 (void) close(p[1]);
00620 (void) dup2(p[0], STDIN_FILENO);
00621 (void) close(p[0]);
00622 (void) execl("/bin/sh", "/bin/sh", "-c", rpmcliPipeOutput, NULL);
00623 fprintf(stderr, _("exec failed\n"));
00624 }
00625
00626 (void) close(p[0]);
00627 (void) dup2(p[1], STDOUT_FILENO);
00628 (void) close(p[1]);
00629 }
00630
00631 ts = rpmtsCreate();
00632 (void) rpmtsSetRootDir(ts, rpmcliRootDir);
00633 switch (bigMode) {
00634 #ifdef IAM_RPMDB
00635 case MODE_INITDB:
00636 (void) rpmtsInitDB(ts, 0644);
00637 break;
00638
00639 case MODE_REBUILDDB:
00640 { rpmVSFlags vsflags = rpmExpandNumeric("%{_vsflags_rebuilddb}");
00641 rpmVSFlags ovsflags = rpmtsSetVSFlags(ts, vsflags);
00642 ec = rpmtsRebuildDB(ts);
00643 vsflags = rpmtsSetVSFlags(ts, ovsflags);
00644 } break;
00645 case MODE_VERIFYDB:
00646 ec = rpmtsVerifyDB(ts);
00647 break;
00648 #endif
00649
00650 #ifdef IAM_RPMBT
00651 case MODE_REBUILD:
00652 case MODE_RECOMPILE:
00653 { const char * pkg;
00654
00655 while (!rpmIsVerbose())
00656 rpmIncreaseVerbosity();
00657
00658 if (!poptPeekArg(optCon))
00659 argerror(_("no packages files given for rebuild"));
00660
00661 ba->buildAmount =
00662 RPMBUILD_PREP | RPMBUILD_BUILD | RPMBUILD_INSTALL | RPMBUILD_CHECK;
00663 if (bigMode == MODE_REBUILD) {
00664 ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
00665 ba->buildAmount |= RPMBUILD_RMSOURCE;
00666 ba->buildAmount |= RPMBUILD_RMSPEC;
00667 ba->buildAmount |= RPMBUILD_CLEAN;
00668 ba->buildAmount |= RPMBUILD_RMBUILD;
00669 }
00670
00671 while ((pkg = poptGetArg(optCon))) {
00672 const char * specFile = NULL;
00673
00674 ba->cookie = NULL;
00675 ec = rpmInstallSource(ts, pkg, &specFile, &ba->cookie);
00676 if (ec == 0) {
00677 ba->rootdir = rpmcliRootDir;
00678 ba->passPhrase = passPhrase;
00679 ec = build(ts, specFile, ba, rpmcliRcfile);
00680 }
00681 ba->cookie = _free(ba->cookie);
00682 specFile = _free(specFile);
00683
00684 if (ec)
00685 break;
00686 }
00687
00688 } break;
00689
00690 case MODE_BUILD:
00691 case MODE_TARBUILD:
00692 { const char * pkg;
00693 while (!rpmIsVerbose())
00694 rpmIncreaseVerbosity();
00695
00696 switch (ba->buildChar) {
00697 case 'a':
00698 ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
00699
00700 case 'b':
00701 ba->buildAmount |= RPMBUILD_PACKAGEBINARY;
00702 ba->buildAmount |= RPMBUILD_CLEAN;
00703
00704 case 'i':
00705 ba->buildAmount |= RPMBUILD_INSTALL;
00706 ba->buildAmount |= RPMBUILD_CHECK;
00707 if ((ba->buildChar == 'i') && ba->shortCircuit)
00708 break;
00709
00710 case 'c':
00711 ba->buildAmount |= RPMBUILD_BUILD;
00712 if ((ba->buildChar == 'c') && ba->shortCircuit)
00713 break;
00714
00715 case 'p':
00716 ba->buildAmount |= RPMBUILD_PREP;
00717 break;
00718
00719 case 'l':
00720 ba->buildAmount |= RPMBUILD_FILECHECK;
00721 break;
00722 case 's':
00723 ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
00724 break;
00725 }
00726
00727 if (!poptPeekArg(optCon)) {
00728 if (bigMode == MODE_BUILD)
00729 argerror(_("no spec files given for build"));
00730 else
00731 argerror(_("no tar files given for build"));
00732 }
00733
00734 while ((pkg = poptGetArg(optCon))) {
00735 ba->rootdir = rpmcliRootDir;
00736 ba->passPhrase = passPhrase;
00737 ba->cookie = NULL;
00738 ec = build(ts, pkg, ba, rpmcliRcfile);
00739 if (ec)
00740 break;
00741 rpmFreeMacros(NULL);
00742 (void) rpmReadConfigFiles(rpmcliRcfile, NULL);
00743 }
00744 } break;
00745 #endif
00746
00747 #ifdef IAM_RPMEIU
00748 case MODE_ERASE:
00749 if (ia->noDeps) ia->eraseInterfaceFlags |= UNINSTALL_NODEPS;
00750
00751 if (!poptPeekArg(optCon)) {
00752 if (ia->rbtid == 0)
00753 argerror(_("no packages given for erase"));
00754 ia->transFlags |= RPMTRANS_FLAG_NOMD5;
00755 ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
00756 ec += rpmRollback(ts, ia, NULL);
00757 } else {
00758 ec += rpmErase(ts, ia, (const char **) poptGetArgs(optCon));
00759 }
00760 break;
00761
00762 case MODE_INSTALL:
00763
00764
00765
00766 if (!ia->incldocs) {
00767 if (ia->transFlags & RPMTRANS_FLAG_NODOCS) {
00768 ;
00769 } else if (rpmExpandNumeric("%{_excludedocs}"))
00770 ia->transFlags |= RPMTRANS_FLAG_NODOCS;
00771 }
00772
00773 if (ia->noDeps) ia->installInterfaceFlags |= INSTALL_NODEPS;
00774
00775
00776
00777 if (ia->prefix) {
00778 ia->relocations = xmalloc(2 * sizeof(*ia->relocations));
00779 ia->relocations[0].oldPath = NULL;
00780 ia->relocations[0].newPath = ia->prefix;
00781 ia->relocations[1].oldPath = NULL;
00782 ia->relocations[1].newPath = NULL;
00783 } else if (ia->relocations) {
00784 ia->relocations = xrealloc(ia->relocations,
00785 sizeof(*ia->relocations) * (ia->numRelocations + 1));
00786 ia->relocations[ia->numRelocations].oldPath = NULL;
00787 ia->relocations[ia->numRelocations].newPath = NULL;
00788 }
00789
00790
00791 if (!poptPeekArg(optCon)) {
00792 if (ia->rbtid == 0)
00793 argerror(_("no packages given for install"));
00794 ia->transFlags |= RPMTRANS_FLAG_NOMD5;
00795 ia->probFilter |= RPMPROB_FILTER_OLDPACKAGE;
00796 ec += rpmRollback(ts, ia, NULL);
00797 } else {
00798
00799 ec += rpmInstall(ts, ia, (const char **)poptGetArgs(optCon));
00800
00801 }
00802 break;
00803
00804 #endif
00805
00806 #ifdef IAM_RPMQV
00807 case MODE_QUERY:
00808 if (qva->qva_source != RPMQV_ALL && !poptPeekArg(optCon))
00809 argerror(_("no arguments given for query"));
00810
00811 qva->qva_specQuery = rpmspecQuery;
00812 ec = rpmcliQuery(ts, qva, (const char **) poptGetArgs(optCon));
00813 qva->qva_specQuery = NULL;
00814 break;
00815
00816 case MODE_VERIFY:
00817 { rpmVerifyFlags verifyFlags = VERIFY_ALL;
00818
00819 verifyFlags &= ~qva->qva_flags;
00820 qva->qva_flags = (rpmQueryFlags) verifyFlags;
00821
00822 if (qva->qva_source != RPMQV_ALL && !poptPeekArg(optCon))
00823 argerror(_("no arguments given for verify"));
00824 ec = rpmcliVerify(ts, qva, (const char **) poptGetArgs(optCon));
00825 } break;
00826 #endif
00827
00828 #ifdef IAM_RPMK
00829 case MODE_CHECKSIG:
00830 { rpmVerifyFlags verifyFlags =
00831 (VERIFY_MD5|VERIFY_DIGEST|VERIFY_SIGNATURE);
00832
00833 verifyFlags &= ~ka->qva_flags;
00834 ka->qva_flags = (rpmQueryFlags) verifyFlags;
00835 }
00836 case MODE_RESIGN:
00837 if (!poptPeekArg(optCon))
00838 argerror(_("no arguments given"));
00839 ka->passPhrase = passPhrase;
00840 ec = rpmcliSign(ts, ka, (const char **)poptGetArgs(optCon));
00841 break;
00842 #endif
00843
00844 #if !defined(IAM_RPMQV)
00845 case MODE_QUERY:
00846 case MODE_VERIFY:
00847 #endif
00848 #if !defined(IAM_RPMK)
00849 case MODE_CHECKSIG:
00850 case MODE_RESIGN:
00851 #endif
00852 #if !defined(IAM_RPMDB)
00853 case MODE_INITDB:
00854 case MODE_REBUILDDB:
00855 case MODE_VERIFYDB:
00856 #endif
00857 #if !defined(IAM_RPMBT)
00858 case MODE_BUILD:
00859 case MODE_REBUILD:
00860 case MODE_RECOMPILE:
00861 case MODE_TARBUILD:
00862 #endif
00863 #if !defined(IAM_RPMEIU)
00864 case MODE_INSTALL:
00865 case MODE_ERASE:
00866 #endif
00867 case MODE_UNKNOWN:
00868 if (poptPeekArg(optCon) != NULL || argc <= 1 || rpmIsVerbose()) {
00869 printUsage(optCon, stdout, 0);
00870 ec = argc;
00871 }
00872 break;
00873 }
00874
00875 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
00876 exit:
00877 #endif
00878
00879 ts = rpmtsFree(ts);
00880
00881 optCon = poptFreeContext(optCon);
00882 rpmFreeMacros(NULL);
00883 rpmFreeMacros(rpmCLIMacroContext);
00884 rpmFreeRpmrc();
00885
00886 if (pipeChild) {
00887 (void) fclose(stdout);
00888 (void) waitpid(pipeChild, &status, 0);
00889 }
00890
00891
00892 freeFilesystems();
00893 urlFreeCache();
00894 rpmlogClose();
00895 dbiTags = _free(dbiTags);
00896
00897 #ifdef IAM_RPMQV
00898 qva->qva_queryFormat = _free(qva->qva_queryFormat);
00899 #endif
00900
00901 #ifdef IAM_RPMBT
00902 freeNames();
00903 ba->buildRootOverride = _free(ba->buildRootOverride);
00904 ba->targets = _free(ba->targets);
00905 #endif
00906
00907 #ifdef IAM_RPMEIU
00908 if (ia->relocations != NULL)
00909 for (i = 0; i < ia->numRelocations; i++)
00910 ia->relocations[i].oldPath = _free(ia->relocations[i].oldPath);
00911 ia->relocations = _free(ia->relocations);
00912 #endif
00913
00914 #if HAVE_MCHECK_H && HAVE_MTRACE
00915
00916 muntrace();
00917
00918 #endif
00919
00920
00921 if (ec > 255) ec = 255;
00922
00923
00924 return ec;
00925
00926 }
00927
00928