rpm 5.3.7
|
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 }