00001
00006 #include "system.h"
00007
00008 #include <poptIO.h>
00009
00010 #define _RPMPGP_INTERNAL
00011 #if defined(WITH_BEECRYPT)
00012 #define _RPMBC_INTERNAL
00013 #include <rpmbc.h>
00014 #endif
00015 #if defined(WITH_GCRYPT)
00016 #define _RPMGC_INTERNAL
00017 #include <rpmgc.h>
00018 #endif
00019 #if defined(WITH_NSS)
00020 #define _RPMNSS_INTERNAL
00021 #include <rpmnss.h>
00022 #endif
00023 #if defined(WITH_SSL)
00024 #define _RPMSSL_INTERNAL
00025 #include <rpmssl.h>
00026 #endif
00027
00028 #include <rpmficl.h>
00029 #include <rpmjs.h>
00030 #include <rpmperl.h>
00031 #include <rpmpython.h>
00032 #include <rpmruby.h>
00033 #include <rpmtcl.h>
00034
00035 #include "debug.h"
00036
00037 const char *__progname;
00038
00039 #if !defined(POPT_ARGFLAG_TOGGLE)
00040 #define POPT_ARGFLAG_TOGGLE 0
00041 #endif
00042 #define POPT_SHOWVERSION -999
00043 #define POPT_UNDEFINE -994
00044 #define POPT_CRYPTO -993
00045
00046
00047 int __debug = 0;
00048
00049
00050
00051
00052 extern int _ar_debug;
00053
00054 extern int _av_debug;
00055
00056 extern int _cpio_debug;
00057
00058 extern int _dav_debug;
00059
00060 extern int _ftp_debug;
00061
00062 extern int _fts_debug;
00063
00064 extern int _ht_debug;
00065
00066 extern int _iosm_debug;
00067
00068 extern int noLibio;
00069
00070 extern int _pgp_debug;
00071
00072 extern int _rpmio_debug;
00073
00074 extern int _rpmiob_debug;
00075
00076 extern int _rpmlua_debug;
00077
00078 extern int _rpmsq_debug;
00079
00080 extern int _rpmzq_debug;
00081
00082 extern int _tar_debug;
00083
00084 extern int _xar_debug;
00085
00086
00087
00088
00089 const char * rpmioPipeOutput = NULL;
00090
00091
00092 const char * rpmioRootDir = "/";
00093
00094
00095 const char *rpmioEVR = VERSION;
00096
00097
00098 static int rpmioInitialized = -1;
00099
00100 #ifdef NOTYET
00101 #ifdef WITH_LUA
00102
00103 extern const char *rpmluaFiles;
00104 #endif
00105
00106
00107 static char *rpmpoptfiles = RPMPOPTFILES;
00108 #endif
00109
00110 pgpHashAlgo rpmioDigestHashAlgo = -1;
00111
00115 struct poptOption rpmioDigestPoptTable[] = {
00116 { "md2", '\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD2,
00117 N_("MD2 digest (RFC-1319)"), NULL },
00118 { "md4", '\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD4,
00119 N_("MD4 digest"), NULL },
00120 { "md5", '\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD5,
00121 N_("MD5 digest (RFC-1321)"), NULL },
00122 { "sha1",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA1,
00123 N_("SHA-1 digest (FIPS-180-1)"), NULL },
00124 { "sha224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA224,
00125 N_("SHA-224 digest (FIPS-180-2)"), NULL },
00126 { "sha256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA256,
00127 N_("SHA-256 digest (FIPS-180-2)"), NULL },
00128 { "sha384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA384,
00129 N_("SHA-384 digest (FIPS-180-2)"), NULL },
00130 { "sha512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA512,
00131 N_("SHA-512 digest (FIPS-180-2)"), NULL },
00132 { "salsa10",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_SALSA10,
00133 N_("SALSA-10 hash"), NULL },
00134 { "salsa20",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_SALSA20,
00135 N_("SALSA-20 hash"), NULL },
00136 { "rmd128",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD128,
00137 N_("RIPEMD-128 digest"), NULL },
00138 { "rmd160",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD160,
00139 N_("RIPEMD-160 digest"), NULL },
00140 { "rmd256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD256,
00141 N_("RIPEMD-256 digest"), NULL },
00142 { "rmd320",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD320,
00143 N_("RIPEMD-320 digest"), NULL },
00144 { "tiger",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIGER192,
00145 N_("TIGER digest"), NULL },
00146 { "crc32",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CRC32,
00147 N_("CRC-32 checksum"), NULL },
00148 { "crc64",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CRC64,
00149 N_("CRC-64 checksum"), NULL },
00150 { "adler32",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_ADLER32,
00151 N_("ADLER-32 checksum"), NULL },
00152 { "jlu32",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JLU32,
00153 N_("Lookup3 hash"), NULL },
00154 { "nodigest",'\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmioDigestHashAlgo, PGPHASHALGO_NONE,
00155 N_("No hash algorithm"), NULL },
00156 { "alldigests",'\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmioDigestHashAlgo, 256,
00157 N_("All hash algorithm(s)"), NULL },
00158 POPT_TABLEEND
00159 };
00160
00164 static void printVersion(FILE * fp)
00165
00166
00167 {
00168 fprintf(fp, _("%s (" RPM_NAME ") %s\n"), __progname, rpmioEVR);
00169 }
00170
00171 void rpmioConfigured(void)
00172
00173
00174 {
00175
00176 if (rpmioInitialized < 0) {
00177
00178 rpmioInitialized = 0;
00179 }
00180 if (rpmioInitialized)
00181 exit(EXIT_FAILURE);
00182 }
00183
00186 static void rpmioAllArgCallback(poptContext con,
00187 enum poptCallbackReason reason,
00188 const struct poptOption * opt, const char * arg,
00189 const void * data)
00190
00191
00192
00193
00194
00195
00196 {
00197
00198
00199 if (opt->arg == NULL)
00200 switch (opt->val) {
00201 case 'q':
00202 rpmSetVerbosity(RPMLOG_WARNING);
00203 break;
00204 case 'v':
00205 rpmIncreaseVerbosity();
00206 break;
00207 #ifdef NOTYET
00208 case 'D':
00209 { char *s, *t;
00210
00211 s = t = xstrdup(arg);
00212 while (*t && !xisspace((int)*t)) {
00213 if (*t == '-') *t = '_';
00214 t++;
00215 }
00216 t = s;
00217 if (*t == '%') t++;
00218 rpmioConfigured();
00219
00220
00221 (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE);
00222 (void) rpmDefineMacro(rpmCLIMacroContext, t, RMIL_CMDLINE);
00223
00224 s = _free(s);
00225 } break;
00226 case POPT_UNDEFINE:
00227 { char *s, *t;
00228
00229 s = t = xstrdup(arg);
00230 while (*t && !xisspace((int)*t)) {
00231 if (*t == '-') *t = '_';
00232 t++;
00233 }
00234 t = s;
00235 if (*t == '%') t++;
00236
00237 rpmioConfigured();
00238 (void) rpmUndefineMacro(NULL, t);
00239 (void) rpmUndefineMacro(rpmCLIMacroContext, t);
00240
00241 s = _free(s);
00242 } break;
00243 case 'E':
00244 rpmioConfigured();
00245 { const char *val = rpmExpand(arg, NULL);
00246 size_t val_len;
00247 val_len = strlen(val);
00248 if (val[val_len - 1] == '\n')
00249 fwrite(val, val_len, 1, stdout);
00250 else
00251 fprintf(stdout, "%s\n", val);
00252 val = _free(val);
00253 }
00254 break;
00255 #endif
00256 case POPT_CRYPTO:
00257 { const char *val;
00258 #ifdef NOTYET
00259 rpmioConfigured();
00260 val = rpmExpand(arg, NULL);
00261 #else
00262 val = xstrdup(arg);
00263 #endif
00264 if (!xstrcasecmp(val, "beecrypt") || !xstrcasecmp(val, "bc")) {
00265 #if defined(WITH_BEECRYPT)
00266 pgpImplVecs = &rpmbcImplVecs;
00267 #else
00268 rpmlog(RPMLOG_ERR, "BeeCrypt (\"beecrypt\") based cryptography implementation not available\n");
00269 exit(EXIT_FAILURE);
00270 #endif
00271 }
00272 else if (!xstrcasecmp(val, "gcrypt") || !xstrcasecmp(val, "gc")) {
00273 #if defined(WITH_GCRYPT)
00274 pgpImplVecs = &rpmgcImplVecs;
00275 #else
00276 rpmlog(RPMLOG_ERR, "GCrypt (\"gcrypt\") based cryptography implementation not available\n");
00277 exit(EXIT_FAILURE);
00278 #endif
00279 }
00280 else if (!xstrcasecmp(val, "NSS")) {
00281 #if defined(WITH_NSS)
00282 pgpImplVecs = &rpmnssImplVecs;
00283 #else
00284 rpmlog(RPMLOG_ERR, "Mozilla NSS (\"nss\") based cryptography implementation not available\n");
00285 exit(EXIT_FAILURE);
00286 #endif
00287 }
00288 else if (!xstrcasecmp(val, "OpenSSL") || !xstrcasecmp(val, "ssl")) {
00289 #if defined(WITH_SSL)
00290 pgpImplVecs = &rpmsslImplVecs;
00291 #else
00292 rpmlog(RPMLOG_ERR, "OpenSSL (\"openssl\") based cryptography implementation not available\n");
00293 exit(EXIT_FAILURE);
00294 #endif
00295 }
00296 else {
00297 rpmlog(RPMLOG_ERR, "cryptography implementation \"%s\" not known\n", val);
00298 exit(EXIT_FAILURE);
00299 }
00300 val = _free(val);
00301 }
00302 break;
00303 case POPT_SHOWVERSION:
00304 printVersion(stdout);
00305 con = rpmioFini(con);
00306 exit(EXIT_SUCCESS);
00307 break;
00308 }
00309 }
00310
00311
00312 int rpmioFtsOpts = 0;
00313
00314
00315 struct poptOption rpmioFtsPoptTable[] = {
00316 { "comfollow", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_COMFOLLOW,
00317 N_("FTS_COMFOLLOW: follow command line symlinks"), NULL },
00318 { "logical", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_LOGICAL,
00319 N_("FTS_LOGICAL: logical walk"), NULL },
00320 { "nochdir", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_NOCHDIR,
00321 N_("FTS_NOCHDIR: don't change directories"), NULL },
00322 { "nostat", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_NOSTAT,
00323 N_("FTS_NOSTAT: don't get stat info"), NULL },
00324 { "physical", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_PHYSICAL,
00325 N_("FTS_PHYSICAL: physical walk"), NULL },
00326 { "seedot", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_SEEDOT,
00327 N_("FTS_SEEDOT: return dot and dot-dot"), NULL },
00328 { "xdev", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_XDEV,
00329 N_("FTS_XDEV: don't cross devices"), NULL },
00330 { "whiteout", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_WHITEOUT,
00331 N_("FTS_WHITEOUT: return whiteout information"), NULL },
00332 POPT_TABLEEND
00333 };
00334
00335
00336
00337 struct poptOption rpmioAllPoptTable[] = {
00338
00339 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00340 rpmioAllArgCallback, 0, NULL, NULL },
00341
00342
00343 { "debug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &__debug, -1,
00344 N_("Debug generic operations"), NULL },
00345
00346 #ifdef NOTYET
00347 { "define", 'D', POPT_ARG_STRING, NULL, (int)'D',
00348 N_("Define MACRO with value EXPR"),
00349 N_("'MACRO EXPR'") },
00350 { "undefine", '\0', POPT_ARG_STRING, NULL, POPT_UNDEFINE,
00351 N_("Undefine MACRO"),
00352 N_("'MACRO'") },
00353 { "eval", 'E', POPT_ARG_STRING, NULL, (int)'E',
00354 N_("Print macro expansion of EXPR"),
00355 N_("'EXPR'") },
00356
00357 { "macros", '\0', POPT_ARG_STRING, &rpmMacrofiles, 0,
00358 N_("Read <FILE:...> instead of default file(s)"),
00359 N_("<FILE:...>") },
00360 #ifdef WITH_LUA
00361 { "rpmlua", '\0', POPT_ARG_STRING, &rpmluaFiles, 0,
00362 N_("Read <FILE:...> instead of default RPM Lua file(s)"),
00363 N_("<FILE:...>") },
00364 #endif
00365 { "rpmpopt", '\0', POPT_ARG_STRING, NULL, 0,
00366 N_("Read <FILE:...> instead of default POPT file(s)"),
00367 N_("<FILE:...>") },
00368 #endif
00369
00370 { "pipe", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &rpmioPipeOutput, 0,
00371 N_("Send stdout to CMD"),
00372 N_("CMD") },
00373 { "root", 'r', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT, &rpmioRootDir, 0,
00374 N_("Use ROOT as top level directory"),
00375 N_("ROOT") },
00376
00377 { "quiet", '\0', 0, NULL, (int)'q',
00378 N_("Provide less detailed output"), NULL},
00379 { "verbose", 'v', 0, NULL, (int)'v',
00380 N_("Provide more detailed output"), NULL},
00381 { "version", '\0', 0, NULL, POPT_SHOWVERSION,
00382 N_("Print the version"), NULL },
00383
00384 #if defined(HAVE_LIBIO_H) && defined(_G_IO_IO_FILE_VERSION)
00385 { "nolibio", '\0', POPT_ARG_VAL|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN, &noLibio, -1,
00386 N_("Disable use of libio(3) API"), NULL},
00387 #endif
00388
00389 { "usecrypto",'\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, NULL, POPT_CRYPTO,
00390 N_("Select cryptography implementation"),
00391 N_("CRYPTO") },
00392
00393 { "ardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ar_debug, -1,
00394 N_("Debug ar archives"), NULL},
00395 { "avdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_av_debug, -1,
00396 N_("Debug argv collections"), NULL},
00397 { "cpiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_cpio_debug, -1,
00398 N_("Debug cpio archives"), NULL},
00399 { "davdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_dav_debug, -1,
00400 N_("Debug WebDAV data stream"), NULL},
00401 { "ftpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ftp_debug, -1,
00402 N_("Debug FTP/HTTP data stream"), NULL},
00403 { "ftsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_fts_debug, -1,
00404 N_("Debug Fts(3) traverse"), NULL},
00405 { "htdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ht_debug, -1,
00406 N_("Debug hash tables"), NULL},
00407 { "iosmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_iosm_debug, -1,
00408 N_("Debug I/O state machine"), NULL},
00409 { "miredebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_mire_debug, -1,
00410 N_("Debug miRE patterns"), NULL},
00411 { "pgpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_pgp_debug, -1,
00412 N_("Debug PGP usage"), NULL},
00413 { "rpmiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmio_debug, -1,
00414 N_("Debug rpmio I/O"), NULL},
00415 { "rpmiobdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmiob_debug, -1,
00416 N_("Debug rpmio I/O buffers"), NULL},
00417 { "rpmficldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmficl_debug, -1,
00418 N_("Debug embedded FICL interpreter"), NULL},
00419 { "rpmjsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmjs_debug, -1,
00420 N_("Debug embedded JavaScript interpreter"), NULL},
00421 #ifdef WITH_LUA
00422 { "rpmluadebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmlua_debug, -1,
00423 N_("Debug embedded Lua interpreter"), NULL},
00424 #endif
00425 { "rpmmgdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmmg_debug, -1,
00426 N_("Debug rpmmg magic"), NULL},
00427 { "rpmperldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmperl_debug, -1,
00428 N_("Debug embedded Perl interpreter"), NULL},
00429 { "rpmpythondebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmpython_debug, -1,
00430 N_("Debug embedded Python interpreter"), NULL},
00431 { "rpmrubydebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmruby_debug, -1,
00432 N_("Debug embedded Ruby interpreter"), NULL},
00433 { "rpmsqdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsq_debug, -1,
00434 N_("Debug rpmsq Signal Queue"), NULL},
00435 { "rpmtcldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmtcl_debug, -1,
00436 N_("Debug embedded TCL interpreter"), NULL},
00437 #ifdef WITH_BZIP2
00438 { "rpmzqdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmzq_debug, -1,
00439 N_("Debug rpmzq Job Queuing"), NULL},
00440 #endif
00441 { "xardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_xar_debug, -1,
00442 N_("Debug xar archives"), NULL},
00443 { "tardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_tar_debug, -1,
00444 N_("Debug tar archives"), NULL},
00445 { "stats", '\0', POPT_ARG_VAL, &_rpmsw_stats, -1,
00446 N_("Display operation statistics"), NULL},
00447 { "urldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_url_debug, -1,
00448 N_("Debug URL cache handling"), NULL},
00449
00450 POPT_TABLEEND
00451 };
00452
00453
00454 poptContext
00455 rpmioFini(poptContext optCon)
00456 {
00457
00458
00459 rpmFreeMacros(NULL);
00460 rpmFreeMacros(rpmCLIMacroContext);
00461
00462 rpmioClean();
00463
00464 optCon = poptFreeContext(optCon);
00465
00466 #if defined(HAVE_MCHECK_H) && defined(HAVE_MTRACE)
00467
00468 muntrace();
00469
00470 #endif
00471
00472 return NULL;
00473 }
00474
00475 static inline int checkfd(const char * devnull, int fdno, int flags)
00476
00477 {
00478 struct stat sb;
00479 int ret = 0;
00480
00481 if (fstat(fdno, &sb) == -1 && errno == EBADF)
00482 ret = (open(devnull, flags) == fdno) ? 1 : 2;
00483 return ret;
00484 }
00485
00486
00487 poptContext
00488 rpmioInit(int argc, char *const argv[], struct poptOption * optionsTable)
00489 {
00490 poptContext optCon;
00491 int rc;
00492 #ifdef NOTYET
00493 int i;
00494 #endif
00495
00496 #if defined(HAVE_MCHECK_H) && defined(HAVE_MTRACE)
00497
00498 mtrace();
00499
00500 #endif
00501
00502 setprogname(argv[0]);
00503
00504
00505 if (__progname == NULL) {
00506 if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
00507 else __progname = argv[0];
00508 }
00509
00510
00511
00512 { static const char _devnull[] = "/dev/null";
00513 #if defined(STDIN_FILENO)
00514 (void) checkfd(_devnull, STDIN_FILENO, O_RDONLY);
00515 #endif
00516 #if defined(STDOUT_FILENO)
00517 (void) checkfd(_devnull, STDOUT_FILENO, O_WRONLY);
00518 #endif
00519 #if defined(STDERR_FILENO)
00520 (void) checkfd(_devnull, STDERR_FILENO, O_WRONLY);
00521 #endif
00522 }
00523
00524 #if defined(ENABLE_NLS) && !defined(__LCLINT__)
00525 (void) setlocale(LC_ALL, "" );
00526 (void) bindtextdomain(PACKAGE, LOCALEDIR);
00527 (void) textdomain(PACKAGE);
00528 #endif
00529
00530 rpmSetVerbosity(RPMLOG_NOTICE);
00531
00532 if (optionsTable == NULL) {
00533
00534 rpmioConfigured();
00535 return NULL;
00536 }
00537
00538 #ifdef NOTYET
00539
00540 for (i = 1; i < argc; i++) {
00541 if (strcmp(argv[i], "--rpmpopt") == 0 && i+1 < argc) {
00542 rpmpoptfiles = argv[i+1];
00543 break;
00544 }
00545 else if (strncmp(argv[i], "--rpmpopt=", 10) == 0) {
00546 rpmpoptfiles = argv[i]+10;
00547 break;
00548 }
00549 }
00550 #endif
00551
00552
00553 optCon = poptGetContext(__progname, argc, (const char **)argv, optionsTable, 0);
00554
00555
00556 #ifdef NOTYET
00557 #if defined(RPM_VENDOR_OPENPKG) || \
00558 !defined(POPT_ERROR_BADCONFIG)
00559 { char * path_buf = xstrdup(rpmpoptfiles);
00560 char *path;
00561 char *path_next;
00562
00563 for (path = path_buf; path != NULL && *path != '\0'; path = path_next) {
00564 const char **av;
00565 int ac, i;
00566
00567
00568 path_next = strchr(path, ':');
00569 if (path_next != NULL && *path_next == ':')
00570 *path_next++ = '\0';
00571 else
00572 path_next = path + strlen(path);
00573
00574
00575 ac = 0;
00576 av = NULL;
00577 if ((i = rpmGlob(path, &ac, &av)) != 0)
00578 continue;
00579
00580
00581 for (i = 0; i < ac; i++) {
00582 const char *fn = av[i];
00583 if (fn[0] == '@' ) {
00584 fn++;
00585 if (!rpmSecuritySaneFile(fn)) {
00586 rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", fn);
00587 continue;
00588 }
00589 }
00590 (void)poptReadConfigFile(optCon, fn);
00591 av[i] = _free(av[i]);
00592 }
00593 av = _free(av);
00594 }
00595 path_buf = _free(path_buf);
00596 }
00597 #else
00598
00599 if ((xx = poptReadConfigFiles(optCon, rpmpoptfiles)) != 0)
00600 rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", rpmpoptfiles);
00601 #endif
00602
00603
00604
00605 (void) poptReadDefaultConfig(optCon, 1);
00606
00607 poptSetExecPath(optCon, USRLIBRPM, 1);
00608 #endif
00609
00610
00611 while ((rc = poptGetNextOpt(optCon)) > 0) {
00612 const char * optArg = poptGetOptArg(optCon);
00613
00614 optArg = _free(optArg);
00615
00616 switch (rc) {
00617 default:
00618
00619 fprintf(stderr, _("%s: option table misconfigured (%d)\n"),
00620 __progname, rc);
00621
00622 exit(EXIT_FAILURE);
00623
00624 break;
00625 }
00626 }
00627
00628 if (rc < -1) {
00629
00630 fprintf(stderr, "%s: %s: %s\n", __progname,
00631 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
00632 poptStrerror(rc));
00633
00634 exit(EXIT_FAILURE);
00635 }
00636
00637
00638 rpmioConfigured();
00639
00640 if (__debug) {
00641 rpmIncreaseVerbosity();
00642 rpmIncreaseVerbosity();
00643 }
00644
00645 return optCon;
00646 }
00647