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