Hex Artifact Content

Artifact 65d4398d3f94d2fb3c5d9e77992a74f3bb473f5c:


0000: 23 69 6e 63 6c 75 64 65 20 22 63 6f 6d 70 61 74  #include "compat
0010: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6c 69  .h".#include "li
0020: 62 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c  bconfig.h".#incl
0030: 75 64 65 20 22 6c 69 62 63 6f 6e 66 69 67 5f 70  ude "libconfig_p
0040: 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75  rivate.h".#inclu
0050: 64 65 20 22 63 6f 6e 66 5f 73 65 63 74 69 6f 6e  de "conf_section
0060: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  .h".#include "co
0070: 6e 66 5f 61 70 61 63 68 65 2e 68 22 0a 23 69 6e  nf_apache.h".#in
0080: 63 6c 75 64 65 20 22 63 6f 6e 66 5f 63 6f 6c 6f  clude "conf_colo
0090: 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 63  n.h".#include "c
00a0: 6f 6e 66 5f 65 71 75 61 6c 2e 68 22 0a 23 69 6e  onf_equal.h".#in
00b0: 63 6c 75 64 65 20 22 63 6f 6e 66 5f 73 70 61 63  clude "conf_spac
00c0: 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 63  e.h".#include "c
00d0: 6f 6e 66 5f 78 6d 6c 2e 68 22 0a 0a 23 69 66 64  onf_xml.h"..#ifd
00e0: 65 66 20 48 41 56 45 5f 53 54 52 49 4e 47 5f 48  ef HAVE_STRING_H
00f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0100: 67 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g.h>.#endif..#if
0110: 64 65 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f  def HAVE_STDLIB_
0120: 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  H.#include <stdl
0130: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ib.h>.#endif..#i
0140: 66 64 65 66 20 48 41 56 45 5f 43 54 59 50 45 5f  fdef HAVE_CTYPE_
0150: 48 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70  H.#include <ctyp
0160: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e.h>.#endif..#if
0170: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4f 5f 48  def HAVE_STDIO_H
0180: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  .h>.#endif..#ifd
01a0: 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f 48  ef HAVE_UNISTD_H
01b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
01c0: 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66  d.h>.#endif..#if
01d0: 64 65 66 20 48 41 56 45 5f 53 59 53 5f 54 59 50  def HAVE_SYS_TYP
01e0: 45 53 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ES_H.#include <s
01f0: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 65 6e 64  ys/types.h>.#end
0200: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
0210: 50 57 44 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c  PWD_H.#include <
0220: 70 77 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 73  pwd.h>.#endif..s
0230: 74 72 75 63 74 20 6c 63 5f 76 61 72 68 61 6e 64  truct lc_varhand
0240: 6c 65 72 5f 73 74 20 2a 76 61 72 68 61 6e 64 6c  ler_st *varhandl
0250: 65 72 73 20 3d 20 4e 55 4c 4c 3b 0a 6c 63 5f 65  ers = NULL;.lc_e
0260: 72 72 5f 74 20 6c 63 5f 65 72 72 6e 6f 20 3d 20  rr_t lc_errno = 
0270: 4c 43 5f 45 52 52 5f 4e 4f 4e 45 3b 0a 69 6e 74  LC_ERR_NONE;.int
0280: 20 6c 63 5f 6f 70 74 69 6e 64 20 3d 20 30 3b 0a   lc_optind = 0;.
0290: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 2a 65  .extern char **e
02a0: 6e 76 69 72 6f 6e 3b 0a 0a 73 74 61 74 69 63 20  nviron;..static 
02b0: 69 6e 74 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76  int lc_process_v
02c0: 61 72 5f 73 74 72 69 6e 67 28 76 6f 69 64 20 2a  ar_string(void *
02d0: 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72  data, const char
02e0: 20 2a 76 61 6c 75 65 29 20 7b 0a 09 63 68 61 72   *value) {..char
02f0: 20 2a 2a 64 61 74 61 76 61 6c 3b 0a 0a 09 64 61   **dataval;...da
0300: 74 61 76 61 6c 20 3d 20 64 61 74 61 3b 0a 09 2a  taval = data;..*
0310: 64 61 74 61 76 61 6c 20 3d 20 73 74 72 64 75 70  dataval = strdup
0320: 28 76 61 6c 75 65 29 3b 0a 0a 09 72 65 74 75 72  (value);...retur
0330: 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
0340: 69 6e 74 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76  int lc_process_v
0350: 61 72 5f 63 69 64 72 28 76 6f 69 64 20 2a 64 61  ar_cidr(void *da
0360: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
0370: 76 61 6c 75 65 29 20 7b 0a 09 0a 0a 09 72 65 74  value) {.....ret
0380: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(0);.}..stati
0390: 63 20 69 6e 74 20 6c 63 5f 70 72 6f 63 65 73 73  c int lc_process
03a0: 5f 76 61 72 5f 69 70 28 76 6f 69 64 20 2a 64 61  _var_ip(void *da
03b0: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
03c0: 76 61 6c 75 65 29 20 7b 0a 09 75 69 6e 74 33 32  value) {..uint32
03d0: 5f 74 20 2a 64 61 74 61 76 61 6c 20 3d 20 4e 55  _t *dataval = NU
03e0: 4c 4c 2c 20 72 65 74 76 61 6c 20 3d 20 30 3b 0a  LL, retval = 0;.
03f0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 6f 74  .const char *dot
0400: 70 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74  ptr = NULL;..int
0410: 20 74 6d 70 76 61 6c 20 3d 20 2d 31 3b 0a 0a 09   tmpval = -1;...
0420: 64 61 74 61 76 61 6c 20 3d 20 64 61 74 61 3b 0a  dataval = data;.
0430: 0a 09 64 6f 74 70 74 72 20 3d 20 76 61 6c 75 65  ..dotptr = value
0440: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ;...while (1) {.
0450: 09 09 74 6d 70 76 61 6c 20 3d 20 61 74 6f 69 28  ..tmpval = atoi(
0460: 64 6f 74 70 74 72 29 3b 0a 09 09 69 66 20 28 74  dotptr);...if (t
0470: 6d 70 76 61 6c 20 3c 20 30 29 20 7b 0a 09 09 09  mpval < 0) {....
0480: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 72 65  break;...}....re
0490: 74 76 61 6c 20 3c 3c 3d 20 38 3b 0a 09 09 72 65  tval <<= 8;...re
04a0: 74 76 61 6c 20 7c 3d 20 74 6d 70 76 61 6c 3b 0a  tval |= tmpval;.
04b0: 0a 09 09 64 6f 74 70 74 72 20 3d 20 73 74 72 70  ...dotptr = strp
04c0: 62 72 6b 28 64 6f 74 70 74 72 2c 20 22 2e 2f 20  brk(dotptr, "./ 
04d0: 5c 74 22 29 3b 0a 09 09 69 66 20 28 64 6f 74 70  \t");...if (dotp
04e0: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  tr == NULL) {...
04f0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 69 66  .break;...}...if
0500: 20 28 2a 64 6f 74 70 74 72 20 21 3d 20 27 2e 27   (*dotptr != '.'
0510: 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ) {....break;...
0520: 7d 0a 09 09 64 6f 74 70 74 72 2b 2b 3b 0a 09 7d  }...dotptr++;..}
0530: 0a 0a 09 2a 64 61 74 61 76 61 6c 20 3d 20 72 65  ...*dataval = re
0540: 74 76 61 6c 3b 0a 0a 09 72 65 74 75 72 6e 28 30  tval;...return(0
0550: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
0560: 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76 61 72 5f   lc_process_var_
0570: 6c 6f 6e 67 6c 6f 6e 67 28 76 6f 69 64 20 2a 64  longlong(void *d
0580: 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ata, const char 
0590: 2a 76 61 6c 75 65 29 20 7b 0a 09 6c 6f 6e 67 20  *value) {..long 
05a0: 6c 6f 6e 67 20 2a 64 61 74 61 76 61 6c 3b 0a 0a  long *dataval;..
05b0: 09 64 61 74 61 76 61 6c 20 3d 20 64 61 74 61 3b  .dataval = data;
05c0: 0a 09 2a 64 61 74 61 76 61 6c 20 3d 20 73 74 72  ..*dataval = str
05d0: 74 6f 6c 6c 28 76 61 6c 75 65 2c 20 4e 55 4c 4c  toll(value, NULL
05e0: 2c 20 31 30 29 3b 0a 0a 09 72 65 74 75 72 6e 28  , 10);...return(
05f0: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  0);.}..static in
0600: 74 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76 61 72  t lc_process_var
0610: 5f 6c 6f 6e 67 28 76 6f 69 64 20 2a 64 61 74 61  _long(void *data
0620: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61  , const char *va
0630: 6c 75 65 29 20 7b 0a 09 6c 6f 6e 67 20 2a 64 61  lue) {..long *da
0640: 74 61 76 61 6c 3b 0a 0a 09 64 61 74 61 76 61 6c  taval;...dataval
0650: 20 3d 20 64 61 74 61 3b 0a 09 2a 64 61 74 61 76   = data;..*datav
0660: 61 6c 20 3d 20 73 74 72 74 6f 6c 6c 28 76 61 6c  al = strtoll(val
0670: 75 65 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 0a  ue, NULL, 10);..
0680: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
0690: 74 61 74 69 63 20 69 6e 74 20 6c 63 5f 70 72 6f  tatic int lc_pro
06a0: 63 65 73 73 5f 76 61 72 5f 69 6e 74 28 76 6f 69  cess_var_int(voi
06b0: 64 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63  d *data, const c
06c0: 68 61 72 20 2a 76 61 6c 75 65 29 20 7b 0a 09 69  har *value) {..i
06d0: 6e 74 20 2a 64 61 74 61 76 61 6c 3b 0a 0a 09 64  nt *dataval;...d
06e0: 61 74 61 76 61 6c 20 3d 20 64 61 74 61 3b 0a 09  ataval = data;..
06f0: 2a 64 61 74 61 76 61 6c 20 3d 20 73 74 72 74 6f  *dataval = strto
0700: 6c 6c 28 76 61 6c 75 65 2c 20 4e 55 4c 4c 2c 20  ll(value, NULL, 
0710: 31 30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  10);...return(0)
0720: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
0730: 6c 63 5f 70 72 6f 63 65 73 73 5f 76 61 72 5f 73  lc_process_var_s
0740: 68 6f 72 74 28 76 6f 69 64 20 2a 64 61 74 61 2c  hort(void *data,
0750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 6c   const char *val
0760: 75 65 29 20 7b 0a 09 73 68 6f 72 74 20 2a 64 61  ue) {..short *da
0770: 74 61 76 61 6c 3b 0a 0a 09 64 61 74 61 76 61 6c  taval;...dataval
0780: 20 3d 20 64 61 74 61 3b 0a 09 2a 64 61 74 61 76   = data;..*datav
0790: 61 6c 20 3d 20 73 74 72 74 6f 6c 6c 28 76 61 6c  al = strtoll(val
07a0: 75 65 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 0a  ue, NULL, 10);..
07b0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
07c0: 74 61 74 69 63 20 69 6e 74 20 6c 63 5f 70 72 6f  tatic int lc_pro
07d0: 63 65 73 73 5f 76 61 72 5f 62 6f 6f 6c 5f 62 79  cess_var_bool_by
07e0: 65 78 69 73 74 61 6e 63 65 28 76 6f 69 64 20 2a  existance(void *
07f0: 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72  data, const char
0800: 20 2a 76 61 6c 75 65 29 20 7b 0a 09 69 6e 74 20   *value) {..int 
0810: 2a 64 61 74 61 76 61 6c 3b 0a 0a 09 64 61 74 61  *dataval;...data
0820: 76 61 6c 20 3d 20 64 61 74 61 3b 0a 0a 09 2a 64  val = data;...*d
0830: 61 74 61 76 61 6c 20 3d 20 31 3b 0a 0a 09 72 65  ataval = 1;...re
0840: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
0850: 69 63 20 69 6e 74 20 6c 63 5f 70 72 6f 63 65 73  ic int lc_proces
0860: 73 5f 76 61 72 5f 62 6f 6f 6c 28 76 6f 69 64 20  s_var_bool(void 
0870: 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61  *data, const cha
0880: 72 20 2a 76 61 6c 75 65 29 20 7b 0a 09 69 6e 74  r *value) {..int
0890: 20 2a 64 61 74 61 76 61 6c 3b 0a 0a 09 64 61 74   *dataval;...dat
08a0: 61 76 61 6c 20 3d 20 64 61 74 61 3b 0a 0a 09 2a  aval = data;...*
08b0: 64 61 74 61 76 61 6c 20 3d 20 2d 31 3b 0a 0a 09  dataval = -1;...
08c0: 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 28 76  if (strcasecmp(v
08d0: 61 6c 75 65 2c 20 22 65 6e 61 62 6c 65 22 29 20  alue, "enable") 
08e0: 3d 3d 20 30 20 7c 7c 0a 09 20 20 20 20 73 74 72  == 0 ||..    str
08f0: 63 61 73 65 63 6d 70 28 76 61 6c 75 65 2c 20 22  casecmp(value, "
0900: 74 72 75 65 22 29 20 3d 3d 20 30 20 7c 7c 0a 09  true") == 0 ||..
0910: 20 20 20 20 73 74 72 63 61 73 65 63 6d 70 28 76      strcasecmp(v
0920: 61 6c 75 65 2c 20 22 79 65 73 22 29 20 3d 3d 20  alue, "yes") == 
0930: 30 20 7c 7c 0a 09 20 20 20 20 73 74 72 63 61 73  0 ||..    strcas
0940: 65 63 6d 70 28 76 61 6c 75 65 2c 20 22 6f 6e 22  ecmp(value, "on"
0950: 29 20 3d 3d 20 30 20 7c 7c 0a 20 20 20 20 20 20  ) == 0 ||.      
0960: 20 20 20 20 20 20 73 74 72 63 61 73 65 63 6d 70        strcasecmp
0970: 28 76 61 6c 75 65 2c 20 22 79 22 29 20 3d 3d 20  (value, "y") == 
0980: 30 20 7c 7c 0a 09 20 20 20 20 73 74 72 63 61 73  0 ||..    strcas
0990: 65 63 6d 70 28 76 61 6c 75 65 2c 20 22 31 22 29  ecmp(value, "1")
09a0: 20 3d 3d 20 30 29 20 7b 0a 09 09 2a 64 61 74 61   == 0) {...*data
09b0: 76 61 6c 20 3d 20 31 3b 0a 09 09 72 65 74 75 72  val = 1;...retur
09c0: 6e 28 30 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66  n(0);..} else if
09d0: 20 28 73 74 72 63 61 73 65 63 6d 70 28 76 61 6c   (strcasecmp(val
09e0: 75 65 2c 20 22 64 69 73 61 62 6c 65 22 29 20 3d  ue, "disable") =
09f0: 3d 20 30 20 7c 7c 0a 09 20 20 20 20 73 74 72 63  = 0 ||..    strc
0a00: 61 73 65 63 6d 70 28 76 61 6c 75 65 2c 20 22 66  asecmp(value, "f
0a10: 61 6c 73 65 22 29 20 3d 3d 20 30 20 7c 7c 0a 09  alse") == 0 ||..
0a20: 20 20 20 20 73 74 72 63 61 73 65 63 6d 70 28 76      strcasecmp(v
0a30: 61 6c 75 65 2c 20 22 6f 66 66 22 29 20 3d 3d 20  alue, "off") == 
0a40: 30 20 7c 7c 0a 09 20 20 20 20 73 74 72 63 61 73  0 ||..    strcas
0a50: 65 63 6d 70 28 76 61 6c 75 65 2c 20 22 6e 6f 22  ecmp(value, "no"
0a60: 29 20 3d 3d 20 30 20 7c 7c 0a 20 20 20 20 20 20  ) == 0 ||.      
0a70: 20 20 20 20 20 20 73 74 72 63 61 73 65 63 6d 70        strcasecmp
0a80: 28 76 61 6c 75 65 2c 20 22 6e 22 29 20 3d 3d 20  (value, "n") == 
0a90: 30 20 7c 7c 0a 09 20 20 20 20 73 74 72 63 61 73  0 ||..    strcas
0aa0: 65 63 6d 70 28 76 61 6c 75 65 2c 20 22 30 22 29  ecmp(value, "0")
0ab0: 20 3d 3d 20 30 29 20 7b 0a 09 09 2a 64 61 74 61   == 0) {...*data
0ac0: 76 61 6c 20 3d 20 30 3b 0a 09 09 72 65 74 75 72  val = 0;...retur
0ad0: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 6c 63 5f 65 72  n(0);..}...lc_er
0ae0: 72 6e 6f 20 3d 20 4c 43 5f 45 52 52 5f 42 41 44  rno = LC_ERR_BAD
0af0: 46 4f 52 4d 41 54 3b 0a 09 72 65 74 75 72 6e 28  FORMAT;..return(
0b00: 2d 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6c  -1);.}..static l
0b10: 6f 6e 67 20 6c 6f 6e 67 20 6c 63 5f 70 72 6f 63  ong long lc_proc
0b20: 65 73 73 5f 73 69 7a 65 28 63 6f 6e 73 74 20 63  ess_size(const c
0b30: 68 61 72 20 2a 76 61 6c 75 65 29 20 7b 0a 09 6c  har *value) {..l
0b40: 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20  ong long retval 
0b50: 3d 20 2d 31 3b 0a 09 63 68 61 72 20 2a 6d 75 6c  = -1;..char *mul
0b60: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 72 65 74 76  t = NULL;...retv
0b70: 61 6c 20 3d 20 73 74 72 74 6f 6c 6c 28 76 61 6c  al = strtoll(val
0b80: 75 65 2c 20 26 6d 75 6c 74 2c 20 31 30 29 3b 0a  ue, &mult, 10);.
0b90: 09 69 66 20 28 6d 75 6c 74 20 21 3d 20 4e 55 4c  .if (mult != NUL
0ba0: 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 74  L) {...switch (t
0bb0: 6f 6c 6f 77 65 72 28 6d 75 6c 74 5b 30 5d 29 29  olower(mult[0]))
0bc0: 20 7b 0a 09 09 09 63 61 73 65 20 27 70 27 3a 0a   {....case 'p':.
0bd0: 09 09 09 09 72 65 74 76 61 6c 20 2a 3d 20 31 31  ....retval *= 11
0be0: 32 35 38 39 39 39 30 36 38 34 32 36 32 34 4c 4c  25899906842624LL
0bf0: 55 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  U;.....break;...
0c00: 09 63 61 73 65 20 27 74 27 3a 0a 09 09 09 09 72  .case 't':.....r
0c10: 65 74 76 61 6c 20 2a 3d 20 31 39 35 38 35 30 35  etval *= 1958505
0c20: 30 38 36 39 37 36 4c 4c 55 3b 0a 09 09 09 09 62  086976LLU;.....b
0c30: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 67  reak;....case 'g
0c40: 27 3a 0a 09 09 09 09 72 65 74 76 61 6c 20 2a 3d  ':.....retval *=
0c50: 20 31 30 37 33 37 34 31 38 32 34 3b 0a 09 09 09   1073741824;....
0c60: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
0c70: 27 6d 27 3a 0a 09 09 09 09 72 65 74 76 61 6c 20  'm':.....retval 
0c80: 2a 3d 20 31 30 34 38 35 37 36 3b 0a 09 09 09 09  *= 1048576;.....
0c90: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
0ca0: 6b 27 3a 0a 09 09 09 09 72 65 74 76 61 6c 20 2a  k':.....retval *
0cb0: 3d 20 31 30 32 34 3b 0a 09 09 09 09 62 72 65 61  = 1024;.....brea
0cc0: 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
0cd0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
0ce0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
0cf0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
0d00: 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76 61 72 5f   lc_process_var_
0d10: 73 69 7a 65 6c 6f 6e 67 6c 6f 6e 67 28 76 6f 69  sizelonglong(voi
0d20: 64 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63  d *data, const c
0d30: 68 61 72 20 2a 76 61 6c 75 65 29 20 7b 0a 09 6c  har *value) {..l
0d40: 6f 6e 67 20 6c 6f 6e 67 20 2a 64 61 74 61 76 61  ong long *datava
0d50: 6c 3b 0a 0a 09 64 61 74 61 76 61 6c 20 3d 20 64  l;...dataval = d
0d60: 61 74 61 3b 0a 09 2a 64 61 74 61 76 61 6c 20 3d  ata;..*dataval =
0d70: 20 6c 63 5f 70 72 6f 63 65 73 73 5f 73 69 7a 65   lc_process_size
0d80: 28 76 61 6c 75 65 29 3b 0a 0a 09 72 65 74 75 72  (value);...retur
0d90: 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
0da0: 69 6e 74 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76  int lc_process_v
0db0: 61 72 5f 73 69 7a 65 6c 6f 6e 67 28 76 6f 69 64  ar_sizelong(void
0dc0: 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68   *data, const ch
0dd0: 61 72 20 2a 76 61 6c 75 65 29 20 7b 0a 09 6c 6f  ar *value) {..lo
0de0: 6e 67 20 2a 64 61 74 61 76 61 6c 3b 0a 0a 09 64  ng *dataval;...d
0df0: 61 74 61 76 61 6c 20 3d 20 64 61 74 61 3b 0a 09  ataval = data;..
0e00: 2a 64 61 74 61 76 61 6c 20 3d 20 6c 63 5f 70 72  *dataval = lc_pr
0e10: 6f 63 65 73 73 5f 73 69 7a 65 28 76 61 6c 75 65  ocess_size(value
0e20: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
0e30: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 63  }..static int lc
0e40: 5f 70 72 6f 63 65 73 73 5f 76 61 72 5f 73 69 7a  _process_var_siz
0e50: 65 69 6e 74 28 76 6f 69 64 20 2a 64 61 74 61 2c  eint(void *data,
0e60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 6c   const char *val
0e70: 75 65 29 20 7b 0a 09 69 6e 74 20 2a 64 61 74 61  ue) {..int *data
0e80: 76 61 6c 3b 0a 0a 09 64 61 74 61 76 61 6c 20 3d  val;...dataval =
0e90: 20 64 61 74 61 3b 0a 09 2a 64 61 74 61 76 61 6c   data;..*dataval
0ea0: 20 3d 20 6c 63 5f 70 72 6f 63 65 73 73 5f 73 69   = lc_process_si
0eb0: 7a 65 28 76 61 6c 75 65 29 3b 0a 0a 09 72 65 74  ze(value);...ret
0ec0: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(0);.}..stati
0ed0: 63 20 69 6e 74 20 6c 63 5f 70 72 6f 63 65 73 73  c int lc_process
0ee0: 5f 76 61 72 5f 73 69 7a 65 73 68 6f 72 74 28 76  _var_sizeshort(v
0ef0: 6f 69 64 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74  oid *data, const
0f00: 20 63 68 61 72 20 2a 76 61 6c 75 65 29 20 7b 0a   char *value) {.
0f10: 09 73 68 6f 72 74 20 2a 64 61 74 61 76 61 6c 3b  .short *dataval;
0f20: 0a 0a 09 64 61 74 61 76 61 6c 20 3d 20 64 61 74  ...dataval = dat
0f30: 61 3b 0a 09 2a 64 61 74 61 76 61 6c 20 3d 20 6c  a;..*dataval = l
0f40: 63 5f 70 72 6f 63 65 73 73 5f 73 69 7a 65 28 76  c_process_size(v
0f50: 61 6c 75 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28  alue);...return(
0f60: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  0);.}..static in
0f70: 74 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76 61 72  t lc_process_var
0f80: 5f 73 69 7a 65 73 69 7a 65 74 28 76 6f 69 64 20  _sizesizet(void 
0f90: 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61  *data, const cha
0fa0: 72 20 2a 76 61 6c 75 65 29 20 7b 0a 09 73 69 7a  r *value) {..siz
0fb0: 65 5f 74 20 2a 64 61 74 61 76 61 6c 3b 0a 0a 09  e_t *dataval;...
0fc0: 64 61 74 61 76 61 6c 20 3d 20 64 61 74 61 3b 0a  dataval = data;.
0fd0: 09 2a 64 61 74 61 76 61 6c 20 3d 20 6c 63 5f 70  .*dataval = lc_p
0fe0: 72 6f 63 65 73 73 5f 73 69 7a 65 28 76 61 6c 75  rocess_size(valu
0ff0: 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  e);...return(0);
1000: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .}...static int 
1010: 6c 63 5f 68 61 6e 64 6c 65 5f 74 79 70 65 28 6c  lc_handle_type(l
1020: 63 5f 76 61 72 5f 74 79 70 65 5f 74 20 74 79 70  c_var_type_t typ
1030: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76  e, const char *v
1040: 61 6c 75 65 2c 20 76 6f 69 64 20 2a 64 61 74 61  alue, void *data
1050: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 79 70  ) {..switch (typ
1060: 65 29 20 7b 0a 09 09 63 61 73 65 20 4c 43 5f 56  e) {...case LC_V
1070: 41 52 5f 53 54 52 49 4e 47 3a 0a 09 09 09 72 65  AR_STRING:....re
1080: 74 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73 73 5f  turn(lc_process_
1090: 76 61 72 5f 73 74 72 69 6e 67 28 64 61 74 61 2c  var_string(data,
10a0: 20 76 61 6c 75 65 29 29 3b 0a 09 09 09 62 72 65   value));....bre
10b0: 61 6b 3b 0a 09 09 63 61 73 65 20 4c 43 5f 56 41  ak;...case LC_VA
10c0: 52 5f 4c 4f 4e 47 5f 4c 4f 4e 47 3a 0a 09 09 09  R_LONG_LONG:....
10d0: 72 65 74 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73  return(lc_proces
10e0: 73 5f 76 61 72 5f 6c 6f 6e 67 6c 6f 6e 67 28 64  s_var_longlong(d
10f0: 61 74 61 2c 20 76 61 6c 75 65 29 29 3b 0a 09 09  ata, value));...
1100: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 4c  .break;...case L
1110: 43 5f 56 41 52 5f 4c 4f 4e 47 3a 0a 09 09 09 72  C_VAR_LONG:....r
1120: 65 74 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73 73  eturn(lc_process
1130: 5f 76 61 72 5f 6c 6f 6e 67 28 64 61 74 61 2c 20  _var_long(data, 
1140: 76 61 6c 75 65 29 29 3b 0a 09 09 09 62 72 65 61  value));....brea
1150: 6b 3b 0a 09 09 63 61 73 65 20 4c 43 5f 56 41 52  k;...case LC_VAR
1160: 5f 49 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  _INT:....return(
1170: 6c 63 5f 70 72 6f 63 65 73 73 5f 76 61 72 5f 69  lc_process_var_i
1180: 6e 74 28 64 61 74 61 2c 20 76 61 6c 75 65 29 29  nt(data, value))
1190: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
11a0: 73 65 20 4c 43 5f 56 41 52 5f 53 48 4f 52 54 3a  se LC_VAR_SHORT:
11b0: 0a 09 09 09 72 65 74 75 72 6e 28 6c 63 5f 70 72  ....return(lc_pr
11c0: 6f 63 65 73 73 5f 76 61 72 5f 73 68 6f 72 74 28  ocess_var_short(
11d0: 64 61 74 61 2c 20 76 61 6c 75 65 29 29 3b 0a 09  data, value));..
11e0: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
11f0: 4c 43 5f 56 41 52 5f 42 4f 4f 4c 3a 0a 09 09 09  LC_VAR_BOOL:....
1200: 72 65 74 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73  return(lc_proces
1210: 73 5f 76 61 72 5f 62 6f 6f 6c 28 64 61 74 61 2c  s_var_bool(data,
1220: 20 76 61 6c 75 65 29 29 3b 0a 09 09 09 62 72 65   value));....bre
1230: 61 6b 3b 0a 09 09 63 61 73 65 20 4c 43 5f 56 41  ak;...case LC_VA
1240: 52 5f 53 49 5a 45 5f 4c 4f 4e 47 5f 4c 4f 4e 47  R_SIZE_LONG_LONG
1250: 3a 0a 09 09 09 72 65 74 75 72 6e 28 6c 63 5f 70  :....return(lc_p
1260: 72 6f 63 65 73 73 5f 76 61 72 5f 73 69 7a 65 6c  rocess_var_sizel
1270: 6f 6e 67 6c 6f 6e 67 28 64 61 74 61 2c 20 76 61  onglong(data, va
1280: 6c 75 65 29 29 3b 0a 09 09 09 62 72 65 61 6b 3b  lue));....break;
1290: 0a 09 09 63 61 73 65 20 4c 43 5f 56 41 52 5f 53  ...case LC_VAR_S
12a0: 49 5a 45 5f 4c 4f 4e 47 3a 0a 09 09 09 72 65 74  IZE_LONG:....ret
12b0: 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73 73 5f 76  urn(lc_process_v
12c0: 61 72 5f 73 69 7a 65 6c 6f 6e 67 28 64 61 74 61  ar_sizelong(data
12d0: 2c 20 76 61 6c 75 65 29 29 3b 0a 09 09 09 62 72  , value));....br
12e0: 65 61 6b 3b 0a 09 09 63 61 73 65 20 4c 43 5f 56  eak;...case LC_V
12f0: 41 52 5f 53 49 5a 45 5f 49 4e 54 3a 0a 09 09 09  AR_SIZE_INT:....
1300: 72 65 74 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73  return(lc_proces
1310: 73 5f 76 61 72 5f 73 69 7a 65 69 6e 74 28 64 61  s_var_sizeint(da
1320: 74 61 2c 20 76 61 6c 75 65 29 29 3b 0a 09 09 09  ta, value));....
1330: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 4c 43  break;...case LC
1340: 5f 56 41 52 5f 53 49 5a 45 5f 53 48 4f 52 54 3a  _VAR_SIZE_SHORT:
1350: 0a 09 09 09 72 65 74 75 72 6e 28 6c 63 5f 70 72  ....return(lc_pr
1360: 6f 63 65 73 73 5f 76 61 72 5f 73 69 7a 65 73 68  ocess_var_sizesh
1370: 6f 72 74 28 64 61 74 61 2c 20 76 61 6c 75 65 29  ort(data, value)
1380: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
1390: 61 73 65 20 4c 43 5f 56 41 52 5f 42 4f 4f 4c 5f  ase LC_VAR_BOOL_
13a0: 42 59 5f 45 58 49 53 54 41 4e 43 45 3a 0a 09 09  BY_EXISTANCE:...
13b0: 09 72 65 74 75 72 6e 28 6c 63 5f 70 72 6f 63 65  .return(lc_proce
13c0: 73 73 5f 76 61 72 5f 62 6f 6f 6c 5f 62 79 65 78  ss_var_bool_byex
13d0: 69 73 74 61 6e 63 65 28 64 61 74 61 2c 20 76 61  istance(data, va
13e0: 6c 75 65 29 29 3b 0a 09 09 09 62 72 65 61 6b 3b  lue));....break;
13f0: 0a 09 09 63 61 73 65 20 4c 43 5f 56 41 52 5f 53  ...case LC_VAR_S
1400: 49 5a 45 5f 53 49 5a 45 5f 54 3a 0a 09 09 09 72  IZE_SIZE_T:....r
1410: 65 74 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73 73  eturn(lc_process
1420: 5f 76 61 72 5f 73 69 7a 65 73 69 7a 65 74 28 64  _var_sizesizet(d
1430: 61 74 61 2c 20 76 61 6c 75 65 29 29 3b 0a 09 09  ata, value));...
1440: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 4c  .break;...case L
1450: 43 5f 56 41 52 5f 49 50 3a 0a 09 09 09 72 65 74  C_VAR_IP:....ret
1460: 75 72 6e 28 6c 63 5f 70 72 6f 63 65 73 73 5f 76  urn(lc_process_v
1470: 61 72 5f 69 70 28 64 61 74 61 2c 20 76 61 6c 75  ar_ip(data, valu
1480: 65 29 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  e));....break;..
1490: 09 63 61 73 65 20 4c 43 5f 56 41 52 5f 54 49 4d  .case LC_VAR_TIM
14a0: 45 3a 0a 09 09 63 61 73 65 20 4c 43 5f 56 41 52  E:...case LC_VAR
14b0: 5f 44 41 54 45 3a 0a 09 09 63 61 73 65 20 4c 43  _DATE:...case LC
14c0: 5f 56 41 52 5f 46 49 4c 45 4e 41 4d 45 3a 0a 09  _VAR_FILENAME:..
14d0: 09 63 61 73 65 20 4c 43 5f 56 41 52 5f 44 49 52  .case LC_VAR_DIR
14e0: 45 43 54 4f 52 59 3a 0a 23 69 66 64 65 66 20 44  ECTORY:.#ifdef D
14f0: 45 42 55 47 0a 09 09 09 66 70 72 69 6e 74 66 28  EBUG....fprintf(
1500: 73 74 64 65 72 72 2c 20 22 4e 6f 74 20 69 6d 70  stderr, "Not imp
1510: 6c 65 6d 65 6e 74 65 64 20 79 65 74 21 5c 6e 22  lemented yet!\n"
1520: 29 3b 0a 23 65 6e 64 69 66 0a 09 09 09 72 65 74  );.#endif....ret
1530: 75 72 6e 28 2d 31 29 3b 0a 09 09 63 61 73 65 20  urn(-1);...case 
1540: 4c 43 5f 56 41 52 5f 4e 4f 4e 45 3a 0a 09 09 63  LC_VAR_NONE:...c
1550: 61 73 65 20 4c 43 5f 56 41 52 5f 55 4e 4b 4e 4f  ase LC_VAR_UNKNO
1560: 57 4e 3a 0a 09 09 63 61 73 65 20 4c 43 5f 56 41  WN:...case LC_VA
1570: 52 5f 53 45 43 54 49 4f 4e 3a 0a 09 09 63 61 73  R_SECTION:...cas
1580: 65 20 4c 43 5f 56 41 52 5f 53 45 43 54 49 4f 4e  e LC_VAR_SECTION
1590: 53 54 41 52 54 3a 0a 09 09 63 61 73 65 20 4c 43  START:...case LC
15a0: 5f 56 41 52 5f 53 45 43 54 49 4f 4e 45 4e 44 3a  _VAR_SECTIONEND:
15b0: 0a 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
15c0: 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
15d0: 74 75 72 6e 28 2d 31 29 3b 0a 7d 0a 0a 73 74 61  turn(-1);.}..sta
15e0: 74 69 63 20 69 6e 74 20 6c 63 5f 68 61 6e 64 6c  tic int lc_handl
15f0: 65 28 73 74 72 75 63 74 20 6c 63 5f 76 61 72 68  e(struct lc_varh
1600: 61 6e 64 6c 65 72 5f 73 74 20 2a 68 61 6e 64 6c  andler_st *handl
1610: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1620: 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  var, const char 
1630: 2a 76 61 72 61 72 67 73 2c 20 63 6f 6e 73 74 20  *varargs, const 
1640: 63 68 61 72 20 2a 76 61 6c 75 65 2c 20 6c 63 5f  char *value, lc_
1650: 66 6c 61 67 73 5f 74 20 66 6c 61 67 73 29 20 7b  flags_t flags) {
1660: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  ..const char *lo
1670: 63 61 6c 76 61 72 20 3d 20 4e 55 4c 4c 3b 0a 09  calvar = NULL;..
1680: 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09 69 66  int retval;...if
1690: 20 28 76 61 72 20 21 3d 20 4e 55 4c 4c 29 20 7b   (var != NULL) {
16a0: 0a 09 09 6c 6f 63 61 6c 76 61 72 20 3d 20 73 74  ...localvar = st
16b0: 72 72 63 68 72 28 76 61 72 2c 20 27 2e 27 29 3b  rrchr(var, '.');
16c0: 0a 09 09 69 66 20 28 6c 6f 63 61 6c 76 61 72 20  ...if (localvar 
16d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f  == NULL) {....lo
16e0: 63 61 6c 76 61 72 20 3d 20 76 61 72 3b 0a 09 09  calvar = var;...
16f0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f 63 61  } else {....loca
1700: 6c 76 61 72 2b 2b 3b 0a 09 09 7d 0a 09 7d 20 65  lvar++;...}..} e
1710: 6c 73 65 20 7b 0a 09 09 6c 6f 63 61 6c 76 61 72  lse {...localvar
1720: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 73 77   = NULL;..}...sw
1730: 69 74 63 68 20 28 68 61 6e 64 6c 65 72 2d 3e 6d  itch (handler->m
1740: 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 4c 43  ode) {...case LC
1750: 5f 4d 4f 44 45 5f 43 41 4c 4c 42 41 43 4b 3a 0a  _MODE_CALLBACK:.
1760: 09 09 09 69 66 20 28 68 61 6e 64 6c 65 72 2d 3e  ...if (handler->
1770: 63 61 6c 6c 62 61 63 6b 20 21 3d 20 4e 55 4c 4c  callback != NULL
1780: 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  ) {.....retval =
1790: 20 68 61 6e 64 6c 65 72 2d 3e 63 61 6c 6c 62 61   handler->callba
17a0: 63 6b 28 6c 6f 63 61 6c 76 61 72 2c 20 76 61 72  ck(localvar, var
17b0: 2c 20 76 61 72 61 72 67 73 2c 20 76 61 6c 75 65  , varargs, value
17c0: 2c 20 66 6c 61 67 73 2c 20 68 61 6e 64 6c 65 72  , flags, handler
17d0: 2d 3e 65 78 74 72 61 29 3b 0a 09 09 09 09 69 66  ->extra);.....if
17e0: 20 28 72 65 74 76 61 6c 20 3c 20 30 29 20 7b 0a   (retval < 0) {.
17f0: 09 09 09 09 09 6c 63 5f 65 72 72 6e 6f 20 3d 20  .....lc_errno = 
1800: 4c 43 5f 45 52 52 5f 43 41 4c 4c 42 41 43 4b 3b  LC_ERR_CALLBACK;
1810: 0a 09 09 09 09 7d 0a 09 09 09 09 72 65 74 75 72  .....}.....retur
1820: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 09 7d 0a  n(retval);....}.
1830: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
1840: 20 4c 43 5f 4d 4f 44 45 5f 56 41 52 3a 0a 09 09   LC_MODE_VAR:...
1850: 09 72 65 74 75 72 6e 28 6c 63 5f 68 61 6e 64 6c  .return(lc_handl
1860: 65 5f 74 79 70 65 28 68 61 6e 64 6c 65 72 2d 3e  e_type(handler->
1870: 74 79 70 65 2c 20 76 61 6c 75 65 2c 20 68 61 6e  type, value, han
1880: 64 6c 65 72 2d 3e 64 61 74 61 29 29 3b 0a 09 09  dler->data));...
1890: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74  .break;..}...ret
18a0: 75 72 6e 28 2d 31 29 3b 0a 7d 0a 0a 73 74 61 74  urn(-1);.}..stat
18b0: 69 63 20 69 6e 74 20 6c 63 5f 70 72 6f 63 65 73  ic int lc_proces
18c0: 73 5f 65 6e 76 69 72 6f 6e 6d 65 6e 74 28 63 6f  s_environment(co
18d0: 6e 73 74 20 63 68 61 72 20 2a 61 70 70 6e 61 6d  nst char *appnam
18e0: 65 29 20 7b 0a 09 73 74 72 75 63 74 20 6c 63 5f  e) {..struct lc_
18f0: 76 61 72 68 61 6e 64 6c 65 72 5f 73 74 20 2a 68  varhandler_st *h
1900: 61 6e 64 6c 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  andler = NULL;..
1910: 73 69 7a 65 5f 74 20 61 70 70 6e 61 6d 65 6c 65  size_t appnamele
1920: 6e 20 3d 20 30 3b 0a 09 63 68 61 72 20 76 61 72  n = 0;..char var
1930: 6e 61 6d 65 62 75 66 5b 31 32 38 5d 20 3d 20 7b  namebuf[128] = {
1940: 30 7d 3b 0a 09 63 68 61 72 20 2a 2a 63 75 72 72  0};..char **curr
1950: 76 61 72 3b 0a 09 63 68 61 72 20 2a 73 65 70 20  var;..char *sep 
1960: 3d 20 4e 55 4c 4c 2c 20 2a 76 61 6c 75 65 20 3d  = NULL, *value =
1970: 20 4e 55 4c 4c 2c 20 2a 63 6d 64 20 3d 20 4e 55   NULL, *cmd = NU
1980: 4c 4c 3b 0a 09 63 68 61 72 20 2a 75 63 61 73 65  LL;..char *ucase
1990: 5f 61 70 70 6e 61 6d 65 20 3d 20 4e 55 4c 4c 2c  _appname = NULL,
19a0: 20 2a 75 63 61 73 65 5f 61 70 70 6e 61 6d 65 5f   *ucase_appname_
19b0: 69 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61  itr = NULL;..cha
19c0: 72 20 2a 6c 61 73 74 63 6f 6d 70 6f 6e 65 6e 74  r *lastcomponent
19d0: 5f 68 61 6e 64 6c 65 72 20 3d 20 4e 55 4c 4c 3b  _handler = NULL;
19e0: 0a 09 69 6e 74 20 76 61 72 6e 61 6d 65 6c 65 6e  ..int varnamelen
19f0: 20 3d 20 30 3b 0a 0a 09 2f 2a 20 4d 61 6b 65 20   = 0;.../* Make 
1a00: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20  sure we have an 
1a10: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 74 6f 20 73  environment to s
1a20: 63 72 65 77 20 77 69 74 68 2c 20 69 66 20 6e 6f  crew with, if no
1a30: 74 2c 0a 09 20 20 20 6e 6f 20 61 72 67 75 6d 65  t,..   no argume
1a40: 6e 74 73 20 77 65 72 65 20 66 6f 75 6e 64 20 74  nts were found t
1a50: 6f 20 62 65 20 69 6e 20 65 72 72 6f 72 20 2a 2f  o be in error */
1a60: 0a 09 69 66 20 28 65 6e 76 69 72 6f 6e 20 3d 3d  ..if (environ ==
1a70: 20 4e 55 4c 4c 20 7c 7c 20 61 70 70 6e 61 6d 65   NULL || appname
1a80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
1a90: 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(0);..}.../*
1aa0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 63 72   Allocate and cr
1ab0: 65 61 74 65 20 6f 75 72 20 75 70 70 65 72 63 61  eate our upperca
1ac0: 73 65 20 61 70 70 6e 61 6d 65 2e 20 2a 2f 0a 09  se appname. */..
1ad0: 75 63 61 73 65 5f 61 70 70 6e 61 6d 65 20 3d 20  ucase_appname = 
1ae0: 73 74 72 64 75 70 28 61 70 70 6e 61 6d 65 29 3b  strdup(appname);
1af0: 0a 09 69 66 20 28 75 63 61 73 65 5f 61 70 70 6e  ..if (ucase_appn
1b00: 61 6d 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ame == NULL) {..
1b10: 09 6c 63 5f 65 72 72 6e 6f 20 3d 20 4c 43 5f 45  .lc_errno = LC_E
1b20: 52 52 5f 45 4e 4f 4d 45 4d 3b 0a 09 09 72 65 74  RR_ENOMEM;...ret
1b30: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 09 66 6f 72  urn(-1);..}..for
1b40: 20 28 75 63 61 73 65 5f 61 70 70 6e 61 6d 65 5f   (ucase_appname_
1b50: 69 74 72 20 3d 20 75 63 61 73 65 5f 61 70 70 6e  itr = ucase_appn
1b60: 61 6d 65 3b 20 2a 75 63 61 73 65 5f 61 70 70 6e  ame; *ucase_appn
1b70: 61 6d 65 5f 69 74 72 20 21 3d 20 27 5c 30 27 3b  ame_itr != '\0';
1b80: 20 75 63 61 73 65 5f 61 70 70 6e 61 6d 65 5f 69   ucase_appname_i
1b90: 74 72 2b 2b 29 20 7b 0a 09 09 2a 75 63 61 73 65  tr++) {...*ucase
1ba0: 5f 61 70 70 6e 61 6d 65 5f 69 74 72 20 3d 20 74  _appname_itr = t
1bb0: 6f 75 70 70 65 72 28 2a 75 63 61 73 65 5f 61 70  oupper(*ucase_ap
1bc0: 70 6e 61 6d 65 5f 69 74 72 29 3b 0a 09 7d 0a 0a  pname_itr);..}..
1bd0: 09 61 70 70 6e 61 6d 65 6c 65 6e 20 3d 20 73 74  .appnamelen = st
1be0: 72 6c 65 6e 28 75 63 61 73 65 5f 61 70 70 6e 61  rlen(ucase_appna
1bf0: 6d 65 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72  me);...for (curr
1c00: 76 61 72 20 3d 20 65 6e 76 69 72 6f 6e 3b 20 2a  var = environ; *
1c10: 63 75 72 72 76 61 72 20 21 3d 20 4e 55 4c 4c 3b  currvar != NULL;
1c20: 20 63 75 72 72 76 61 72 2b 2b 29 20 7b 0a 09 09   currvar++) {...
1c30: 2f 2a 20 49 66 20 69 74 20 64 6f 65 73 6e 27 74  /* If it doesn't
1c40: 20 62 65 67 69 6e 20 77 69 74 68 20 6f 75 72 20   begin with our 
1c50: 61 70 70 6e 61 6d 65 20 69 67 6e 6f 72 65 20 69  appname ignore i
1c60: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 20 2a 2f  t completely. */
1c70: 0a 09 09 69 66 20 28 73 74 72 6e 63 6d 70 28 2a  ...if (strncmp(*
1c80: 63 75 72 72 76 61 72 2c 20 75 63 61 73 65 5f 61  currvar, ucase_a
1c90: 70 70 6e 61 6d 65 2c 20 61 70 70 6e 61 6d 65 6c  ppname, appnamel
1ca0: 65 6e 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  en) != 0) {....c
1cb0: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
1cc0: 2f 2a 20 46 69 6e 64 20 6f 75 72 20 73 65 70 65  /* Find our sepe
1cd0: 72 61 74 6f 72 2e 20 2a 2f 0a 09 09 73 65 70 20  rator. */...sep 
1ce0: 3d 20 73 74 72 63 68 72 28 2a 63 75 72 72 76 61  = strchr(*currva
1cf0: 72 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28 73  r, '=');...if (s
1d00: 65 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ep == NULL) {...
1d10: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1d20: 09 09 76 61 72 6e 61 6d 65 6c 65 6e 20 3d 20 73  ..varnamelen = s
1d30: 65 70 20 2d 20 2a 63 75 72 72 76 61 72 3b 0a 0a  ep - *currvar;..
1d40: 09 09 2f 2a 20 53 6b 69 70 20 76 61 72 69 61 62  ../* Skip variab
1d50: 6c 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6f  les that would o
1d60: 76 65 72 66 6c 6f 77 20 6f 75 72 20 62 75 66 66  verflow our buff
1d70: 65 72 2e 20 2a 2f 0a 09 09 69 66 20 28 76 61 72  er. */...if (var
1d80: 6e 61 6d 65 6c 65 6e 20 3e 3d 20 73 69 7a 65 6f  namelen >= sizeo
1d90: 66 28 76 61 72 6e 61 6d 65 62 75 66 29 29 20 7b  f(varnamebuf)) {
1da0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1db0: 7d 0a 0a 09 09 73 74 72 6e 63 70 79 28 76 61 72  }....strncpy(var
1dc0: 6e 61 6d 65 62 75 66 2c 20 2a 63 75 72 72 76 61  namebuf, *currva
1dd0: 72 2c 20 76 61 72 6e 61 6d 65 6c 65 6e 29 3b 0a  r, varnamelen);.
1de0: 0a 09 09 76 61 72 6e 61 6d 65 62 75 66 5b 76 61  ...varnamebuf[va
1df0: 72 6e 61 6d 65 6c 65 6e 5d 20 3d 20 27 5c 30 27  rnamelen] = '\0'
1e00: 3b 0a 09 09 76 61 6c 75 65 20 3d 20 73 65 70 20  ;...value = sep 
1e10: 2b 20 31 3b 0a 0a 09 09 2f 2a 20 57 65 20 69 67  + 1;..../* We ig
1e20: 6e 6f 72 65 20 41 50 50 4e 41 4d 45 20 62 79 20  nore APPNAME by 
1e30: 69 74 73 65 6c 66 2e 20 2a 2f 0a 09 09 69 66 20  itself. */...if 
1e40: 28 73 74 72 6c 65 6e 28 76 61 72 6e 61 6d 65 62  (strlen(varnameb
1e50: 75 66 29 20 3c 3d 20 61 70 70 6e 61 6d 65 6c 65  uf) <= appnamele
1e60: 6e 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  n) {....continue
1e70: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 46 75 72 74  ;...}..../* Furt
1e80: 68 65 72 20 69 74 20 6d 75 73 74 20 62 65 20 3c  her it must be <
1e90: 41 50 50 4e 41 4d 45 3e 5f 20 2a 2f 0a 09 09 69  APPNAME>_ */...i
1ea0: 66 20 28 76 61 72 6e 61 6d 65 62 75 66 5b 61 70  f (varnamebuf[ap
1eb0: 70 6e 61 6d 65 6c 65 6e 5d 20 21 3d 20 27 5f 27  pnamelen] != '_'
1ec0: 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
1ed0: 0a 09 09 7d 0a 0a 09 09 63 6d 64 20 3d 20 76 61  ...}....cmd = va
1ee0: 72 6e 61 6d 65 62 75 66 20 2b 20 61 70 70 6e 61  rnamebuf + appna
1ef0: 6d 65 6c 65 6e 20 2b 20 31 3b 0a 0a 09 09 2f 2a  melen + 1;..../*
1f00: 20 57 65 20 64 6f 6e 27 74 20 61 6c 6c 6f 77 20   We don't allow 
1f10: 73 65 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  section specifie
1f20: 72 73 2c 20 66 6f 72 20 72 65 61 73 6f 6e 73 20  rs, for reasons 
1f30: 73 65 65 20 6e 6f 74 65 73 20 69 6e 0a 09 09 20  see notes in... 
1f40: 20 20 74 68 65 20 63 6d 64 6c 69 6e 65 20 70 72    the cmdline pr
1f50: 6f 63 65 73 73 6f 72 20 28 62 65 6c 6f 77 29 2e  ocessor (below).
1f60: 20 2a 2f 0a 09 09 69 66 20 28 73 74 72 63 68 72   */...if (strchr
1f70: 28 63 6d 64 2c 20 27 2e 27 29 20 21 3d 20 4e 55  (cmd, '.') != NU
1f80: 4c 4c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75  LL) {....continu
1f90: 65 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 68  e;...}....for (h
1fa0: 61 6e 64 6c 65 72 20 3d 20 76 61 72 68 61 6e 64  andler = varhand
1fb0: 6c 65 72 73 3b 20 68 61 6e 64 6c 65 72 20 21 3d  lers; handler !=
1fc0: 20 4e 55 4c 4c 3b 20 68 61 6e 64 6c 65 72 20 3d   NULL; handler =
1fd0: 20 68 61 6e 64 6c 65 72 2d 3e 5f 6e 65 78 74 29   handler->_next)
1fe0: 20 7b 0a 09 09 09 69 66 20 28 68 61 6e 64 6c 65   {....if (handle
1ff0: 72 2d 3e 76 61 72 20 3d 3d 20 4e 55 4c 4c 29 20  r->var == NULL) 
2000: 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
2010: 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 53 6b 69 70  ...}...../* Skip
2020: 20 68 61 6e 64 6c 65 72 73 20 77 68 69 63 68 20   handlers which 
2030: 64 6f 6e 27 74 20 61 67 72 65 65 20 77 69 74 68  don't agree with
2040: 20 62 65 69 6e 67 0a 09 09 09 20 20 20 70 72 6f   being....   pro
2050: 63 65 73 73 65 64 20 6f 75 74 73 69 64 65 20 61  cessed outside a
2060: 20 63 6f 6e 66 69 67 20 66 69 6c 65 20 2a 2f 0a   config file */.
2070: 09 09 09 69 66 20 28 68 61 6e 64 6c 65 72 2d 3e  ...if (handler->
2080: 74 79 70 65 20 3d 3d 20 4c 43 5f 56 41 52 5f 53  type == LC_VAR_S
2090: 45 43 54 49 4f 4e 20 7c 7c 0a 09 09 09 20 20 20  ECTION ||....   
20a0: 20 68 61 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d   handler->type =
20b0: 3d 20 4c 43 5f 56 41 52 5f 53 45 43 54 49 4f 4e  = LC_VAR_SECTION
20c0: 53 54 41 52 54 20 7c 7c 0a 09 09 09 20 20 20 20  START ||....    
20d0: 68 61 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d  handler->type ==
20e0: 20 4c 43 5f 56 41 52 5f 53 45 43 54 49 4f 4e 45   LC_VAR_SECTIONE
20f0: 4e 44 20 7c 7c 0a 09 09 09 20 20 20 20 68 61 6e  ND ||....    han
2100: 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d 20 4c 43  dler->type == LC
2110: 5f 56 41 52 5f 55 4e 4b 4e 4f 57 4e 29 20 7b 0a  _VAR_UNKNOWN) {.
2120: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
2130: 09 7d 0a 0a 09 09 09 2f 2a 20 46 69 6e 64 20 74  .}...../* Find t
2140: 68 65 20 6c 61 73 74 20 70 61 72 74 20 6f 66 20  he last part of 
2150: 74 68 65 20 76 61 72 69 61 62 6c 65 20 61 6e 64  the variable and
2160: 20 63 6f 6d 70 61 72 65 20 69 74 20 77 69 74 68   compare it with
2170: 20 0a 09 09 09 20 20 20 74 68 65 20 6f 70 74 69   ....   the opti
2180: 6f 6e 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  on being process
2190: 65 64 2c 20 69 66 20 61 20 77 69 6c 64 63 61 72  ed, if a wildcar
21a0: 64 20 69 73 20 67 69 76 65 6e 2e 20 2a 2f 0a 09  d is given. */..
21b0: 09 09 69 66 20 28 68 61 6e 64 6c 65 72 2d 3e 76  ..if (handler->v
21c0: 61 72 5b 30 5d 20 3d 3d 20 27 2a 27 20 26 26 20  ar[0] == '*' && 
21d0: 68 61 6e 64 6c 65 72 2d 3e 76 61 72 5b 31 5d 20  handler->var[1] 
21e0: 3d 3d 20 27 2e 27 29 20 7b 0a 09 09 09 09 6c 61  == '.') {.....la
21f0: 73 74 63 6f 6d 70 6f 6e 65 6e 74 5f 68 61 6e 64  stcomponent_hand
2200: 6c 65 72 20 3d 20 73 74 72 72 63 68 72 28 68 61  ler = strrchr(ha
2210: 6e 64 6c 65 72 2d 3e 76 61 72 2c 20 27 2e 27 29  ndler->var, '.')
2220: 3b 0a 09 09 09 09 69 66 20 28 6c 61 73 74 63 6f  ;.....if (lastco
2230: 6d 70 6f 6e 65 6e 74 5f 68 61 6e 64 6c 65 72 20  mponent_handler 
2240: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
2250: 6c 61 73 74 63 6f 6d 70 6f 6e 65 6e 74 5f 68 61  lastcomponent_ha
2260: 6e 64 6c 65 72 20 3d 20 68 61 6e 64 6c 65 72 2d  ndler = handler-
2270: 3e 76 61 72 3b 0a 09 09 09 09 7d 20 65 6c 73 65  >var;.....} else
2280: 20 7b 0a 09 09 09 09 09 6c 61 73 74 63 6f 6d 70   {......lastcomp
2290: 6f 6e 65 6e 74 5f 68 61 6e 64 6c 65 72 2b 2b 3b  onent_handler++;
22a0: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
22b0: 20 7b 0a 09 09 09 09 6c 61 73 74 63 6f 6d 70 6f   {.....lastcompo
22c0: 6e 65 6e 74 5f 68 61 6e 64 6c 65 72 20 3d 20 68  nent_handler = h
22d0: 61 6e 64 6c 65 72 2d 3e 76 61 72 3b 0a 09 09 09  andler->var;....
22e0: 7d 0a 0a 09 09 09 2f 2a 20 49 67 6e 6f 72 65 20  }...../* Ignore 
22f0: 74 68 69 73 20 68 61 6e 64 6c 65 72 20 69 66 20  this handler if 
2300: 74 68 65 79 20 64 6f 6e 27 74 20 6d 61 74 63 68  they don't match
2310: 2e 20 2a 2f 0a 09 09 09 69 66 20 28 73 74 72 63  . */....if (strc
2320: 61 73 65 63 6d 70 28 6c 61 73 74 63 6f 6d 70 6f  asecmp(lastcompo
2330: 6e 65 6e 74 5f 68 61 6e 64 6c 65 72 2c 20 63 6d  nent_handler, cm
2340: 64 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 63  d) != 0) {.....c
2350: 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
2360: 09 09 69 66 20 28 68 61 6e 64 6c 65 72 2d 3e 74  ..if (handler->t
2370: 79 70 65 20 3d 3d 20 4c 43 5f 56 41 52 5f 4e 4f  ype == LC_VAR_NO
2380: 4e 45 20 7c 7c 20 68 61 6e 64 6c 65 72 2d 3e 74  NE || handler->t
2390: 79 70 65 20 3d 3d 20 4c 43 5f 56 41 52 5f 42 4f  ype == LC_VAR_BO
23a0: 4f 4c 5f 42 59 5f 45 58 49 53 54 41 4e 43 45 29  OL_BY_EXISTANCE)
23b0: 20 7b 0a 09 09 09 09 76 61 6c 75 65 20 3d 20 4e   {.....value = N
23c0: 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ULL;....}...../*
23d0: 20 57 65 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   We ignore error
23e0: 73 20 66 72 6f 6d 20 74 68 65 20 65 6e 76 69 72  s from the envir
23f0: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
2400: 2c 0a 09 09 09 20 20 20 74 68 65 79 27 72 65 20  ,....   they're 
2410: 6d 6f 73 74 6c 79 20 69 6e 73 69 67 6e 69 66 69  mostly insignifi
2420: 63 61 6e 74 2e 20 2a 2f 0a 09 09 09 6c 63 5f 68  cant. */....lc_h
2430: 61 6e 64 6c 65 28 68 61 6e 64 6c 65 72 2c 20 63  andle(handler, c
2440: 6d 64 2c 20 4e 55 4c 4c 2c 20 76 61 6c 75 65 2c  md, NULL, value,
2450: 20 4c 43 5f 46 4c 41 47 53 5f 45 4e 56 49 52 4f   LC_FLAGS_ENVIRO
2460: 4e 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  N);.....break;..
2470: 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 75 63 61  .}..}...free(uca
2480: 73 65 5f 61 70 70 6e 61 6d 65 29 3b 0a 0a 09 72  se_appname);...r
2490: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61  eturn(0);.}..sta
24a0: 74 69 63 20 69 6e 74 20 6c 63 5f 70 72 6f 63 65  tic int lc_proce
24b0: 73 73 5f 63 6d 64 6c 69 6e 65 28 69 6e 74 20 61  ss_cmdline(int a
24c0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
24d0: 29 20 7b 0a 09 73 74 72 75 63 74 20 6c 63 5f 76  ) {..struct lc_v
24e0: 61 72 68 61 6e 64 6c 65 72 5f 73 74 20 2a 68 61  arhandler_st *ha
24f0: 6e 64 6c 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63  ndler = NULL;..c
2500: 68 61 72 20 2a 63 6d 64 61 72 67 20 3d 20 4e 55  har *cmdarg = NU
2510: 4c 4c 2c 20 2a 63 6d 64 6f 70 74 61 72 67 20 3d  LL, *cmdoptarg =
2520: 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c 61   NULL;..char *la
2530: 73 74 63 6f 6d 70 6f 6e 65 6e 74 5f 68 61 6e 64  stcomponent_hand
2540: 6c 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61  ler = NULL;..cha
2550: 72 20 2a 2a 6e 65 77 61 72 67 76 20 3d 20 4e 55  r **newargv = NU
2560: 4c 4c 3b 0a 09 63 68 61 72 20 2a 75 73 65 64 61  LL;..char *useda
2570: 72 67 76 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74  rgv = NULL;..int
2580: 20 63 6d 64 61 72 67 69 64 78 20 3d 20 30 3b 0a   cmdargidx = 0;.
2590: 09 69 6e 74 20 6e 65 77 61 72 67 76 69 64 78 20  .int newargvidx 
25a0: 3d 20 30 3b 0a 09 69 6e 74 20 72 65 74 76 61 6c  = 0;..int retval
25b0: 20 3d 20 30 2c 20 63 68 6b 72 65 74 76 61 6c 20   = 0, chkretval 
25c0: 3d 20 30 3b 0a 09 69 6e 74 20 63 68 20 3d 20 30  = 0;..int ch = 0
25d0: 3b 0a 0a 09 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ;.../* Allocate 
25e0: 22 61 72 67 63 20 2b 20 31 22 20 28 2b 31 20 66  "argc + 1" (+1 f
25f0: 6f 72 20 74 68 65 20 4e 55 4c 4c 20 74 65 72 6d  or the NULL term
2600: 69 6e 61 74 6f 72 29 20 65 6c 65 6d 65 6e 74 73  inator) elements
2610: 2e 20 2a 2f 0a 09 6e 65 77 61 72 67 76 20 3d 20  . */..newargv = 
2620: 6d 61 6c 6c 6f 63 28 28 61 72 67 63 20 2b 20 31  malloc((argc + 1
2630: 29 20 2a 20 73 69 7a 65 6f 66 28 2a 6e 65 77 61  ) * sizeof(*newa
2640: 72 67 76 29 29 3b 0a 09 69 66 20 28 6e 65 77 61  rgv));..if (newa
2650: 72 67 76 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rgv == NULL) {..
2660: 09 6c 63 5f 65 72 72 6e 6f 20 3d 20 4c 43 5f 45  .lc_errno = LC_E
2670: 52 52 5f 45 4e 4f 4d 45 4d 3b 0a 09 09 72 65 74  RR_ENOMEM;...ret
2680: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 09 6e 65 77  urn(-1);..}..new
2690: 61 72 67 76 5b 6e 65 77 61 72 67 76 69 64 78 2b  argv[newargvidx+
26a0: 2b 5d 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 09 6e  +] = argv[0];..n
26b0: 65 77 61 72 67 76 5b 61 72 67 63 5d 20 3d 20 4e  ewargv[argc] = N
26c0: 55 4c 4c 3b 0a 0a 09 2f 2a 20 41 6c 6c 6f 63 61  ULL;.../* Alloca
26d0: 74 65 20 73 70 61 63 65 20 74 6f 20 69 6e 64 69  te space to indi
26e0: 63 61 74 65 20 77 68 69 63 68 20 61 72 67 75 6d  cate which argum
26f0: 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 75  ents have been u
2700: 73 65 64 2e 20 2a 2f 0a 09 75 73 65 64 61 72 67  sed. */..usedarg
2710: 76 20 3d 20 6d 61 6c 6c 6f 63 28 61 72 67 63 20  v = malloc(argc 
2720: 2a 20 73 69 7a 65 6f 66 28 2a 75 73 65 64 61 72  * sizeof(*usedar
2730: 67 76 29 29 3b 0a 09 69 66 20 28 75 73 65 64 61  gv));..if (useda
2740: 72 67 76 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rgv == NULL) {..
2750: 09 6c 63 5f 65 72 72 6e 6f 20 3d 20 4c 43 5f 45  .lc_errno = LC_E
2760: 52 52 5f 45 4e 4f 4d 45 4d 3b 0a 09 09 66 72 65  RR_ENOMEM;...fre
2770: 65 28 6e 65 77 61 72 67 76 29 3b 0a 09 09 72 65  e(newargv);...re
2780: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 09 66 6f  turn(-1);..}..fo
2790: 72 20 28 63 6d 64 61 72 67 69 64 78 20 3d 20 30  r (cmdargidx = 0
27a0: 3b 20 63 6d 64 61 72 67 69 64 78 20 3c 20 61 72  ; cmdargidx < ar
27b0: 67 63 3b 20 63 6d 64 61 72 67 69 64 78 2b 2b 29  gc; cmdargidx++)
27c0: 20 7b 0a 09 09 75 73 65 64 61 72 67 76 5b 63 6d   {...usedargv[cm
27d0: 64 61 72 67 69 64 78 5d 20 3d 20 30 3b 0a 09 7d  dargidx] = 0;..}
27e0: 0a 0a 09 66 6f 72 20 28 63 6d 64 61 72 67 69 64  ...for (cmdargid
27f0: 78 20 3d 20 31 3b 20 63 6d 64 61 72 67 69 64 78  x = 1; cmdargidx
2800: 20 3c 20 61 72 67 63 3b 20 63 6d 64 61 72 67 69   < argc; cmdargi
2810: 64 78 2b 2b 29 20 7b 0a 09 09 63 6d 64 61 72 67  dx++) {...cmdarg
2820: 20 3d 20 61 72 67 76 5b 63 6d 64 61 72 67 69 64   = argv[cmdargid
2830: 78 5d 3b 0a 0a 09 09 2f 2a 20 4d 61 6b 65 20 73  x];..../* Make s
2840: 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 61  ure we have an a
2850: 72 67 75 6d 65 6e 74 20 68 65 72 65 2e 20 2a 2f  rgument here. */
2860: 0a 09 09 69 66 20 28 63 6d 64 61 72 67 20 3d 3d  ...if (cmdarg ==
2870: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61   NULL) {....brea
2880: 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20  k;...}..../* If 
2890: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 6e  the argument isn
28a0: 27 74 20 61 6e 20 6f 70 74 69 6f 6e 2c 20 61 62  't an option, ab
28b0: 6f 72 74 2e 20 2a 2f 0a 09 09 69 66 20 28 63 6d  ort. */...if (cm
28c0: 64 61 72 67 5b 30 5d 20 21 3d 20 27 2d 27 29 20  darg[0] != '-') 
28d0: 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  {....continue;..
28e0: 09 7d 0a 0a 09 09 2f 2a 20 53 65 74 75 70 20 61  .}..../* Setup a
28f0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
2900: 6e 65 77 20 61 72 72 61 79 20 66 6f 72 20 74 68  new array for th
2910: 65 20 61 63 74 75 61 6c 20 61 72 67 75 6d 65 6e  e actual argumen
2920: 74 2e 20 2a 2f 0a 09 09 6e 65 77 61 72 67 76 5b  t. */...newargv[
2930: 6e 65 77 61 72 67 76 69 64 78 2b 2b 5d 20 3d 20  newargvidx++] = 
2940: 63 6d 64 61 72 67 3b 0a 09 09 75 73 65 64 61 72  cmdarg;...usedar
2950: 67 76 5b 63 6d 64 61 72 67 69 64 78 5d 20 3d 20  gv[cmdargidx] = 
2960: 31 3b 0a 0a 09 09 2f 2a 20 54 68 65 6e 20 73 68  1;..../* Then sh
2970: 69 66 74 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ift the argument
2980: 20 70 61 73 74 20 74 68 65 20 27 2d 27 20 73 6f   past the '-' so
2990: 20 77 65 20 63 61 6e 20 69 67 6e 6f 72 65 20 69   we can ignore i
29a0: 74 2e 20 2a 2f 0a 09 09 63 6d 64 61 72 67 2b 2b  t. */...cmdarg++
29b0: 3b 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20 6c  ;..../* Handle l
29c0: 6f 6e 67 20 6f 70 74 69 6f 6e 73 2e 20 2a 2f 0a  ong options. */.
29d0: 09 09 69 66 20 28 63 6d 64 61 72 67 5b 30 5d 20  ..if (cmdarg[0] 
29e0: 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 09 63 6d 64  == '-') {....cmd
29f0: 61 72 67 2b 2b 3b 0a 0a 09 09 09 2f 2a 20 44 6f  arg++;...../* Do
2a00: 6e 27 74 20 70 72 6f 63 65 73 73 20 61 72 67 75  n't process argu
2a10: 6d 65 6e 74 73 20 61 66 74 65 72 20 74 68 65 20  ments after the 
2a20: 27 2d 2d 27 20 6f 70 74 69 6f 6e 2e 20 2a 2f 0a  '--' option. */.
2a30: 09 09 09 69 66 20 28 63 6d 64 61 72 67 5b 30 5d  ...if (cmdarg[0]
2a40: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 09   == '\0') {.....
2a50: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
2a60: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 20 76 61  /* Look for a va
2a70: 72 69 61 62 6c 65 20 6e 61 6d 65 20 74 68 61 74  riable name that
2a80: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 09 09 09 66   matches */....f
2a90: 6f 72 20 28 68 61 6e 64 6c 65 72 20 3d 20 76 61  or (handler = va
2aa0: 72 68 61 6e 64 6c 65 72 73 3b 20 68 61 6e 64 6c  rhandlers; handl
2ab0: 65 72 20 21 3d 20 4e 55 4c 4c 3b 20 68 61 6e 64  er != NULL; hand
2ac0: 6c 65 72 20 3d 20 68 61 6e 64 6c 65 72 2d 3e 5f  ler = handler->_
2ad0: 6e 65 78 74 29 20 7b 0a 09 09 09 09 2f 2a 20 53  next) {...../* S
2ae0: 6b 69 70 20 68 61 6e 64 6c 65 72 73 20 77 69 74  kip handlers wit
2af0: 68 20 6e 6f 20 76 61 72 69 61 62 6c 65 20 6e 61  h no variable na
2b00: 6d 65 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 68  me. */.....if (h
2b10: 61 6e 64 6c 65 72 2d 3e 76 61 72 20 3d 3d 20 4e  andler->var == N
2b20: 55 4c 4c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74  ULL) {......cont
2b30: 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 09 09 09 09  inue;.....}.....
2b40: 2f 2a 20 53 6b 69 70 20 68 61 6e 64 6c 65 72 73  /* Skip handlers
2b50: 20 77 68 69 63 68 20 64 6f 6e 27 74 20 61 67 72   which don't agr
2b60: 65 65 20 77 69 74 68 20 62 65 69 6e 67 0a 09 09  ee with being...
2b70: 09 09 20 20 20 70 72 6f 63 65 73 73 65 64 20 6f  ..   processed o
2b80: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
2b90: 6e 65 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 68  ne. */.....if (h
2ba0: 61 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d 20  andler->type == 
2bb0: 4c 43 5f 56 41 52 5f 53 45 43 54 49 4f 4e 20 7c  LC_VAR_SECTION |
2bc0: 7c 0a 09 09 09 09 20 20 20 20 68 61 6e 64 6c 65  |.....    handle
2bd0: 72 2d 3e 74 79 70 65 20 3d 3d 20 4c 43 5f 56 41  r->type == LC_VA
2be0: 52 5f 53 45 43 54 49 4f 4e 53 54 41 52 54 20 7c  R_SECTIONSTART |
2bf0: 7c 0a 09 09 09 09 20 20 20 20 68 61 6e 64 6c 65  |.....    handle
2c00: 72 2d 3e 74 79 70 65 20 3d 3d 20 4c 43 5f 56 41  r->type == LC_VA
2c10: 52 5f 53 45 43 54 49 4f 4e 45 4e 44 20 7c 7c 0a  R_SECTIONEND ||.
2c20: 09 09 09 09 20 20 20 20 68 61 6e 64 6c 65 72 2d  ....    handler-
2c30: 3e 74 79 70 65 20 3d 3d 20 4c 43 5f 56 41 52 5f  >type == LC_VAR_
2c40: 55 4e 4b 4e 4f 57 4e 29 20 7b 0a 09 09 09 09 09  UNKNOWN) {......
2c50: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
2c60: 0a 09 09 09 09 2f 2a 20 46 69 6e 64 20 74 68 65  ...../* Find the
2c70: 20 6c 61 73 74 20 70 61 72 74 20 6f 66 20 74 68   last part of th
2c80: 65 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 63  e variable and c
2c90: 6f 6d 70 61 72 65 20 69 74 20 77 69 74 68 20 0a  ompare it with .
2ca0: 09 09 09 09 20 20 20 74 68 65 20 6f 70 74 69 6f  ....   the optio
2cb0: 6e 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  n being processe
2cc0: 64 2c 20 69 66 20 61 20 77 69 6c 64 63 61 72 64  d, if a wildcard
2cd0: 20 69 73 20 67 69 76 65 6e 2e 20 2a 2f 0a 09 09   is given. */...
2ce0: 09 09 69 66 20 28 68 61 6e 64 6c 65 72 2d 3e 76  ..if (handler->v
2cf0: 61 72 5b 30 5d 20 3d 3d 20 27 2a 27 20 26 26 20  ar[0] == '*' && 
2d00: 68 61 6e 64 6c 65 72 2d 3e 76 61 72 5b 31 5d 20  handler->var[1] 
2d10: 3d 3d 20 27 2e 27 29 20 7b 0a 09 09 09 09 09 6c  == '.') {......l
2d20: 61 73 74 63 6f 6d 70 6f 6e 65 6e 74 5f 68 61 6e  astcomponent_han
2d30: 64 6c 65 72 20 3d 20 73 74 72 72 63 68 72 28 68  dler = strrchr(h
2d40: 61 6e 64 6c 65 72 2d 3e 76 61 72 2c 20 27 2e 27  andler->var, '.'
2d50: 29 3b 0a 09 09 09 09 09 69 66 20 28 6c 61 73 74  );......if (last
2d60: 63 6f 6d 70 6f 6e 65 6e 74 5f 68 61 6e 64 6c 65  component_handle
2d70: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  r == NULL) {....
2d80: 09 09 09 6c 61 73 74 63 6f 6d 70 6f 6e 65 6e 74  ...lastcomponent
2d90: 5f 68 61 6e 64 6c 65 72 20 3d 20 68 61 6e 64 6c  _handler = handl
2da0: 65 72 2d 3e 76 61 72 3b 0a 09 09 09 09 09 7d 20  er->var;......} 
2db0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 6c 61 73  else {.......las
2dc0: 74 63 6f 6d 70 6f 6e 65 6e 74 5f 68 61 6e 64 6c  tcomponent_handl
2dd0: 65 72 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  er++;......}....
2de0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 2f  .} else {....../
2df0: 2a 20 44 69 73 61 6c 6c 6f 77 20 75 73 65 20 6f  * Disallow use o
2e00: 66 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  f the fully qual
2e10: 69 66 69 65 64 20 6e 61 6d 65 0a 09 09 09 09 09  ified name......
2e20: 20 20 20 73 69 6e 63 65 20 74 68 65 72 65 20 77     since there w
2e30: 61 73 20 6e 6f 20 73 65 63 74 69 6f 6e 73 74 61  as no sectionsta
2e40: 72 74 20 70 6f 72 74 69 6f 6e 0a 09 09 09 09 09  rt portion......
2e50: 20 20 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c     we cannot all
2e60: 6f 77 20 69 74 20 74 6f 20 68 61 6e 64 6c 65 20  ow it to handle 
2e70: 63 68 69 6c 64 72 65 6e 20 6f 66 20 69 74 2e 20  children of it. 
2e80: 2a 2f 0a 09 09 09 09 09 69 66 20 28 73 74 72 63  */......if (strc
2e90: 68 72 28 63 6d 64 61 72 67 2c 20 27 2e 27 29 20  hr(cmdarg, '.') 
2ea0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  != NULL) {......
2eb0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09  .continue;......
2ec0: 7d 0a 09 09 09 09 09 6c 61 73 74 63 6f 6d 70 6f  }......lastcompo
2ed0: 6e 65 6e 74 5f 68 61 6e 64 6c 65 72 20 3d 20 68  nent_handler = h
2ee0: 61 6e 64 6c 65 72 2d 3e 76 61 72 3b 0a 09 09 09  andler->var;....
2ef0: 09 7d 0a 0a 09 09 09 09 2f 2a 20 49 67 6e 6f 72  .}....../* Ignor
2f00: 65 20 74 68 69 73 20 68 61 6e 64 6c 65 72 20 69  e this handler i
2f10: 66 20 74 68 65 79 20 64 6f 6e 27 74 20 6d 61 74  f they don't mat
2f20: 63 68 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ch. */.....if (s
2f30: 74 72 63 61 73 65 63 6d 70 28 6c 61 73 74 63 6f  trcasecmp(lastco
2f40: 6d 70 6f 6e 65 6e 74 5f 68 61 6e 64 6c 65 72 2c  mponent_handler,
2f50: 20 63 6d 64 61 72 67 29 20 21 3d 20 30 29 20 7b   cmdarg) != 0) {
2f60: 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
2f70: 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 68  ....}......if (h
2f80: 61 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d 20  andler->type == 
2f90: 4c 43 5f 56 41 52 5f 4e 4f 4e 45 20 7c 7c 20 68  LC_VAR_NONE || h
2fa0: 61 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d 20  andler->type == 
2fb0: 4c 43 5f 56 41 52 5f 42 4f 4f 4c 5f 42 59 5f 45  LC_VAR_BOOL_BY_E
2fc0: 58 49 53 54 41 4e 43 45 29 20 7b 0a 09 09 09 09  XISTANCE) {.....
2fd0: 09 63 6d 64 6f 70 74 61 72 67 20 3d 20 4e 55 4c  .cmdoptarg = NUL
2fe0: 4c 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  L;.....} else {.
2ff0: 09 09 09 09 09 63 6d 64 61 72 67 69 64 78 2b 2b  .....cmdargidx++
3000: 3b 0a 09 09 09 09 09 69 66 20 28 63 6d 64 61 72  ;......if (cmdar
3010: 67 69 64 78 20 3e 3d 20 61 72 67 63 29 20 7b 0a  gidx >= argc) {.
3020: 09 09 09 09 09 09 66 70 72 69 6e 74 66 28 73 74  ......fprintf(st
3030: 64 65 72 72 2c 20 22 41 72 67 75 6d 65 6e 74 20  derr, "Argument 
3040: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 09  required.\n");..
3050: 09 09 09 09 09 6c 63 5f 65 72 72 6e 6f 20 3d 20  .....lc_errno = 
3060: 4c 43 5f 45 52 52 5f 42 41 44 46 4f 52 4d 41 54  LC_ERR_BADFORMAT
3070: 3b 0a 09 09 09 09 09 09 66 72 65 65 28 75 73 65  ;.......free(use
3080: 64 61 72 67 76 29 3b 0a 09 09 09 09 09 09 66 72  dargv);.......fr
3090: 65 65 28 6e 65 77 61 72 67 76 29 3b 0a 09 09 09  ee(newargv);....
30a0: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
30b0: 09 09 09 09 7d 0a 09 09 09 09 09 63 6d 64 6f 70  ....}......cmdop
30c0: 74 61 72 67 20 3d 20 61 72 67 76 5b 63 6d 64 61  targ = argv[cmda
30d0: 72 67 69 64 78 5d 3b 0a 09 09 09 09 09 6e 65 77  rgidx];......new
30e0: 61 72 67 76 5b 6e 65 77 61 72 67 76 69 64 78 2b  argv[newargvidx+
30f0: 2b 5d 20 3d 20 63 6d 64 6f 70 74 61 72 67 3b 0a  +] = cmdoptarg;.
3100: 09 09 09 09 09 75 73 65 64 61 72 67 76 5b 63 6d  .....usedargv[cm
3110: 64 61 72 67 69 64 78 5d 20 3d 20 31 3b 0a 09 09  dargidx] = 1;...
3120: 09 09 7d 0a 0a 09 09 09 09 63 68 6b 72 65 74 76  ..}......chkretv
3130: 61 6c 20 3d 20 6c 63 5f 68 61 6e 64 6c 65 28 68  al = lc_handle(h
3140: 61 6e 64 6c 65 72 2c 20 68 61 6e 64 6c 65 72 2d  andler, handler-
3150: 3e 76 61 72 2c 20 4e 55 4c 4c 2c 20 63 6d 64 6f  >var, NULL, cmdo
3160: 70 74 61 72 67 2c 20 4c 43 5f 46 4c 41 47 53 5f  ptarg, LC_FLAGS_
3170: 43 4d 44 4c 49 4e 45 29 3b 0a 09 09 09 09 69 66  CMDLINE);.....if
3180: 20 28 63 68 6b 72 65 74 76 61 6c 20 3c 20 30 29   (chkretval < 0)
3190: 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
31a0: 20 2d 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09   -1;.....}......
31b0: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
31c0: 69 66 20 28 68 61 6e 64 6c 65 72 20 3d 3d 20 4e  if (handler == N
31d0: 55 4c 4c 29 20 7b 0a 09 09 09 09 66 70 72 69 6e  ULL) {.....fprin
31e0: 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
31f0: 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 2d 2d 25 73  own option: --%s
3200: 5c 6e 22 2c 20 63 6d 64 61 72 67 29 3b 0a 09 09  \n", cmdarg);...
3210: 09 09 6c 63 5f 65 72 72 6e 6f 20 3d 20 4c 43 5f  ..lc_errno = LC_
3220: 45 52 52 5f 49 4e 56 43 4d 44 3b 0a 09 09 09 09  ERR_INVCMD;.....
3230: 66 72 65 65 28 75 73 65 64 61 72 67 76 29 3b 0a  free(usedargv);.
3240: 09 09 09 09 66 72 65 65 28 6e 65 77 61 72 67 76  ....free(newargv
3250: 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
3260: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
3270: 20 7b 0a 09 09 09 66 6f 72 20 28 3b 20 2a 63 6d   {....for (; *cm
3280: 64 61 72 67 20 21 3d 20 27 5c 30 27 3b 20 63 6d  darg != '\0'; cm
3290: 64 61 72 67 2b 2b 29 20 7b 0a 09 09 09 09 63 68  darg++) {.....ch
32a0: 20 3d 20 2a 63 6d 64 61 72 67 3b 0a 0a 09 09 09   = *cmdarg;.....
32b0: 09 66 6f 72 20 28 68 61 6e 64 6c 65 72 20 3d 20  .for (handler = 
32c0: 76 61 72 68 61 6e 64 6c 65 72 73 3b 20 68 61 6e  varhandlers; han
32d0: 64 6c 65 72 20 21 3d 20 4e 55 4c 4c 3b 20 68 61  dler != NULL; ha
32e0: 6e 64 6c 65 72 20 3d 20 68 61 6e 64 6c 65 72 2d  ndler = handler-
32f0: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 09 69  >_next) {......i
3300: 66 20 28 68 61 6e 64 6c 65 72 2d 3e 6f 70 74 20  f (handler->opt 
3310: 21 3d 20 63 68 20 7c 7c 20 68 61 6e 64 6c 65 72  != ch || handler
3320: 2d 3e 6f 70 74 20 3d 3d 20 27 5c 30 27 29 20 7b  ->opt == '\0') {
3330: 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  .......continue;
3340: 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 2f 2a 20  ......}....../* 
3350: 53 6b 69 70 20 68 61 6e 64 6c 65 72 73 20 77 68  Skip handlers wh
3360: 69 63 68 20 64 6f 6e 27 74 20 61 67 72 65 65 20  ich don't agree 
3370: 77 69 74 68 20 62 65 69 6e 67 0a 09 09 09 09 09  with being......
3380: 20 20 20 70 72 6f 63 65 73 73 65 64 20 6f 6e 20     processed on 
3390: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
33a0: 2e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 68 61  . */......if (ha
33b0: 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d 20 4c  ndler->type == L
33c0: 43 5f 56 41 52 5f 53 45 43 54 49 4f 4e 20 7c 7c  C_VAR_SECTION ||
33d0: 0a 09 09 09 09 09 20 20 20 20 68 61 6e 64 6c 65  ......    handle
33e0: 72 2d 3e 74 79 70 65 20 3d 3d 20 4c 43 5f 56 41  r->type == LC_VA
33f0: 52 5f 53 45 43 54 49 4f 4e 53 54 41 52 54 20 7c  R_SECTIONSTART |
3400: 7c 0a 09 09 09 09 09 20 20 20 20 68 61 6e 64 6c  |......    handl
3410: 65 72 2d 3e 74 79 70 65 20 3d 3d 20 4c 43 5f 56  er->type == LC_V
3420: 41 52 5f 53 45 43 54 49 4f 4e 45 4e 44 20 7c 7c  AR_SECTIONEND ||
3430: 0a 09 09 09 09 09 20 20 20 20 68 61 6e 64 6c 65  ......    handle
3440: 72 2d 3e 74 79 70 65 20 3d 3d 20 4c 43 5f 56 41  r->type == LC_VA
3450: 52 5f 55 4e 4b 4e 4f 57 4e 29 20 7b 0a 09 09 09  R_UNKNOWN) {....
3460: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
3470: 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 68 61  ..}.......if (ha
3480: 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d 20 4c  ndler->type == L
3490: 43 5f 56 41 52 5f 4e 4f 4e 45 20 7c 7c 20 68 61  C_VAR_NONE || ha
34a0: 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 3d 20 4c  ndler->type == L
34b0: 43 5f 56 41 52 5f 42 4f 4f 4c 5f 42 59 5f 45 58  C_VAR_BOOL_BY_EX
34c0: 49 53 54 41 4e 43 45 29 20 7b 0a 09 09 09 09 09  ISTANCE) {......
34d0: 09 63 6d 64 6f 70 74 61 72 67 20 3d 20 4e 55 4c  .cmdoptarg = NUL
34e0: 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
34f0: 0a 09 09 09 09 09 09 63 6d 64 61 72 67 69 64 78  .......cmdargidx
3500: 2b 2b 3b 0a 09 09 09 09 09 09 69 66 20 28 63 6d  ++;.......if (cm
3510: 64 61 72 67 69 64 78 20 3e 3d 20 61 72 67 63 29  dargidx >= argc)
3520: 20 7b 0a 09 09 09 09 09 09 09 66 70 72 69 6e 74   {........fprint
3530: 66 28 73 74 64 65 72 72 2c 20 22 41 72 67 75 6d  f(stderr, "Argum
3540: 65 6e 74 20 72 65 71 75 69 72 65 64 2e 5c 6e 22  ent required.\n"
3550: 29 3b 0a 09 09 09 09 09 09 09 6c 63 5f 65 72 72  );........lc_err
3560: 6e 6f 20 3d 20 4c 43 5f 45 52 52 5f 42 41 44 46  no = LC_ERR_BADF
3570: 4f 52 4d 41 54 3b 0a 09 09 09 09 09 09 09 66 72  ORMAT;........fr
3580: 65 65 28 75 73 65 64 61 72 67 76 29 3b 0a 09 09  ee(usedargv);...
3590: 09 09 09 09 09 66 72 65 65 28 6e 65 77 61 72 67  .....free(newarg
35a0: 76 29 3b 0a 09 09 09 09 09 09 09 72 65 74 75 72  v);........retur
35b0: 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09  n(-1);.......}..
35c0: 09 09 09 09 09 63 6d 64 6f 70 74 61 72 67 20 3d  .....cmdoptarg =
35d0: 20 61 72 67 76 5b 63 6d 64 61 72 67 69 64 78 5d   argv[cmdargidx]
35e0: 3b 0a 09 09 09 09 09 09 6e 65 77 61 72 67 76 5b  ;.......newargv[
35f0: 6e 65 77 61 72 67 76 69 64 78 2b 2b 5d 20 3d 20  newargvidx++] = 
3600: 63 6d 64 6f 70 74 61 72 67 3b 0a 09 09 09 09 09  cmdoptarg;......
3610: 09 75 73 65 64 61 72 67 76 5b 63 6d 64 61 72 67  .usedargv[cmdarg
3620: 69 64 78 5d 20 3d 20 31 3b 0a 09 09 09 09 09 7d  idx] = 1;......}
3630: 0a 0a 09 09 09 09 09 63 68 6b 72 65 74 76 61 6c  .......chkretval
3640: 20 3d 20 6c 63 5f 68 61 6e 64 6c 65 28 68 61 6e   = lc_handle(han
3650: 64 6c 65 72 2c 20 68 61 6e 64 6c 65 72 2d 3e 76  dler, handler->v
3660: 61 72 2c 20 4e 55 4c 4c 2c 20 63 6d 64 6f 70 74  ar, NULL, cmdopt
3670: 61 72 67 2c 20 4c 43 5f 46 4c 41 47 53 5f 43 4d  arg, LC_FLAGS_CM
3680: 44 4c 49 4e 45 29 3b 0a 09 09 09 09 09 69 66 20  DLINE);......if 
3690: 28 63 68 6b 72 65 74 76 61 6c 20 3c 20 30 29 20  (chkretval < 0) 
36a0: 7b 0a 09 09 09 09 09 09 72 65 74 76 61 6c 20 3d  {.......retval =
36b0: 20 2d 31 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09   -1;......}.....
36c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
36d0: 09 09 09 09 69 66 20 28 68 61 6e 64 6c 65 72 20  ....if (handler 
36e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
36f0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
3700: 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "Unknown option:
3710: 20 2d 25 63 5c 6e 22 2c 20 63 68 29 3b 0a 09 09   -%c\n", ch);...
3720: 09 09 09 6c 63 5f 65 72 72 6e 6f 20 3d 20 4c 43  ...lc_errno = LC
3730: 5f 45 52 52 5f 49 4e 56 43 4d 44 3b 0a 09 09 09  _ERR_INVCMD;....
3740: 09 09 66 72 65 65 28 75 73 65 64 61 72 67 76 29  ..free(usedargv)
3750: 3b 0a 09 09 09 09 09 66 72 65 65 28 6e 65 77 61  ;......free(newa
3760: 72 67 76 29 3b 0a 09 09 09 09 09 72 65 74 75 72  rgv);......retur
3770: 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09  n(-1);.....}....
3780: 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 72  }...}..}...if (r
3790: 65 74 76 61 6c 20 3e 3d 20 30 29 20 7b 0a 09 09  etval >= 0) {...
37a0: 6c 63 5f 6f 70 74 69 6e 64 20 3d 20 6e 65 77 61  lc_optind = newa
37b0: 72 67 76 69 64 78 3b 0a 09 09 66 6f 72 20 28 63  rgvidx;...for (c
37c0: 6d 64 61 72 67 69 64 78 20 3d 20 31 3b 20 63 6d  mdargidx = 1; cm
37d0: 64 61 72 67 69 64 78 20 3c 20 61 72 67 63 3b 20  dargidx < argc; 
37e0: 63 6d 64 61 72 67 69 64 78 2b 2b 29 20 7b 0a 09  cmdargidx++) {..
37f0: 09 09 69 66 20 28 75 73 65 64 61 72 67 76 5b 63  ..if (usedargv[c
3800: 6d 64 61 72 67 69 64 78 5d 20 21 3d 20 30 29 20  mdargidx] != 0) 
3810: 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
3820: 09 09 09 7d 0a 09 09 09 0a 09 09 09 63 6d 64 61  ...}........cmda
3830: 72 67 20 3d 20 61 72 67 76 5b 63 6d 64 61 72 67  rg = argv[cmdarg
3840: 69 64 78 5d 3b 0a 0a 09 09 09 6e 65 77 61 72 67  idx];.....newarg
3850: 76 5b 6e 65 77 61 72 67 76 69 64 78 2b 2b 5d 20  v[newargvidx++] 
3860: 3d 20 63 6d 64 61 72 67 3b 0a 09 09 7d 0a 09 09  = cmdarg;...}...
3870: 66 6f 72 20 28 63 6d 64 61 72 67 69 64 78 20 3d  for (cmdargidx =
3880: 20 31 3b 20 63 6d 64 61 72 67 69 64 78 20 3c 20   1; cmdargidx < 
3890: 61 72 67 63 3b 20 63 6d 64 61 72 67 69 64 78 2b  argc; cmdargidx+
38a0: 2b 29 20 7b 0a 09 09 09 61 72 67 76 5b 63 6d 64  +) {....argv[cmd
38b0: 61 72 67 69 64 78 5d 20 3d 20 6e 65 77 61 72 67  argidx] = newarg
38c0: 76 5b 63 6d 64 61 72 67 69 64 78 5d 3b 0a 09 09  v[cmdargidx];...
38d0: 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 75 73 65 64  }..}...free(used
38e0: 61 72 67 76 29 3b 0a 09 66 72 65 65 28 6e 65 77  argv);..free(new
38f0: 61 72 67 76 29 3b 0a 0a 09 72 65 74 75 72 6e 28  argv);...return(
3900: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 0a 69 6e 74  retval);.}...int
3910: 20 6c 63 5f 70 72 6f 63 65 73 73 5f 76 61 72 28   lc_process_var(
3920: 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 72 2c  const char *var,
3930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 72   const char *var
3940: 61 72 67 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  args, const char
3950: 20 2a 76 61 6c 75 65 2c 20 6c 63 5f 66 6c 61 67   *value, lc_flag
3960: 73 5f 74 20 66 6c 61 67 73 29 20 7b 0a 09 73 74  s_t flags) {..st
3970: 72 75 63 74 20 6c 63 5f 76 61 72 68 61 6e 64 6c  ruct lc_varhandl
3980: 65 72 5f 73 74 20 2a 68 61 6e 64 6c 65 72 20 3d  er_st *handler =
3990: 20 4e 55 4c 4c 3b 0a 09 63 6f 6e 73 74 20 63 68   NULL;..const ch
39a0: 61 72 20 2a 6c 61 73 74 63 6f 6d 70 6f 6e 65 6e  ar *lastcomponen
39b0: 74 5f 68 61 6e 64 6c 65 72 20 3d 20 4e 55 4c 4c  t_handler = NULL
39c0: 2c 20 2a 6c 61 73 74 63 6f 6d 70 6f 6e 65 6e 74  , *lastcomponent
39d0: 5f 76 61 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 6c  _var = NULL;...l
39e0: 61 73 74 63 6f 6d 70 6f 6e 65 6e 74 5f 76 61 72  astcomponent_var
39f0: 20 3d 20 73 74 72 72 63 68 72 28 76 61 72 2c 20   = strrchr(var, 
3a00: 27 2e 27 29 3b 0a 09 69 66 20 28 6c 61 73 74 63  '.');..if (lastc
3a10: 6f 6d 70 6f 6e 65 6e 74 5f 76 61 72 20 3d 3d 20  omponent_var == 
3a20: 4e 55 4c 4c 29 20 7b 0a 09 09 6c 61 73 74 63 6f  NULL) {...lastco
3a30: 6d 70 6f 6e 65 6e 74 5f 76 61 72 20 3d 20 76 61  mponent_var = va
3a40: 72 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6c  r;..} else {...l
3a50: 61 73 74 63 6f 6d 70 6f 6e 65 6e 74 5f 76 61 72  astcomponent_var
3a60: 2b 2b 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 68 61  ++;..}...for (ha
3a70: 6e 64 6c 65 72 20 3d 20 76 61 72 68 61 6e 64 6c  ndler = varhandl
3a80: 65 72 73 3b 20 68 61 6e 64 6c 65 72 20 21 3d 20  ers; handler != 
3a90: 4e 55 4c 4c 3b 20 68 61 6e 64 6c 65 72 20 3d 20  NULL; handler = 
3aa0: 68 61 6e 64 6c 65 72 2d 3e 5f 6e 65 78 74 29 20  handler->_next) 
3ab0: 7b 0a 09 09 2f 2a 20 49 66 20 65 69 74 68 65 72  {.../* If either
3ac0: 20 68 61 6e 64 6c 65 72 2d 3e 76 61 72 20 6f 72   handler->var or
3ad0: 20 76 61 72 20 69 73 20 4e 55 4c 4c 2c 20 73 6b   var is NULL, sk
3ae0: 69 70 2c 20 75 6e 6c 65 73 73 20 62 6f 74 68 20  ip, unless both 
3af0: 61 72 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 09 09 69  are NULL. */...i
3b00: 66 20 28 68 61 6e 64 6c 65 72 2d 3e 76 61 72 20  f (handler->var 
3b10: 21 3d 20 76 61 72 20 26 26 20 28 68 61 6e 64 6c  != var && (handl
3b20: 65 72 2d 3e 76 61 72 20 3d 3d 20 4e 55 4c 4c 20  er->var == NULL 
3b30: 7c 7c 20 76 61 72 20 3d 3d 20 4e 55 4c 4c 29 29  || var == NULL))
3b40: 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a   {....continue;.
3b50: 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 62 6f 74  ..}..../* If bot
3b60: 68 20 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 2c 20  h are not-NULL, 
3b70: 63 6f 6d 70 61 72 65 20 74 68 65 6d 2e 20 2a 2f  compare them. */
3b80: 0a 09 09 69 66 20 28 68 61 6e 64 6c 65 72 2d 3e  ...if (handler->
3b90: 76 61 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  var != NULL) {..
3ba0: 09 09 2f 2a 20 57 69 6c 64 2d 63 61 72 64 2d 69  ../* Wild-card-i
3bb0: 73 68 20 6d 61 74 63 68 2e 20 2a 2f 0a 09 09 09  sh match. */....
3bc0: 69 66 20 28 68 61 6e 64 6c 65 72 2d 3e 76 61 72  if (handler->var
3bd0: 5b 30 5d 20 3d 3d 20 27 2a 27 20 26 26 20 68 61  [0] == '*' && ha
3be0: 6e 64 6c 65 72 2d 3e 76 61 72 5b 31 5d 20 3d 3d  ndler->var[1] ==
3bf0: 20 27 2e 27 29 20 7b 0a 09 09 09 09 2f 2a 20 4f   '.') {...../* O
3c00: 6e 6c 79 20 63 6f 6d 70 61 72 65 20 74 68 65 20  nly compare the 
3c10: 6c 61 73 74 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  last components 
3c20: 2a 2f 0a 0a 09 09 09 09 6c 61 73 74 63 6f 6d 70  */......lastcomp
3c30: 6f 6e 65 6e 74 5f 68 61 6e 64 6c 65 72 20 3d 20  onent_handler = 
3c40: 73 74 72 72 63 68 72 28 68 61 6e 64 6c 65 72 2d  strrchr(handler-
3c50: 3e 76 61 72 2c 20 27 2e 27 29 20 2b 20 31 3b 20  >var, '.') + 1; 
3c60: 2f 2a 20 73 74 72 72 63 68 72 28 29 20 77 6f 6e  /* strrchr() won
3c70: 27 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20  't return NULL, 
3c80: 62 65 63 61 75 73 65 20 77 65 20 61 6c 72 65 61  because we alrea
3c90: 64 79 20 63 68 65 63 6b 65 64 20 69 74 2e 20 2a  dy checked it. *
3ca0: 2f 0a 0a 09 09 09 09 69 66 20 28 73 74 72 63 61  /......if (strca
3cb0: 73 65 63 6d 70 28 6c 61 73 74 63 6f 6d 70 6f 6e  secmp(lastcompon
3cc0: 65 6e 74 5f 68 61 6e 64 6c 65 72 2c 20 6c 61 73  ent_handler, las
3cd0: 74 63 6f 6d 70 6f 6e 65 6e 74 5f 76 61 72 29 20  tcomponent_var) 
3ce0: 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 6f 6e  != 0) {......con
3cf0: 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 09 09 09  tinue;.....}....
3d00: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 61  } else if (strca
3d10: 73 65 63 6d 70 28 68 61 6e 64 6c 65 72 2d 3e 76  secmp(handler->v
3d20: 61 72 2c 20 76 61 72 29 20 21 3d 20 30 29 20 7b  ar, var) != 0) {
3d30: 0a 09 09 09 09 2f 2a 20 45 78 61 63 74 20 28 63  ...../* Exact (c
3d40: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
3d50: 63 6f 6d 70 61 72 69 73 6f 6e 29 20 66 61 69 6c  comparison) fail
3d60: 65 64 2e 20 2a 2f 0a 09 09 09 09 63 6f 6e 74 69  ed. */.....conti
3d70: 6e 75 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  nue;....}...}...
3d80: 09 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 4e 55  .if (value == NU
3d90: 4c 4c 20 26 26 0a 09 09 20 20 20 20 68 61 6e 64  LL &&...    hand
3da0: 6c 65 72 2d 3e 74 79 70 65 20 21 3d 20 4c 43 5f  ler->type != LC_
3db0: 56 41 52 5f 4e 4f 4e 45 20 26 26 0a 09 09 20 20  VAR_NONE &&...  
3dc0: 20 20 68 61 6e 64 6c 65 72 2d 3e 74 79 70 65 20    handler->type 
3dd0: 21 3d 20 4c 43 5f 56 41 52 5f 42 4f 4f 4c 5f 42  != LC_VAR_BOOL_B
3de0: 59 5f 45 58 49 53 54 41 4e 43 45 20 26 26 0a 09  Y_EXISTANCE &&..
3df0: 09 20 20 20 20 68 61 6e 64 6c 65 72 2d 3e 74 79  .    handler->ty
3e00: 70 65 20 21 3d 20 4c 43 5f 56 41 52 5f 53 45 43  pe != LC_VAR_SEC
3e10: 54 49 4f 4e 20 26 26 0a 09 09 20 20 20 20 68 61  TION &&...    ha
3e20: 6e 64 6c 65 72 2d 3e 74 79 70 65 20 21 3d 20 4c  ndler->type != L
3e30: 43 5f 56 41 52 5f 53 45 43 54 49 4f 4e 53 54 41  C_VAR_SECTIONSTA
3e40: 52 54 20 26 26 0a 09 09 20 20 20 20 68 61 6e 64  RT &&...    hand
3e50: 6c 65 72 2d 3e 74 79 70 65 20 21 3d 20 4c 43 5f  ler->type != LC_
3e60: 56 41 52 5f 53 45 43 54 49 4f 4e 45 4e 44 29 20  VAR_SECTIONEND) 
3e70: 7b 0a 09 09 09 6c 63 5f 65 72 72 6e 6f 20 3d 20  {....lc_errno = 
3e80: 4c 43 5f 45 52 52 5f 42 41 44 46 4f 52 4d 41 54  LC_ERR_BADFORMAT
3e90: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  ;....break;...}.
3ea0: 0a 09 09 72 65 74 75 72 6e 28 6c 63 5f 68 61 6e  ...return(lc_han
3eb0: 64 6c 65 28 68 61 6e 64 6c 65 72 2c 20 76 61 72  dle(handler, var
3ec0: 2c 20 76 61 72 61 72 67 73 2c 20 76 61 6c 75 65  , varargs, value
3ed0: 2c 20 66 6c 61 67 73 29 29 3b 0a 09 7d 0a 0a 09  , flags));..}...
3ee0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 7d 0a 0a 69  return(-1);.}..i
3ef0: 6e 74 20 6c 63 5f 72 65 67 69 73 74 65 72 5f 63  nt lc_register_c
3f00: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 63 68  allback(const ch
3f10: 61 72 20 2a 76 61 72 2c 20 63 68 61 72 20 6f 70  ar *var, char op
3f20: 74 2c 20 6c 63 5f 76 61 72 5f 74 79 70 65 5f 74  t, lc_var_type_t
3f30: 20 74 79 70 65 2c 20 69 6e 74 20 28 2a 63 61 6c   type, int (*cal
3f40: 6c 62 61 63 6b 29 28 63 6f 6e 73 74 20 63 68 61  lback)(const cha
3f50: 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  r *, const char 
3f60: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  *, const char *,
3f70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 6c   const char *, l
3f80: 63 5f 66 6c 61 67 73 5f 74 2c 20 76 6f 69 64 20  c_flags_t, void 
3f90: 2a 29 2c 20 76 6f 69 64 20 2a 65 78 74 72 61 29  *), void *extra)
3fa0: 20 7b 0a 09 73 74 72 75 63 74 20 6c 63 5f 76 61   {..struct lc_va
3fb0: 72 68 61 6e 64 6c 65 72 5f 73 74 20 2a 6e 65 77  rhandler_st *new
3fc0: 68 61 6e 64 6c 65 72 20 3d 20 4e 55 4c 4c 3b 0a  handler = NULL;.
3fd0: 0a 09 6e 65 77 68 61 6e 64 6c 65 72 20 3d 20 6d  ..newhandler = m
3fe0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6e 65  alloc(sizeof(*ne
3ff0: 77 68 61 6e 64 6c 65 72 29 29 3b 0a 0a 09 69 66  whandler));...if
4000: 20 28 6e 65 77 68 61 6e 64 6c 65 72 20 3d 3d 20   (newhandler == 
4010: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
4020: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76  (-1);..}...if (v
4030: 61 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ar == NULL) {...
4040: 6e 65 77 68 61 6e 64 6c 65 72 2d 3e 76 61 72 20  newhandler->var 
4050: 3d 20 4e 55 4c 4c 3b 0a 09 7d 20 65 6c 73 65 20  = NULL;..} else 
4060: 7b 0a 09 09 6e 65 77 68 61 6e 64 6c 65 72 2d 3e  {...newhandler->
4070: 76 61 72 20 3d 20 73 74 72 64 75 70 28 76 61 72  var = strdup(var
4080: 29 3b 0a 09 7d 0a 09 6e 65 77 68 61 6e 64 6c 65  );..}..newhandle
4090: 72 2d 3e 6d 6f 64 65 20 3d 20 4c 43 5f 4d 4f 44  r->mode = LC_MOD
40a0: 45 5f 43 41 4c 4c 42 41 43 4b 3b 0a 09 6e 65 77  E_CALLBACK;..new
40b0: 68 61 6e 64 6c 65 72 2d 3e 74 79 70 65 20 3d 20  handler->type = 
40c0: 74 79 70 65 3b 0a 09 6e 65 77 68 61 6e 64 6c 65  type;..newhandle
40d0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 63 61  r->callback = ca
40e0: 6c 6c 62 61 63 6b 3b 0a 09 6e 65 77 68 61 6e 64  llback;..newhand
40f0: 6c 65 72 2d 3e 6f 70 74 20 3d 20 6f 70 74 3b 0a  ler->opt = opt;.
4100: 09 6e 65 77 68 61 6e 64 6c 65 72 2d 3e 65 78 74  .newhandler->ext
4110: 72 61 20 3d 20 65 78 74 72 61 3b 0a 09 6e 65 77  ra = extra;..new
4120: 68 61 6e 64 6c 65 72 2d 3e 5f 6e 65 78 74 20 3d  handler->_next =
4130: 20 76 61 72 68 61 6e 64 6c 65 72 73 3b 0a 0a 09   varhandlers;...
4140: 76 61 72 68 61 6e 64 6c 65 72 73 20 3d 20 6e 65  varhandlers = ne
4150: 77 68 61 6e 64 6c 65 72 3b 0a 0a 09 72 65 74 75  whandler;...retu
4160: 72 6e 28 30 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 63  rn(0);.}..int lc
4170: 5f 72 65 67 69 73 74 65 72 5f 76 61 72 28 63 6f  _register_var(co
4180: 6e 73 74 20 63 68 61 72 20 2a 76 61 72 2c 20 6c  nst char *var, l
4190: 63 5f 76 61 72 5f 74 79 70 65 5f 74 20 74 79 70  c_var_type_t typ
41a0: 65 2c 20 76 6f 69 64 20 2a 64 61 74 61 2c 20 63  e, void *data, c
41b0: 68 61 72 20 6f 70 74 29 20 7b 0a 09 73 74 72 75  har opt) {..stru
41c0: 63 74 20 6c 63 5f 76 61 72 68 61 6e 64 6c 65 72  ct lc_varhandler
41d0: 5f 73 74 20 2a 6e 65 77 68 61 6e 64 6c 65 72 20  _st *newhandler 
41e0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 6e 65 77 68 61 6e  = NULL;...newhan
41f0: 64 6c 65 72 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  dler = malloc(si
4200: 7a 65 6f 66 28 2a 6e 65 77 68 61 6e 64 6c 65 72  zeof(*newhandler
4210: 29 29 3b 0a 0a 09 69 66 20 28 6e 65 77 68 61 6e  ));...if (newhan
4220: 64 6c 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  dler == NULL) {.
4230: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
4240: 0a 0a 09 69 66 20 28 76 61 72 20 3d 3d 20 4e 55  ...if (var == NU
4250: 4c 4c 29 20 7b 0a 09 09 6e 65 77 68 61 6e 64 6c  LL) {...newhandl
4260: 65 72 2d 3e 76 61 72 20 3d 20 4e 55 4c 4c 3b 0a  er->var = NULL;.
4270: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 65 77 68  .} else {...newh
4280: 61 6e 64 6c 65 72 2d 3e 76 61 72 20 3d 20 73 74  andler->var = st
4290: 72 64 75 70 28 76 61 72 29 3b 0a 09 7d 0a 09 6e  rdup(var);..}..n
42a0: 65 77 68 61 6e 64 6c 65 72 2d 3e 6d 6f 64 65 20  ewhandler->mode 
42b0: 3d 20 4c 43 5f 4d 4f 44 45 5f 56 41 52 3b 0a 09  = LC_MODE_VAR;..
42c0: 6e 65 77 68 61 6e 64 6c 65 72 2d 3e 74 79 70 65  newhandler->type
42d0: 20 3d 20 74 79 70 65 3b 0a 09 6e 65 77 68 61 6e   = type;..newhan
42e0: 64 6c 65 72 2d 3e 64 61 74 61 20 3d 20 64 61 74  dler->data = dat
42f0: 61 3b 0a 09 6e 65 77 68 61 6e 64 6c 65 72 2d 3e  a;..newhandler->
4300: 6f 70 74 20 3d 20 6f 70 74 3b 0a 09 6e 65 77 68  opt = opt;..newh
4310: 61 6e 64 6c 65 72 2d 3e 65 78 74 72 61 20 3d 20  andler->extra = 
4320: 4e 55 4c 4c 3b 0a 09 6e 65 77 68 61 6e 64 6c 65  NULL;..newhandle
4330: 72 2d 3e 5f 6e 65 78 74 20 3d 20 76 61 72 68 61  r->_next = varha
4340: 6e 64 6c 65 72 73 3b 0a 0a 09 76 61 72 68 61 6e  ndlers;...varhan
4350: 64 6c 65 72 73 20 3d 20 6e 65 77 68 61 6e 64 6c  dlers = newhandl
4360: 65 72 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  er;...return(0);
4370: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .}..static int l
4380: 63 5f 70 72 6f 63 65 73 73 5f 66 69 6c 65 28 63  c_process_file(c
4390: 6f 6e 73 74 20 63 68 61 72 20 2a 61 70 70 6e 61  onst char *appna
43a0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
43b0: 70 61 74 68 6e 61 6d 65 2c 20 6c 63 5f 63 6f 6e  pathname, lc_con
43c0: 66 5f 74 79 70 65 5f 74 20 74 79 70 65 29 20 7b  f_type_t type) {
43d0: 0a 09 69 6e 74 20 63 68 6b 72 65 74 76 61 6c 20  ..int chkretval 
43e0: 3d 20 30 3b 0a 0a 09 73 77 69 74 63 68 20 28 74  = 0;...switch (t
43f0: 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 4c 43  ype) {...case LC
4400: 5f 43 4f 4e 46 5f 53 45 43 54 49 4f 4e 3a 0a 09  _CONF_SECTION:..
4410: 09 09 63 68 6b 72 65 74 76 61 6c 20 3d 20 6c 63  ..chkretval = lc
4420: 5f 70 72 6f 63 65 73 73 5f 63 6f 6e 66 5f 73 65  _process_conf_se
4430: 63 74 69 6f 6e 28 61 70 70 6e 61 6d 65 2c 20 70  ction(appname, p
4440: 61 74 68 6e 61 6d 65 29 3b 0a 09 09 09 62 72 65  athname);....bre
4450: 61 6b 3b 0a 09 09 63 61 73 65 20 4c 43 5f 43 4f  ak;...case LC_CO
4460: 4e 46 5f 41 50 41 43 48 45 3a 0a 09 09 09 63 68  NF_APACHE:....ch
4470: 6b 72 65 74 76 61 6c 20 3d 20 6c 63 5f 70 72 6f  kretval = lc_pro
4480: 63 65 73 73 5f 63 6f 6e 66 5f 61 70 61 63 68 65  cess_conf_apache
4490: 28 61 70 70 6e 61 6d 65 2c 20 70 61 74 68 6e 61  (appname, pathna
44a0: 6d 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  me);....break;..
44b0: 09 63 61 73 65 20 4c 43 5f 43 4f 4e 46 5f 43 4f  .case LC_CONF_CO
44c0: 4c 4f 4e 3a 0a 09 09 09 63 68 6b 72 65 74 76 61  LON:....chkretva
44d0: 6c 20 3d 20 6c 63 5f 70 72 6f 63 65 73 73 5f 63  l = lc_process_c
44e0: 6f 6e 66 5f 63 6f 6c 6f 6e 28 61 70 70 6e 61 6d  onf_colon(appnam
44f0: 65 2c 20 70 61 74 68 6e 61 6d 65 29 3b 0a 09 09  e, pathname);...
4500: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 4c  .break;...case L
4510: 43 5f 43 4f 4e 46 5f 45 51 55 41 4c 3a 0a 09 09  C_CONF_EQUAL:...
4520: 09 63 68 6b 72 65 74 76 61 6c 20 3d 20 6c 63 5f  .chkretval = lc_
4530: 70 72 6f 63 65 73 73 5f 63 6f 6e 66 5f 65 71 75  process_conf_equ
4540: 61 6c 28 61 70 70 6e 61 6d 65 2c 20 70 61 74 68  al(appname, path
4550: 6e 61 6d 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b  name);....break;
4560: 0a 09 09 63 61 73 65 20 4c 43 5f 43 4f 4e 46 5f  ...case LC_CONF_
4570: 53 50 41 43 45 3a 0a 09 09 09 63 68 6b 72 65 74  SPACE:....chkret
4580: 76 61 6c 20 3d 20 6c 63 5f 70 72 6f 63 65 73 73  val = lc_process
4590: 5f 63 6f 6e 66 5f 73 70 61 63 65 28 61 70 70 6e  _conf_space(appn
45a0: 61 6d 65 2c 20 70 61 74 68 6e 61 6d 65 29 3b 0a  ame, pathname);.
45b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
45c0: 20 4c 43 5f 43 4f 4e 46 5f 58 4d 4c 3a 0a 09 09   LC_CONF_XML:...
45d0: 09 63 68 6b 72 65 74 76 61 6c 20 3d 20 6c 63 5f  .chkretval = lc_
45e0: 70 72 6f 63 65 73 73 5f 63 6f 6e 66 5f 78 6d 6c  process_conf_xml
45f0: 28 61 70 70 6e 61 6d 65 2c 20 70 61 74 68 6e 61  (appname, pathna
4600: 6d 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  me);....break;..
4610: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 63 68 6b  .default:....chk
4620: 72 65 74 76 61 6c 20 3d 20 2d 31 3b 0a 09 09 09  retval = -1;....
4630: 6c 63 5f 65 72 72 6e 6f 20 3d 20 4c 43 5f 45 52  lc_errno = LC_ER
4640: 52 5f 49 4e 56 44 41 54 41 3b 0a 09 09 09 62 72  R_INVDATA;....br
4650: 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  eak;..}...return
4660: 28 63 68 6b 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  (chkretval);.}..
4670: 73 74 61 74 69 63 20 69 6e 74 20 6c 63 5f 70 72  static int lc_pr
4680: 6f 63 65 73 73 5f 66 69 6c 65 73 28 63 6f 6e 73  ocess_files(cons
4690: 74 20 63 68 61 72 20 2a 61 70 70 6e 61 6d 65 2c  t char *appname,
46a0: 20 6c 63 5f 63 6f 6e 66 5f 74 79 70 65 5f 74 20   lc_conf_type_t 
46b0: 74 79 70 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  type, const char
46c0: 20 2a 65 78 74 72 61 63 6f 6e 66 69 67 29 20 7b   *extraconfig) {
46d0: 0a 09 73 74 72 75 63 74 20 70 61 73 73 77 64 20  ..struct passwd 
46e0: 2a 70 77 69 6e 66 6f 20 3d 20 4e 55 4c 4c 3b 0a  *pwinfo = NULL;.
46f0: 09 63 68 61 72 20 63 6f 6e 66 69 67 66 69 6c 65  .char configfile
4700: 73 5b 33 5d 5b 31 33 5d 5b 35 31 32 5d 20 3d 20  s[3][13][512] = 
4710: 7b 7b 7b 30 7d 7d 7d 3b 0a 09 63 68 61 72 20 2a  {{{0}}};..char *
4720: 63 6f 6e 66 69 67 66 69 6c 65 20 3d 20 4e 55 4c  configfile = NUL
4730: 4c 3b 0a 09 63 68 61 72 20 2a 68 6f 6d 65 64 69  L;..char *homedi
4740: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 63  r = NULL;..int c
4750: 6f 6e 66 69 67 73 65 74 69 64 78 20 3d 20 30 2c  onfigsetidx = 0,
4760: 20 63 6f 6e 66 69 67 69 64 78 20 3d 20 30 3b 0a   configidx = 0;.
4770: 09 69 6e 74 20 63 68 6b 72 65 74 76 61 6c 20 3d  .int chkretval =
4780: 20 30 2c 20 72 65 74 76 61 6c 20 3d 20 30 3b 0a   0, retval = 0;.
4790: 0a 09 69 66 20 28 65 78 74 72 61 63 6f 6e 66 69  ..if (extraconfi
47a0: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73  g != NULL) {...s
47b0: 6e 70 72 69 6e 74 66 28 63 6f 6e 66 69 67 66 69  nprintf(configfi
47c0: 6c 65 73 5b 30 5d 5b 30 5d 2c 20 73 69 7a 65 6f  les[0][0], sizeo
47d0: 66 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65 73 29  f(**configfiles)
47e0: 20 2d 20 31 2c 20 22 25 73 22 2c 20 65 78 74 72   - 1, "%s", extr
47f0: 61 63 6f 6e 66 69 67 29 3b 0a 09 7d 0a 09 73 6e  aconfig);..}..sn
4800: 70 72 69 6e 74 66 28 63 6f 6e 66 69 67 66 69 6c  printf(configfil
4810: 65 73 5b 31 5d 5b 30 5d 2c 20 73 69 7a 65 6f 66  es[1][0], sizeof
4820: 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65 73 29 20  (**configfiles) 
4830: 2d 20 31 2c 20 22 2f 65 74 63 2f 25 73 2e 63 66  - 1, "/etc/%s.cf
4840: 67 22 2c 20 61 70 70 6e 61 6d 65 29 3b 0a 09 73  g", appname);..s
4850: 6e 70 72 69 6e 74 66 28 63 6f 6e 66 69 67 66 69  nprintf(configfi
4860: 6c 65 73 5b 31 5d 5b 31 5d 2c 20 73 69 7a 65 6f  les[1][1], sizeo
4870: 66 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65 73 29  f(**configfiles)
4880: 20 2d 20 31 2c 20 22 2f 65 74 63 2f 25 73 2e 63   - 1, "/etc/%s.c
4890: 6f 6e 66 22 2c 20 61 70 70 6e 61 6d 65 29 3b 0a  onf", appname);.
48a0: 09 73 6e 70 72 69 6e 74 66 28 63 6f 6e 66 69 67  .snprintf(config
48b0: 66 69 6c 65 73 5b 31 5d 5b 32 5d 2c 20 73 69 7a  files[1][2], siz
48c0: 65 6f 66 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65  eof(**configfile
48d0: 73 29 20 2d 20 31 2c 20 22 2f 65 74 63 2f 25 73  s) - 1, "/etc/%s
48e0: 2f 25 73 2e 63 66 67 22 2c 20 61 70 70 6e 61 6d  /%s.cfg", appnam
48f0: 65 2c 20 61 70 70 6e 61 6d 65 29 3b 0a 09 73 6e  e, appname);..sn
4900: 70 72 69 6e 74 66 28 63 6f 6e 66 69 67 66 69 6c  printf(configfil
4910: 65 73 5b 31 5d 5b 33 5d 2c 20 73 69 7a 65 6f 66  es[1][3], sizeof
4920: 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65 73 29 20  (**configfiles) 
4930: 2d 20 31 2c 20 22 2f 65 74 63 2f 25 73 2f 25 73  - 1, "/etc/%s/%s
4940: 2e 63 6f 6e 66 22 2c 20 61 70 70 6e 61 6d 65 2c  .conf", appname,
4950: 20 61 70 70 6e 61 6d 65 29 3b 0a 09 73 6e 70 72   appname);..snpr
4960: 69 6e 74 66 28 63 6f 6e 66 69 67 66 69 6c 65 73  intf(configfiles
4970: 5b 31 5d 5b 34 5d 2c 20 73 69 7a 65 6f 66 28 2a  [1][4], sizeof(*
4980: 2a 63 6f 6e 66 69 67 66 69 6c 65 73 29 20 2d 20  *configfiles) - 
4990: 31 2c 20 22 2f 75 73 72 2f 65 74 63 2f 25 73 2e  1, "/usr/etc/%s.
49a0: 63 66 67 22 2c 20 61 70 70 6e 61 6d 65 29 3b 0a  cfg", appname);.
49b0: 09 73 6e 70 72 69 6e 74 66 28 63 6f 6e 66 69 67  .snprintf(config
49c0: 66 69 6c 65 73 5b 31 5d 5b 35 5d 2c 20 73 69 7a  files[1][5], siz
49d0: 65 6f 66 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65  eof(**configfile
49e0: 73 29 20 2d 20 31 2c 20 22 2f 75 73 72 2f 65 74  s) - 1, "/usr/et
49f0: 63 2f 25 73 2e 63 6f 6e 66 22 2c 20 61 70 70 6e  c/%s.conf", appn
4a00: 61 6d 65 29 3b 0a 09 73 6e 70 72 69 6e 74 66 28  ame);..snprintf(
4a10: 63 6f 6e 66 69 67 66 69 6c 65 73 5b 31 5d 5b 36  configfiles[1][6
4a20: 5d 2c 20 73 69 7a 65 6f 66 28 2a 2a 63 6f 6e 66  ], sizeof(**conf
4a30: 69 67 66 69 6c 65 73 29 20 2d 20 31 2c 20 22 2f  igfiles) - 1, "/
4a40: 75 73 72 2f 65 74 63 2f 25 73 2f 25 73 2e 63 66  usr/etc/%s/%s.cf
4a50: 67 22 2c 20 61 70 70 6e 61 6d 65 2c 20 61 70 70  g", appname, app
4a60: 6e 61 6d 65 29 3b 0a 09 73 6e 70 72 69 6e 74 66  name);..snprintf
4a70: 28 63 6f 6e 66 69 67 66 69 6c 65 73 5b 31 5d 5b  (configfiles[1][
4a80: 37 5d 2c 20 73 69 7a 65 6f 66 28 2a 2a 63 6f 6e  7], sizeof(**con
4a90: 66 69 67 66 69 6c 65 73 29 20 2d 20 31 2c 20 22  figfiles) - 1, "
4aa0: 2f 75 73 72 2f 65 74 63 2f 25 73 2f 25 73 2e 63  /usr/etc/%s/%s.c
4ab0: 6f 6e 66 22 2c 20 61 70 70 6e 61 6d 65 2c 20 61  onf", appname, a
4ac0: 70 70 6e 61 6d 65 29 3b 0a 09 73 6e 70 72 69 6e  ppname);..snprin
4ad0: 74 66 28 63 6f 6e 66 69 67 66 69 6c 65 73 5b 31  tf(configfiles[1
4ae0: 5d 5b 38 5d 2c 20 73 69 7a 65 6f 66 28 2a 2a 63  ][8], sizeof(**c
4af0: 6f 6e 66 69 67 66 69 6c 65 73 29 20 2d 20 31 2c  onfigfiles) - 1,
4b00: 20 22 2f 75 73 72 2f 6c 6f 63 61 6c 2f 65 74 63   "/usr/local/etc
4b10: 2f 25 73 2e 63 66 67 22 2c 20 61 70 70 6e 61 6d  /%s.cfg", appnam
4b20: 65 29 3b 0a 09 73 6e 70 72 69 6e 74 66 28 63 6f  e);..snprintf(co
4b30: 6e 66 69 67 66 69 6c 65 73 5b 31 5d 5b 39 5d 2c  nfigfiles[1][9],
4b40: 20 73 69 7a 65 6f 66 28 2a 2a 63 6f 6e 66 69 67   sizeof(**config
4b50: 66 69 6c 65 73 29 20 2d 20 31 2c 20 22 2f 75 73  files) - 1, "/us
4b60: 72 2f 6c 6f 63 61 6c 2f 65 74 63 2f 25 73 2e 63  r/local/etc/%s.c
4b70: 6f 6e 66 22 2c 20 61 70 70 6e 61 6d 65 29 3b 0a  onf", appname);.
4b80: 09 73 6e 70 72 69 6e 74 66 28 63 6f 6e 66 69 67  .snprintf(config
4b90: 66 69 6c 65 73 5b 31 5d 5b 31 30 5d 2c 20 73 69  files[1][10], si
4ba0: 7a 65 6f 66 28 2a 2a 63 6f 6e 66 69 67 66 69 6c  zeof(**configfil
4bb0: 65 73 29 20 2d 20 31 2c 20 22 2f 75 73 72 2f 6c  es) - 1, "/usr/l
4bc0: 6f 63 61 6c 2f 65 74 63 2f 25 73 2f 25 73 2e 63  ocal/etc/%s/%s.c
4bd0: 66 67 22 2c 20 61 70 70 6e 61 6d 65 2c 20 61 70  fg", appname, ap
4be0: 70 6e 61 6d 65 29 3b 0a 09 73 6e 70 72 69 6e 74  pname);..snprint
4bf0: 66 28 63 6f 6e 66 69 67 66 69 6c 65 73 5b 31 5d  f(configfiles[1]
4c00: 5b 31 31 5d 2c 20 73 69 7a 65 6f 66 28 2a 2a 63  [11], sizeof(**c
4c10: 6f 6e 66 69 67 66 69 6c 65 73 29 20 2d 20 31 2c  onfigfiles) - 1,
4c20: 20 22 2f 75 73 72 2f 6c 6f 63 61 6c 2f 65 74 63   "/usr/local/etc
4c30: 2f 25 73 2f 25 73 2e 63 6f 6e 66 22 2c 20 61 70  /%s/%s.conf", ap
4c40: 70 6e 61 6d 65 2c 20 61 70 70 6e 61 6d 65 29 3b  pname, appname);
4c50: 0a 09 69 66 20 28 67 65 74 75 69 64 28 29 20 21  ..if (getuid() !
4c60: 3d 20 30 29 20 7b 0a 09 09 68 6f 6d 65 64 69 72  = 0) {...homedir
4c70: 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 22   = getenv("HOME"
4c80: 29 3b 0a 09 09 69 66 20 28 68 6f 6d 65 64 69 72  );...if (homedir
4c90: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 70   == NULL) {....p
4ca0: 77 69 6e 66 6f 20 3d 20 67 65 74 70 77 75 69 64  winfo = getpwuid
4cb0: 28 67 65 74 75 69 64 28 29 29 3b 0a 09 09 09 69  (getuid());....i
4cc0: 66 20 28 70 77 69 6e 66 6f 20 21 3d 20 4e 55 4c  f (pwinfo != NUL
4cd0: 4c 29 20 7b 0a 09 09 09 09 68 6f 6d 65 64 69 72  L) {.....homedir
4ce0: 20 3d 20 70 77 69 6e 66 6f 2d 3e 70 77 5f 64 69   = pwinfo->pw_di
4cf0: 72 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 09 69 66  r;....}...}...if
4d00: 20 28 68 6f 6d 65 64 69 72 20 21 3d 20 4e 55 4c   (homedir != NUL
4d10: 4c 29 20 7b 0a 09 09 09 69 66 20 28 73 74 72 63  L) {....if (strc
4d20: 6d 70 28 68 6f 6d 65 64 69 72 2c 20 22 2f 22 29  mp(homedir, "/")
4d30: 20 21 3d 20 30 20 26 26 20 61 63 63 65 73 73 28   != 0 && access(
4d40: 68 6f 6d 65 64 69 72 2c 20 52 5f 4f 4b 7c 57 5f  homedir, R_OK|W_
4d50: 4f 4b 7c 58 5f 4f 4b 29 20 3d 3d 20 30 29 20 7b  OK|X_OK) == 0) {
4d60: 0a 09 09 09 09 73 6e 70 72 69 6e 74 66 28 63 6f  .....snprintf(co
4d70: 6e 66 69 67 66 69 6c 65 73 5b 32 5d 5b 30 5d 2c  nfigfiles[2][0],
4d80: 20 73 69 7a 65 6f 66 28 2a 2a 63 6f 6e 66 69 67   sizeof(**config
4d90: 66 69 6c 65 73 29 20 2d 20 31 2c 20 22 25 73 2f  files) - 1, "%s/
4da0: 2e 25 73 72 63 22 2c 20 68 6f 6d 65 64 69 72 2c  .%src", homedir,
4db0: 20 61 70 70 6e 61 6d 65 29 3b 0a 09 09 09 09 73   appname);.....s
4dc0: 6e 70 72 69 6e 74 66 28 63 6f 6e 66 69 67 66 69  nprintf(configfi
4dd0: 6c 65 73 5b 32 5d 5b 31 5d 2c 20 73 69 7a 65 6f  les[2][1], sizeo
4de0: 66 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65 73 29  f(**configfiles)
4df0: 20 2d 20 31 2c 20 22 25 73 2f 2e 25 73 2e 63 66   - 1, "%s/.%s.cf
4e00: 67 22 2c 20 68 6f 6d 65 64 69 72 2c 20 61 70 70  g", homedir, app
4e10: 6e 61 6d 65 29 3b 0a 09 09 09 09 73 6e 70 72 69  name);.....snpri
4e20: 6e 74 66 28 63 6f 6e 66 69 67 66 69 6c 65 73 5b  ntf(configfiles[
4e30: 32 5d 5b 32 5d 2c 20 73 69 7a 65 6f 66 28 2a 2a  2][2], sizeof(**
4e40: 63 6f 6e 66 69 67 66 69 6c 65 73 29 20 2d 20 31  configfiles) - 1
4e50: 2c 20 22 25 73 2f 2e 25 73 2e 63 6f 6e 66 22 2c  , "%s/.%s.conf",
4e60: 20 68 6f 6d 65 64 69 72 2c 20 61 70 70 6e 61 6d   homedir, appnam
4e70: 65 29 3b 0a 09 09 09 09 73 6e 70 72 69 6e 74 66  e);.....snprintf
4e80: 28 63 6f 6e 66 69 67 66 69 6c 65 73 5b 32 5d 5b  (configfiles[2][
4e90: 33 5d 2c 20 73 69 7a 65 6f 66 28 2a 2a 63 6f 6e  3], sizeof(**con
4ea0: 66 69 67 66 69 6c 65 73 29 20 2d 20 31 2c 20 22  figfiles) - 1, "
4eb0: 25 73 2f 2e 25 73 2f 25 73 2e 63 66 67 22 2c 20  %s/.%s/%s.cfg", 
4ec0: 68 6f 6d 65 64 69 72 2c 20 61 70 70 6e 61 6d 65  homedir, appname
4ed0: 2c 20 61 70 70 6e 61 6d 65 29 3b 0a 09 09 09 09  , appname);.....
4ee0: 73 6e 70 72 69 6e 74 66 28 63 6f 6e 66 69 67 66  snprintf(configf
4ef0: 69 6c 65 73 5b 32 5d 5b 34 5d 2c 20 73 69 7a 65  iles[2][4], size
4f00: 6f 66 28 2a 2a 63 6f 6e 66 69 67 66 69 6c 65 73  of(**configfiles
4f10: 29 20 2d 20 31 2c 20 22 25 73 2f 2e 25 73 2f 25  ) - 1, "%s/.%s/%
4f20: 73 2e 63 6f 6e 66 22 2c 20 68 6f 6d 65 64 69 72  s.conf", homedir
4f30: 2c 20 61 70 70 6e 61 6d 65 2c 20 61 70 70 6e 61  , appname, appna
4f40: 6d 65 29 3b 0a 09 09 09 09 73 6e 70 72 69 6e 74  me);.....snprint
4f50: 66 28 63 6f 6e 66 69 67 66 69 6c 65 73 5b 32 5d  f(configfiles[2]
4f60: 5b 35 5d 2c 20 73 69 7a 65 6f 66 28 2a 2a 63 6f  [5], sizeof(**co
4f70: 6e 66 69 67 66 69 6c 65 73 29 20 2d 20 31 2c 20  nfigfiles) - 1, 
4f80: 22 25 73 2f 2e 25 73 2f 63 6f 6e 66 69 67 22 2c  "%s/.%s/config",
4f90: 20 68 6f 6d 65 64 69 72 2c 20 61 70 70 6e 61 6d   homedir, appnam
4fa0: 65 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  e);....}...}..}.
4fb0: 0a 09 66 6f 72 20 28 63 6f 6e 66 69 67 73 65 74  ..for (configset
4fc0: 69 64 78 20 3d 20 30 3b 20 63 6f 6e 66 69 67 73  idx = 0; configs
4fd0: 65 74 69 64 78 20 3c 20 33 3b 20 63 6f 6e 66 69  etidx < 3; confi
4fe0: 67 73 65 74 69 64 78 2b 2b 29 20 7b 0a 09 09 66  gsetidx++) {...f
4ff0: 6f 72 20 28 63 6f 6e 66 69 67 69 64 78 20 3d 20  or (configidx = 
5000: 30 3b 20 63 6f 6e 66 69 67 69 64 78 20 3c 20 31  0; configidx < 1
5010: 33 3b 20 63 6f 6e 66 69 67 69 64 78 2b 2b 29 20  3; configidx++) 
5020: 7b 0a 09 09 09 63 6f 6e 66 69 67 66 69 6c 65 20  {....configfile 
5030: 3d 20 63 6f 6e 66 69 67 66 69 6c 65 73 5b 63 6f  = configfiles[co
5040: 6e 66 69 67 73 65 74 69 64 78 5d 5b 63 6f 6e 66  nfigsetidx][conf
5050: 69 67 69 64 78 5d 3b 0a 09 09 09 69 66 20 28 63  igidx];....if (c
5060: 6f 6e 66 69 67 66 69 6c 65 5b 30 5d 20 3d 3d 20  onfigfile[0] == 
5070: 27 5c 30 27 29 20 7b 0a 09 09 09 09 62 72 65 61  '\0') {.....brea
5080: 6b 3b 0a 09 09 09 7d 0a 09 09 09 69 66 20 28 61  k;....}....if (a
5090: 63 63 65 73 73 28 63 6f 6e 66 69 67 66 69 6c 65  ccess(configfile
50a0: 2c 20 52 5f 4f 4b 29 20 3d 3d 20 30 29 20 7b 0a  , R_OK) == 0) {.
50b0: 09 09 09 09 63 68 6b 72 65 74 76 61 6c 20 3d 20  ....chkretval = 
50c0: 6c 63 5f 70 72 6f 63 65 73 73 5f 66 69 6c 65 28  lc_process_file(
50d0: 61 70 70 6e 61 6d 65 2c 20 63 6f 6e 66 69 67 66  appname, configf
50e0: 69 6c 65 2c 20 74 79 70 65 29 3b 0a 09 09 09 09  ile, type);.....
50f0: 69 66 20 28 63 68 6b 72 65 74 76 61 6c 20 3c 20  if (chkretval < 
5100: 30 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  0) {......retval
5110: 20 3d 20 2d 31 3b 0a 09 09 09 09 7d 0a 09 09 09   = -1;.....}....
5120: 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
5130: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
5140: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
5150: 76 6f 69 64 20 6c 63 5f 63 6c 65 61 6e 75 70 28  void lc_cleanup(
5160: 76 6f 69 64 29 20 7b 0a 09 73 74 72 75 63 74 20  void) {..struct 
5170: 6c 63 5f 76 61 72 68 61 6e 64 6c 65 72 5f 73 74  lc_varhandler_st
5180: 20 2a 68 61 6e 64 6c 65 72 20 3d 20 4e 55 4c 4c   *handler = NULL
5190: 2c 20 2a 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  , *next = NULL;.
51a0: 0a 09 68 61 6e 64 6c 65 72 20 3d 20 76 61 72 68  ..handler = varh
51b0: 61 6e 64 6c 65 72 73 3b 0a 09 77 68 69 6c 65 20  andlers;..while 
51c0: 28 68 61 6e 64 6c 65 72 20 21 3d 20 4e 55 4c 4c  (handler != NULL
51d0: 29 20 7b 0a 09 09 69 66 20 28 68 61 6e 64 6c 65  ) {...if (handle
51e0: 72 2d 3e 76 61 72 20 21 3d 20 4e 55 4c 4c 29 20  r->var != NULL) 
51f0: 7b 0a 09 09 09 66 72 65 65 28 68 61 6e 64 6c 65  {....free(handle
5200: 72 2d 3e 76 61 72 29 3b 0a 09 09 7d 0a 0a 09 09  r->var);...}....
5210: 6e 65 78 74 20 3d 20 68 61 6e 64 6c 65 72 2d 3e  next = handler->
5220: 5f 6e 65 78 74 3b 0a 0a 09 09 66 72 65 65 28 68  _next;....free(h
5230: 61 6e 64 6c 65 72 29 3b 0a 0a 09 09 68 61 6e 64  andler);....hand
5240: 6c 65 72 20 3d 20 6e 65 78 74 3b 0a 09 7d 0a 0a  ler = next;..}..
5250: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 69 6e 74 20  .return;.}..int 
5260: 6c 63 5f 70 72 6f 63 65 73 73 28 69 6e 74 20 61  lc_process(int a
5270: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
5280: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 70  , const char *ap
5290: 70 6e 61 6d 65 2c 20 6c 63 5f 63 6f 6e 66 5f 74  pname, lc_conf_t
52a0: 79 70 65 5f 74 20 74 79 70 65 2c 20 63 6f 6e 73  ype_t type, cons
52b0: 74 20 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b  t char *extra) {
52c0: 0a 09 69 6e 74 20 72 65 74 76 61 6c 20 3d 20 30  ..int retval = 0
52d0: 2c 20 63 68 6b 72 65 74 76 61 6c 20 3d 20 30 3b  , chkretval = 0;
52e0: 0a 0a 09 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6e  .../* Handle con
52f0: 66 69 67 20 66 69 6c 65 73 2e 20 2a 2f 0a 09 63  fig files. */..c
5300: 68 6b 72 65 74 76 61 6c 20 3d 20 6c 63 5f 70 72  hkretval = lc_pr
5310: 6f 63 65 73 73 5f 66 69 6c 65 73 28 61 70 70 6e  ocess_files(appn
5320: 61 6d 65 2c 20 74 79 70 65 2c 20 65 78 74 72 61  ame, type, extra
5330: 29 3b 0a 09 69 66 20 28 63 68 6b 72 65 74 76 61  );..if (chkretva
5340: 6c 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 76 61  l < 0) {...retva
5350: 6c 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  l = -1;..}.../* 
5360: 48 61 6e 64 6c 65 20 65 6e 76 69 72 6f 6e 6d 65  Handle environme
5370: 6e 74 20 76 61 72 69 61 62 6c 65 73 2e 2a 2f 0a  nt variables.*/.
5380: 09 63 68 6b 72 65 74 76 61 6c 20 3d 20 6c 63 5f  .chkretval = lc_
5390: 70 72 6f 63 65 73 73 5f 65 6e 76 69 72 6f 6e 6d  process_environm
53a0: 65 6e 74 28 61 70 70 6e 61 6d 65 29 3b 0a 09 69  ent(appname);..i
53b0: 66 20 28 63 68 6b 72 65 74 76 61 6c 20 3c 20 30  f (chkretval < 0
53c0: 29 20 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20 2d  ) {...retval = -
53d0: 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 48 61 6e 64 6c  1;..}.../* Handl
53e0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61  e command line a
53f0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 63 68 6b  rguments */..chk
5400: 72 65 74 76 61 6c 20 3d 20 6c 63 5f 70 72 6f 63  retval = lc_proc
5410: 65 73 73 5f 63 6d 64 6c 69 6e 65 28 61 72 67 63  ess_cmdline(argc
5420: 2c 20 61 72 67 76 29 3b 0a 09 69 66 20 28 63 68  , argv);..if (ch
5430: 6b 72 65 74 76 61 6c 20 3c 20 30 29 20 7b 0a 09  kretval < 0) {..
5440: 09 72 65 74 76 61 6c 20 3d 20 2d 31 3b 0a 09 7d  .retval = -1;..}
5450: 0a 0a 09 2f 2a 20 46 72 65 65 20 6f 75 72 20 73  .../* Free our s
5460: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 09 6c  tructures. */..l
5470: 63 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 0a 09 72  c_cleanup();...r
5480: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
5490: 0a 0a 0a 6c 63 5f 65 72 72 5f 74 20 6c 63 5f 67  ...lc_err_t lc_g
54a0: 65 74 65 72 72 6e 6f 28 76 6f 69 64 29 20 7b 0a  eterrno(void) {.
54b0: 09 6c 63 5f 65 72 72 5f 74 20 72 65 74 76 61 6c  .lc_err_t retval
54c0: 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6c 63 5f  ;...retval = lc_
54d0: 65 72 72 6e 6f 3b 0a 0a 09 6c 63 5f 65 72 72 6e  errno;...lc_errn
54e0: 6f 20 3d 20 4c 43 5f 45 52 52 5f 4e 4f 4e 45 3b  o = LC_ERR_NONE;
54f0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
5500: 29 3b 0a 7d 0a 0a 63 68 61 72 20 2a 6c 63 5f 67  );.}..char *lc_g
5510: 65 74 65 72 72 73 74 72 28 76 6f 69 64 29 20 7b  eterrstr(void) {
5520: 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 20 3d  ..char *retval =
5530: 20 4e 55 4c 4c 3b 0a 0a 09 73 77 69 74 63 68 20   NULL;...switch 
5540: 28 6c 63 5f 65 72 72 6e 6f 29 20 7b 0a 09 09 63  (lc_errno) {...c
5550: 61 73 65 20 4c 43 5f 45 52 52 5f 4e 4f 4e 45 3a  ase LC_ERR_NONE:
5560: 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 22 53 75  ....retval = "Su
5570: 63 63 65 73 73 22 3b 0a 09 09 09 62 72 65 61 6b  ccess";....break
5580: 3b 0a 09 09 63 61 73 65 20 4c 43 5f 45 52 52 5f  ;...case LC_ERR_
5590: 49 4e 56 43 4d 44 3a 0a 09 09 09 72 65 74 76 61  INVCMD:....retva
55a0: 6c 20 3d 20 22 49 6e 76 61 6c 69 64 20 63 6f 6d  l = "Invalid com
55b0: 6d 61 6e 64 22 3b 0a 09 09 09 62 72 65 61 6b 3b  mand";....break;
55c0: 0a 09 09 63 61 73 65 20 4c 43 5f 45 52 52 5f 49  ...case LC_ERR_I
55d0: 4e 56 53 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65  NVSECTION:....re
55e0: 74 76 61 6c 20 3d 20 22 49 6e 76 61 6c 69 64 20  tval = "Invalid 
55f0: 73 65 63 74 69 6f 6e 22 3b 0a 09 09 09 62 72 65  section";....bre
5600: 61 6b 3b 0a 09 09 63 61 73 65 20 4c 43 5f 45 52  ak;...case LC_ER
5610: 52 5f 49 4e 56 44 41 54 41 3a 0a 09 09 09 72 65  R_INVDATA:....re
5620: 74 76 61 6c 20 3d 20 22 49 6e 76 61 6c 69 64 20  tval = "Invalid 
5630: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61  application data
5640: 20 28 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72   (internal error
5650: 29 22 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  )";....break;...
5660: 63 61 73 65 20 4c 43 5f 45 52 52 5f 42 41 44 46  case LC_ERR_BADF
5670: 4f 52 4d 41 54 3a 0a 09 09 09 72 65 74 76 61 6c  ORMAT:....retval
5680: 20 3d 20 22 42 61 64 20 64 61 74 61 20 73 70 65   = "Bad data spe
5690: 63 69 66 69 65 64 20 6f 72 20 69 6e 63 6f 72 72  cified or incorr
56a0: 65 63 74 20 66 6f 72 6d 61 74 2e 22 3b 0a 09 09  ect format.";...
56b0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 4c  .break;...case L
56c0: 43 5f 45 52 52 5f 43 41 4e 54 4f 50 45 4e 3a 0a  C_ERR_CANTOPEN:.
56d0: 09 09 09 72 65 74 76 61 6c 20 3d 20 22 43 61 6e  ...retval = "Can
56e0: 27 74 20 6f 70 65 6e 20 66 69 6c 65 2e 22 3b 0a  't open file.";.
56f0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
5700: 20 4c 43 5f 45 52 52 5f 43 41 4c 4c 42 41 43 4b   LC_ERR_CALLBACK
5710: 3a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 22 45  :....retval = "E
5720: 72 72 6f 72 20 72 65 74 75 72 6e 20 66 72 6f 6d  rror return from
5730: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 6e   application han
5740: 64 6c 65 72 2e 22 3b 0a 09 09 09 62 72 65 61 6b  dler.";....break
5750: 3b 0a 09 09 63 61 73 65 20 4c 43 5f 45 52 52 5f  ;...case LC_ERR_
5760: 45 4e 4f 4d 45 4d 3a 0a 09 09 09 72 65 74 76 61  ENOMEM:....retva
5770: 6c 20 3d 20 22 49 6e 73 75 66 66 63 69 65 6e 74  l = "Insuffcient
5780: 20 6d 65 6d 6f 72 79 2e 22 3b 0a 09 09 09 62 72   memory.";....br
5790: 65 61 6b 3b 0a 09 7d 0a 0a 09 6c 63 5f 65 72 72  eak;..}...lc_err
57a0: 6e 6f 20 3d 20 4c 43 5f 45 52 52 5f 4e 4f 4e 45  no = LC_ERR_NONE
57b0: 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21  ;...if (retval !
57c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
57d0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 09  rn(retval);..}..
57e0: 72 65 74 75 72 6e 28 22 55 6e 6b 6e 6f 77 6e 20  return("Unknown 
57f0: 65 72 72 6f 72 22 29 3b 0a 7d 0a                 error");.}.