rpm 5.3.12
rpmio/poptIO.c
Go to the documentation of this file.
00001 
00006 #include "system.h"
00007 
00008 #include <poptIO.h>
00009 
00010 #if defined(WITH_BEECRYPT)
00011 #include <rpmbc.h>
00012 #endif
00013 #if defined(WITH_CDSA)
00014 #include <rpmcdsa.h>
00015 #endif
00016 #if defined(WITH_GCRYPT)
00017 #include <rpmgc.h>
00018 #endif
00019 #if defined(WITH_NSS)
00020 #include <rpmnss.h>
00021 #endif
00022 #if defined(WITH_SSL)
00023 #include <rpmssl.h>
00024 #endif
00025 #if defined(WITH_TOMCRYPT)
00026 #include <rpmltc.h>
00027 #endif
00028 
00029 #include <rpmbf.h>
00030 
00031 #include <rpmaug.h>
00032 #include <rpmbag.h>
00033 #include <rpmbf.h>
00034 #include <rpmcudf.h>
00035 #include <rpmficl.h>
00036 #include <rpmjs.h>
00037 #include <rpmnix.h>
00038 #include <rpmperl.h>
00039 #include <rpmpython.h>
00040 #include <rpmruby.h>
00041 #include <rpmsql.h>
00042 #include <rpmsquirrel.h>
00043 #include <rpmtcl.h>
00044 
00045 #include <rpmhkp.h>
00046 
00047 #include <rpmsm.h>
00048 #include <rpmsp.h>
00049 #include <rpmsx.h>
00050 
00051 #include "debug.h"
00052 
00053 const char *__progname;
00054 
00055 #if !defined(POPT_ARGFLAG_TOGGLE)       /* XXX compat with popt < 1.15 */
00056 #define POPT_ARGFLAG_TOGGLE     0
00057 #endif
00058 #define POPT_SHOWVERSION        -999
00059 #define POPT_UNDEFINE           -994
00060 #define POPT_CRYPTO             -993
00061 
00062 /*@unchecked@*/
00063 int __debug = 0;
00064 
00065 /*@-exportheadervar@*/
00066 /*@-redecl@*/
00067 /*@unchecked@*/
00068 extern int _ar_debug;
00069 /*@unchecked@*/
00070 extern int _av_debug;
00071 /*@unchecked@*/
00072 extern int _cpio_debug;
00073 /*@unchecked@*/
00074 extern int _ctx_debug;
00075 /*@unchecked@*/
00076 extern int _dav_debug;
00077 /*@unchecked@*/
00078 extern int _ftp_debug;
00079 /*@unchecked@*/
00080 extern int _fts_debug;
00081 /*@unchecked@*/
00082 extern int _ht_debug;
00083 /*@unchecked@*/
00084 extern int _html_debug;
00085 /*@unchecked@*/
00086 extern int _iosm_debug;
00087 /*@unchecked@*/
00088 extern int noLibio;
00089 /*@unchecked@*/
00090 extern int _pgp_debug;
00091 /*@unchecked@*/
00092 extern int _pgp_print;
00093 /*@unchecked@*/
00094 extern int _rpmio_debug;
00095 /*@unchecked@*/
00096 extern int _rpmiob_debug;
00097 /*@unchecked@*/
00098 extern int _rpmlua_debug;
00099 /*@unchecked@*/
00100 extern int _rpmsq_debug;
00101 /*@unchecked@*/
00102 extern int _rpmzq_debug;
00103 /*@unchecked@*/
00104 extern int _tar_debug;
00105 /*@unchecked@*/
00106 extern int _xar_debug;
00107 /*@=redecl@*/
00108 /*@=exportheadervar@*/
00109 
00110 /*@unchecked@*/ /*@null@*/
00111 const char * rpmioPipeOutput = NULL;
00112 
00113 /*@unchecked@*/
00114 const char * rpmioRootDir = "/";
00115 
00116 /*@observer@*/ /*@unchecked@*/
00117 const char *rpmioEVR = VERSION;
00118 
00119 /*@unchecked@*/
00120 static int rpmioInitialized = -1;
00121 
00122 #ifdef  NOTYET
00123 #ifdef WITH_LUA
00124 /*@unchecked@*/
00125 extern const char *rpmluaFiles;
00126 #endif
00127 
00128 /*@unchecked@*/
00129 static char *rpmpoptfiles = RPMPOPTFILES;
00130 #endif
00131 
00132 int _rpmio_popt_context_flags = 0;
00133 
00134 pgpHashAlgo rpmioDigestHashAlgo = -1;
00135 
00139 struct poptOption rpmioDigestPoptTable[] = {
00140  { "md2", '\0', POPT_ARG_VAL,   &rpmioDigestHashAlgo, PGPHASHALGO_MD2,
00141         N_("MD2 digest (RFC-1319)"), NULL },
00142  { "md4", '\0', POPT_ARG_VAL,   &rpmioDigestHashAlgo, PGPHASHALGO_MD4,
00143         N_("MD4 digest"), NULL },
00144  { "md5", '\0', POPT_ARG_VAL,   &rpmioDigestHashAlgo, PGPHASHALGO_MD5,
00145         N_("MD5 digest (RFC-1321)"), NULL },
00146  { "sha1",'\0', POPT_ARG_VAL,   &rpmioDigestHashAlgo, PGPHASHALGO_SHA1,
00147         N_("SHA-1 digest (FIPS-180-1)"), NULL },
00148  { "sha224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA224,
00149         N_("SHA-224 digest (FIPS-180-2)"), NULL },
00150  { "sha256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA256,
00151         N_("SHA-256 digest (FIPS-180-2)"), NULL },
00152  { "sha384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA384,
00153         N_("SHA-384 digest (FIPS-180-2)"), NULL },
00154  { "sha512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA512,
00155         N_("SHA-512 digest (FIPS-180-2)"), NULL },
00156  { "skein-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_224,
00157         N_("SKEIN-224 digest"), NULL },
00158  { "skein-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_256,
00159         N_("SKEIN-256 digest"), NULL },
00160  { "skein-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_384,
00161         N_("SKEIN-384 digest"), NULL },
00162  { "skein-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_512,
00163         N_("SKEIN-512 digest"), NULL },
00164  { "skein-1024",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_1024,
00165         N_("SKEIN-1024 digest"), NULL },
00166  { "arirang-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_224,
00167         N_("Arirang-224 digest"), NULL },
00168  { "arirang-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_256,
00169         N_("Arirang-256 digest"), NULL },
00170  { "arirang-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_384,
00171         N_("Arirang-384 digest"), NULL },
00172  { "arirang-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_512,
00173         N_("Arirang-512 digest"), NULL },
00174  { "blake-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_224,
00175         N_("Blake-224 digest"), NULL },
00176  { "blake-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_256,
00177         N_("Blake-256 digest"), NULL },
00178  { "blake-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_384,
00179         N_("Blake-384 digest"), NULL },
00180  { "blake-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_512,
00181         N_("Blake-512 digest"), NULL },
00182  { "bmw-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_224,
00183         N_("BlueMidnightWish-224 digest"), NULL },
00184  { "bmw-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_256,
00185         N_("BlueMidnightWish-256 digest"), NULL },
00186  { "bmw-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_384,
00187         N_("BlueMidnightWish-384 digest"), NULL },
00188  { "bmw-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_512,
00189         N_("BlueMidnightWish-512 digest"), NULL },
00190  { "chi-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_224,
00191         N_("Chi-224 digest"), NULL },
00192  { "chi-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_256,
00193         N_("Chi-256 digest"), NULL },
00194  { "chi-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_384,
00195         N_("Chi-384 digest"), NULL },
00196  { "chi-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_512,
00197         N_("Chi-512 digest"), NULL },
00198  { "cubehash-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_224,
00199         N_("CubeHash-224 digest"), NULL },
00200  { "cubehash-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_256,
00201         N_("CubeHash-256 digest"), NULL },
00202  { "cubehash-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_384,
00203         N_("CubeHash-384 digest"), NULL },
00204  { "cubehash-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_512,
00205         N_("CubeHash-512 digest"), NULL },
00206  { "echo-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_224,
00207         N_("Echo-224 digest"), NULL },
00208  { "echo-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_256,
00209         N_("Echo-256 digest"), NULL },
00210  { "echo-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_384,
00211         N_("Echo-384 digest"), NULL },
00212  { "echo-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_512,
00213         N_("Echo-512 digest"), NULL },
00214  { "edonr-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_224,
00215         N_("EdonR-224 digest"), NULL },
00216  { "edonr-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_256,
00217         N_("EdonR-256 digest"), NULL },
00218  { "edonr-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_384,
00219         N_("EdonR-384 digest"), NULL },
00220  { "edonr-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_512,
00221         N_("EdonR-512 digest"), NULL },
00222  { "fugue-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_224,
00223         N_("Fugue-224 digest"), NULL },
00224  { "fugue-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_256,
00225         N_("Fugue-256 digest"), NULL },
00226  { "fugue-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_384,
00227         N_("Fugue-384 digest"), NULL },
00228  { "fugue-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_512,
00229         N_("Fugue-512 digest"), NULL },
00230  { "groestl-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_224,
00231         N_("Groestl-224 digest"), NULL },
00232  { "groestl-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_256,
00233         N_("Groestl-256 digest"), NULL },
00234  { "groestl-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_384,
00235         N_("Groestl-384 digest"), NULL },
00236  { "groestl-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_512,
00237         N_("Groestl-512 digest"), NULL },
00238  { "hamsi-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_224,
00239         N_("Hamsi-224 digest"), NULL },
00240  { "hamsi-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_256,
00241         N_("Hamsi-256 digest"), NULL },
00242  { "hamsi-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_384,
00243         N_("Hamsi-384 digest"), NULL },
00244  { "hamsi-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_512,
00245         N_("Hamsi-512 digest"), NULL },
00246  { "jh-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_224,
00247         N_("JH-224 digest"), NULL },
00248  { "jh-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_256,
00249         N_("JH-256 digest"), NULL },
00250  { "jh-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_384,
00251         N_("JH-384 digest"), NULL },
00252  { "jh-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_512,
00253         N_("JH-512 digest"), NULL },
00254  { "keccak-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_224,
00255         N_("Keccak-224 digest"), NULL },
00256  { "keccak-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_256,
00257         N_("Keccak-256 digest"), NULL },
00258  { "keccak-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_384,
00259         N_("Keccak-384 digest"), NULL },
00260  { "keccak-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_512,
00261         N_("Keccak-512 digest"), NULL },
00262  { "lane-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_224,
00263         N_("Lane-224 digest"), NULL },
00264  { "lane-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_256,
00265         N_("Lane-256 digest"), NULL },
00266  { "lane-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_384,
00267         N_("Lane-384 digest"), NULL },
00268  { "lane-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_512,
00269         N_("Lane-512 digest"), NULL },
00270  { "luffa-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_224,
00271         N_("Luffa-224 digest"), NULL },
00272  { "luffa-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_256,
00273         N_("Luffa-256 digest"), NULL },
00274  { "luffa-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_384,
00275         N_("Luffa-384 digest"), NULL },
00276  { "luffa-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_512,
00277         N_("Luffa-512 digest"), NULL },
00278  { "md6-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_224,
00279         N_("MD6-224 digest"), NULL },
00280  { "md6-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_256,
00281         N_("MD6-256 digest"), NULL },
00282  { "md6-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_384,
00283         N_("MD6-384 digest"), NULL },
00284  { "md6-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_512,
00285         N_("MD6-512digest"), NULL },
00286  { "shabal-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_224,
00287         N_("Shabal-224 digest"), NULL },
00288  { "shabal-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_256,
00289         N_("Shabal-256 digest"), NULL },
00290  { "shabal-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_384,
00291         N_("Shabal-384 digest"), NULL },
00292  { "shabal-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_512,
00293         N_("Shabal-512 digest"), NULL },
00294  { "shavite3-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_224,
00295         N_("SHAvite3-224 digest"), NULL },
00296  { "shavite3-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_256,
00297         N_("SHAvite3-256 digest"), NULL },
00298  { "shavite3-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_384,
00299         N_("SHAvite3-384 digest"), NULL },
00300  { "shavite3-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_512,
00301         N_("SHAvite3-512 digest"), NULL },
00302  { "simd-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_224,
00303         N_("SIMD-224 digest"), NULL },
00304  { "simd-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_256,
00305         N_("SIMD-256 digest"), NULL },
00306  { "simd-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_384,
00307         N_("SIMD-384 digest"), NULL },
00308  { "simd-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_512,
00309         N_("SIMD-512 digest"), NULL },
00310  { "tib3-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_224,
00311         N_("TIB3-224 digest"), NULL },
00312  { "tib3-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_256,
00313         N_("TIB3-256 digest"), NULL },
00314  { "tib3-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_384,
00315         N_("TIB3-384 digest"), NULL },
00316  { "tib3-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_512,
00317         N_("TIB3-512 digest"), NULL },
00318  { "salsa10",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_SALSA10,
00319         N_("SALSA-10 hash"), NULL },
00320  { "salsa20",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_SALSA20,
00321         N_("SALSA-20 hash"), NULL },
00322  { "rmd128",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD128,
00323         N_("RIPEMD-128 digest"), NULL },
00324  { "rmd160",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD160,
00325         N_("RIPEMD-160 digest"), NULL },
00326  { "rmd256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD256,
00327         N_("RIPEMD-256 digest"), NULL },
00328  { "rmd320",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD320,
00329         N_("RIPEMD-320 digest"), NULL },
00330  { "tiger",'\0', POPT_ARG_VAL,  &rpmioDigestHashAlgo, PGPHASHALGO_TIGER192,
00331         N_("TIGER digest"), NULL },
00332  { "crc32",'\0', POPT_ARG_VAL,  &rpmioDigestHashAlgo, PGPHASHALGO_CRC32,
00333         N_("CRC-32 checksum"), NULL },
00334  { "crc64",'\0', POPT_ARG_VAL,  &rpmioDigestHashAlgo, PGPHASHALGO_CRC64,
00335         N_("CRC-64 checksum"), NULL },
00336  { "adler32",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_ADLER32,
00337         N_("ADLER-32 checksum"), NULL },
00338  { "jlu32",'\0', POPT_ARG_VAL,  &rpmioDigestHashAlgo, PGPHASHALGO_JLU32,
00339         N_("Lookup3 hash"), NULL },
00340  { "nodigest",'\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmioDigestHashAlgo, PGPHASHALGO_NONE,
00341         N_("No hash algorithm"), NULL },
00342  { "alldigests",'\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmioDigestHashAlgo, 256,
00343         N_("All hash algorithm(s)"), NULL },
00344     POPT_TABLEEND
00345 };
00346 
00350 static void printVersion(FILE * fp)
00351         /*@globals rpmioEVR, fileSystem @*/
00352         /*@modifies *fp, fileSystem @*/
00353 {
00354     fprintf(fp, _("%s (" RPM_NAME ") %s\n"), __progname, rpmioEVR);
00355 }
00356 
00357 void rpmioConfigured(void)
00358         /*@globals rpmioInitialized @*/
00359         /*@modifies rpmioInitialized @*/
00360 {
00361 
00362     if (rpmioInitialized < 0) {
00363         /* XXX TODO: add initialization side-effects. */
00364         rpmioInitialized = 0;
00365     }
00366     if (rpmioInitialized)
00367         exit(EXIT_FAILURE);
00368 }
00369 
00372 static void rpmioAllArgCallback(poptContext con,
00373                 /*@unused@*/ enum poptCallbackReason reason,
00374                 const struct poptOption * opt, const char * arg,
00375                 /*@unused@*/ const void * data)
00376         /*@globals pgpImplVecs,
00377                 rpmGlobalMacroContext,
00378                 fileSystem, internalState @*/
00379         /*@modifies con, pgpImplVecs,
00380                 rpmGlobalMacroContext,
00381                 fileSystem, internalState @*/
00382 {
00383 
00384     /* XXX avoid accidental collisions with POPT_BIT_SET for flags */
00385     if (opt->arg == NULL)
00386     switch (opt->val) {
00387     case 'q':
00388         rpmSetVerbosity(RPMLOG_WARNING);
00389         break;
00390     case 'v':
00391         rpmIncreaseVerbosity();
00392         break;
00393 #ifdef  NOTYET
00394     case 'D':
00395     {   char *s, *t;
00396         /* XXX Convert '-' in macro name to underscore, skip leading %. */
00397         s = t = xstrdup(arg);
00398         while (*t && !xisspace((int)*t)) {
00399             if (*t == '-') *t = '_';
00400             t++;
00401         }
00402         t = s;
00403         if (*t == '%') t++;
00404         rpmioConfigured();
00405 /*@-type@*/
00406         /* XXX adding macro to global context isn't Right Thing Todo. */
00407         (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE);
00408         (void) rpmDefineMacro(rpmCLIMacroContext, t, RMIL_CMDLINE);
00409 /*@=type@*/
00410         s = _free(s);
00411     }   break;
00412     case POPT_UNDEFINE:
00413     {   char *s, *t;
00414         /* XXX Convert '-' in macro name to underscore, skip leading %. */
00415         s = t = xstrdup(arg);
00416         while (*t && !xisspace((int)*t)) {
00417             if (*t == '-') *t = '_';
00418             t++;
00419         }
00420         t = s;
00421         if (*t == '%') t++;
00422 /*@-type@*/
00423         rpmioConfigured();
00424         (void) rpmUndefineMacro(NULL, t);
00425         (void) rpmUndefineMacro(rpmCLIMacroContext, t);
00426 /*@=type@*/
00427         s = _free(s);
00428     }   break;
00429     case 'E':
00430         rpmioConfigured();
00431         {   const char *val = rpmExpand(arg, NULL);
00432             size_t val_len;
00433             val_len = strlen(val);
00434             if (val[val_len - 1] == '\n')
00435                 fwrite(val, val_len, 1, stdout);
00436             else
00437                 fprintf(stdout, "%s\n", val);
00438             val = _free(val);
00439         }
00440         break;
00441 #endif  /* NOTYET */
00442     case POPT_CRYPTO:
00443         {   const char *val;
00444 #ifdef  NOTYET
00445             rpmioConfigured();
00446             val = rpmExpand(arg, NULL);
00447 #else
00448             val = xstrdup(arg);
00449 #endif  /* NOTYET */
00450             if (!xstrcasecmp(val, "beecrypt") || !xstrcasecmp(val, "bc")) {
00451 #if defined(WITH_BEECRYPT)
00452                 pgpImplVecs = &rpmbcImplVecs;
00453 #else
00454                 rpmlog(RPMLOG_ERR, "BeeCrypt (\"beecrypt\") based cryptography implementation not available\n");
00455                 exit(EXIT_FAILURE);
00456 #endif
00457             }
00458             else if (!xstrcasecmp(val, "gcrypt") || !xstrcasecmp(val, "gc")) {
00459 #if defined(WITH_GCRYPT)
00460                 pgpImplVecs = &rpmgcImplVecs;
00461 #else
00462                 rpmlog(RPMLOG_ERR, "GCrypt (\"gcrypt\") based cryptography implementation not available\n");
00463                 exit(EXIT_FAILURE);
00464 #endif
00465             }
00466             else if (!xstrcasecmp(val, "tomcrypt") || !xstrcasecmp(val, "ltc")) {
00467 #if defined(WITH_TOMCRYPT)
00468                 pgpImplVecs = &rpmltcImplVecs;
00469 #else
00470                 rpmlog(RPMLOG_ERR, "TomCrypt (\"tomcrypt\") based cryptography implementation not available\n");
00471                 exit(EXIT_FAILURE);
00472 #endif
00473             }
00474             else if (!xstrcasecmp(val, "NSS")) {
00475 #if defined(WITH_NSS)
00476                 pgpImplVecs = &rpmnssImplVecs;
00477 #else
00478                 rpmlog(RPMLOG_ERR, "Mozilla NSS (\"nss\") based cryptography implementation not available\n");
00479                 exit(EXIT_FAILURE);
00480 #endif
00481             }
00482             else if (!xstrcasecmp(val, "OpenSSL") || !xstrcasecmp(val, "ssl")) {
00483 #if defined(WITH_SSL)
00484                 pgpImplVecs = &rpmsslImplVecs;
00485 #else
00486                 rpmlog(RPMLOG_ERR, "OpenSSL (\"openssl\") based cryptography implementation not available\n");
00487                 exit(EXIT_FAILURE);
00488 #endif
00489             }
00490             else if (!xstrcasecmp(val, "CDSA")) {
00491 #if defined(WITH_CDSA)
00492                 pgpImplVecs = &rpmcdsaImplVecs;
00493 #else
00494                 rpmlog(RPMLOG_ERR, "CDSA (\"cdsa\") based cryptography implementation not available\n");
00495                 exit(EXIT_FAILURE);
00496 #endif
00497             }
00498             else {
00499                 rpmlog(RPMLOG_ERR, "cryptography implementation \"%s\" not known\n", val);
00500                 exit(EXIT_FAILURE);
00501             }
00502             val = _free(val);
00503         }
00504         break;
00505     case POPT_SHOWVERSION:
00506         printVersion(stdout);
00507 /*@i@*/ con = rpmioFini(con);
00508         exit(EXIT_SUCCESS);
00509         /*@notreached@*/ break;
00510     }
00511 }
00512 
00513 /*@unchecked@*/
00514 int rpmioFtsOpts = 0;
00515 
00516 /*@unchecked@*/
00517 struct poptOption rpmioFtsPoptTable[] = {
00518  { "comfollow", '\0', POPT_BIT_SET,     &rpmioFtsOpts, FTS_COMFOLLOW,
00519         N_("FTS_COMFOLLOW: follow command line symlinks"), NULL },
00520  { "logical", '\0', POPT_BIT_SET,       &rpmioFtsOpts, FTS_LOGICAL,
00521         N_("FTS_LOGICAL: logical walk"), NULL },
00522  { "nochdir", '\0', POPT_BIT_SET,       &rpmioFtsOpts, FTS_NOCHDIR,
00523         N_("FTS_NOCHDIR: don't change directories"), NULL },
00524  { "nostat", '\0', POPT_BIT_SET,        &rpmioFtsOpts, FTS_NOSTAT,
00525         N_("FTS_NOSTAT: don't get stat info"), NULL },
00526  { "physical", '\0', POPT_BIT_SET,      &rpmioFtsOpts, FTS_PHYSICAL,
00527         N_("FTS_PHYSICAL: physical walk"), NULL },
00528  { "seedot", '\0', POPT_BIT_SET,        &rpmioFtsOpts, FTS_SEEDOT,
00529         N_("FTS_SEEDOT: return dot and dot-dot"), NULL },
00530  { "xdev", '\0', POPT_BIT_SET,          &rpmioFtsOpts, FTS_XDEV,
00531         N_("FTS_XDEV: don't cross devices"), NULL },
00532  { "whiteout", '\0', POPT_BIT_SET,      &rpmioFtsOpts, FTS_WHITEOUT,
00533         N_("FTS_WHITEOUT: return whiteout information"), NULL },
00534    POPT_TABLEEND
00535 };
00536 
00537 /*@-bitwisesigned -compmempass @*/
00538 /*@unchecked@*/
00539 struct poptOption rpmioAllPoptTable[] = {
00540 /*@-type@*/ /* FIX: cast? */
00541  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00542         rpmioAllArgCallback, 0, NULL, NULL },
00543 /*@=type@*/
00544 
00545  { "debug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &__debug, -1,
00546         N_("Debug generic operations"), NULL },
00547 
00548 #ifdef  NOTYET
00549  { "define", 'D', POPT_ARG_STRING, NULL, (int)'D',
00550         N_("Define MACRO with value EXPR"),
00551         N_("'MACRO EXPR'") },
00552  { "undefine", '\0', POPT_ARG_STRING, NULL, POPT_UNDEFINE,
00553         N_("Undefine MACRO"),
00554         N_("'MACRO'") },
00555  { "eval", 'E', POPT_ARG_STRING, NULL, (int)'E',
00556         N_("Print macro expansion of EXPR"),
00557         N_("'EXPR'") },
00558 
00559  { "macros", '\0', POPT_ARG_STRING, &rpmMacrofiles, 0,
00560         N_("Read <FILE:...> instead of default file(s)"),
00561         N_("<FILE:...>") },
00562 #ifdef WITH_LUA
00563  { "rpmlua", '\0', POPT_ARG_STRING, &rpmluaFiles, 0,
00564         N_("Read <FILE:...> instead of default RPM Lua file(s)"),
00565         N_("<FILE:...>") },
00566 #endif
00567  { "rpmpopt", '\0', POPT_ARG_STRING, NULL, 0,
00568         N_("Read <FILE:...> instead of default POPT file(s)"),
00569         N_("<FILE:...>") },
00570 #endif  /* NOTYET */
00571 
00572  { "pipe", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &rpmioPipeOutput, 0,
00573         N_("Send stdout to CMD"),
00574         N_("CMD") },
00575  { "root", 'r', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT, &rpmioRootDir, 0,
00576         N_("Use ROOT as top level directory"),
00577         N_("ROOT") },
00578 
00579  { "quiet", '\0', 0, NULL, (int)'q',
00580         N_("Provide less detailed output"), NULL},
00581  { "verbose", 'v', 0, NULL, (int)'v',
00582         N_("Provide more detailed output"), NULL},
00583  { "version", '\0', 0, NULL, POPT_SHOWVERSION,
00584         N_("Print the version"), NULL },
00585 
00586 #if defined(HAVE_LIBIO_H) && defined(_G_IO_IO_FILE_VERSION)
00587  { "nolibio", '\0', POPT_ARG_VAL|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN, &noLibio, -1,
00588         N_("Disable use of libio(3) API"), NULL},
00589 #endif
00590 
00591  { "usecrypto",'\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, NULL, POPT_CRYPTO,
00592         N_("Select cryptography implementation"),
00593         N_("CRYPTO") },
00594 
00595  { "ardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ar_debug, -1,
00596         N_("Debug ar archives"), NULL},
00597  { "avdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_av_debug, -1,
00598         N_("Debug argv collections"), NULL},
00599  { "cpiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_cpio_debug, -1,
00600         N_("Debug cpio archives"), NULL},
00601  { "ctxdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ctx_debug, -1,
00602         N_("Debug digest contexts"), NULL},
00603  { "davdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_dav_debug, -1,
00604         N_("Debug WebDAV data stream"), NULL},
00605  { "ftpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ftp_debug, -1,
00606         N_("Debug FTP/HTTP data stream"), NULL},
00607  { "ftsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_fts_debug, -1,
00608         N_("Debug Fts(3) traverse"), NULL},
00609  { "htdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ht_debug, -1,
00610         N_("Debug hash tables"), NULL},
00611  { "htmldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_html_debug, -1,
00612         N_("Debug HTML parsing"), NULL},
00613  { "iosmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_iosm_debug, -1,
00614         N_("Debug I/O state machine"), NULL},
00615  { "miredebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_mire_debug, -1,
00616         N_("Debug miRE patterns"), NULL},
00617  { "pgpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_pgp_debug, -1,
00618         N_("Debug PGP usage"), NULL},
00619  { "pgpprint", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_pgp_print, -1,
00620         N_("Print PGP keys"), NULL},
00621  { "rpmbfdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmbf_debug, -1,
00622         N_("Debug Bloom filters"), NULL},
00623  { "rpmhkpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmhkp_debug, -1,
00624         N_("Debug hkp:// keyring"), NULL},
00625  { "rpmiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmio_debug, -1,
00626         N_("Debug rpmio I/O"), NULL},
00627  { "rpmiobdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmiob_debug, -1,
00628         N_("Debug rpmio I/O buffers"), NULL},
00629 
00630  { "rpmbagdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmbag_debug, -1,
00631         N_("Debug depsolver wrappers "), NULL},
00632 
00633  { "rpmaugdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmaug_debug, -1,
00634         N_("Debug embedded Augeas interpreter"), NULL},
00635  { "rpmcudfdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmcudf_debug, -1,
00636         N_("Debug embedded CUDF parser"), NULL},
00637  { "rpmficldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmficl_debug, -1,
00638         N_("Debug embedded FICL interpreter"), NULL},
00639  { "rpmjsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmjs_debug, -1,
00640         N_("Debug embedded JavaScript interpreter"), NULL},
00641 #ifdef WITH_LUA
00642  { "rpmluadebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmlua_debug, -1,
00643         N_("Debug embedded Lua interpreter"), NULL},
00644 #endif
00645  { "rpmmgdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmmg_debug, -1,
00646         N_("Debug rpmmg magic"), NULL},
00647  { "nixdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmnix_debug, -1,
00648         N_("Debug embedded Nix interpreter"), NULL},
00649  { "rpmperldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmperl_debug, -1,
00650         N_("Debug embedded Perl interpreter"), NULL},
00651  { "rpmpythondebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmpython_debug, -1,
00652         N_("Debug embedded Python interpreter"), NULL},
00653  { "rpmrubydebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmruby_debug, -1,
00654         N_("Debug embedded Ruby interpreter"), NULL},
00655  { "rpmsqdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsq_debug, -1,
00656         N_("Debug rpmsq Signal Queue"), NULL},
00657  { "rpmsqldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsql_debug, -1,
00658         N_("Debug embedded SQL interpreter"), NULL},
00659  { "rpmsquirreldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsquirrel_debug, -1,
00660         N_("Debug embedded SQUIRREL interpreter"), NULL},
00661  { "rpmsmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsm_debug, 1,
00662         N_("Debug semanage"), NULL},
00663  { "rpmspdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsp_debug, 1,
00664         N_("Debug sepol"), NULL},
00665  { "rpmsxdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsx_debug, 1,
00666         N_("Debug selinux"), NULL},
00667  { "rpmtcldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmtcl_debug, -1,
00668         N_("Debug embedded TCL interpreter"), NULL},
00669  { "rpmvcdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmvc_debug, -1,
00670         N_("Debug embedded SQL virtual cursor"), NULL},
00671  { "rpmvtdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmvt_debug, -1,
00672         N_("Debug embedded SQL virtual table"), NULL},
00673 #ifdef WITH_BZIP2
00674  { "rpmzqdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmzq_debug, -1,
00675         N_("Debug rpmzq Job Queuing"), NULL},
00676 #endif
00677  { "xardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_xar_debug, -1,
00678         N_("Debug xar archives"), NULL},
00679  { "tardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_tar_debug, -1,
00680         N_("Debug tar archives"), NULL},
00681  { "stats", '\0', POPT_ARG_VAL,                         &_rpmsw_stats, -1,
00682         N_("Display operation statistics"), NULL},
00683  { "urldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_url_debug, -1,
00684         N_("Debug URL cache handling"), NULL},
00685 
00686    POPT_TABLEEND
00687 };
00688 /*@=bitwisesigned =compmempass @*/
00689 
00690 poptContext
00691 rpmioFini(poptContext optCon)
00692 {
00693     /* XXX this should be done in the rpmioClean() wrapper. */
00694     /* keeps memory leak checkers quiet */
00695     rpmFreeMacros(NULL);
00696 /*@i@*/ rpmFreeMacros(rpmCLIMacroContext);
00697 
00698     rpmioClean();
00699 
00700     optCon = poptFreeContext(optCon);
00701 
00702 #if defined(HAVE_MCHECK_H) && defined(HAVE_MTRACE)
00703     /*@-noeffect@*/
00704     muntrace();   /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
00705     /*@=noeffect@*/
00706 #endif
00707 
00708     return NULL;
00709 }
00710 
00711 static inline int checkfd(const char * devnull, int fdno, int flags)
00712         /*@*/
00713 {
00714     struct stat sb;
00715     int ret = 0;
00716 
00717     if (fstat(fdno, &sb) == -1 && errno == EBADF)
00718         ret = (open(devnull, flags) == fdno) ? 1 : 2;
00719     return ret;
00720 }
00721 
00722 /*@-globstate@*/
00723 poptContext
00724 rpmioInit(int argc, char *const argv[], struct poptOption * optionsTable)
00725 {
00726     poptContext optCon;
00727     int rc;
00728 #ifdef  NOTYET
00729     int i;
00730 #endif
00731 
00732 #if defined(HAVE_MCHECK_H) && defined(HAVE_MTRACE)
00733     /*@-noeffect@*/
00734     mtrace();   /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
00735     /*@=noeffect@*/
00736 #endif
00737 /*@-globs -mods@*/
00738     setprogname(argv[0]);       /* Retrofit glibc __progname */
00739 
00740     /* XXX glibc churn sanity */
00741     if (__progname == NULL) {
00742         if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
00743         else __progname = argv[0];
00744     }
00745 /*@=globs =mods@*/
00746 
00747     /* Insure that stdin/stdout/stderr are open, lest stderr end up in rpmdb. */
00748    {    static const char _devnull[] = "/dev/null";
00749 #if defined(STDIN_FILENO)
00750         (void) checkfd(_devnull, STDIN_FILENO, O_RDONLY);
00751 #endif
00752 #if defined(STDOUT_FILENO)
00753         (void) checkfd(_devnull, STDOUT_FILENO, O_WRONLY);
00754 #endif
00755 #if defined(STDERR_FILENO)
00756         (void) checkfd(_devnull, STDERR_FILENO, O_WRONLY);
00757 #endif
00758    }
00759 
00760 #if defined(ENABLE_NLS) && !defined(__LCLINT__)
00761     (void) setlocale(LC_ALL, "" );
00762     (void) bindtextdomain(PACKAGE, LOCALEDIR);
00763     (void) textdomain(PACKAGE);
00764 #endif
00765 
00766     rpmSetVerbosity(RPMLOG_NOTICE);
00767 
00768     if (optionsTable == NULL) {
00769         /* Read rpm configuration (if not already read). */
00770         rpmioConfigured();
00771         return NULL;
00772     }
00773 
00774 #ifdef  NOTYET
00775     /* read all RPM POPT configuration files */
00776     for (i = 1; i < argc; i++) {
00777         if (strcmp(argv[i], "--rpmpopt") == 0 && i+1 < argc) {
00778             rpmpoptfiles = argv[i+1];
00779             break;
00780         }
00781         else if (strncmp(argv[i], "--rpmpopt=", 10) == 0) {
00782             rpmpoptfiles = argv[i]+10;
00783             break;
00784         }
00785     }
00786 #endif  /* NOTYET */
00787 
00788 /*@-nullpass -temptrans@*/
00789     optCon = poptGetContext(__progname, argc, (const char **)argv, optionsTable, _rpmio_popt_context_flags);
00790 /*@=nullpass =temptrans@*/
00791 
00792 #ifdef  NOTYET
00793 #if defined(RPM_VENDOR_OPENPKG) /* stick-with-rpm-file-sanity-checking */ || \
00794     !defined(POPT_ERROR_BADCONFIG)      /* XXX POPT 1.15 retrofit */
00795   { char * path_buf = xstrdup(rpmpoptfiles);
00796     char *path;
00797     char *path_next;
00798 
00799     for (path = path_buf; path != NULL && *path != '\0'; path = path_next) {
00800         const char **av;
00801         int ac, i;
00802 
00803         /* locate start of next path element */
00804         path_next = strchr(path, ':');
00805         if (path_next != NULL && *path_next == ':')
00806             *path_next++ = '\0';
00807         else
00808             path_next = path + strlen(path);
00809 
00810         /* glob-expand the path element */
00811         ac = 0;
00812         av = NULL;
00813         if ((i = rpmGlob(path, &ac, &av)) != 0)
00814             continue;
00815 
00816         /* work-off each resulting file from the path element */
00817         for (i = 0; i < ac; i++) {
00818             const char *fn = av[i];
00819             if (fn[0] == '@' /* attention */) {
00820                 fn++;
00821                 if (!rpmSecuritySaneFile(fn)) {
00822                     rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", fn);
00823                     continue;
00824                 }
00825             }
00826             (void)poptReadConfigFile(optCon, fn);
00827             av[i] = _free(av[i]);
00828         }
00829         av = _free(av);
00830     }
00831     path_buf = _free(path_buf);
00832   }
00833 #else
00834     /* XXX FIXME: better error message is needed. */
00835     if ((xx = poptReadConfigFiles(optCon, rpmpoptfiles)) != 0)
00836        rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", rpmpoptfiles);
00837 #endif
00838 
00839     /* read standard POPT configuration files */
00840     /* XXX FIXME: the 2nd arg useEnv flag is UNUSED. */
00841     (void) poptReadDefaultConfig(optCon, 1);
00842 
00843     poptSetExecPath(optCon, USRLIBRPM, 1);
00844 #endif  /* NOTYET */
00845 
00846     /* Process all options, whine if unknown. */
00847     while ((rc = poptGetNextOpt(optCon)) > 0) {
00848         const char * optArg = poptGetOptArg(optCon);
00849 /*@-dependenttrans -modobserver -observertrans @*/
00850         optArg = _free(optArg);
00851 /*@=dependenttrans =modobserver =observertrans @*/
00852         switch (rc) {
00853         default:
00854 /*@-nullpass@*/
00855             fprintf(stderr, _("%s: option table misconfigured (%d)\n"),
00856                 __progname, rc);
00857 /*@=nullpass@*/
00858             exit(EXIT_FAILURE);
00859 
00860             /*@notreached@*/ /*@switchbreak@*/ break;
00861         }
00862     }
00863 
00864     if (rc < -1) {
00865 /*@-nullpass@*/
00866         fprintf(stderr, "%s: %s: %s\n", __progname,
00867                 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
00868                 poptStrerror(rc));
00869 /*@=nullpass@*/
00870         exit(EXIT_FAILURE);
00871     }
00872 
00873     /* Read rpm configuration (if not already read). */
00874     rpmioConfigured();
00875 
00876     if (__debug) {
00877         rpmIncreaseVerbosity();
00878         rpmIncreaseVerbosity();
00879     }
00880 
00881     return optCon;
00882 }
00883 /*@=globstate@*/
00884 
00892 /*@null@*/
00893 static char *
00894 matchchar(char * p, char pl, char pr)
00895         /*@*/
00896 {
00897     int lvl = 0;
00898     char c;
00899 
00900     while ((c = *p++) != '\0') {
00901         if (c == '\\') {        /* Ignore escaped chars */
00902             p++;
00903             continue;
00904         }
00905         if (c == pr) {
00906             if (--lvl <= 0)     return --p;
00907         } else if (c == pl)
00908             lvl++;
00909     }
00910     return (char *)NULL;
00911 }
00912 
00913 rpmioP rpmioPFree(rpmioP P)
00914 {
00915     if (P != NULL) {
00916         P->str = _free(P->str);
00917         P->av = argvFree(P->av);
00918         P = _free(P);
00919     }
00920     return NULL;
00921 }
00922 
00923 rpmRC rpmioParse(rpmioP *Pptr, const char * str)
00924 {
00925     static char whitespace[] = " \t\n\r";
00926     rpmioP P;
00927     rpmRC rc = RPMRC_FAIL;      /* assume failure */
00928     char *b;
00929     char *be;
00930     int xx;
00931     int c;
00932 
00933     if ((P = *Pptr) == NULL)
00934         *Pptr = P = xcalloc(1, sizeof(*P));
00935 
00936     if (str != NULL) {
00937         P->str = _free(P->str);
00938         P->next = P->str = xstrdup(str);
00939     }
00940 
00941     /* Ltrim whitespace. Anything left to parse? */
00942     if ((b = P->next) != NULL)
00943     while (*b && strchr(whitespace, *b))
00944         *b++ = '\0';
00945     if (b == NULL || *b == '\0')
00946         return RPMRC_NOTFOUND;
00947 
00948     /* Parse next command into an argv. */
00949     P->ac = 0;
00950     P->av = argvFree(P->av);
00951     if ((be = b) != NULL)
00952   while (1) {
00953     c = *be++;
00954     switch (c) {
00955     default:
00956         break;
00957     case '\\':          /* escaped character. */
00958         if (*be != '\0')
00959             be++;
00960         break;
00961     case '\0':          /* end-of-command termination. */
00962     case '\n':
00963     case '\r':
00964     case ';':   
00965         if (be[-1] != '\0')
00966             be[-1] = '\0';
00967         else
00968             be--;                       /* XXX one too far */
00969         if ((be - b) > 1) {
00970             xx = argvAdd(&P->av, b);
00971             P->ac++;
00972         }
00973         goto exit;
00974         break;
00975     case '[':           /* XPath construct with '[' balancing. */
00976         if ((be = matchchar(be, '[', ']')) == NULL) {
00977             be += strlen(b);    /* XXX unmatched ']' */
00978             goto exit;
00979         }
00980         be++;
00981         break;
00982     case '"':           /* quoted string */
00983         while (1) {
00984             if ((be = strchr(be, '"')) == NULL) {
00985                 be += strlen(b);        /* XXX unmatched '"' */
00986                 goto exit;
00987             }
00988             be++;
00989             if (be[-2] == '\\') /* escaped quote */
00990                 continue;
00991             break;
00992         }
00993         break;
00994     case ' ':           /* argument separator */
00995     case '\t':
00996         be[-1] = '\0';
00997         if ((be - b) > 1) {
00998             xx = argvAdd(&P->av, b);
00999             P->ac++;
01000         }
01001         b = be;
01002         while (*b && (*b == ' ' || *b == '\t'))
01003             *b++ = '\0';
01004         be = b;
01005         break;
01006     }
01007   }
01008     rc = RPMRC_OK;
01009 
01010 exit:
01011     P->next = be;
01012     return rc;
01013 }