static PyObject * setVerbosity (PyObject * self, PyObject * arg) { int level; if (!PyArg_Parse(arg, "i", &level)) return NULL; rpmSetVerbosity(level); Py_RETURN_NONE; }
static PyObject * setVerbosity (PyObject * self, PyObject * args, PyObject *kwds) { int level; char * kwlist[] = {"level", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &level)) return NULL; rpmSetVerbosity(level); Py_INCREF(Py_None); return (PyObject *) Py_None; }
static void rpmcliAllArgCallback( poptContext con, enum poptCallbackReason reason, const struct poptOption * opt, const char * arg, const void * data) { /* XXX avoid accidental collisions with POPT_BIT_SET for flags */ if (opt->arg == NULL) switch (opt->val) { case 'q': rpmSetVerbosity(RPMLOG_WARNING); break; case 'v': rpmIncreaseVerbosity(); break; case POPT_PREDEFINE: (void) rpmDefineMacro(NULL, arg, RMIL_CMDLINE); break; case 'D': { char *s, *t; /* XXX Convert '-' in macro name to underscore, skip leading %. */ s = t = xstrdup(arg); while (*t && !risspace(*t)) { if (*t == '-') *t = '_'; t++; } t = s; if (*t == '%') t++; /* XXX Predefine macro if not initialized yet. */ if (rpmcliInitialized < 0) (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE); rpmcliConfigured(); (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE); (void) rpmDefineMacro(rpmCLIMacroContext, t, RMIL_CMDLINE); free(s); break; } case 'E': rpmcliConfigured(); { char *val = rpmExpand(arg, NULL); fprintf(stdout, "%s\n", val); free(val); } break; case POPT_DBPATH: rpmcliConfigured(); addMacro(NULL, "_dbpath", NULL, arg, RMIL_CMDLINE); break; case POPT_SHOWVERSION: printVersion(stdout); exit(EXIT_SUCCESS); break; case POPT_SHOWRC: rpmcliConfigured(); (void) rpmShowRC(stdout); exit(EXIT_SUCCESS); break; case POPT_QUERYTAGS: rpmDisplayQueryTags(stdout); exit(EXIT_SUCCESS); break; case RPMCLI_POPT_NODIGEST: rpmcliQueryFlags |= VERIFY_DIGEST; break; case RPMCLI_POPT_NOSIGNATURE: rpmcliQueryFlags |= VERIFY_SIGNATURE; break; case RPMCLI_POPT_NOHDRCHK: rpmcliQueryFlags |= VERIFY_HDRCHK; break; } }
poptContext rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable) { poptContext optCon; int rc; const char *ctx, *execPath; setprogname(argv[0]); /* Retrofit glibc __progname */ /* XXX glibc churn sanity */ if (__progname == NULL) { if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++; else __progname = argv[0]; } #if defined(ENABLE_NLS) (void) setlocale(LC_ALL, "" ); (void) bindtextdomain(PACKAGE, LOCALEDIR); (void) textdomain(PACKAGE); #endif rpmSetVerbosity(RPMLOG_NOTICE); if (optionsTable == NULL) { /* Read rpm configuration (if not already read). */ rpmcliConfigured(); return NULL; } /* XXX hack to get popt working from build tree wrt lt-foo names */ ctx = rstreqn(__progname, "lt-", 3) ? __progname + 3 : __progname; optCon = poptGetContext(ctx, argc, (const char **)argv, optionsTable, 0); { char *poptfile = rpmGenPath(rpmConfigDir(), LIBRPMALIAS_FILENAME, NULL); (void) poptReadConfigFile(optCon, poptfile); free(poptfile); } (void) poptReadDefaultConfig(optCon, 1); if ((execPath = getenv("RPM_POPTEXEC_PATH")) == NULL) execPath = LIBRPMALIAS_EXECPATH; poptSetExecPath(optCon, execPath, 1); /* Process all options, whine if unknown. */ while ((rc = poptGetNextOpt(optCon)) > 0) { fprintf(stderr, _("%s: option table misconfigured (%d)\n"), __progname, rc); exit(EXIT_FAILURE); } if (rc < -1) { fprintf(stderr, "%s: %s: %s\n", __progname, poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(rc)); exit(EXIT_FAILURE); } /* Read rpm configuration (if not already read). */ rpmcliConfigured(); if (_debug) { rpmIncreaseVerbosity(); rpmIncreaseVerbosity(); } return optCon; }
int main(int argc, char **argv) { rpmts *ts = NULL; int tscount = 0; int rc = 0; int i; int c; int ignoremissing = 0; int deplistmode = 0; char *outfile = NULL; debugmode = 0; outf = stdout; opterr = 0; while ((c = getopt (argc, argv, "itdo:")) != -1) { switch (c) { case 'i': ignoremissing = 1; break; case 't': deplistmode = 1; break; case 'd': debugmode = 1; break; case 'o': outfile = strdup(optarg); break; case '?': if(isprint(optopt)) fprintf(stderr, "Unknown option `-%c'.\n", optopt); else fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt); usage(); return 1; default: abort(); } } if( argc - optind < 1 ) { usage(); return 1; } if( outfile ) { if(debugmode) printf("DEBUG: Using output file %s\n", outfile); outf = fopen(outfile, "w"); } const char *dblistfn = argv[optind]; rpmcliInit(argc, argv, NULL); if(debugmode) rpmSetVerbosity(RPMLOG_DEBUG); rpmDefineMacro(NULL, "__dbi_txn create nofsync", RMIL_CMDLINE); rc = loadTs(&ts, &tscount, dblistfn); if( rc ) return 1; if( tscount == 0 ) { fprintf(stderr, "Please specify database list file or database location\n"); return 1; } if(deplistmode) { rc = printDepList(ts, tscount); } else { if( argc - optind < 2 ) { fprintf(stderr, "Please specify package list file\n"); } else { const char *pkglistfn = argv[optind+1]; rc = processPackages(ts, tscount, pkglistfn, ignoremissing); } } for(i=0; i<tscount; i++) (void)rpmtsFree(ts[i]); free(ts); if( outfile ) { fclose(outf); free(outfile); } return rc; }
/*@-globstate@*/ poptContext rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable) /*@globals rpmpoptfiles @*/ /*@modifies rpmpoptfiles @*/ { poptContext optCon; int rc; int xx; int i; #if defined(HAVE_MCHECK_H) && defined(HAVE_MTRACE) /*@-noeffect@*/ mtrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */ /*@=noeffect@*/ #endif /*@-globs -mods@*/ setprogname(argv[0]); /* Retrofit glibc __progname */ /* XXX glibc churn sanity */ if (__progname == NULL) { if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++; else __progname = argv[0]; } /*@=globs =mods@*/ /* Insure that stdin/stdout/stderr are open, lest stderr end up in rpmdb. */ { static const char _devnull[] = "/dev/null"; #if defined(STDIN_FILENO) (void) checkfd(_devnull, STDIN_FILENO, O_RDONLY); #endif #if defined(STDOUT_FILENO) (void) checkfd(_devnull, STDOUT_FILENO, O_WRONLY); #endif #if defined(STDERR_FILENO) (void) checkfd(_devnull, STDERR_FILENO, O_WRONLY); #endif } #if defined(RPM_VENDOR_WINDRIVER) (void) setRuntimeRelocPaths(); #endif #if defined(ENABLE_NLS) && !defined(__LCLINT__) (void) setlocale(LC_ALL, "" ); (void) bindtextdomain(PACKAGE, __localedir); (void) textdomain(PACKAGE); #endif rpmSetVerbosity(RPMLOG_NOTICE); if (optionsTable == NULL) { /* Read rpm configuration (if not already read). */ rpmcliConfigured(); return NULL; } /* read all RPM POPT configuration files */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "--rpmpopt") == 0 && i+1 < argc) { rpmpoptfiles = argv[i+1]; break; } else if (strncmp(argv[i], "--rpmpopt=", 10) == 0) { rpmpoptfiles = argv[i]+10; break; } } /* XXX strip off the "lt-" prefix so that rpmpopt aliases "work". */ { static const char lt_[] = "lt-"; const char * s = __progname; if (!strncmp(s, lt_, sizeof(lt_)-1)) s += sizeof(lt_)-1; /*@-nullpass -temptrans@*/ optCon = poptGetContext(s, argc, (const char **)argv, optionsTable, 0); /*@=nullpass =temptrans@*/ } #if defined(RPM_VENDOR_OPENPKG) /* stick-with-rpm-file-sanity-checking */ || \ !defined(POPT_ERROR_BADCONFIG) /* XXX POPT 1.15 retrofit */ { char * path_buf = xstrdup(rpmpoptfiles); char *path; char *path_next; for (path = path_buf; path != NULL && *path != '\0'; path = path_next) { const char **av; int ac; /* locate start of next path element */ path_next = strchr(path, ':'); if (path_next != NULL && *path_next == ':') *path_next++ = '\0'; else path_next = path + strlen(path); /* glob-expand the path element */ ac = 0; av = NULL; if ((xx = rpmGlob(path, &ac, &av)) != 0) continue; /* work-off each resulting file from the path element */ for (i = 0; i < ac; i++) { const char *fn = av[i]; if (fn[0] == '@' /* attention */) { fn++; if (!rpmSecuritySaneFile(fn)) { rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", fn); /*@innercontinue@*/ continue; } } (void) poptReadConfigFile(optCon, fn); av[i] = _free(av[i]); } av = _free(av); } path_buf = _free(path_buf); } #else /* XXX FIXME: better error message is needed. */ if ((xx = poptReadConfigFiles(optCon, rpmpoptfiles)) != 0) rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", rpmpoptfiles); #endif #if defined(RPM_VENDOR_WINDRIVER) { const char * poptAliasFn = rpmGetPath(__usrlibrpm, "/rpmpopt", NULL); (void) poptReadConfigFile(optCon, poptAliasFn); poptAliasFn = _free(poptAliasFn); } #endif /* read standard POPT configuration files */ /* XXX FIXME: the 2nd arg useEnv flag is UNUSED. */ (void) poptReadDefaultConfig(optCon, 1); #if defined(RPM_VENDOR_WINDRIVER) { const char * poptExecPath = rpmGetPath(__usrlibrpm, NULL); poptSetExecPath(optCon, poptExecPath, 1); poptExecPath = _free(poptExecPath); } #else poptSetExecPath(optCon, USRLIBRPM, 1); #endif /* Process all options, whine if unknown. */ while ((rc = poptGetNextOpt(optCon)) > 0) { const char * optArg = poptGetOptArg(optCon); /*@-dependenttrans -observertrans@*/ /* Avoid popt memory leaks. */ optArg = _free(optArg); /*@=dependenttrans =observertrans @*/ switch (rc) { default: /*@-nullpass@*/ fprintf(stderr, _("%s: option table misconfigured (%d)\n"), __progname, rc); /*@=nullpass@*/ exit(EXIT_FAILURE); /*@notreached@*/ /*@switchbreak@*/ break; } } if (rc < -1) { /*@-nullpass@*/ fprintf(stderr, "%s: %s: %s\n", __progname, poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(rc)); /*@=nullpass@*/ exit(EXIT_FAILURE); } /* Read rpm configuration (if not already read). */ rpmcliConfigured(); if (_debug) { rpmIncreaseVerbosity(); rpmIncreaseVerbosity(); } /* Initialize header stat collection. */ /*@-mods@*/ _hdr_stats = _rpmts_stats; /*@=mods@*/ return optCon; }
uint32_t TDNFRpmExecTransaction( PTDNF pTdnf, PTDNF_SOLVED_PKG_INFO pSolvedInfo ) { uint32_t dwError = 0; int nKeepCachedRpms = 0; TDNFRPMTS ts = {0}; if(!pTdnf || !pTdnf->pConf || !pSolvedInfo) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } nKeepCachedRpms = pTdnf->pConf->nKeepCache; ts.pCachedRpmsArray = g_array_new(TRUE, TRUE, sizeof(char*)); if(!ts.pCachedRpmsArray) { dwError = ERROR_TDNF_OUT_OF_MEMORY; BAIL_ON_TDNF_ERROR(dwError); } dwError = rpmReadConfigFiles(NULL, NULL); BAIL_ON_TDNF_ERROR(dwError); rpmSetVerbosity(TDNFConfGetRpmVerbosity(pTdnf)); //Allow downgrades ts.nProbFilterFlags = RPMPROB_FILTER_OLDPACKAGE; if(pSolvedInfo->nAlterType == ALTER_REINSTALL) { ts.nProbFilterFlags = ts.nProbFilterFlags | RPMPROB_FILTER_REPLACEPKG; } ts.pTS = rpmtsCreate(); if(!ts.pTS) { dwError = ERROR_TDNF_RPMTS_CREATE_FAILED; BAIL_ON_TDNF_ERROR(dwError); } ts.pKeyring = rpmKeyringNew(); if(!ts.pKeyring) { dwError = ERROR_TDNF_RPMTS_KEYRING_FAILED; BAIL_ON_TDNF_ERROR(dwError); } ts.nTransFlags = rpmtsSetFlags (ts.pTS, RPMTRANS_FLAG_NONE); if(rpmtsSetRootDir (ts.pTS, pTdnf->pArgs->pszInstallRoot)) { dwError = ERROR_TDNF_RPMTS_BAD_ROOT_DIR; BAIL_ON_TDNF_ERROR(dwError); } if(rpmtsSetNotifyCallback(ts.pTS, TDNFRpmCB, (void*)&ts)) { dwError = ERROR_TDNF_RPMTS_SET_CB_FAILED; BAIL_ON_TDNF_ERROR(dwError); } dwError = TDNFPopulateTransaction(&ts, pTdnf, pSolvedInfo); BAIL_ON_TDNF_ERROR(dwError); dwError = TDNFRunTransaction(&ts, pTdnf); BAIL_ON_TDNF_ERROR(dwError); cleanup: if(ts.pTS) { rpmtsCloseDB(ts.pTS); rpmtsFree(ts.pTS); } if(ts.pKeyring) { rpmKeyringFree(ts.pKeyring); } if(ts.pCachedRpmsArray) { if(!nKeepCachedRpms) { TDNFRemoveCachedRpms(ts.pCachedRpmsArray); } TDNFFreeCachedRpmsArray(ts.pCachedRpmsArray); } return dwError; error: goto cleanup; }
int main(int argc, char *argv[]) { rpmts ts = NULL; enum modes bigMode = MODE_UNKNOWN; #if defined(IAM_RPMQV) QVA_t qva = &rpmQVKArgs; #endif #ifdef IAM_RPMEIU struct rpmInstallArguments_s * ia = &rpmIArgs; #endif poptContext optCon; int ec = 0; #ifdef IAM_RPMEIU int i; #endif xsetprogname(argv[0]); /* Portability call -- see system.h */ optCon = rpmcliInit(argc, argv, optionsTable); /* Set the major mode based on argv[0] */ #ifdef IAM_RPMQV if (rstreq(xgetprogname(), "rpmquery")) bigMode = MODE_QUERY; if (rstreq(xgetprogname(), "rpmverify")) bigMode = MODE_VERIFY; #endif #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_INSTALL: case MODE_ERASE: case MODE_UNKNOWN: default: break; } #endif #ifdef IAM_RPMQV if (bigMode == MODE_UNKNOWN || (bigMode & MODES_QV)) { switch (qva->qva_mode) { case 'q': bigMode = MODE_QUERY; break; case 'V': bigMode = MODE_VERIFY; break; } if (qva->qva_sourceCount) { if (qva->qva_sourceCount > 1) argerror(_("one type of query/verify may be performed at a " "time")); } if (qva->qva_flags && (bigMode & ~MODES_QV)) argerror(_("unexpected query flags")); if (qva->qva_queryFormat && (bigMode & ~MODES_QV)) argerror(_("unexpected query format")); if (qva->qva_source != RPMQV_PACKAGE && (bigMode & ~MODES_QV)) argerror(_("unexpected query source")); } #endif /* IAM_RPMQV */ #ifdef IAM_RPMEIU if (bigMode == MODE_UNKNOWN || (bigMode & MODES_IE)) { int iflags = (ia->installInterfaceFlags & (INSTALL_UPGRADE|INSTALL_FRESHEN| INSTALL_INSTALL|INSTALL_REINSTALL)); int eflags = (ia->installInterfaceFlags & INSTALL_ERASE); if (iflags & eflags) argerror(_("only one major mode may be specified")); else if (iflags) bigMode = MODE_INSTALL; else if (eflags) bigMode = MODE_ERASE; } #endif /* IAM_RPMEIU */ #if defined(IAM_RPMEIU) if (!( bigMode == MODE_INSTALL ) && (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")); if (ia->relocations && ia->prefix) argerror(_("cannot use --prefix with --relocate or --excludepath")); if (bigMode != MODE_INSTALL && ia->relocations) argerror(_("--relocate and --excludepath may only be used when installing new packages")); if (bigMode != MODE_INSTALL && ia->prefix) argerror(_("--prefix may only be used when installing new packages")); if (ia->prefix && ia->prefix[0] != '/') argerror(_("arguments to --prefix must begin with a /")); if (!(bigMode & MODES_IE) && (ia->installInterfaceFlags & INSTALL_HASH)) argerror(_("--hash (-h) may only be specified during package " "installation and erasure")); if (!(bigMode & MODES_IE) && (ia->installInterfaceFlags & INSTALL_PERCENT)) argerror(_("--percent may only be specified during package " "installation and erasure")); if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_REPLACEPKG)) argerror(_("--replacepkgs may only be specified during package " "installation")); if (bigMode != MODE_INSTALL && (ia->transFlags & RPMTRANS_FLAG_NODOCS)) argerror(_("--excludedocs may only be specified during package " "installation")); if (bigMode != MODE_INSTALL && ia->incldocs) argerror(_("--includedocs may only be specified during package " "installation")); if (ia->incldocs && (ia->transFlags & RPMTRANS_FLAG_NODOCS)) argerror(_("only one of --excludedocs and --includedocs may be " "specified")); if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_IGNOREARCH)) argerror(_("--ignorearch may only be specified during package " "installation")); if (bigMode != MODE_INSTALL && (ia->probFilter & RPMPROB_FILTER_IGNOREOS)) argerror(_("--ignoreos may only be specified during package " "installation")); 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->installInterfaceFlags & UNINSTALL_ALLMATCHES) && bigMode != MODE_ERASE) argerror(_("--allmatches may only be specified during package " "erasure")); if ((ia->transFlags & RPMTRANS_FLAG_ALLFILES) && bigMode != MODE_INSTALL) argerror(_("--allfiles may only be specified during package " "installation")); if ((ia->transFlags & RPMTRANS_FLAG_JUSTDB) && bigMode != MODE_INSTALL && bigMode != MODE_ERASE) argerror(_("--justdb may only be specified during package " "installation and erasure")); 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 && 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 " "installation, erasure, and verification")); if ((ia->transFlags & RPMTRANS_FLAG_TEST) && (bigMode & ~MODES_FOR_TEST)) argerror(_("--test may only be specified during package installation " "and erasure")); #endif /* IAM_RPMEIU */ if (rpmcliRootDir && rpmcliRootDir[0] != '/') { argerror(_("arguments to --root (-r) must begin with a /")); } if (quiet) rpmSetVerbosity(RPMLOG_WARNING); if (rpmcliPipeOutput && initPipe()) exit(EXIT_FAILURE); ts = rpmtsCreate(); (void) rpmtsSetRootDir(ts, rpmcliRootDir); switch (bigMode) { #ifdef IAM_RPMEIU case MODE_ERASE: if (ia->noDeps) ia->installInterfaceFlags |= UNINSTALL_NODEPS; if (!poptPeekArg(optCon)) { argerror(_("no packages given for erase")); } else { ec += rpmErase(ts, ia, (ARGV_const_t) poptGetArgs(optCon)); } break; case MODE_INSTALL: /* RPMTRANS_FLAG_KEEPOBSOLETE */ if (!ia->incldocs) { if (ia->transFlags & RPMTRANS_FLAG_NODOCS) { ; } else if (rpmExpandNumeric("%{_excludedocs}")) ia->transFlags |= RPMTRANS_FLAG_NODOCS; } if (ia->noDeps) ia->installInterfaceFlags |= INSTALL_NODEPS; /* we've already ensured !(!ia->prefix && !ia->relocations) */ if (ia->prefix) { ia->relocations = xmalloc(2 * sizeof(*ia->relocations)); ia->relocations[0].oldPath = NULL; /* special case magic */ ia->relocations[0].newPath = ia->prefix; ia->relocations[1].oldPath = NULL; ia->relocations[1].newPath = NULL; } else if (ia->relocations) { ia->relocations = xrealloc(ia->relocations, sizeof(*ia->relocations) * (ia->numRelocations + 1)); ia->relocations[ia->numRelocations].oldPath = NULL; ia->relocations[ia->numRelocations].newPath = NULL; } if (!poptPeekArg(optCon)) { argerror(_("no packages given for install")); } else { /* FIX: ia->relocations[0].newPath undefined */ ec += rpmInstall(ts, ia, (ARGV_t) poptGetArgs(optCon)); } break; #endif /* IAM_RPMEIU */ #ifdef IAM_RPMQV case MODE_QUERY: if (!poptPeekArg(optCon) && !(qva->qva_source == RPMQV_ALL)) argerror(_("no arguments given for query")); ec = rpmcliQuery(ts, qva, (ARGV_const_t) poptGetArgs(optCon)); break; case MODE_VERIFY: { rpmVerifyFlags verifyFlags = VERIFY_ALL; verifyFlags &= ~qva->qva_flags; qva->qva_flags = (rpmQueryFlags) verifyFlags; if (!poptPeekArg(optCon) && !(qva->qva_source == RPMQV_ALL)) argerror(_("no arguments given for verify")); ec = rpmcliVerify(ts, qva, (ARGV_const_t) poptGetArgs(optCon)); } break; #endif /* IAM_RPMQV */ #if !defined(IAM_RPMQV) case MODE_QUERY: case MODE_VERIFY: #endif #if !defined(IAM_RPMEIU) case MODE_INSTALL: case MODE_ERASE: #endif case MODE_UNKNOWN: if (poptPeekArg(optCon) != NULL || argc <= 1 || rpmIsVerbose()) { printUsage(optCon, stderr, 0); ec = argc; } break; } rpmtsFree(ts); if (finishPipe()) ec = EXIT_FAILURE; #ifdef IAM_RPMQV free(qva->qva_queryFormat); #endif #ifdef IAM_RPMEIU if (ia->relocations != NULL) { for (i = 0; i < ia->numRelocations; i++) free(ia->relocations[i].oldPath); free(ia->relocations); } #endif rpmcliFini(optCon); return RETVAL(ec); }