--- libaitcfg/src/aitcfg.c 2025/08/19 11:22:09 1.16.6.3 +++ libaitcfg/src/aitcfg.c 2026/08/04 18:51:43 1.17.4.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcfg.c,v 1.16.6.3 2025/08/19 11:22:09 misho Exp $ +* $Id: aitcfg.c,v 1.17.4.1 2026/08/04 18:51:43 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2025 +Copyright 2004 - 2026 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -160,24 +160,23 @@ cfgEndConfig(cfg_root_t **pcfg) * cfgInitConfigExt() - Init existed config root * * @cfg = Config root - * return: NULL error or !=NULL inited config root + * return: -1 error or 0 inited config root */ -cfg_root_t * +int cfgInitConfigExt(cfg_root_t * __restrict cfg) { - pthread_mutex_t mtx = { 0 }; + if (!cfg) { + cfg_SetErr(EINVAL, "Invalid parameter"); + return -1; + } - if (!TAILQ_EMPTY(cfg) || !RB_EMPTY(cfg) || - memcmp(&cfg->rc_mtx, &mtx, sizeof mtx)) - cfgUnloadConfig(cfg); - memset(cfg, 0, sizeof(cfg_root_t)); pthread_mutex_init(&cfg->rc_mtx, NULL); TAILQ_INIT(cfg); RB_INIT(cfg); - return cfg; + return 0; } /* @@ -192,25 +191,41 @@ cfgLoadConfig(const char *cfgName, cfg_root_t * __rest { FILE *f; int ret; - pthread_mutex_t mtx = { 0 }; - if (!cfgName || !cfg) { + if (!cfgName || cfgInitConfigExt(cfg)) { cfg_SetErr(EINVAL, "Invalid parameter(s)"); return -1; - } else { - if (!TAILQ_EMPTY(cfg) || !RB_EMPTY(cfg) || memcmp(&cfg->rc_mtx, &mtx, sizeof mtx)) - cfgUnloadConfig(cfg); - /* - if (memcmp(&cfg->rc_mtx, &mtx, sizeof mtx)) - pthread_mutex_destroy(&cfg->rc_mtx); - */ + } - memset(cfg, 0, sizeof(cfg_root_t)); + f = fopen(cfgName, "r"); + if (!f) { + LOGERR; + return -1; + } - pthread_mutex_init(&cfg->rc_mtx, NULL); + ret = cfg_ReadConfig(f, cfg, 1); - TAILQ_INIT(cfg); - RB_INIT(cfg); + fclose(f); + return ret; +} + +/* + * cfgLoadConfigExt() - Load config from file with recursion level of includes + * + * @cfgName = Config filename + * @cfg = Config root + * @lvl = Level of include recursion + * return: -1 error or 0 ok + */ +int +cfgLoadConfigExt(const char *cfgName, cfg_root_t * __restrict cfg, int lvl) +{ + FILE *f; + int ret; + + if (!cfgName || cfgInitConfigExt(cfg)) { + cfg_SetErr(EINVAL, "Invalid parameter(s)"); + return -1; } f = fopen(cfgName, "r"); @@ -219,12 +234,11 @@ cfgLoadConfig(const char *cfgName, cfg_root_t * __rest return -1; } - ret = cfgReadConfig(f, cfg); + ret = cfg_ReadConfig(f, cfg, lvl); fclose(f); return ret; } - /* * cfgClearConfig() - Clear config and free resources *