rpm  4.5
poptALL.c
Go to the documentation of this file.
1 
6 #include "system.h"
7 const char *__progname;
8 
9 #include <rpmcli.h>
10 #include <rpmlua.h> /* XXX rpmluaFree() */
11 #include <fs.h> /* XXX rpmFreeFilesystems() */
12 #include <fts.h>
13 #include <mire.h>
14 
15 #include "debug.h"
16 
17 #define POPT_SHOWVERSION -999
18 #define POPT_SHOWRC -998
19 #define POPT_QUERYTAGS -997
20 #define POPT_PREDEFINE -996
21 #ifdef NOTYET
22 #define POPT_RCFILE -995
23 #endif
24 
25 /*@access headerTagIndices @*/ /* XXX rpmcliFini */
26 /*@access headerTagTableEntry @*/ /* XXX rpmcliFini */
27 
28 /*@unchecked@*/
29 extern int _tagcache;
30 
31 /*@unchecked@*/
32 static int _debug = 0;
33 
34 /*@-exportheadervar@*/
35 /*@unchecked@*/
36 extern int _rpmds_nopromote;
37 
38 /*@unchecked@*/
39 extern int _cpio_debug;
40 
41 /*@unchecked@*/
42 extern int _fps_debug;
43 
44 /*@unchecked@*/
45 extern int _fsm_debug;
46 
47 /*@unchecked@*/
48 extern int _fsm_threads;
49 
50 /*@unchecked@*/
51 extern int _hdr_debug;
52 
53 /*@unchecked@*/
54 extern int _mire_debug;
55 
56 /*@unchecked@*/
57 extern int _print_pkts;
58 
59 /*@unchecked@*/
60 extern int _psm_debug;
61 
62 /*@unchecked@*/
63 extern int _psm_threads;
64 
65 /*@unchecked@*/
66 extern int _rpmal_debug;
67 
68 /*@unchecked@*/
69 extern int _rpmdb_debug;
70 
71 /*@unchecked@*/
72 extern int _rpmds_debug;
73 
74 /* XXX avoid -lrpmbuild linkage. */
75 /*@unchecked@*/
77 
78 /*@unchecked@*/
79 extern int _rpmfi_debug;
80 
81 /*@unchecked@*/
82 extern int _rpmgi_debug;
83 
84 /*@unchecked@*/
85 extern int _rpmps_debug;
86 
87 /*@unchecked@*/
88 extern int _rpmsq_debug;
89 
90 /*@unchecked@*/
91 extern int _rpmsx_debug;
92 
93 /*@unchecked@*/
94 extern int _rpmte_debug;
95 
96 /*@unchecked@*/
97 extern int _rpmts_debug;
98 
99 /*@unchecked@*/
100 extern int _rpmts_stats;
101 
102 /*@unchecked@*/
103 extern int _tar_debug;
104 
105 /*@unchecked@*/
106 extern int noLibio;
107 /*@=exportheadervar@*/
108 
109 /*@unchecked@*/ /*@null@*/
110 const char * rpmcliPipeOutput = NULL;
111 
112 /*@unchecked@*/ /*@null@*/
113 const char * rpmcliRcfile = NULL;
114 
115 /*@unchecked@*/
116 const char * rpmcliRootDir = "/";
117 
118 /*@unchecked@*/
120 
121 /*@unchecked@*/ /*@null@*/
122 const char * rpmcliTargets = NULL;
123 
124 /*@-exportheadervar@*/
125 /*@unchecked@*/
126 extern int _ftp_debug;
127 /*@unchecked@*/
128 extern int _av_debug;
129 
130 /*@unchecked@*/
131 extern int noLibio;
132 
133 /*@unchecked@*/
134 extern int _rpmio_debug;
135 /*@=exportheadervar@*/
136 
137 /*@unchecked@*/
138 static int rpmcliInitialized = -1;
139 
143 static void printVersion(FILE * fp)
144  /*@globals rpmEVR, fileSystem @*/
145  /*@modifies *fp, fileSystem @*/
146 {
147  fprintf(fp, _("RPM version %s\n"), rpmEVR);
148 }
149 
151  /*@globals rpmcliInitialized, rpmCLIMacroContext, rpmGlobalMacroContext,
152  h_errno, fileSystem, internalState @*/
153  /*@modifies rpmcliInitialized, rpmCLIMacroContext, rpmGlobalMacroContext,
154  fileSystem, internalState @*/
155 {
156 
157  if (rpmcliInitialized < 0) {
158  char * t = NULL;
159  if (rpmcliTargets != NULL) {
160  char *te;
161  t = xstrdup(rpmcliTargets);
162  if ((te = strchr(t, ',')) != NULL)
163  *te = '\0';
164  }
166  t = _free(t);
167  }
168  if (rpmcliInitialized)
169  exit(EXIT_FAILURE);
170 }
171 
174 /*@-bounds@*/
175 static void rpmcliAllArgCallback(poptContext con,
176  /*@unused@*/ enum poptCallbackReason reason,
177  const struct poptOption * opt, const char * arg,
178  /*@unused@*/ const void * data)
179  /*@globals rpmRcfiles, rpmcliTargets, rpmcliQueryFlags, rpmCLIMacroContext,
180  rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
181  /*@modifies con, rpmcliTargets, rpmcliQueryFlags, rpmCLIMacroContext,
182  rpmGlobalMacroContext, fileSystem, internalState @*/
183 {
184 
185  /* XXX avoid accidental collisions with POPT_BIT_SET for flags */
186  /*@-branchstate@*/
187  if (opt->arg == NULL)
188  switch (opt->val) {
189  case 'q':
191  break;
192  case 'v':
194  break;
195  case POPT_PREDEFINE:
196  (void) rpmDefineMacro(NULL, arg, RMIL_CMDLINE);
197  break;
198  case 'D':
199  { char *s, *t;
200  /* XXX Convert '-' in macro name to underscore, skip leading %. */
201  s = t = xstrdup(arg);
202  while (*t && !xisspace(*t)) {
203  if (*t == '-') *t = '_';
204  t++;
205  }
206  t = s;
207  if (*t == '%') t++;
208  /* XXX Predefine macro if not initialized yet. */
209  if (rpmcliInitialized < 0)
210  (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE);
212 /*@-type@*/
213  (void) rpmDefineMacro(NULL, t, RMIL_CMDLINE);
215 /*@=type@*/
216  s = _free(s);
217  } break;
218  case 'E':
220  { const char *val = rpmExpand(arg, NULL);
221  fprintf(stdout, "%s\n", val);
222  val = _free(val);
223  }
224  break;
225  case POPT_SHOWVERSION:
226  printVersion(stdout);
227 /*@i@*/ con = rpmcliFini(con);
228  exit(EXIT_SUCCESS);
229  /*@notreached@*/ break;
230  case POPT_SHOWRC:
232  (void) rpmShowRC(stdout);
233 /*@i@*/ con = rpmcliFini(con);
234  exit(EXIT_SUCCESS);
235  /*@notreached@*/ break;
236  case POPT_QUERYTAGS:
237  rpmDisplayQueryTags(stdout);
238 /*@i@*/ con = rpmcliFini(con);
239  exit(EXIT_SUCCESS);
240  /*@notreached@*/ break;
241 #if defined(POPT_RCFILE)
242  case POPT_RCFILE: /* XXX FIXME: noop for now */
243  break;
244 #endif
247  break;
248 
251  break;
252 
255  break;
256 
258  if (rpmcliTargets == NULL)
259  rpmcliTargets = xstrdup(arg);
260  else {
261 /*@-modobserver @*/
262  char * t = (char *) rpmcliTargets;
263  size_t nb = strlen(t) + (sizeof(",")-1) + strlen(arg) + 1;
264 /*@i@*/ t = xrealloc(t, nb);
265  (void) stpcpy( stpcpy(t, ","), arg);
266  rpmcliTargets = t;
267 /*@=modobserver @*/
268  }
269  break;
270  }
271  /*@=branchstate@*/
272 }
273 
274 /*@unchecked@*/
275 int ftsOpts = 0;
276 
277 /*@unchecked@*/
278 struct poptOption rpmcliFtsPoptTable[] = {
279  { "comfollow", '\0', POPT_BIT_SET, &ftsOpts, FTS_COMFOLLOW,
280  N_("FTS_COMFOLLOW: follow command line symlinks"), NULL },
281  { "logical", '\0', POPT_BIT_SET, &ftsOpts, FTS_LOGICAL,
282  N_("FTS_LOGICAL: logical walk"), NULL },
283  { "nochdir", '\0', POPT_BIT_SET, &ftsOpts, FTS_NOCHDIR,
284  N_("FTS_NOCHDIR: don't change directories"), NULL },
285  { "nostat", '\0', POPT_BIT_SET, &ftsOpts, FTS_NOSTAT,
286  N_("FTS_NOSTAT: don't get stat info"), NULL },
287  { "physical", '\0', POPT_BIT_SET, &ftsOpts, FTS_PHYSICAL,
288  N_("FTS_PHYSICAL: physical walk"), NULL },
289  { "seedot", '\0', POPT_BIT_SET, &ftsOpts, FTS_SEEDOT,
290  N_("FTS_SEEDOT: return dot and dot-dot"), NULL },
291  { "xdev", '\0', POPT_BIT_SET, &ftsOpts, FTS_XDEV,
292  N_("FTS_XDEV: don't cross devices"), NULL },
293  { "whiteout", '\0', POPT_BIT_SET, &ftsOpts, FTS_WHITEOUT,
294  N_("FTS_WHITEOUT: return whiteout information"), NULL },
295  POPT_TABLEEND
296 };
297 
298 /*@unchecked@*/
300 
301 /*@unchecked@*/
302 struct poptOption rpmcliDepFlagsPoptTable[] = {
303  { "aid", '\0', POPT_BIT_SET, &global_depFlags, RPMDEPS_FLAG_ADDINDEPS,
304  N_("add suggested packages to transaction"), NULL },
305  { "anaconda", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
307  N_("use anaconda \"presentation order\""), NULL},
308  { "deploops", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
310  N_("print dependency loops as warning"), NULL},
311  { "nosuggest", '\0', POPT_BIT_SET,
313  N_("do not suggest missing dependency resolution(s)"), NULL},
314  { "noconflicts", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
316  N_("do not check added package conflicts"), NULL},
317  { "linktos", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN,
319  N_("use added package requires on symlink targets"), NULL},
320  { "nolinktos", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
322  N_("ignore added package requires on symlink targets"), NULL},
323  { "noobsoletes", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
325  N_("ignore added package obsoletes"), NULL},
326  { "parentdirs", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN,
328  N_("use added package requires on file parent directory"), NULL},
329  { "noparentdirs", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
331  N_("ignore added package requires on file parent directory"), NULL},
332  { "norequires", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
334  N_("do not check added package requires"), NULL},
335  { "noupgrade", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
337  N_("ignore added package upgrades"), NULL},
338  POPT_TABLEEND
339 };
340 
341 /*@-bitwisesigned -compmempass @*/
342 /*@unchecked@*/
343 struct poptOption rpmcliAllPoptTable[] = {
344 /*@-type@*/ /* FIX: cast? */
345  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
346  rpmcliAllArgCallback, 0, NULL, NULL },
347 /*@=type@*/
348 
349  { "debug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_debug, -1,
350  NULL, NULL },
351 
352  { "predefine", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_PREDEFINE,
353  N_("predefine MACRO with value EXPR"),
354  N_("'MACRO EXPR'") },
355  { "define", 'D', POPT_ARG_STRING, 0, 'D',
356  N_("define MACRO with value EXPR"),
357  N_("'MACRO EXPR'") },
358  { "eval", 'E', POPT_ARG_STRING, 0, 'E',
359  N_("print macro expansion of EXPR"),
360  N_("'EXPR'") },
361  { "macros", '\0', POPT_ARG_STRING, &rpmMacrofiles, 0,
362  N_("read <FILE:...> instead of default file(s)"),
363  N_("<FILE:...>") },
364  { "target", '\0', POPT_ARG_STRING, 0, RPMCLI_POPT_TARGETPLATFORM,
365  N_("specify target platform"), N_("CPU-VENDOR-OS") },
366 
367  { "nodigest", '\0', 0, 0, RPMCLI_POPT_NODIGEST,
368  N_("don't verify package digest(s)"), NULL },
369  { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOHDRCHK,
370  N_("don't verify database header(s) when retrieved"), NULL },
371 #if HAVE_LIBIO_H && defined(_G_IO_IO_FILE_VERSION)
372  { "nolibio", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &noLibio, 1,
373  N_("disable use of libio(3) API"), NULL},
374 #endif
375  { "nosignature", '\0', 0, 0, RPMCLI_POPT_NOSIGNATURE,
376  N_("don't verify package signature(s)"), NULL },
377 
378  { "pipe", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &rpmcliPipeOutput, 0,
379  N_("send stdout to CMD"),
380  N_("CMD") },
381 #if !defined(POPT_RCFILE)
382  { "rcfile", '\0', POPT_ARG_STRING, &rpmcliRcfile, 0,
383  N_("read <FILE:...> instead of default file(s)"),
384  N_("<FILE:...>") },
385 #else
386  { "rcfile", '\0', 0, NULL, POPT_RCFILE,
387  N_("read <FILE:...> instead of default file(s)"),
388  N_("<FILE:...>") },
389 #endif
390  { "root", 'r', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT, &rpmcliRootDir, 0,
391  N_("use ROOT as top level directory"),
392  N_("ROOT") },
393 
394  { "querytags", '\0', 0, 0, POPT_QUERYTAGS,
395  N_("display known query tags"), NULL },
396  { "showrc", '\0', 0, NULL, POPT_SHOWRC,
397  N_("display final rpmrc and macro configuration"), NULL },
398  { "quiet", '\0', 0, NULL, 'q',
399  N_("provide less detailed output"), NULL},
400  { "verbose", 'v', 0, NULL, 'v',
401  N_("provide more detailed output"), NULL},
402  { "version", '\0', 0, NULL, POPT_SHOWVERSION,
403  N_("print the version of rpm being used"), NULL },
404 
405 #if HAVE_LIBIO_H && defined(_G_IO_IO_FILE_VERSION)
406  { "nolibio", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &noLibio, 1,
407  N_("disable use of libio(3) API"), NULL},
408 #endif
409 
410  { "promoteepoch", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmds_nopromote, 0,
411  NULL, NULL},
412 
413  { "cpiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_cpio_debug, -1,
414  N_("debug cpio payloads"), NULL},
415  { "fpsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_fps_debug, -1,
416  NULL, NULL},
417  { "fsmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_fsm_debug, -1,
418  N_("debug payload file state machine"), NULL},
419  { "fsmthreads", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_fsm_threads, -1,
420  N_("use threads for file state machine"), NULL},
421  { "ftpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ftp_debug, -1,
422  N_("debug FTP/HTTP data stream"), NULL},
423  { "avdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_av_debug, -1,
424  N_("debug argv collections"), NULL},
425  { "hdrdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_hdr_debug, -1,
426  NULL, NULL},
427  { "miredebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_mire_debug, -1,
428  NULL, NULL},
429 #ifdef DYING
430  { "poptdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_popt_debug, -1,
431  N_("debug option/argument processing"), NULL},
432 #endif
433  { "prtpkts", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_print_pkts, -1,
434  NULL, NULL},
435  { "psmdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_psm_debug, -1,
436  N_("debug package state machine"), NULL},
437  { "psmthreads", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_psm_threads, -1,
438  N_("use threads for package state machine"), NULL},
439  { "rpmaldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmal_debug, -1,
440  NULL, NULL},
441  { "rpmdbdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmdb_debug, -1,
442  NULL, NULL},
443  { "rpmdsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmds_debug, -1,
444  NULL, NULL},
445  { "rpmfcdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmfc_debug, -1,
446  NULL, NULL},
447  { "rpmfidebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmfi_debug, -1,
448  NULL, NULL},
449  { "rpmgidebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmgi_debug, -1,
450  NULL, NULL},
451  { "rpmiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmio_debug, -1,
452  N_("debug rpmio I/O"), NULL},
453  { "rpmpsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmps_debug, -1,
454  NULL, NULL},
455  { "rpmsqdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsq_debug, -1,
456  NULL, NULL},
457  { "rpmsxdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmsx_debug, -1,
458  NULL, NULL},
459  { "rpmtedebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmte_debug, -1,
460  NULL, NULL},
461  { "rpmtsdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmts_debug, -1,
462  NULL, NULL},
463  { "tardebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_tar_debug, -1,
464  N_("debug tar payloads"), NULL},
465  { "stats", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmts_stats, -1,
466  NULL, NULL},
467  { "urldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_url_debug, -1,
468  N_("debug URL cache handling"), NULL},
469 
470  { "notagcache", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_tagcache, 0,
471  N_("disable tag data caching"), NULL},
472  { "tagcache", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_tagcache, 1,
473  N_("enable tag data caching"), NULL},
474 
475  POPT_TABLEEND
476 };
477 /*@=bitwisesigned =compmempass @*/
478 
479 poptContext
480 rpmcliFini(poptContext optCon)
481 {
482  /* keeps memory leak checkers quiet */
483  rpmFreeMacros(NULL);
485  rpmFreeRpmrc();
486 #ifdef WITH_LUA
487  (void) rpmluaFree(NULL);
488 #endif
490 /*@i@*/ urlFreeCache();
491  rpmlogClose();
493 
496 
497  optCon = poptFreeContext(optCon);
498 
499 #if HAVE_MCHECK_H && HAVE_MTRACE
500  /*@-noeffect@*/
501  muntrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
502  /*@=noeffect@*/
503 #endif
504 
505  return NULL;
506 }
507 
508 /*@-globstate@*/
509 poptContext
510 rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
511 {
512  const char * optArg;
513  poptContext optCon;
514  int rc;
515 
516 #if HAVE_MCHECK_H && HAVE_MTRACE
517  /*@-noeffect@*/
518  mtrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
519  /*@=noeffect@*/
520 #endif
521 /*@-globs -mods@*/
522  setprogname(argv[0]); /* Retrofit glibc __progname */
523 
524  /* XXX glibc churn sanity */
525  if (__progname == NULL) {
526  if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
527  else __progname = argv[0];
528  }
529 /*@=globs =mods@*/
530 
531 #if defined(ENABLE_NLS) && !defined(__LCLINT__)
532  (void) setlocale(LC_ALL, "" );
534  (void) textdomain(PACKAGE);
535 #endif
536 
538 
539  if (optionsTable == NULL) {
540  /* Read rpm configuration (if not already read). */
542  return NULL;
543  }
544 
545 /*@-nullpass -temptrans@*/
546  optCon = poptGetContext(__progname, argc, (const char **)argv, optionsTable, 0);
547 /*@=nullpass =temptrans@*/
548  (void) poptReadConfigFile(optCon, RPMPOPTFILE);
549  (void) poptReadDefaultConfig(optCon, 1);
550  poptSetExecPath(optCon, USRLIBRPM, 1);
551 
552  /* Process all options, whine if unknown. */
553  while ((rc = poptGetNextOpt(optCon)) > 0) {
554  optArg = poptGetOptArg(optCon);
555  switch (rc) {
556  default:
557 /*@-nullpass@*/
558  fprintf(stderr, _("%s: option table misconfigured (%d)\n"),
559  __progname, rc);
560 /*@=nullpass@*/
561  exit(EXIT_FAILURE);
562 
563  /*@notreached@*/ /*@switchbreak@*/ break;
564  }
565  }
566 
567  if (rc < -1) {
568 /*@-nullpass@*/
569  fprintf(stderr, "%s: %s: %s\n", __progname,
570  poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
571  poptStrerror(rc));
572 /*@=nullpass@*/
573  exit(EXIT_FAILURE);
574  }
575 
576  /* Read rpm configuration (if not already read). */
578 
579  if (_debug) {
582  }
583 
584  return optCon;
585 }
586 /*@=globstate@*/