rpm  5.4.10
poptIO.c
Go to the documentation of this file.
1 
6 #include "system.h"
7 
8 #include <poptIO.h>
9 
10 #if defined(WITH_BEECRYPT)
11 #include <rpmbc.h>
12 #endif
13 #if defined(WITH_CDSA)
14 #include <rpmcdsa.h>
15 #endif
16 #if defined(WITH_GCRYPT)
17 #include <rpmgc.h>
18 #endif
19 #if defined(WITH_NSS)
20 #include <rpmnss.h>
21 #endif
22 #if defined(WITH_SSL)
23 #include <rpmssl.h>
24 #endif
25 #if defined(WITH_TOMCRYPT)
26 #include <rpmltc.h>
27 #endif
28 
29 #include <rpmasn.h>
30 #include <rpmtpm.h>
31 #include <mongo.h>
32 
33 #include <rpmaug.h>
34 #include <rpmbag.h>
35 #include <rpmbf.h>
36 #include <rpmcudf.h>
37 #include <rpmcvs.h>
38 #include <rpmficl.h>
39 #include <rpmgit.h>
40 #include <rpmhkp.h>
41 #include <rpmjs.h>
42 #include <rpmnix.h>
43 #include <rpmodbc.h>
44 #include <rpmperl.h>
45 #include <rpmpython.h>
46 #include <rpmruby.h>
47 #include <rpmsql.h>
48 #include <rpmsquirrel.h>
49 #include <rpmsvn.h>
50 extern int _rpmsvn_debug;
51 #include <rpmtcl.h>
52 
53 #include <rpmsm.h>
54 #include <rpmsp.h>
55 #include <rpmsx.h>
56 
57 #include <set.h>
58 
59 #include "debug.h"
60 
61 #ifdef __cplusplus
62 GENfree(rpmioP)
63 #endif /* __cplusplus */
64 
65 const char *__progname;
66 
67 #if !defined(POPT_ARGFLAG_TOGGLE) /* XXX compat with popt < 1.15 */
68 #define POPT_ARGFLAG_TOGGLE 0
69 #endif
70 #define POPT_SHOWVERSION -999
71 #define POPT_UNDEFINE -994
72 #define POPT_CRYPTO -993
73 
74 /*@unchecked@*/
75 int __debug = 0;
76 
77 /*@-exportheadervar@*/
78 /*@-redecl@*/
79 /*@unchecked@*/
80 extern int _ar_debug;
81 /*@unchecked@*/
82 extern int _av_debug;
83 /*@unchecked@*/
84 extern int _cpio_debug;
85 /*@unchecked@*/
86 extern int _ctx_debug;
87 /*@unchecked@*/
88 extern int _dav_debug;
89 /*@unchecked@*/
90 extern int _ftp_debug;
91 /*@unchecked@*/
92 extern int _fts_debug;
93 /*@unchecked@*/
94 extern int _ht_debug;
95 /*@unchecked@*/
96 extern int _html_debug;
97 /*@unchecked@*/
98 extern int _iosm_debug;
99 /*@unchecked@*/
100 extern int noLibio;
101 /*@unchecked@*/
102 extern int _pgp_debug;
103 /*@unchecked@*/
104 extern int _pgp_print;
105 /*@unchecked@*/
106 extern int _rpmio_debug;
107 /*@unchecked@*/
108 extern int _rpmiob_debug;
109 /*@unchecked@*/
110 extern int _rpmlua_debug;
111 /*@unchecked@*/
112 extern int _rpmsq_debug;
113 /*@unchecked@*/
114 extern int _rpmzq_debug;
115 /*@unchecked@*/
116 extern int _tar_debug;
117 /*@unchecked@*/
118 extern int _xar_debug;
119 /*@=redecl@*/
120 /*@=exportheadervar@*/
121 
122 /*@unchecked@*/ /*@null@*/
123 const char * rpmioPipeOutput = NULL;
124 
125 /*@unchecked@*/
126 const char * rpmioRootDir = "/";
127 
128 /*@observer@*/ /*@unchecked@*/
129 const char *rpmioEVR = VERSION;
130 
131 /*@unchecked@*/
132 static int rpmioInitialized = -1;
133 
134 #ifdef NOTYET
135 #ifdef WITH_LUA
136 /*@unchecked@*/
137 extern const char *rpmluaFiles;
138 #endif
139 
140 /*@unchecked@*/
141 static char *rpmpoptfiles = RPMPOPTFILES;
142 #endif
143 
145 
147 
151 struct poptOption rpmioDigestPoptTable[] = {
152  { "md2", '\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD2,
153  N_("MD2 digest (RFC-1319)"), NULL },
154  { "md4", '\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD4,
155  N_("MD4 digest"), NULL },
156  { "md5", '\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD5,
157  N_("MD5 digest (RFC-1321)"), NULL },
158  { "sha1",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA1,
159  N_("SHA-1 digest (FIPS-180-1)"), NULL },
160  { "sha224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA224,
161  N_("SHA-224 digest (FIPS-180-2)"), NULL },
162  { "sha256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA256,
163  N_("SHA-256 digest (FIPS-180-2)"), NULL },
164  { "sha384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA384,
165  N_("SHA-384 digest (FIPS-180-2)"), NULL },
166  { "sha512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHA512,
167  N_("SHA-512 digest (FIPS-180-2)"), NULL },
168  { "skein-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_224,
169  N_("SKEIN-224 digest"), NULL },
170  { "skein-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_256,
171  N_("SKEIN-256 digest"), NULL },
172  { "skein-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_384,
173  N_("SKEIN-384 digest"), NULL },
174  { "skein-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_512,
175  N_("SKEIN-512 digest"), NULL },
176  { "skein-1024",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SKEIN_1024,
177  N_("SKEIN-1024 digest"), NULL },
178  { "arirang-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_224,
179  N_("Arirang-224 digest"), NULL },
180  { "arirang-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_256,
181  N_("Arirang-256 digest"), NULL },
182  { "arirang-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_384,
183  N_("Arirang-384 digest"), NULL },
184  { "arirang-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ARIRANG_512,
185  N_("Arirang-512 digest"), NULL },
186  { "blake-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_224,
187  N_("Blake-224 digest"), NULL },
188  { "blake-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_256,
189  N_("Blake-256 digest"), NULL },
190  { "blake-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_384,
191  N_("Blake-384 digest"), NULL },
192  { "blake-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BLAKE_512,
193  N_("Blake-512 digest"), NULL },
194  { "bmw-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_224,
195  N_("BlueMidnightWish-224 digest"), NULL },
196  { "bmw-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_256,
197  N_("BlueMidnightWish-256 digest"), NULL },
198  { "bmw-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_384,
199  N_("BlueMidnightWish-384 digest"), NULL },
200  { "bmw-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_BMW_512,
201  N_("BlueMidnightWish-512 digest"), NULL },
202  { "chi-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_224,
203  N_("Chi-224 digest"), NULL },
204  { "chi-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_256,
205  N_("Chi-256 digest"), NULL },
206  { "chi-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_384,
207  N_("Chi-384 digest"), NULL },
208  { "chi-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CHI_512,
209  N_("Chi-512 digest"), NULL },
210  { "cubehash-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_224,
211  N_("CubeHash-224 digest"), NULL },
212  { "cubehash-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_256,
213  N_("CubeHash-256 digest"), NULL },
214  { "cubehash-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_384,
215  N_("CubeHash-384 digest"), NULL },
216  { "cubehash-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CUBEHASH_512,
217  N_("CubeHash-512 digest"), NULL },
218  { "echo-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_224,
219  N_("Echo-224 digest"), NULL },
220  { "echo-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_256,
221  N_("Echo-256 digest"), NULL },
222  { "echo-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_384,
223  N_("Echo-384 digest"), NULL },
224  { "echo-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_ECHO_512,
225  N_("Echo-512 digest"), NULL },
226  { "edonr-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_224,
227  N_("EdonR-224 digest"), NULL },
228  { "edonr-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_256,
229  N_("EdonR-256 digest"), NULL },
230  { "edonr-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_384,
231  N_("EdonR-384 digest"), NULL },
232  { "edonr-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_EDONR_512,
233  N_("EdonR-512 digest"), NULL },
234  { "fugue-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_224,
235  N_("Fugue-224 digest"), NULL },
236  { "fugue-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_256,
237  N_("Fugue-256 digest"), NULL },
238  { "fugue-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_384,
239  N_("Fugue-384 digest"), NULL },
240  { "fugue-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_FUGUE_512,
241  N_("Fugue-512 digest"), NULL },
242  { "groestl-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_224,
243  N_("Groestl-224 digest"), NULL },
244  { "groestl-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_256,
245  N_("Groestl-256 digest"), NULL },
246  { "groestl-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_384,
247  N_("Groestl-384 digest"), NULL },
248  { "groestl-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_GROESTL_512,
249  N_("Groestl-512 digest"), NULL },
250  { "hamsi-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_224,
251  N_("Hamsi-224 digest"), NULL },
252  { "hamsi-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_256,
253  N_("Hamsi-256 digest"), NULL },
254  { "hamsi-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_384,
255  N_("Hamsi-384 digest"), NULL },
256  { "hamsi-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_HAMSI_512,
257  N_("Hamsi-512 digest"), NULL },
258  { "jh-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_224,
259  N_("JH-224 digest"), NULL },
260  { "jh-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_256,
261  N_("JH-256 digest"), NULL },
262  { "jh-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_384,
263  N_("JH-384 digest"), NULL },
264  { "jh-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JH_512,
265  N_("JH-512 digest"), NULL },
266  { "keccak-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_224,
267  N_("Keccak-224 digest"), NULL },
268  { "keccak-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_256,
269  N_("Keccak-256 digest"), NULL },
270  { "keccak-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_384,
271  N_("Keccak-384 digest"), NULL },
272  { "keccak-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_KECCAK_512,
273  N_("Keccak-512 digest"), NULL },
274  { "lane-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_224,
275  N_("Lane-224 digest"), NULL },
276  { "lane-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_256,
277  N_("Lane-256 digest"), NULL },
278  { "lane-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_384,
279  N_("Lane-384 digest"), NULL },
280  { "lane-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LANE_512,
281  N_("Lane-512 digest"), NULL },
282  { "luffa-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_224,
283  N_("Luffa-224 digest"), NULL },
284  { "luffa-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_256,
285  N_("Luffa-256 digest"), NULL },
286  { "luffa-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_384,
287  N_("Luffa-384 digest"), NULL },
288  { "luffa-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_LUFFA_512,
289  N_("Luffa-512 digest"), NULL },
290  { "md6-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_224,
291  N_("MD6-224 digest"), NULL },
292  { "md6-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_256,
293  N_("MD6-256 digest"), NULL },
294  { "md6-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_384,
295  N_("MD6-384 digest"), NULL },
296  { "md6-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_MD6_512,
297  N_("MD6-512digest"), NULL },
298  { "shabal-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_224,
299  N_("Shabal-224 digest"), NULL },
300  { "shabal-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_256,
301  N_("Shabal-256 digest"), NULL },
302  { "shabal-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_384,
303  N_("Shabal-384 digest"), NULL },
304  { "shabal-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHABAL_512,
305  N_("Shabal-512 digest"), NULL },
306  { "shavite3-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_224,
307  N_("SHAvite3-224 digest"), NULL },
308  { "shavite3-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_256,
309  N_("SHAvite3-256 digest"), NULL },
310  { "shavite3-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_384,
311  N_("SHAvite3-384 digest"), NULL },
312  { "shavite3-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SHAVITE3_512,
313  N_("SHAvite3-512 digest"), NULL },
314  { "simd-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_224,
315  N_("SIMD-224 digest"), NULL },
316  { "simd-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_256,
317  N_("SIMD-256 digest"), NULL },
318  { "simd-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_384,
319  N_("SIMD-384 digest"), NULL },
320  { "simd-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_SIMD_512,
321  N_("SIMD-512 digest"), NULL },
322  { "tib3-224",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_224,
323  N_("TIB3-224 digest"), NULL },
324  { "tib3-256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_256,
325  N_("TIB3-256 digest"), NULL },
326  { "tib3-384",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_384,
327  N_("TIB3-384 digest"), NULL },
328  { "tib3-512",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIB3_512,
329  N_("TIB3-512 digest"), NULL },
330  { "salsa10",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_SALSA10,
331  N_("SALSA-10 hash"), NULL },
332  { "salsa20",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_SALSA20,
333  N_("SALSA-20 hash"), NULL },
334  { "rmd128",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD128,
335  N_("RIPEMD-128 digest"), NULL },
336  { "rmd160",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD160,
337  N_("RIPEMD-160 digest"), NULL },
338  { "rmd256",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD256,
339  N_("RIPEMD-256 digest"), NULL },
340  { "rmd320",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_RIPEMD320,
341  N_("RIPEMD-320 digest"), NULL },
342  { "tiger",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_TIGER192,
343  N_("TIGER digest"), NULL },
344  { "crc32",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CRC32,
345  N_("CRC-32 checksum"), NULL },
346  { "crc64",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_CRC64,
347  N_("CRC-64 checksum"), NULL },
348  { "adler32",'\0', POPT_ARG_VAL,&rpmioDigestHashAlgo, PGPHASHALGO_ADLER32,
349  N_("ADLER-32 checksum"), NULL },
350  { "jlu32",'\0', POPT_ARG_VAL, &rpmioDigestHashAlgo, PGPHASHALGO_JLU32,
351  N_("Lookup3 hash"), NULL },
352  { "nodigest",'\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmioDigestHashAlgo, PGPHASHALGO_NONE,
353  N_("No hash algorithm"), NULL },
354  { "alldigests",'\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &rpmioDigestHashAlgo, 256,
355  N_("All hash algorithm(s)"), NULL },
356  POPT_TABLEEND
357 };
358 
362 static void printVersion(FILE * fp)
363  /*@globals rpmioEVR, fileSystem @*/
364  /*@modifies *fp, fileSystem @*/
365 {
366  fprintf(fp, _("%s (" RPM_NAME ") %s\n"), __progname, rpmioEVR);
367 }
368 
369 void rpmioConfigured(void)
370  /*@globals rpmioInitialized @*/
371  /*@modifies rpmioInitialized @*/
372 {
373 
374  if (rpmioInitialized < 0) {
375  /* XXX TODO: add initialization side-effects. */
376  rpmioInitialized = 0;
377  }
378  if (rpmioInitialized)
379  exit(EXIT_FAILURE);
380 }
381 
384 static void rpmioAllArgCallback(poptContext con,
385  /*@unused@*/ enum poptCallbackReason reason,
386  const struct poptOption * opt, const char * arg,
387  /*@unused@*/ const void * data)
388  /*@globals pgpImplVecs,
389  rpmGlobalMacroContext,
390  fileSystem, internalState @*/
391  /*@modifies con, pgpImplVecs,
392  rpmGlobalMacroContext,
393  fileSystem, internalState @*/
394 {
395 
396  /* XXX avoid accidental collisions with POPT_BIT_SET for flags */
397  if (opt->arg == NULL)
398  switch (opt->val) {
399  case 'q':
401  break;
402  case 'v':
404  break;
405 #ifdef NOTYET
406  case 'D':
407  { char *s, *t;
408  /* XXX Convert '-' in macro name to underscore, skip leading %. */
409  s = t = xstrdup(arg);
410  while (*t && !xisspace((int)*t)) {
411  if (*t == '-') *t = '_';
412  t++;
413  }
414  t = s;
415  if (*t == '%') t++;
416  rpmioConfigured();
417 /*@-type@*/
418  /* XXX adding macro to global context isn't Right Thing Todo. */
419  (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE);
421 /*@=type@*/
422  s = _free(s);
423  } break;
424  case POPT_UNDEFINE:
425  { char *s, *t;
426  /* XXX Convert '-' in macro name to underscore, skip leading %. */
427  s = t = xstrdup(arg);
428  while (*t && !xisspace((int)*t)) {
429  if (*t == '-') *t = '_';
430  t++;
431  }
432  t = s;
433  if (*t == '%') t++;
434 /*@-type@*/
435  rpmioConfigured();
436  (void) rpmUndefineMacro(NULL, t);
438 /*@=type@*/
439  s = _free(s);
440  } break;
441  case 'E':
442  rpmioConfigured();
443  { const char *val = rpmExpand(arg, NULL);
444  size_t val_len;
445  val_len = strlen(val);
446  if (val[val_len - 1] == '\n')
447  fwrite(val, val_len, 1, stdout);
448  else
449  fprintf(stdout, "%s\n", val);
450  val = _free(val);
451  }
452  break;
453 #endif /* NOTYET */
454  case POPT_CRYPTO:
455  { const char *val;
456 #ifdef NOTYET
457  rpmioConfigured();
458  val = rpmExpand(arg, NULL);
459 #else
460  val = xstrdup(arg);
461 #endif /* NOTYET */
462  if (!xstrcasecmp(val, "beecrypt") || !xstrcasecmp(val, "bc")) {
463 #if defined(WITH_BEECRYPT)
465 #else
466  rpmlog(RPMLOG_ERR, "BeeCrypt (\"beecrypt\") based cryptography implementation not available\n");
467  exit(EXIT_FAILURE);
468 #endif
469  }
470  else if (!xstrcasecmp(val, "gcrypt") || !xstrcasecmp(val, "gc")) {
471 #if defined(WITH_GCRYPT)
473 #else
474  rpmlog(RPMLOG_ERR, "GCrypt (\"gcrypt\") based cryptography implementation not available\n");
475  exit(EXIT_FAILURE);
476 #endif
477  }
478  else if (!xstrcasecmp(val, "tomcrypt") || !xstrcasecmp(val, "ltc")) {
479 #if defined(WITH_TOMCRYPT)
480  pgpImplVecs = &rpmltcImplVecs;
481 #else
482  rpmlog(RPMLOG_ERR, "TomCrypt (\"tomcrypt\") based cryptography implementation not available\n");
483  exit(EXIT_FAILURE);
484 #endif
485  }
486  else if (!xstrcasecmp(val, "NSS")) {
487 #if defined(WITH_NSS)
489 #else
490  rpmlog(RPMLOG_ERR, "Mozilla NSS (\"nss\") based cryptography implementation not available\n");
491  exit(EXIT_FAILURE);
492 #endif
493  }
494  else if (!xstrcasecmp(val, "OpenSSL") || !xstrcasecmp(val, "ssl")) {
495 #if defined(WITH_SSL)
497 #else
498  rpmlog(RPMLOG_ERR, "OpenSSL (\"openssl\") based cryptography implementation not available\n");
499  exit(EXIT_FAILURE);
500 #endif
501  }
502  else if (!xstrcasecmp(val, "CDSA")) {
503 #if defined(WITH_CDSA)
504  pgpImplVecs = &rpmcdsaImplVecs;
505 #else
506  rpmlog(RPMLOG_ERR, "CDSA (\"cdsa\") based cryptography implementation not available\n");
507  exit(EXIT_FAILURE);
508 #endif
509  }
510  else {
511  rpmlog(RPMLOG_ERR, "cryptography implementation \"%s\" not known\n", val);
512  exit(EXIT_FAILURE);
513  }
514  val = _free(val);
515  }
516  break;
517  case POPT_SHOWVERSION:
518  printVersion(stdout);
519 /*@i@*/ con = rpmioFini(con);
520  exit(EXIT_SUCCESS);
521  /*@notreached@*/ break;
522  }
523 }
524 
525 /*@unchecked@*/
526 int rpmioFtsOpts = 0;
527 
528 /*@unchecked@*/
529 struct poptOption rpmioFtsPoptTable[] = {
530  { "comfollow", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_COMFOLLOW,
531  N_("FTS_COMFOLLOW: follow command line symlinks"), NULL },
532  { "logical", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_LOGICAL,
533  N_("FTS_LOGICAL: logical walk"), NULL },
534  { "nochdir", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_NOCHDIR,
535  N_("FTS_NOCHDIR: don't change directories"), NULL },
536  { "nostat", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_NOSTAT,
537  N_("FTS_NOSTAT: don't get stat info"), NULL },
538  { "physical", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_PHYSICAL,
539  N_("FTS_PHYSICAL: physical walk"), NULL },
540  { "seedot", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_SEEDOT,
541  N_("FTS_SEEDOT: return dot and dot-dot"), NULL },
542  { "xdev", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_XDEV,
543  N_("FTS_XDEV: don't cross devices"), NULL },
544  { "whiteout", '\0', POPT_BIT_SET, &rpmioFtsOpts, FTS_WHITEOUT,
545  N_("FTS_WHITEOUT: return whiteout information"), NULL },
546  POPT_TABLEEND
547 };
548 
549 /*@-bitwisesigned -compmempass @*/
550 /*@unchecked@*/
551 struct poptOption rpmioAllPoptTable[] = {
552 /*@-type@*/ /* FIX: cast? */
553  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
554  (void *)rpmioAllArgCallback, 0, NULL, NULL },
555 /*@=type@*/
556 
557  { "debug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &__debug, -1,
558  N_("Debug generic operations"), NULL },
559 
560 #ifdef NOTYET
561  { "define", 'D', POPT_ARG_STRING, NULL, (int)'D',
562  N_("Define MACRO with value EXPR"),
563  N_("'MACRO EXPR'") },
564  { "undefine", '\0', POPT_ARG_STRING, NULL, POPT_UNDEFINE,
565  N_("Undefine MACRO"),
566  N_("'MACRO'") },
567  { "eval", 'E', POPT_ARG_STRING, NULL, (int)'E',
568  N_("Print macro expansion of EXPR"),
569  N_("'EXPR'") },
570 
571  { "macros", '\0', POPT_ARG_STRING, &rpmMacrofiles, 0,
572  N_("Read <FILE:...> instead of default file(s)"),
573  N_("<FILE:...>") },
574 #ifdef WITH_LUA
575  { "rpmlua", '\0', POPT_ARG_STRING, &rpmluaFiles, 0,
576  N_("Read <FILE:...> instead of default RPM Lua file(s)"),
577  N_("<FILE:...>") },
578 #endif
579  { "rpmpopt", '\0', POPT_ARG_STRING, NULL, 0,
580  N_("Read <FILE:...> instead of default POPT file(s)"),
581  N_("<FILE:...>") },
582 #endif /* NOTYET */
583 
584  { "pipe", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &rpmioPipeOutput, 0,
585  N_("Send stdout to CMD"),
586  N_("CMD") },
587  { "root", 'r', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT, &rpmioRootDir, 0,
588  N_("Use ROOT as top level directory"),
589  N_("ROOT") },
590 
591  { "quiet", '\0', 0, NULL, (int)'q',
592  N_("Provide less detailed output"), NULL},
593  { "verbose", 'v', 0, NULL, (int)'v',
594  N_("Provide more detailed output"), NULL},
595  { "version", '\0', 0, NULL, POPT_SHOWVERSION,
596  N_("Print the version"), NULL },
597 
598 #if defined(HAVE_LIBIO_H) && defined(_G_IO_IO_FILE_VERSION)
599  { "nolibio", '\0', POPT_ARG_VAL|POPT_ARGFLAG_TOGGLE|POPT_ARGFLAG_DOC_HIDDEN, &noLibio, -1,
600  N_("Disable use of libio(3) API"), NULL},
601 #endif
602 
603  { "usecrypto",'\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, NULL, POPT_CRYPTO,
604  N_("Select cryptography implementation"),
605  N_("CRYPTO") },
606 
607  { "ardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ar_debug, -1,
608  N_("Debug ar archives"), NULL},
609  { "avdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_av_debug, -1,
610  N_("Debug argv collections"), NULL},
611  { "cpiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_cpio_debug, -1,
612  N_("Debug cpio archives"), NULL},
613  { "ctxdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ctx_debug, -1,
614  N_("Debug digest contexts"), NULL},
615  { "davdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_dav_debug, -1,
616  N_("Debug WebDAV data stream"), NULL},
617  { "ftpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ftp_debug, -1,
618  N_("Debug FTP/HTTP data stream"), NULL},
619  { "ftsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_fts_debug, -1,
620  N_("Debug Fts(3) traverse"), NULL},
621  { "htdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ht_debug, -1,
622  N_("Debug hash tables"), NULL},
623  { "htmldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_html_debug, -1,
624  N_("Debug HTML parsing"), NULL},
625  { "iosmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_iosm_debug, -1,
626  N_("Debug I/O state machine"), NULL},
627  { "miredebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_mire_debug, -1,
628  N_("Debug miRE patterns"), NULL},
629  { "pgpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_pgp_debug, -1,
630  N_("Debug PGP usage"), NULL},
631  { "pgpprint", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_pgp_print, -1,
632  N_("Print PGP keys"), NULL},
633  { "rpmiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmio_debug, -1,
634  N_("Debug rpmio I/O"), NULL},
635  { "rpmiobdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmiob_debug, -1,
636  N_("Debug rpmio I/O buffers"), NULL},
637 
638  { "rpmasndebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmasn_debug, -1,
639  N_("Debug embedded ASN.1 interpreter"), NULL},
640  { "rpmbagdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmbag_debug, -1,
641  N_("Debug depsolver wrappers "), NULL},
642  { "rpmcvsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmcvs_debug, -1,
643  N_("Debug CVS wrappers "), NULL},
644  { "rpmgitdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmgit_debug, -1,
645  N_("Debug GIT wrappers "), NULL},
646  { "rpmsetdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmset_debug, -1,
647  N_("Debug SET-VERSION wrappers "), NULL},
648  { "rpmsvndebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsvn_debug, -1,
649  N_("Debug Subversion wrappers "), NULL},
650  { "rpmtpmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmtpm_debug, -1,
651  N_("Debug TPM emulator"), NULL},
652 
653  { "rpmaugdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmaug_debug, -1,
654  N_("Debug embedded Augeas interpreter"), NULL},
655  { "rpmbfdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmbf_debug, -1,
656  N_("Debug Bloom filters"), NULL},
657  { "rpmcudfdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmcudf_debug, -1,
658  N_("Debug embedded CUDF parser"), NULL},
659  { "rpmficldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmficl_debug, -1,
660  N_("Debug embedded FICL interpreter"), NULL},
661  { "rpmhkpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmhkp_debug, -1,
662  N_("Debug hkp:// keyring"), NULL},
663  { "rpmjsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmjs_debug, -1,
664  N_("Debug embedded JavaScript interpreter"), NULL},
665 #ifdef WITH_LUA
666  { "rpmluadebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmlua_debug, -1,
667  N_("Debug embedded Lua interpreter"), NULL},
668 #endif
669  { "rpmmgdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmmg_debug, -1,
670  N_("Debug rpmmg magic"), NULL},
671  { "mongodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmmgo_debug, -1,
672  N_("Debug Mongo DB connection"), NULL},
673  { "nixdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmnix_debug, -1,
674  N_("Debug embedded Nix interpreter"), NULL},
675  { "odbcdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_odbc_debug, -1,
676  N_("Debug embedded ODBC interface"), NULL},
677  { "rpmperldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmperl_debug, -1,
678  N_("Debug embedded Perl interpreter"), NULL},
679  { "rpmpythondebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmpython_debug, -1,
680  N_("Debug embedded Python interpreter"), NULL},
681  { "rpmrubydebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmruby_debug, -1,
682  N_("Debug embedded Ruby interpreter"), NULL},
683  { "rpmsqdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsq_debug, -1,
684  N_("Debug rpmsq Signal Queue"), NULL},
685  { "rpmsqldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsql_debug, -1,
686  N_("Debug embedded SQL interpreter"), NULL},
687  { "rpmsquirreldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsquirrel_debug, -1,
688  N_("Debug embedded SQUIRREL interpreter"), NULL},
689  { "rpmsmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsm_debug, 1,
690  N_("Debug semanage"), NULL},
691  { "rpmspdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsp_debug, 1,
692  N_("Debug sepol"), NULL},
693  { "rpmsxdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsx_debug, 1,
694  N_("Debug selinux"), NULL},
695  { "rpmtcldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmtcl_debug, -1,
696  N_("Debug embedded TCL interpreter"), NULL},
697  { "rpmvcdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmvc_debug, -1,
698  N_("Debug embedded SQL virtual cursor"), NULL},
699  { "rpmvtdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmvt_debug, -1,
700  N_("Debug embedded SQL virtual table"), NULL},
701 #ifdef WITH_BZIP2
702  { "rpmzqdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmzq_debug, -1,
703  N_("Debug rpmzq Job Queuing"), NULL},
704 #endif
705  { "xardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_xar_debug, -1,
706  N_("Debug xar archives"), NULL},
707  { "tardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_tar_debug, -1,
708  N_("Debug tar archives"), NULL},
709  { "stats", '\0', POPT_ARG_VAL, &_rpmsw_stats, -1,
710  N_("Display operation statistics"), NULL},
711  { "urldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_url_debug, -1,
712  N_("Debug URL cache handling"), NULL},
713 
714  POPT_TABLEEND
715 };
716 /*@=bitwisesigned =compmempass @*/
717 
718 poptContext
719 rpmioFini(poptContext optCon)
720 {
721  /* XXX this should be done in the rpmioClean() wrapper. */
722  /* keeps memory leak checkers quiet */
723  rpmFreeMacros(NULL);
725 
726  rpmioClean();
727 
728  optCon = poptFreeContext(optCon);
729 
730 #if defined(HAVE_MCHECK_H) && defined(HAVE_MTRACE)
731  /*@-noeffect@*/
732  muntrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
733  /*@=noeffect@*/
734 #endif
735 
736  return NULL;
737 }
738 
739 static inline int checkfd(const char * devnull, int fdno, int flags)
740  /*@*/
741 {
742  struct stat sb;
743  int ret = 0;
744 
745  if (fstat(fdno, &sb) == -1 && errno == EBADF)
746  ret = (open(devnull, flags) == fdno) ? 1 : 2;
747  return ret;
748 }
749 
750 /*@-globstate@*/
751 poptContext
752 rpmioInit(int argc, char *const argv[], struct poptOption * optionsTable)
753 {
754  poptContext optCon;
755  int rc;
756 #ifdef NOTYET
757  int i;
758 #endif
759 
760 #if defined(HAVE_MCHECK_H) && defined(HAVE_MTRACE)
761  /*@-noeffect@*/
762  mtrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
763  /*@=noeffect@*/
764 #endif
765 /*@-globs -mods@*/
766  setprogname(argv[0]); /* Retrofit glibc __progname */
767 
768  /* XXX glibc churn sanity */
769  if (__progname == NULL) {
770  if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
771  else __progname = argv[0];
772  }
773 /*@=globs =mods@*/
774 
775  /* Insure that stdin/stdout/stderr are open, lest stderr end up in rpmdb. */
776  { static const char _devnull[] = "/dev/null";
777 #if defined(STDIN_FILENO)
778  (void) checkfd(_devnull, STDIN_FILENO, O_RDONLY);
779 #endif
780 #if defined(STDOUT_FILENO)
781  (void) checkfd(_devnull, STDOUT_FILENO, O_WRONLY);
782 #endif
783 #if defined(STDERR_FILENO)
784  (void) checkfd(_devnull, STDERR_FILENO, O_WRONLY);
785 #endif
786  }
787 
788 #if defined(ENABLE_NLS) && !defined(__LCLINT__)
789  (void) setlocale(LC_ALL, "" );
791  (void) textdomain(PACKAGE);
792 #endif
793 
795 
796  if (optionsTable == NULL) {
797  /* Read rpm configuration (if not already read). */
798  rpmioConfigured();
799  return NULL;
800  }
801 
802 #ifdef NOTYET
803  /* read all RPM POPT configuration files */
804  for (i = 1; i < argc; i++) {
805  if (strcmp(argv[i], "--rpmpopt") == 0 && i+1 < argc) {
806  rpmpoptfiles = argv[i+1];
807  break;
808  }
809  else if (strncmp(argv[i], "--rpmpopt=", 10) == 0) {
810  rpmpoptfiles = argv[i]+10;
811  break;
812  }
813  }
814 #endif /* NOTYET */
815 
816 /*@-nullpass -temptrans@*/
817  optCon = poptGetContext(__progname, argc, (const char **)argv, optionsTable, _rpmio_popt_context_flags);
818 /*@=nullpass =temptrans@*/
819 
820 #ifdef NOTYET
821 #if defined(RPM_VENDOR_OPENPKG) /* stick-with-rpm-file-sanity-checking */ || \
822  !defined(POPT_ERROR_BADCONFIG) /* XXX POPT 1.15 retrofit */
823  { char * path_buf = xstrdup(rpmpoptfiles);
824  char *path;
825  char *path_next;
826 
827  for (path = path_buf; path != NULL && *path != '\0'; path = path_next) {
828  const char **av;
829  int ac, i;
830 
831  /* locate start of next path element */
832  path_next = strchr(path, ':');
833  if (path_next != NULL && *path_next == ':')
834  *path_next++ = '\0';
835  else
836  path_next = path + strlen(path);
837 
838  /* glob-expand the path element */
839  ac = 0;
840  av = NULL;
841  if ((i = rpmGlob(path, &ac, &av)) != 0)
842  continue;
843 
844  /* work-off each resulting file from the path element */
845  for (i = 0; i < ac; i++) {
846  const char *fn = av[i];
847  if (fn[0] == '@' /* attention */) {
848  fn++;
849  if (!rpmSecuritySaneFile(fn)) {
850  rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", fn);
851  continue;
852  }
853  }
854  (void)poptReadConfigFile(optCon, fn);
855  av[i] = _free(av[i]);
856  }
857  av = _free(av);
858  }
859  path_buf = _free(path_buf);
860  }
861 #else
862  /* XXX FIXME: better error message is needed. */
863  if ((xx = poptReadConfigFiles(optCon, rpmpoptfiles)) != 0)
864  rpmlog(RPMLOG_WARNING, "existing POPT configuration file \"%s\" considered INSECURE -- not loaded\n", rpmpoptfiles);
865 #endif
866 
867  /* read standard POPT configuration files */
868  /* XXX FIXME: the 2nd arg useEnv flag is UNUSED. */
869  (void) poptReadDefaultConfig(optCon, 1);
870 
871  poptSetExecPath(optCon, USRLIBRPM, 1);
872 #endif /* NOTYET */
873 
874  /* Process all options, whine if unknown. */
875  while ((rc = poptGetNextOpt(optCon)) > 0) {
876  const char * optArg = poptGetOptArg(optCon);
877 /*@-dependenttrans -modobserver -observertrans @*/
878  optArg = _free(optArg);
879 /*@=dependenttrans =modobserver =observertrans @*/
880  switch (rc) {
881  default:
882 /*@-nullpass@*/
883  fprintf(stderr, _("%s: option table misconfigured (%d)\n"),
884  __progname, rc);
885 /*@=nullpass@*/
886  exit(EXIT_FAILURE);
887 
888  /*@notreached@*/ /*@switchbreak@*/ break;
889  }
890  }
891 
892  if (rc < -1) {
893 /*@-nullpass@*/
894  fprintf(stderr, "%s: %s: %s\n", __progname,
895  poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
896  poptStrerror(rc));
897 /*@=nullpass@*/
898  exit(EXIT_FAILURE);
899  }
900 
901  /* Read rpm configuration (if not already read). */
902  rpmioConfigured();
903 
904  if (__debug) {
907  }
908 
909  return optCon;
910 }
911 /*@=globstate@*/
912 
920 /*@null@*/
921 static char *
922 matchchar(char * p, char pl, char pr)
923  /*@*/
924 {
925  int lvl = 0;
926  char c;
927 
928  while ((c = *p++) != '\0') {
929  if (c == '\\') { /* Ignore escaped chars */
930  p++;
931  continue;
932  }
933  if (c == pr) {
934  if (--lvl <= 0) return --p;
935  } else if (c == pl)
936  lvl++;
937  }
938  return (char *)NULL;
939 }
940 
942 {
943  if (P != NULL) {
944  P->str = _free(P->str);
945  P->av = argvFree(P->av);
946  P = _free(P);
947  }
948  return NULL;
949 }
950 
951 rpmRC rpmioParse(rpmioP *Pptr, const char * str)
952 {
953  static char whitespace[] = " \t\n\r";
954  rpmioP P;
955  rpmRC rc = RPMRC_FAIL; /* assume failure */
956  char *b;
957  char *be;
958  int xx;
959  int c;
960 
961  if ((P = *Pptr) == NULL)
962  *Pptr = P = (rpmioP) xcalloc(1, sizeof(*P));
963 
964  if (str != NULL) {
965  P->str = _free(P->str);
966  P->next = P->str = xstrdup(str);
967  }
968 
969  /* Ltrim whitespace. Anything left to parse? */
970  if ((b = P->next) != NULL)
971  while (*b && strchr(whitespace, *b))
972  *b++ = '\0';
973  if (b == NULL || *b == '\0')
974  return RPMRC_NOTFOUND;
975 
976  /* Parse next command into an argv. */
977  P->ac = 0;
978  P->av = argvFree(P->av);
979  if ((be = b) != NULL)
980  while (1) {
981  c = *be++;
982  switch (c) {
983  default:
984  break;
985  case '\\': /* escaped character. */
986  if (*be != '\0')
987  be++;
988  break;
989  case '\0': /* end-of-command termination. */
990  case '\n':
991  case '\r':
992  case ';':
993  if (be[-1] != '\0')
994  be[-1] = '\0';
995  else
996  be--; /* XXX one too far */
997  if ((be - b) > 1) {
998  xx = argvAdd(&P->av, b);
999  P->ac++;
1000  }
1001  goto exit;
1002  break;
1003  case '[': /* XPath construct with '[' balancing. */
1004  if ((be = matchchar(be, '[', ']')) == NULL) {
1005  be += strlen(b); /* XXX unmatched ']' */
1006  goto exit;
1007  }
1008  be++;
1009  break;
1010  case '"': /* quoted string */
1011  while (1) {
1012  if ((be = strchr(be, '"')) == NULL) {
1013  be += strlen(b); /* XXX unmatched '"' */
1014  goto exit;
1015  }
1016  be++;
1017  if (be[-2] == '\\') /* escaped quote */
1018  continue;
1019  break;
1020  }
1021  break;
1022  case ' ': /* argument separator */
1023  case '\t':
1024  be[-1] = '\0';
1025  if ((be - b) > 1) {
1026  xx = argvAdd(&P->av, b);
1027  P->ac++;
1028  }
1029  b = be;
1030  while (*b && (*b == ' ' || *b == '\t'))
1031  *b++ = '\0';
1032  be = b;
1033  break;
1034  }
1035  }
1036  rc = RPMRC_OK;
1037 
1038 exit:
1039  P->next = be;
1040  return rc;
1041 }
#define RPMPOPTFILES
Definition: config.h:1123
void rpmFreeMacros(MacroContext mc)
Destroy macro context.
Definition: macro.c:2966
const char ** av
Definition: rpmiotypes.h:69
int noLibio
Definition: rpmio.c:165
int _rpmsx_debug
Definition: rpmsx.c:61
#define FTS_XDEV
Definition: fts.h:93
pgpImplVecs_t * pgpImplVecs
Definition: rpmpgp.c:38
poptContext rpmioInit(int argc, char *const argv[], struct poptOption *optionsTable)
Definition: poptIO.c:752
struct pgpImplVecs_s rpmbcImplVecs
Definition: rpmbc.c:850
#define setprogname(pn)
Definition: system.h:429
int _mire_debug
Definition: mire.c:18
struct poptOption rpmioDigestPoptTable[]
Digest options using popt.
Definition: poptIO.c:151
void rpmioClean(void)
Free all memory allocated by rpmio usage.
Definition: rpmio.c:3219
int _ftp_debug
Definition: rpmio.c:188
int _rpmvt_debug
Definition: rpmsql.c:46
struct rpmioP_s * rpmioP
static int checkfd(const char *devnull, int fdno, int flags)
Definition: poptIO.c:739
int _ar_debug
Definition: ar.c:23
#define EXIT_FAILURE
char * xstrdup(const char *str)
Definition: rpmmalloc.c:322
int _rpmiob_debug
Definition: rpmiob.c:14
MacroContext rpmCLIMacroContext
Definition: macro.c:127
enum pgpHashAlgo_e pgpHashAlgo
9.4.
static struct poptOption optionsTable[]
Definition: rpmqv.c:118
int _html_debug
Definition: rpmdav.c:1117
struct poptOption rpmioFtsPoptTable[]
Definition: poptIO.c:529
#define VERSION
Definition: config.h:1270
int _rpmsq_debug
Definition: rpmsq.c:278
int errno
int _rpmzq_debug
static void rpmlog(int code, const char *fmt,...)
Definition: rpmlog.h:299
pgpImplVecs_t rpmnssImplVecs
pgpHashAlgo rpmioDigestHashAlgo
Definition: poptIO.c:146
int _ctx_debug
Definition: digest.c:110
#define bindtextdomain(Domain, Directory)
Definition: system.h:481
const char * rpmioPipeOutput
Definition: poptIO.c:123
int _rpmsquirrel_debug
Definition: rpmsquirrel.c:22
int _rpmmg_debug
Definition: rpmmg.c:21
#define POPT_UNDEFINE
Definition: poptIO.c:71
#define POPT_CRYPTO
Definition: poptIO.c:72
int rpmGlob(const char *patterns, int *argcPtr, const char ***argvPtr)
Return URL path(s) from a (URL prefixed) pattern glob.
Definition: macro.c:2509
void * xcalloc(size_t nmemb, size_t size)
Definition: rpmmalloc.c:301
int _av_debug
Definition: rpmio.c:183
int _rpmperl_debug
Definition: rpmperl.c:25
int _rpmjs_debug
Definition: rpmjs.c:74
int _rpmruby_debug
Triggers printing of debugging information.
Definition: rpmruby.c:30
#define N_(Text)
Definition: system.h:490
int _url_debug
Definition: url.c:71
#define FTS_COMFOLLOW
Definition: fts.h:87
#define POPT_ARGFLAG_TOGGLE
Definition: poptIO.c:68
static int xisspace(int c)
Definition: rpmiotypes.h:446
const char * rpmioRootDir
Definition: poptIO.c:126
int _rpmvc_debug
Definition: rpmsql.c:49
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
Definition: argv.c:44
#define setlocale(Category, Locale)
Definition: system.h:472
static void printVersion(FILE *fp)
Display rpm version.
Definition: poptIO.c:362
int _rpmsvn_debug
int rpmDefineMacro(MacroContext mc, const char *macro, int level)
Define macro in context.
Definition: macro.c:2739
rpmioP rpmioPFree(rpmioP P)
Destroy a rpmioP object.
Definition: poptIO.c:941
int _rpmtcl_debug
Definition: rpmtcl.c:21
static void rpmioAllArgCallback(poptContext con, enum poptCallbackReason reason, const struct poptOption *opt, const char *arg, const void *data)
Definition: poptIO.c:384
int _dav_debug
Definition: rpmio.c:193
char * str
Definition: rpmiotypes.h:67
const char * rpmluaFiles
int _rpmpython_debug
Definition: rpmpython.c:25
const char * rpmMacrofiles
List of macro files to read when configuring rpm.
Definition: macro.c:62
#define FTS_SEEDOT
Definition: fts.h:92
pgpImplVecs_t rpmsslImplVecs
Implementation specific parameter storage.
int argvAdd(ARGV_t *argvp, ARGstr_t val)
Add a string to an argv array.
Definition: argv.c:199
#define RPM_NAME
Definition: config.h:1132
char * next
Definition: rpmiotypes.h:68
int xstrcasecmp(const char *s1, const char *s2)
Locale insensitive strcasecmp(3).
Definition: strcasecmp.c:9
int rpmioFtsOpts
Definition: poptIO.c:526
char * rpmExpand(const char *arg,...)
Return (malloc&#39;ed) concatenated macro expansion(s).
Definition: macro.c:3117
Embedded Ruby interpreter.
int __debug
Definition: poptIO.c:75
#define POPT_SHOWVERSION
Definition: poptIO.c:70
#define rpmSetVerbosity(_lvl)
Definition: rpmcb.h:13
int _ht_debug
Definition: rpmhash.c:13
int _xar_debug
Definition: rpmxar.c:70
void rpmioConfigured(void)
Definition: poptIO.c:369
#define USRLIBRPM
Definition: config.h:1261
int _rpmio_popt_context_flags
Definition: poptIO.c:144
enum rpmRC_e rpmRC
RPM return codes.
#define FTS_NOCHDIR
Definition: fts.h:89
int _rpmio_debug
Definition: rpmio.c:178
#define FTS_WHITEOUT
Definition: fts.h:94
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
Definition: rpmiotypes.h:647
#define LOCALEDIR
Definition: config.h:1067
pgpImplVecs_t rpmgcImplVecs
Implementation specific parameter storage.
int rpmSecuritySaneFile(const char *filename)
Check whether configuration file is moderately secure to load.
Definition: macro.c:2486
static const char * rpmpoptfiles
Definition: poptALL.c:187
#define FTS_PHYSICAL
Definition: fts.h:91
#define FTS_LOGICAL
Definition: fts.h:88
#define textdomain(Domain)
Definition: system.h:483
int _tar_debug
Definition: tar.c:21
int _rpmsw_stats
Definition: rpmsw.c:20
#define _(Text)
Definition: system.h:30
#define RMIL_CMDLINE
Definition: rpmmacro.h:54
int _rpmsql_debug
Definition: rpmsql.c:43
const char * rpmioEVR
Definition: poptIO.c:129
#define PACKAGE
Definition: config.h:1090
int _rpmlua_debug
Definition: rpmlua.c:58
struct poptOption rpmioAllPoptTable[]
Definition: poptIO.c:551
static int rpmioInitialized
Definition: poptIO.c:132
int _cpio_debug
Definition: cpio.c:20
poptContext rpmioFini(poptContext optCon)
Definition: poptIO.c:719
int _pgp_print
Definition: rpmpgp.c:32
#define FTS_NOSTAT
Definition: fts.h:90
int _pgp_debug
Definition: rpmpgp.c:29
int rpmUndefineMacro(MacroContext mc, const char *macro)
Undefine macro in context.
Definition: macro.c:2753
int ac
Definition: rpmiotypes.h:70
int _fts_debug
Definition: fts.c:165
#define rpmIncreaseVerbosity()
Definition: rpmcb.h:15
static char * matchchar(char *p, char pl, char pr)
Return text between pl and matching pr characters.
Definition: poptIO.c:922
rpmRC rpmioParse(rpmioP *Pptr, const char *str)
Parse next command out of a string incrementally.
Definition: poptIO.c:951
int _iosm_debug
Definition: iosm.c:75
const char * __progname
Definition: poptIO.c:65