Kannel: Open Source WAP and SMS gateway  $Revision: 5037 $
cfg.h File Reference

Go to the source code of this file.

Macros

#define cfg_get(grp, varname)   cfg_get_real(grp, varname, __FILE__, __LINE__, __func__)
 

Typedefs

typedef struct Cfg Cfg
 
typedef struct CfgLoc CfgLoc
 
typedef struct CfgGroup CfgGroup
 

Functions

Cfgcfg_create (Octstr *filename)
 
void cfg_destroy (Cfg *cfg)
 
int cfg_read (Cfg *cfg)
 
void cfg_add_hooks (void *allowed, void *single)
 
CfgGroupcfg_get_single_group (Cfg *cfg, Octstr *name)
 
Listcfg_get_multi_group (Cfg *cfg, Octstr *name)
 
Octstrcfg_get_group_name (CfgGroup *grp)
 
Octstrcfg_get_group_checksum (CfgGroup *grp,...)
 
Octstrcfg_get_configfile (CfgGroup *grp)
 
Octstrcfg_get_real (CfgGroup *grp, Octstr *varname, const char *file, long line, const char *func)
 
int cfg_get_integer (long *n, CfgGroup *grp, Octstr *varname)
 
int cfg_get_bool (int *n, CfgGroup *grp, Octstr *varname)
 
Listcfg_get_list (CfgGroup *grp, Octstr *varname)
 
void cfg_set (CfgGroup *grp, Octstr *varname, Octstr *value)
 
void grp_dump (CfgGroup *grp)
 
void cfg_dump (Cfg *cfg)
 
void cfg_init (void)
 
void cfg_shutdown (void)
 
void cfg_dump_all (void)
 

Macro Definition Documentation

Typedef Documentation

typedef struct Cfg Cfg

Definition at line 69 of file cfg.h.

typedef struct CfgGroup CfgGroup

Definition at line 71 of file cfg.h.

typedef struct CfgLoc CfgLoc

Definition at line 70 of file cfg.h.

Function Documentation

void cfg_add_hooks ( void *  allowed,
void *  single 
)

Definition at line 253 of file cfg.c.

References gwlist_append().

254 {
255  gwlist_append(allowed_hooks, allowed);
256  gwlist_append(single_hooks, single);
257 }
void gwlist_append(List *list, void *item)
Definition: list.c:179
static List * allowed_hooks
Definition: cfg.c:177
static List * single_hooks
Definition: cfg.c:178
Cfg* cfg_create ( Octstr filename)

Definition at line 318 of file cfg.c.

References cfg, destroy_group(), destroy_group_list(), dict_create(), Cfg::filename, Cfg::multi_groups, octstr_duplicate, and Cfg::single_groups.

Referenced by at2_read_modems(), bb_reload_smsc_groups(), config_reload(), main(), and read_test_ppg_config().

319 {
320  Cfg *cfg;
321 
322  cfg = gw_malloc(sizeof(*cfg));
323  cfg->filename = octstr_duplicate(filename);
326 
327  return cfg;
328 }
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
Definition: dict.c:192
static void destroy_group_list(void *arg)
Definition: cfg.c:136
Dict * multi_groups
Definition: cfg.c:167
Definition: cfg.c:164
#define octstr_duplicate(ostr)
Definition: octstr.h:187
static void destroy_group(void *arg)
Definition: cfg.c:93
static Cfg * cfg
Definition: smsbox.c:115
Octstr * filename
Definition: cfg.c:165
Dict * single_groups
Definition: cfg.c:166
void cfg_destroy ( Cfg cfg)

Definition at line 331 of file cfg.c.

References dict_destroy(), Cfg::filename, Cfg::multi_groups, octstr_destroy(), and Cfg::single_groups.

Referenced by at2_read_modems(), bb_reload_smsc_groups(), config_reload(), init_wapbox(), main(), read_ppg_config(), and read_test_ppg_config().

332 {
333  if (cfg != NULL) {
334  octstr_destroy(cfg->filename);
337  gw_free(cfg);
338  }
339 }
Dict * multi_groups
Definition: cfg.c:167
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
void dict_destroy(Dict *dict)
Definition: dict.c:215
Octstr * filename
Definition: cfg.c:165
Dict * single_groups
Definition: cfg.c:166
void cfg_dump ( Cfg cfg)

Definition at line 832 of file cfg.c.

References cfg_get_multi_group(), cfg_get_single_group(), debug(), dict_keys(), Cfg::filename, grp_dump(), gwlist_destroy(), gwlist_extract_first(), Cfg::multi_groups, name, octstr_destroy(), octstr_get_cstr, and Cfg::single_groups.

Referenced by init_wapbox(), main(), and read_test_ppg_config().

833 {
834  CfgGroup *grp;
835  List *list;
836  List *names;
837  Octstr *name;
838 
839  debug("gwlib.cfg", 0, "Dumping Cfg %p", (void *) cfg);
840  debug("gwlib.cfg", 0, " filename = <%s>",
841  octstr_get_cstr(cfg->filename));
842 
843  names = dict_keys(cfg->single_groups);
844  while ((name = gwlist_extract_first(names)) != NULL) {
845  grp = cfg_get_single_group(cfg, name);
846  if (grp != NULL)
847  grp_dump(grp);
848  octstr_destroy(name);
849  }
850  gwlist_destroy(names, NULL);
851 
852  names = dict_keys(cfg->multi_groups);
853  while ((name = gwlist_extract_first(names)) != NULL) {
854  list = cfg_get_multi_group(cfg, name);
855  while ((grp = gwlist_extract_first(list)) != NULL)
856  grp_dump(grp);
857  gwlist_destroy(list, NULL);
858  octstr_destroy(name);
859  }
860  gwlist_destroy(names, NULL);
861 
862  debug("gwlib.cfg", 0, "Dump ends.");
863 }
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
Dict * multi_groups
Definition: cfg.c:167
void * gwlist_extract_first(List *list)
Definition: list.c:305
void grp_dump(CfgGroup *grp)
Definition: cfg.c:808
List * cfg_get_multi_group(Cfg *cfg, Octstr *name)
Definition: cfg.c:642
char * name
Definition: smsc_cimd2.c:212
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Definition: octstr.c:118
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
Definition: cfg.c:73
List * dict_keys(Dict *dict)
Definition: dict.c:347
Octstr * filename
Definition: cfg.c:165
CfgGroup * cfg_get_single_group(Cfg *cfg, Octstr *name)
Definition: cfg.c:636
Definition: list.c:102
Dict * single_groups
Definition: cfg.c:166
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145
void cfg_dump_all ( void  )

Definition at line 866 of file cfg.c.

Referenced by get_and_set_debugs().

867 {
868  #define OCTSTR(name) \
869  printf("%s = <please consult user doc>\n", #name);
870  #define SINGLE_GROUP(name, fields) \
871  printf("#\n# Single Group\n#\n"); \
872  printf("group = %s\n", #name); \
873  fields; \
874  printf("\n\n");
875  #define MULTI_GROUP(name, fields) \
876  printf("#\n# Multi Group\n#\n"); \
877  printf("group = %s\n", #name); \
878  fields; \
879  printf("\n\n");
880  #include "cfg.def"
881 }
int cfg_get_bool ( int *  n,
CfgGroup grp,
Octstr varname 
)

Definition at line 756 of file cfg.c.

References cfg_get, octstr_case_compare(), octstr_destroy(), octstr_imm(), and warning().

Referenced by at2_read_modems(), config_reload(), create_onetrans(), httpadmin_start(), init_bearerbox(), init_reroute(), init_smsbox(), init_wapbox(), read_ppg_config(), read_test_ppg_config(), smsbox_start(), smsc2_start(), smsc_at2_create(), smsc_cimd2_create(), smsc_http_create(), smsc_oisd_create(), smsc_smpp_create(), smsc_soap_create(), smscconn_create(), and wapbox_start().

757 {
758  Octstr *os;
759 
760  os = cfg_get(grp, varname);
761  if (os == NULL) {
762  *n = 0;
763  return -1;
764  }
765  if (octstr_case_compare(os, octstr_imm("true")) == 0
766  || octstr_case_compare(os, octstr_imm("yes")) == 0
767  || octstr_case_compare(os, octstr_imm("on")) == 0
768  || octstr_case_compare(os, octstr_imm("1")) == 0)
769  {
770  *n = 1;
771  } else if (octstr_case_compare(os, octstr_imm("false")) == 0
772  || octstr_case_compare(os, octstr_imm("no")) == 0
773  || octstr_case_compare(os, octstr_imm("off")) == 0
774  || octstr_case_compare(os, octstr_imm("0")) == 0)
775  {
776  *n = 0;
777  }
778  else {
779  *n = 1;
780  warning(0, "bool variable set to strange value, assuming 'true'");
781  }
782  octstr_destroy(os);
783  return 0;
784 }
#define cfg_get(grp, varname)
Definition: cfg.h:86
Octstr * octstr_imm(const char *cstr)
Definition: octstr.c:281
int octstr_case_compare(const Octstr *os1, const Octstr *os2)
Definition: octstr.c:901
void warning(int err, const char *fmt,...)
Definition: log.c:624
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Definition: octstr.c:118
Octstr* cfg_get_configfile ( CfgGroup grp)

Definition at line 713 of file cfg.c.

References CfgGroup::configfile, and octstr_duplicate.

Referenced by smsc_at2_create().

714 {
715  return octstr_duplicate(grp->configfile);
716 }
#define octstr_duplicate(ostr)
Definition: octstr.h:187
Octstr * configfile
Definition: cfg.c:76
Octstr* cfg_get_group_checksum ( CfgGroup grp,
  ... 
)

Definition at line 663 of file cfg.c.

References dict_get(), dict_keys(), gwlist_append(), gwlist_create, gwlist_delete_equal(), gwlist_destroy(), gwlist_extract_first(), gwlist_search(), gwlist_sort(), md5(), CfgGroup::name, octstr_append(), octstr_cmp_cb(), octstr_destroy(), octstr_duplicate, octstr_get_cstr, octstr_sort_cb(), panic, and CfgGroup::vars.

Referenced by cmp_conn_grp_checksum(), cmp_rout_grp_checksum(), smscconn_create(), and smscconn_reconfig().

664 {
665  va_list args;
666  Octstr *ret, *os, *key, *val;
667  List *exclude, *keys;
668 
669  exclude = gwlist_create();
670 
671  /*
672  * Variadic Octstr* arguments may contain the
673  * config key names that DO NOT go into the
674  * checksum computation. This allows differential
675  * compares and detection of single changes.
676  */
677  va_start(args, grp);
678  while ((os = va_arg(args, Octstr*)) != NULL) {
679  gwlist_append(exclude, os);
680  }
681  va_end(args);
682 
683  /* all configured config names of this group */
684  keys = dict_keys(grp->vars);
685 
686  /* remove all excluded configs names */
687  while ((os = gwlist_extract_first(exclude)) != NULL) {
688  if ((key = gwlist_search(keys, os, octstr_cmp_cb)) != NULL) {
689  if (gwlist_delete_equal(keys, key) != 1)
690  panic(0, "%s: multiple config variables with same name `%s'?!", __func__,
691  octstr_get_cstr(key));
692  octstr_destroy(key);
693  }
694  }
695  gwlist_destroy(exclude, NULL);
696 
697  os = octstr_duplicate(grp->name);
699  while ((key = gwlist_extract_first(keys)) != NULL) {
700  octstr_append(os, key);
701  if ((val = dict_get(grp->vars, key)) != NULL)
702  octstr_append(os, val);
703  octstr_destroy(key);
704  }
705  gwlist_destroy(keys, NULL);
706 
707  ret = md5(os);
708  octstr_destroy(os);
709 
710  return ret;
711 }
Octstr * md5(Octstr *data)
Definition: md5.c:387
void * gwlist_search(List *list, void *pattern, int(*cmp)(void *, void *))
Definition: list.c:486
void gwlist_append(List *list, void *item)
Definition: list.c:179
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:1502
void gwlist_sort(List *list, int(*cmp)(const void *, const void *))
Definition: list.c:576
Octstr * name
Definition: cfg.c:74
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
static int octstr_cmp_cb(void *a, void *b)
Definition: cfg.c:158
void * gwlist_extract_first(List *list)
Definition: list.c:305
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
static int octstr_sort_cb(const void *a, const void *b)
Definition: cfg.c:149
#define octstr_duplicate(ostr)
Definition: octstr.h:187
long gwlist_delete_equal(List *list, void *item)
Definition: list.c:266
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Definition: octstr.c:118
#define panic
Definition: log.h:87
List * dict_keys(Dict *dict)
Definition: dict.c:347
#define gwlist_create()
Definition: list.h:136
Definition: list.c:102
Dict * vars
Definition: cfg.c:75
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145
Octstr* cfg_get_group_name ( CfgGroup grp)

Definition at line 658 of file cfg.c.

References CfgGroup::name, and octstr_duplicate.

Referenced by create_onetrans().

659 {
660  return octstr_duplicate(grp->name);
661 }
Octstr * name
Definition: cfg.c:74
#define octstr_duplicate(ostr)
Definition: octstr.h:187
int cfg_get_integer ( long *  n,
CfgGroup grp,
Octstr varname 
)

Definition at line 739 of file cfg.c.

References cfg_get, octstr_destroy(), and octstr_parse_long().

Referenced by at2_read_modems(), check_config(), config_reload(), create_onetrans(), dlr_db_fields_create(), generic_get_field_map(), httpadmin_start(), init_bearerbox(), init_configuration(), init_smsbox(), init_wapbox(), radius_acct_init(), read_ppg_config(), read_test_ppg_config(), smpp_pdu_init(), smsbox_start(), smsc2_start(), smsc_at2_create(), smsc_cgw_create(), smsc_cimd2_create(), smsc_emi2_create(), smsc_fake_create(), smsc_http_create(), smsc_oisd_create(), smsc_open(), smsc_smpp_create(), smsc_soap_create(), smscconn_create(), smscconn_instances(), and wapbox_start().

740 {
741  Octstr *os;
742  int ret;
743 
744  os = cfg_get(grp, varname);
745  if (os == NULL)
746  return -1;
747  if (octstr_parse_long(n, os, 0, 0) == -1)
748  ret = -1;
749  else
750  ret = 0;
751  octstr_destroy(os);
752  return ret;
753 }
#define cfg_get(grp, varname)
Definition: cfg.h:86
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Definition: octstr.c:118
long octstr_parse_long(long *nump, Octstr *ostr, long pos, int base)
Definition: octstr.c:747
List* cfg_get_list ( CfgGroup grp,
Octstr varname 
)

Definition at line 787 of file cfg.c.

References cfg_get, octstr_destroy(), and octstr_split_words().

Referenced by config_reload(), init_bearerbox(), and init_smsbox().

788 {
789  Octstr *os;
790  List *list;
791 
792  os = cfg_get(grp, varname);
793  if (os == NULL)
794  return NULL;
795 
796  list = octstr_split_words(os);
797  octstr_destroy(os);
798  return list;
799 }
#define cfg_get(grp, varname)
Definition: cfg.h:86
List * octstr_split_words(const Octstr *ostr)
Definition: octstr.c:1600
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Definition: octstr.c:118
Definition: list.c:102
List* cfg_get_multi_group ( Cfg cfg,
Octstr name 
)

Definition at line 642 of file cfg.c.

References dict_get(), gwlist_append(), gwlist_create, gwlist_get(), gwlist_len(), and Cfg::multi_groups.

Referenced by at2_read_modems(), bb_reload_smsc_groups(), cfg_dump(), config_reload(), init_bearerbox(), init_smsbox_routes(), read_ppg_config(), smpp_pdu_init(), smsbox_req_sendota(), smsc2_start(), and urltrans_add_cfg().

643 {
644  List *list, *copy;
645  long i;
646 
647  list = dict_get(cfg->multi_groups, name);
648  if (list == NULL)
649  return NULL;
650 
651  copy = gwlist_create();
652  for (i = 0; i < gwlist_len(list); ++i)
653  gwlist_append(copy, gwlist_get(list, i));
654  return copy;
655 }
void gwlist_append(List *list, void *item)
Definition: list.c:179
long gwlist_len(List *list)
Definition: list.c:166
void * gwlist_get(List *list, long pos)
Definition: list.c:292
Dict * multi_groups
Definition: cfg.c:167
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
#define gwlist_create()
Definition: list.h:136
Definition: list.c:102
Octstr* cfg_get_real ( CfgGroup grp,
Octstr varname,
const char *  file,
long  line,
const char *  func 
)

Definition at line 719 of file cfg.c.

References dict_get(), is_allowed_in_group(), CfgGroup::name, octstr_duplicate, octstr_get_cstr, panic, and CfgGroup::vars.

721 {
722  Octstr *os;
723 
724  if(grp == NULL)
725  panic(0, "Trying to fetch variable `%s' in non-existing group",
726  octstr_get_cstr(varname));
727 
728  if (grp->name != NULL && !is_allowed_in_group(grp->name, varname))
729  panic(0, "Trying to fetch variable `%s' in group `%s', not allowed.",
730  octstr_get_cstr(varname), octstr_get_cstr(grp->name));
731 
732  os = dict_get(grp->vars, varname);
733  if (os == NULL)
734  return NULL;
735  return gw_claim_area_for(octstr_duplicate(os), file, line, func);
736 }
Octstr * name
Definition: cfg.c:74
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
FILE * file
Definition: log.c:133
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
#define octstr_duplicate(ostr)
Definition: octstr.h:187
Definition: octstr.c:118
#define panic
Definition: log.h:87
Dict * vars
Definition: cfg.c:75
static int is_allowed_in_group(Octstr *group, Octstr *variable)
Definition: cfg.c:224
CfgGroup* cfg_get_single_group ( Cfg cfg,
Octstr name 
)

Definition at line 636 of file cfg.c.

References dict_get(), and Cfg::single_groups.

Referenced by cfg_dump(), check_config(), config_reload(), dlr_init(), dlr_init_spool(), httpadmin_start(), init_bearerbox(), init_smsbox(), init_wapbox(), read_ppg_config(), read_test_ppg_config(), smsbox_start(), smsc2_start(), udp_start(), and wapbox_start().

637 {
638  return dict_get(cfg->single_groups, name);
639 }
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
Dict * single_groups
Definition: cfg.c:166
void cfg_init ( void  )

Definition at line 884 of file cfg.c.

References core_is_allowed_in_group(), core_is_single_group(), gwlist_append(), and gwlist_create.

Referenced by gwlib_init().

885 {
886  /* make sure we put our own core hooks into the lists */
889 
892 }
void gwlist_append(List *list, void *item)
Definition: list.c:179
static List * allowed_hooks
Definition: cfg.c:177
static int core_is_single_group(Octstr *query)
Definition: cfg.c:210
static int core_is_allowed_in_group(Octstr *group, Octstr *variable)
Definition: cfg.c:180
static List * single_hooks
Definition: cfg.c:178
#define gwlist_create()
Definition: list.h:136
int cfg_read ( Cfg cfg)

Definition at line 452 of file cfg.c.

References add_group(), cfg_set(), cfgloc_destroy(), CfgGroup::configfile, create_group(), debug(), destroy_group(), error(), expand_file(), file, CfgLoc::filename, filename, Cfg::filename, gwlist_create, gwlist_destroy(), gwlist_extract_first(), gwlist_insert(), gwlist_search(), CfgLoc::line, CfgLoc::line_no, lines, name, octstr_append_cstr(), octstr_copy, octstr_destroy(), octstr_destroy_item(), octstr_duplicate, octstr_get_char(), octstr_get_cstr, octstr_imm(), octstr_item_match(), octstr_len(), octstr_search(), octstr_search_char(), octstr_strip_blanks(), panic, and parse_value().

Referenced by at2_read_modems(), bb_reload_smsc_groups(), config_reload(), main(), and read_test_ppg_config().

453 {
454  CfgLoc *loc;
455  CfgLoc *loc_inc;
456  List *lines;
457  List *expand;
458  List *stack;
459  Octstr *name;
460  Octstr *value;
461  Octstr *filename;
462  CfgGroup *grp;
463  long equals;
464  long error_lineno;
465 
466  loc = loc_inc = NULL;
467 
468  /*
469  * expand initial main config file and add it to the recursion
470  * stack to protect against cycling
471  */
472  if ((lines = expand_file(cfg->filename, 1)) == NULL) {
473  panic(0, "Failed to load main configuration file `%s'. Aborting!",
474  octstr_get_cstr(cfg->filename));
475  }
476  stack = gwlist_create();
477  gwlist_insert(stack, 0, octstr_duplicate(cfg->filename));
478 
479  grp = NULL;
480  error_lineno = 0;
481  while (error_lineno == 0 && (loc = gwlist_extract_first(lines)) != NULL) {
482  octstr_strip_blanks(loc->line);
483  if (octstr_len(loc->line) == 0) {
484  if (grp != NULL && add_group(cfg, grp) == -1) {
485  error_lineno = loc->line_no;
486  destroy_group(grp);
487  }
488  grp = NULL;
489  } else if (octstr_get_char(loc->line, 0) != '#') {
490  equals = octstr_search_char(loc->line, '=', 0);
491  if (equals == -1) {
492  error(0, "An equals sign ('=') is missing on line %ld of file %s.",
493  loc->line_no, octstr_get_cstr(loc->filename));
494  error_lineno = loc->line_no;
495  } else
496 
497  /*
498  * check for special config directives, like include or conditional
499  * directives here
500  */
501  if (octstr_search(loc->line, octstr_imm("include"), 0) != -1) {
502  filename = octstr_copy(loc->line, equals + 1, octstr_len(loc->line));
503  parse_value(filename);
504 
505  /* check if we are cycling */
506  if (gwlist_search(stack, filename, octstr_item_match) != NULL) {
507  panic(0, "Recursive include for config file `%s' detected "
508  "(on line %ld of file %s).",
509  octstr_get_cstr(filename), loc->line_no,
510  octstr_get_cstr(loc->filename));
511  } else {
512  List *files = gwlist_create();
513  Octstr *file;
514  struct stat filestat;
515 
516  /* check if included file is a directory */
517  if (lstat(octstr_get_cstr(filename), &filestat) != 0) {
518  error(errno, "lstat failed: couldn't stat `%s'",
519  octstr_get_cstr(filename));
520  panic(0, "Failed to include `%s' "
521  "(on line %ld of file %s). Aborting!",
522  octstr_get_cstr(filename), loc->line_no,
523  octstr_get_cstr(loc->filename));
524  }
525 
526  /*
527  * is a directory, create a list with files of
528  * this directory and load all as part of the
529  * whole configuration.
530  */
531  if (S_ISDIR(filestat.st_mode)) {
532  DIR *dh;
533  struct dirent *diritem;
534 
535  debug("gwlib.cfg", 0, "Loading include dir `%s' "
536  "(on line %ld of file %s).",
537  octstr_get_cstr(filename), loc->line_no,
538  octstr_get_cstr(loc->filename));
539 
540  dh = opendir(octstr_get_cstr(filename));
541  while ((diritem = readdir(dh))) {
542  Octstr *fileitem;
543 
544  fileitem = octstr_duplicate(filename);
545  octstr_append_cstr(fileitem, "/");
546  octstr_append_cstr(fileitem, diritem->d_name);
547 
548  lstat(octstr_get_cstr(fileitem), &filestat);
549  if (!S_ISDIR(filestat.st_mode)) {
550  gwlist_insert(files, 0, fileitem);
551  } else {
552  octstr_destroy(fileitem);
553  }
554  }
555  closedir(dh);
556  }
557 
558  /* is a file, create a list with it */
559  else {
560  gwlist_insert(files, 0, octstr_duplicate(filename));
561  }
562 
563  /* include files */
564  while ((file = gwlist_extract_first(files)) != NULL) {
565 
566  gwlist_insert(stack, 0, octstr_duplicate(file));
567  debug("gwlib.cfg", 0, "Loading include file `%s' (on line %ld of file %s).",
568  octstr_get_cstr(file), loc->line_no,
569  octstr_get_cstr(loc->filename));
570 
571  /*
572  * expand the given include file and add it to the current
573  * processed main while loop
574  */
575  if ((expand = expand_file(file, 0)) != NULL) {
576  while ((loc_inc = gwlist_extract_first(expand)) != NULL)
577  gwlist_insert(lines, 0, loc_inc);
578  } else {
579  panic(0, "Failed to load whole configuration. Aborting!");
580  }
581 
582  gwlist_destroy(expand, NULL);
583  cfgloc_destroy(loc_inc);
584  octstr_destroy(file);
585  }
587  }
588  octstr_destroy(filename);
589  }
590 
591  /*
592  * this is a "normal" line, so process it accodingly
593  */
594  else {
595  name = octstr_copy(loc->line, 0, equals);
596  octstr_strip_blanks(name);
597  value = octstr_copy(loc->line, equals + 1, octstr_len(loc->line));
598  parse_value(value);
599 
600  if (grp == NULL)
601  grp = create_group();
602 
603  if (grp->configfile != NULL) {
604  octstr_destroy(grp->configfile);
605  grp->configfile = NULL;
606  }
607  grp->configfile = octstr_duplicate(cfg->filename);
608 
609  cfg_set(grp, name, value);
610  octstr_destroy(name);
611  octstr_destroy(value);
612  }
613  }
614 
615  cfgloc_destroy(loc);
616  }
617 
618  if (grp != NULL && add_group(cfg, grp) == -1) {
619  error_lineno = 1;
620  destroy_group(grp);
621  }
622 
623  gwlist_destroy(lines, NULL);
625 
626  if (error_lineno != 0) {
627  error(0, "Error found on line %ld of file `%s'.",
628  error_lineno, octstr_get_cstr(cfg->filename));
629  return -1;
630  }
631 
632  return 0;
633 }
void error(int err, const char *fmt,...)
Definition: log.c:612
void * gwlist_search(List *list, void *pattern, int(*cmp)(void *, void *))
Definition: list.c:486
static List * expand_file(Octstr *file, int forward)
Definition: cfg.c:389
Octstr * filename
Definition: cfg.c:108
static int add_group(Cfg *cfg, CfgGroup *grp)
Definition: cfg.c:260
static void cfgloc_destroy(CfgLoc *cfgloc)
Definition: cfg.c:126
long octstr_search(const Octstr *haystack, const Octstr *needle, long pos)
Definition: octstr.c:1068
void octstr_append_cstr(Octstr *ostr, const char *cstr)
Definition: octstr.c:1509
void octstr_strip_blanks(Octstr *text)
Definition: octstr.c:1344
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
#define octstr_copy(ostr, from, len)
Definition: octstr.h:178
long octstr_search_char(const Octstr *ostr, int ch, long pos)
Definition: octstr.c:1010
static List * lines
Definition: mtbatch.c:88
Definition: cfg.c:107
FILE * file
Definition: log.c:133
Octstr * octstr_imm(const char *cstr)
Definition: octstr.c:281
void * gwlist_extract_first(List *list)
Definition: list.c:305
#define octstr_duplicate(ostr)
Definition: octstr.h:187
static void destroy_group(void *arg)
Definition: cfg.c:93
int octstr_item_match(void *item, void *pattern)
Definition: octstr.c:1659
char * name
Definition: smsc_cimd2.c:212
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
char filename[FILENAME_MAX+1]
Definition: log.c:135
void octstr_destroy_item(void *os)
Definition: octstr.c:334
void gwlist_insert(List *list, long pos, void *item)
Definition: list.c:214
void cfg_set(CfgGroup *grp, Octstr *varname, Octstr *value)
Definition: cfg.c:802
long octstr_len(const Octstr *ostr)
Definition: octstr.c:340
Definition: octstr.c:118
long line_no
Definition: cfg.c:109
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
#define panic
Definition: log.h:87
static CfgGroup * create_group(void)
Definition: cfg.c:81
Definition: cfg.c:73
#define gwlist_create()
Definition: list.h:136
Octstr * filename
Definition: cfg.c:165
int octstr_get_char(const Octstr *ostr, long pos)
Definition: octstr.c:404
Definition: list.c:102
Octstr * configfile
Definition: cfg.c:76
Octstr * line
Definition: cfg.c:110
static void parse_value(Octstr *value)
Definition: cfg.c:342
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145
void cfg_set ( CfgGroup grp,
Octstr varname,
Octstr value 
)

Definition at line 802 of file cfg.c.

References dict_put(), octstr_duplicate, and CfgGroup::vars.

Referenced by cfg_read().

803 {
804  dict_put(grp->vars, varname, octstr_duplicate(value));
805 }
void dict_put(Dict *dict, Octstr *key, void *value)
Definition: dict.c:240
#define octstr_duplicate(ostr)
Definition: octstr.h:187
Dict * vars
Definition: cfg.c:75
void cfg_shutdown ( void  )

Definition at line 895 of file cfg.c.

References gwlist_destroy().

Referenced by gwlib_shutdown().

896 {
899  allowed_hooks = single_hooks = NULL;
900 }
static List * allowed_hooks
Definition: cfg.c:177
static List * single_hooks
Definition: cfg.c:178
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145
void grp_dump ( CfgGroup grp)

Definition at line 808 of file cfg.c.

References cfg_get, debug(), dict_keys(), gwlist_destroy(), gwlist_extract_first(), CfgGroup::name, name, octstr_destroy(), octstr_get_cstr, and CfgGroup::vars.

Referenced by cfg_dump(), create_onetrans(), and init_smsbox_routes().

809 {
810  List *names;
811  Octstr *name;
812  Octstr *value;
813 
814  if (grp->name == NULL)
815  debug("gwlib.cfg", 0, " dumping group (name not set):");
816  else
817  debug("gwlib.cfg", 0, " dumping group (%s):",
818  octstr_get_cstr(grp->name));
819  names = dict_keys(grp->vars);
820  while ((name = gwlist_extract_first(names)) != NULL) {
821  value = cfg_get(grp, name);
822  debug("gwlib.cfg", 0, " <%s> = <%s>",
823  octstr_get_cstr(name),
824  octstr_get_cstr(value));
825  octstr_destroy(value);
826  octstr_destroy(name);
827  }
828  gwlist_destroy(names, NULL);
829 }
Octstr * name
Definition: cfg.c:74
#define cfg_get(grp, varname)
Definition: cfg.h:86
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
void * gwlist_extract_first(List *list)
Definition: list.c:305
char * name
Definition: smsc_cimd2.c:212
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
Definition: octstr.c:118
void debug(const char *place, int err, const char *fmt,...)
Definition: log.c:690
List * dict_keys(Dict *dict)
Definition: dict.c:347
Definition: list.c:102
Dict * vars
Definition: cfg.c:75
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145
See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.