|
rpm
5.4.4
|
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 }
1.7.5.1