00001 #include "system.h"
00002 const char *__progname;
00003
00004 #include <rpmcli.h>
00005 #include <argv.h>
00006 #include <rpmds.h>
00007 #include <stringbuf.h>
00008 #define _RPMFC_INTERNAL
00009 #include <rpmfc.h>
00010
00011 #include "debug.h"
00012
00013
00014 char *progname;
00015
00016 #define RPMDEP_RPMFC 1
00017 #define RPMDEP_RPMDSCPUINFO 2
00018 #define RPMDEP_RPMDSRPMLIB 3
00019 #define RPMDEP_RPMDSSYSINFO 4
00020 #define RPMDEP_RPMDSGETCONF 5
00021 #define RPMDEP_RPMDSELF 6
00022 #define RPMDEP_RPMDSLDCONFIG 7
00023 #define RPMDEP_RPMDSUNAME 8
00024 #define RPMDEP_RPMDSPIPE 9
00025
00026 #define RPMDEP_RPMDSPERL 10
00027 #define RPMDEP_RPMDSPYTHON 11
00028 #define RPMDEP_RPMDSLIBTOOL 12
00029 #define RPMDEP_RPMDSPKGCONFIG 13
00030
00031 #define RPMDEP_RPMDSPUBKEY 14
00032 #define RPMDEP_RPMDSARCH 15
00033 #define RPMDEP_RPMDSFILE 16
00034 #define RPMDEP_RPMDSSONAME 17
00035 #define RPMDEP_RPMDSPACKAGE 18
00036
00037 #define RPMDEP_RPMDSJAVA 20
00038 #define RPMDEP_RPMDSRUBY 21
00039 #define RPMDEP_RPMDSPHP 22
00040
00041 #define RPMDEP_RPMDSDPKGRPM 32
00042 #define RPMDEP_RPMDSRPMDPKG 33
00043
00044
00045 static int rpmdeps_mode = RPMDEP_RPMFC;
00046
00047
00048 static int print_provides = 1;
00049
00050
00051 static int print_requires = 1;
00052
00053
00054 static int print_closure = 0;
00055
00056 #define _PERL_PROVIDES "/usr/bin/find /usr/lib/perl5 | /usr/lib/rpm/perl.prov"
00057
00058 static const char * _perl_provides = _PERL_PROVIDES;
00059
00060 #define _PERL_REQUIRES "rpm -qa --fileclass | grep 'perl script' | sed -e 's/\t.*$//' | /usr/lib/rpm/perl.req"
00061
00062 static const char * _perl_requires = _PERL_REQUIRES;
00063
00064 #define _JAVA_PROVIDES "rpm -qal | egrep '\\.(jar|class)$' | /usr/lib/rpm/javadeps.sh -P"
00065
00066 static const char * _java_provides = _JAVA_PROVIDES;
00067
00068 #define _JAVA_REQUIRES "rpm -qal | egrep '\\.(jar|class)$' | /usr/lib/rpm/javadeps.sh -R"
00069
00070 static const char * _java_requires = _JAVA_REQUIRES;
00071
00072 #define _LIBTOOL_PROVIDES "/usr/bin/find /usr/lib -name '*.la' | /usr/lib/rpm/libtooldeps.sh -P /"
00073
00074 static const char * _libtool_provides = _LIBTOOL_PROVIDES;
00075
00076 #define _LIBTOOL_REQUIRES "/bin/rpm -qal | grep '\\.la$' | /usr/lib/rpm/libtooldeps.sh -R /"
00077
00078 static const char * _libtool_requires = _LIBTOOL_REQUIRES;
00079
00080 #define _PKGCONFIG_PROVIDES "/usr/bin/find /usr/lib -name '*.pc' | /usr/lib/rpm/pkgconfigdeps.sh -P"
00081 static const char * _pkgconfig_provides = _PKGCONFIG_PROVIDES;
00082
00083 #define _PKGCONFIG_REQUIRES "/bin/rpm -qal | grep '\\.pc$' | /usr/lib/rpm/pkgconfigdeps.sh -R"
00084 static const char * _pkgconfig_requires = _PKGCONFIG_REQUIRES;
00085
00086 #define _DPKG_PROVIDES "egrep '^(Package|Status|Version|Provides):' /var/lib/dpkg/status | sed -e '\n\
00087 /^Package: / {\n\
00088 N\n\
00089 /not-installed/d\n\
00090 N\n\
00091 s|^Package: \\([^\\n]*\\)\\n[^\\n]*\\nVersion: \\(.*\\)$|\\1 = \\2|\n\
00092 }\n\
00093 /^Provides: / {\n\
00094 s|^Provides: ||\n\
00095 s|, |\\n|g\n\
00096 }' | sed -f /usr/lib/rpm/dpkg2fc.sed | sort -u | tee /tmp/dpkg"
00097 static const char * _dpkg_provides = _DPKG_PROVIDES;
00098
00099 #define _DPKG_REQUIRES "egrep '^(Package|Status|Pre-Depends|Depends):' /var/lib/dpkg/status | sed -e '\n\
00100 /^Package: / {\n\
00101 N\n\
00102 /not-installed/d\n\
00103 s|^Package: [^\\n]*\\n.*$||\n\
00104 }\n\
00105 /^Depends: / {\n\
00106 s|^Depends: ||\n\
00107 s|(\\([^)]*\\))|\\1|g\n\
00108 s|>>|>|\n\
00109 s|<<|<|\n\
00110 s|, |\\n|g\n\
00111 }\n\
00112 /^Pre-Depends: / {\n\
00113 s|^Pre-Depends: ||\n\
00114 s|(\\([^)]*\\))|\\1|g\n\
00115 s|>>|>|\n\
00116 s|<<|<|\n\
00117 s|, |\\n|g\n\
00118 }' | sed -f /usr/lib/rpm/dpkg2fc.sed | sed -e 's/ |.*$//' | sort -u | tee /tmp/dpkg"
00119 static const char * _dpkg_requires = _DPKG_REQUIRES;
00120
00121 #define _RPMDB_PACKAGE_PROVIDES "/bin/rpm -qa --qf '%{name} = %|epoch?{%{epoch}:}|%{version}-%{release}\n' | sort -u"
00122 static const char * _rpmdb_package_provides = _RPMDB_PACKAGE_PROVIDES;
00123
00124 #define _RPMDB_PACKAGE_REQUIRES "/bin/rpm -qa --requires | sort -u | sed -e '/^\\//d' -e '/.*\\.so.*/d' -e '/^%/d' -e '/^.*(.*)/d'"
00125 static const char * _rpmdb_package_requires = _RPMDB_PACKAGE_REQUIRES;
00126
00127 #define _RPMDB_SONAME_REQUIRES "/bin/rpm -qa --requires | grep -v '^/' | grep '.*\\.so.*' | sort -u"
00128 static const char * _rpmdb_soname_requires = _RPMDB_SONAME_REQUIRES;
00129
00130 #define _RPMDB_FILE_REQUIRES "/bin/rpm -qa --requires | grep '^/' | sort -u"
00131 static const char * _rpmdb_file_requires = _RPMDB_FILE_REQUIRES;
00132
00133 static int rpmdepPrint(const char * msg, rpmds ds, FILE * fp)
00134 {
00135 if (fp == NULL) fp = stderr;
00136
00137 if (msg)
00138 fprintf(fp, "===================================== %s\n", msg);
00139
00140 ds = rpmdsInit(ds);
00141 while (rpmdsNext(ds) >= 0) {
00142 if (_rpmfc_debug || rpmIsDebug())
00143 fprintf(fp, "%6d\t", rpmdsIx(ds));
00144 if (_rpmfc_debug || rpmIsVerbose())
00145 fprintf(fp, "%s: ", rpmdsTagName(ds));
00146 fprintf(fp, "%s\n", rpmdsDNEVR(ds)+2);
00147 }
00148 return 0;
00149 }
00150
00151 static struct poptOption optionsTable[] = {
00152
00153 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
00154 N_("Common options for all rpm modes and executables:"),
00155 NULL },
00156
00157 { "cpuinfo", 0, POPT_ARG_VAL, &rpmdeps_mode, RPMDEP_RPMDSCPUINFO,
00158 N_("print cpuinfo(...) dependency set"), NULL },
00159 { "rpmlib", 0, POPT_ARG_VAL, &rpmdeps_mode, RPMDEP_RPMDSRPMLIB,
00160 N_("print rpmlib(...) dependency set"), NULL },
00161 { "sysinfo", 0, POPT_ARG_VAL, &rpmdeps_mode, RPMDEP_RPMDSSYSINFO,
00162 N_("print /etc/rpm/sysinfo dependency set"), NULL },
00163 { "getconf", 0, POPT_ARG_VAL, &rpmdeps_mode, RPMDEP_RPMDSGETCONF,
00164 N_("print getconf(...) dependency set"), NULL },
00165 { "elf", 0, POPT_ARG_VAL, &rpmdeps_mode, RPMDEP_RPMDSELF,
00166 N_("print soname(...) dependencies for elf files"), NULL },
00167 { "ldconfig", 0, POPT_ARG_VAL, &rpmdeps_mode, RPMDEP_RPMDSLDCONFIG,
00168 N_("print soname(...) dependencies from /etc/ld.so.cache"), NULL },
00169 { "uname", 0, POPT_ARG_VAL, &rpmdeps_mode, RPMDEP_RPMDSUNAME,
00170 N_("print uname(...) dependency set"), NULL },
00171 { "pipe", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSPIPE,
00172 N_("print dependency set from a command pipe"), NULL },
00173
00174 { "perl", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSPERL,
00175 N_("print perl(...) dependency set"), NULL },
00176 { "python", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSPYTHON,
00177 N_("print python(...) dependency set"), NULL },
00178 { "libtool", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSLIBTOOL,
00179 N_("print libtool(...) dependency set"), NULL },
00180 { "pkgconfig", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSPKGCONFIG,
00181 N_("print pkgconfig(...) dependency set"), NULL },
00182
00183 { "pubkey", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSPUBKEY,
00184 N_("print pubkey(...) dependency set"), NULL },
00185 { "arch", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSARCH,
00186 N_("print arch(...) dependency set"), NULL },
00187 { "file", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSFILE,
00188 N_("print file(...) dependency set"), NULL },
00189 { "soname", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSSONAME,
00190 N_("print soname(...) dependency set"), NULL },
00191 { "package", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSPACKAGE,
00192 N_("print package(...) dependency set"), NULL },
00193
00194 { "java", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSJAVA,
00195 N_("print java(...) dependency set"), NULL },
00196 { "php", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSPHP,
00197 N_("print php(...) dependency set"), NULL },
00198 { "ruby", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSRUBY,
00199 N_("print ruby(...) dependency set"), NULL },
00200 { "dpkgrpm", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSDPKGRPM,
00201 N_("print /var/lib/dpkg Provides: dependency set"), NULL },
00202 { "rpmdpkg", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmdeps_mode, RPMDEP_RPMDSRPMDPKG,
00203 N_("print /var/lib/dpkg Requires: dependency set"), NULL },
00204
00205 { "provides", 'P', POPT_ARG_VAL, &print_provides, -1,
00206 N_("print Provides: dependency set"), NULL },
00207 { "requires", 'R', POPT_ARG_VAL, &print_requires, -1,
00208 N_("print Requires: dependency set"), NULL },
00209 { "closure", 0, POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &print_closure, -1,
00210 N_("check Requires: against Provides: for dependency closure"), NULL },
00211
00212 POPT_AUTOALIAS
00213 POPT_AUTOHELP
00214 POPT_TABLEEND
00215 };
00216
00217 int
00218 main(int argc, char *const argv[])
00219 {
00220 poptContext optCon;
00221 ARGV_t av = NULL;
00222 rpmfc fc = NULL;
00223 rpmds P = NULL;
00224 rpmds R = NULL;
00225 rpmPRCO PRCO = rpmdsNewPRCO(NULL);
00226 const char * closure_name = "for";
00227 FILE * fp = NULL;
00228 int flags = 0;
00229 int ac = 0;
00230 int ec = 1;
00231 int xx;
00232 int i;
00233 char buf[BUFSIZ];
00234
00235
00236 if ((progname = strrchr(argv[0], '/')) != NULL)
00237 progname++;
00238 else
00239 progname = argv[0];
00240
00241
00242 optCon = rpmcliInit(argc, argv, optionsTable);
00243 if (optCon == NULL)
00244 goto exit;
00245
00246 av = poptGetArgs(optCon);
00247 ac = argvCount(av);
00248
00249 if (rpmdeps_mode == RPMDEP_RPMFC && ac == 0) {
00250 av = NULL;
00251 xx = argvFgets(&av, NULL);
00252 ac = argvCount(av);
00253 }
00254
00255
00256 xx = argvSort(av, NULL);
00257
00258 switch (rpmdeps_mode) {
00259 case RPMDEP_RPMFC:
00260 if (ac <= 0)
00261 break;
00262
00263
00264 fc = rpmfcNew();
00265 xx = rpmfcClassify(fc, av, NULL);
00266
00267
00268 xx = rpmfcApply(fc);
00269
00270 if (_rpmfc_debug) {
00271 sprintf(buf, "final: files %d cdict[%d] %d%% ddictx[%d]", fc->nfiles, argvCount(fc->cdict), ((100 * fc->fknown)/fc->nfiles), argiCount(fc->ddictx));
00272 rpmfcPrint(buf, fc, NULL);
00273 }
00274 if (print_provides > 0) print_provides = 0;
00275 if (print_requires > 0) print_requires = 0;
00276 P = fc->provides; fc->provides = NULL;
00277 R = fc->requires; fc->requires = NULL;
00278 fp = stdout;
00279 break;
00280 case RPMDEP_RPMDSCPUINFO:
00281 closure_name = "cpuinfo(...)";
00282 xx = rpmdsCpuinfo(&P, NULL);
00283 break;
00284 case RPMDEP_RPMDSRPMLIB:
00285 closure_name = "rpmlib(...)";
00286 xx = rpmdsRpmlib(&P, NULL);
00287 break;
00288 case RPMDEP_RPMDSSYSINFO:
00289 xx = rpmdsSysinfo(PRCO, NULL);
00290 P = rpmdsLink(rpmdsFromPRCO(PRCO, RPMTAG_PROVIDENAME), __FUNCTION__);
00291 R = rpmdsLink(rpmdsFromPRCO(PRCO, RPMTAG_REQUIRENAME), __FUNCTION__);
00292 break;
00293 case RPMDEP_RPMDSGETCONF:
00294 closure_name = "getconf(...)";
00295 xx = rpmdsGetconf(&P, NULL);
00296 break;
00297 case RPMDEP_RPMDSELF:
00298 closure_name = "soname(...)";
00299 for (i = 0; i < ac; i++)
00300 xx = rpmdsELF(av[i], flags, rpmdsMergePRCO, PRCO);
00301 P = rpmdsLink(rpmdsFromPRCO(PRCO, RPMTAG_PROVIDENAME), __FUNCTION__);
00302 R = rpmdsLink(rpmdsFromPRCO(PRCO, RPMTAG_REQUIRENAME), __FUNCTION__);
00303 break;
00304 case RPMDEP_RPMDSLDCONFIG:
00305 closure_name = "soname(...)";
00306 xx = rpmdsLdconfig(PRCO, NULL);
00307 P = rpmdsLink(rpmdsFromPRCO(PRCO, RPMTAG_PROVIDENAME), __FUNCTION__);
00308 R = rpmdsLink(rpmdsFromPRCO(PRCO, RPMTAG_REQUIRENAME), __FUNCTION__);
00309 break;
00310 case RPMDEP_RPMDSUNAME:
00311 closure_name = "uname(...)";
00312 xx = rpmdsUname(&P, NULL);
00313 break;
00314
00315 case RPMDEP_RPMDSPIPE:
00316 break;
00317 case RPMDEP_RPMDSPERL:
00318 closure_name = "perl(...)";
00319 if (rpmIsVerbose())
00320 fprintf(stderr, "\n*** Gathering %s Provides: using\n\t%s\n", closure_name, _perl_provides);
00321 xx = rpmdsPipe(&P, RPMTAG_PROVIDENAME, _perl_provides);
00322 if (print_closure || rpmIsVerbose()) {
00323 fprintf(stderr, "\n*** Gathering %s Requires: using\n\t%s\n", closure_name, _perl_requires);
00324 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _perl_requires);
00325 print_closure = 1;
00326 }
00327 break;
00328 case RPMDEP_RPMDSPYTHON:
00329 break;
00330 case RPMDEP_RPMDSLIBTOOL:
00331 closure_name = "libtool(...)";
00332 if (rpmIsVerbose())
00333 fprintf(stderr, "\n*** Gathering %s Provides: using\n\t%s\n", closure_name, _libtool_provides);
00334 xx = rpmdsPipe(&P, RPMTAG_PROVIDENAME, _libtool_provides);
00335 if (print_closure || rpmIsVerbose()) {
00336 fprintf(stderr, "\n*** Gathering %s Requires: using\n\t%s\n", closure_name, _libtool_requires);
00337 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _libtool_requires);
00338 print_closure = 1;
00339 }
00340 break;
00341 case RPMDEP_RPMDSPKGCONFIG:
00342 closure_name = "pkgconfig(...)";
00343 if (rpmIsVerbose())
00344 fprintf(stderr, "\n*** Gathering %s Provides: using\n\t%s\n", closure_name, _pkgconfig_provides);
00345 xx = rpmdsPipe(&P, RPMTAG_PROVIDENAME, _pkgconfig_provides);
00346 if (print_closure || rpmIsVerbose()) {
00347 fprintf(stderr, "\n*** Gathering %s Requires: using\n\t%s\n", closure_name, _pkgconfig_requires);
00348 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _pkgconfig_requires);
00349 print_closure = 1;
00350 }
00351 break;
00352
00353 case RPMDEP_RPMDSPUBKEY:
00354 break;
00355 case RPMDEP_RPMDSARCH:
00356 break;
00357 case RPMDEP_RPMDSFILE:
00358 if (rpmIsVerbose())
00359 fprintf(stderr, "\n*** Gathering rpmdb file Requires: using\n\t%s\n", _rpmdb_file_requires);
00360 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _rpmdb_file_requires);
00361 break;
00362 case RPMDEP_RPMDSSONAME:
00363 closure_name = "soname(...)";
00364 xx = rpmdsLdconfig(PRCO, NULL);
00365 P = rpmdsLink(rpmdsFromPRCO(PRCO, RPMTAG_PROVIDENAME), __FUNCTION__);
00366 if (print_closure || rpmIsVerbose()) {
00367 fprintf(stderr, "\n*** Gathering rpmdb soname Requires: using\n\t%s\n", _rpmdb_soname_requires);
00368 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _rpmdb_soname_requires);
00369 print_closure = 1;
00370 }
00371 break;
00372 case RPMDEP_RPMDSPACKAGE:
00373 closure_name = "package(...)";
00374 if (rpmIsVerbose())
00375 fprintf(stderr, "\n*** Gathering rpmdb package Provides: using\n\t%s\n", _rpmdb_package_provides);
00376 xx = rpmdsPipe(&P, RPMTAG_PROVIDENAME, _rpmdb_package_provides);
00377 if (print_closure || rpmIsVerbose()) {
00378 fprintf(stderr, "\n*** Gathering rpmdb package Requires: using\n\t%s\n", _rpmdb_package_requires);
00379 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _rpmdb_package_requires);
00380 print_closure = 1;
00381 }
00382 break;
00383
00384 case RPMDEP_RPMDSJAVA:
00385 closure_name = "java(...)";
00386 if (rpmIsVerbose())
00387 fprintf(stderr, "\n*** Gathering %s Provides: using\n\t%s\n", closure_name, _java_provides);
00388 xx = rpmdsPipe(&P, RPMTAG_PROVIDENAME, _java_provides);
00389 if (print_closure || rpmIsVerbose()) {
00390 fprintf(stderr, "\n*** Gathering %s Requires: using\n\t%s\n", closure_name, _java_requires);
00391 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _java_requires);
00392 print_closure = 1;
00393 }
00394 break;
00395 case RPMDEP_RPMDSRUBY:
00396 break;
00397 case RPMDEP_RPMDSPHP:
00398 break;
00399 case RPMDEP_RPMDSDPKGRPM:
00400 closure_name = "dpkgrpm(...)";
00401 if (rpmIsVerbose())
00402 fprintf(stderr, "\n*** Gathering dpkg Provides: using\n\t%s\n", _dpkg_provides);
00403 xx = rpmdsPipe(&P, RPMTAG_PROVIDENAME, _dpkg_provides);
00404 if (print_closure || rpmIsVerbose()) {
00405 fprintf(stderr, "\n*** Gathering rpmdb package Requires: using\n\t%s\n", _rpmdb_package_requires);
00406 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _rpmdb_package_requires);
00407 print_closure = 1;
00408 }
00409 break;
00410 case RPMDEP_RPMDSRPMDPKG:
00411 closure_name = "rpmdpkg(...)";
00412 if (print_closure || rpmIsVerbose()) {
00413 fprintf(stderr, "\n*** Gathering rpmdb package Provides: using\n\t%s\n", _rpmdb_package_provides);
00414 xx = rpmdsPipe(&P, RPMTAG_PROVIDENAME, _rpmdb_package_provides);
00415 print_closure = 1;
00416 }
00417 if (rpmIsVerbose())
00418 fprintf(stderr, "\n*** Gathering dpkg Requires: using\n\t%s\n", _dpkg_requires);
00419 xx = rpmdsPipe(&R, RPMTAG_REQUIRENAME, _dpkg_requires);
00420 break;
00421 }
00422
00423 if (print_provides && P != NULL)
00424 xx = rpmdepPrint(NULL, P, fp);
00425 if (print_requires && R != NULL)
00426 xx = rpmdepPrint(NULL, R, fp);
00427 if (print_closure) {
00428 if (rpmIsVerbose())
00429 fprintf(stderr, "\n*** Checking %s Requires(%d): against Provides(%d): closure:\n", closure_name, rpmdsCount(R), rpmdsCount(P));
00430 xx = rpmdsPrintClosure(P, R, fp);
00431 }
00432
00433 fc = rpmfcFree(fc);
00434 P = rpmdsFree(P);
00435 R = rpmdsFree(R);
00436 PRCO = rpmdsFreePRCO(PRCO);
00437
00438 ec = 0;
00439
00440 exit:
00441 optCon = rpmcliFini(optCon);
00442 return ec;
00443 }