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