version 1.2, 2009/09/09 09:07:31
|
version 1.6, 2011/05/01 17:24:28
|
Line 5
|
Line 5
|
* $Author$ |
* $Author$ |
* $Id$ |
* $Id$ |
* |
* |
*************************************************************************/ | ************************************************************************** |
| The ELWIX and AITNET software is distributed under the following |
| terms: |
| |
| All of the documentation and software included in the ELWIX and AITNET |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
| |
| Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 |
| by Michael Pounov <misho@elwix.org>. All rights reserved. |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions |
| are met: |
| 1. Redistributions of source code must retain the above copyright |
| notice, this list of conditions and the following disclaimer. |
| 2. Redistributions in binary form must reproduce the above copyright |
| notice, this list of conditions and the following disclaimer in the |
| documentation and/or other materials provided with the distribution. |
| 3. All advertising materials mentioning features or use of this software |
| must display the following acknowledgement: |
| This product includes software developed by Michael Pounov <misho@elwix.org> |
| ELWIX - Embedded LightWeight unIX and its contributors. |
| 4. Neither the name of AITNET nor the names of its contributors |
| may be used to endorse or promote products derived from this software |
| without specific prior written permission. |
| |
| THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| SUCH DAMAGE. |
| */ |
#include "global.h" |
#include "global.h" |
#include "aitcfg.h" |
#include "aitcfg.h" |
#include "tools.h" |
|
|
|
|
|
// cfgDbg() Debug/Log operation |
// cfgDbg() Debug/Log operation |
Line 24 static inline int cfgDbg(FILE *f, char *fmt, ...)
|
Line 60 static inline int cfgDbg(FILE *f, char *fmt, ...)
|
return ret; |
return ret; |
} |
} |
|
|
// ----------------------------------------- | /* |
| * InvertQueue() InvertQueue order //{cfg} list of elements for revert |
| * @cfg = Head list element for revert |
| */ |
| static inline void InvertQueue(sl_config * __restrict cfg) |
| { |
| struct tagPair *item, *next, *prev = NULL; |
|
|
|
for (item = cfg->slh_first; item; item = next) { |
|
next = item->sle_next; |
|
item->sle_next = prev; |
|
prev = item; |
|
} |
|
cfg->slh_first = prev; |
|
} |
|
|
|
// cfgWrite() Write to file from config list |
|
static inline int cfgWrite(FILE *f, sl_config * __restrict cfg, int whitespace) |
|
{ |
|
struct tagPair *av; |
|
time_t tim; |
|
char szTime[MAX_STR + 1]; |
|
u_char szSection[MAX_STR + 1]; |
|
|
|
bzero(szSection, MAX_STR + 1); |
|
|
|
bzero(szTime, MAX_STR + 1); |
|
time(&tim); |
|
strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); |
|
if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) { |
|
LOGERR; |
|
return -1; |
|
} |
|
|
|
InvertQueue(cfg); |
|
for (av = cfg->slh_first; av; av = av->sle_next) { |
|
if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) { |
|
strlcpy((char*) szSection, (char*) av->psSection, MAX_STR + 1); |
|
if (!cfgDbg(f, "\n[%s]\n", av->psSection)) { |
|
LOGERR; |
|
return -1; |
|
} |
|
} |
|
if (!av->psSection && *szSection) { |
|
bzero(szSection, MAX_STR + 1); |
|
if (!cfgDbg(f, "\n[]\n")) { |
|
LOGERR; |
|
return -1; |
|
} |
|
} |
|
|
|
if (whitespace) { |
|
if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) { |
|
LOGERR; |
|
return -1; |
|
} |
|
} else { |
|
if (!cfgDbg(f, "%s=%s\n", av->psAttribute, av->psValue)) { |
|
LOGERR; |
|
return -1; |
|
} |
|
} |
|
} |
|
InvertQueue(cfg); |
|
|
|
bzero(szTime, MAX_STR + 1); |
|
time(&tim); |
|
strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); |
|
if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) { |
|
LOGERR; |
|
return -1; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
// --------------------------------------------------- |
|
|
/* |
/* |
* ReadConfig() Read from file and add new item to config list |
* ReadConfig() Read from file and add new item to config list |
* @f = file resource |
* @f = file resource |
Line 43 int ReadConfig(FILE *f, sl_config * __restrict cfg)
|
Line 155 int ReadConfig(FILE *f, sl_config * __restrict cfg)
|
while (!feof(f)) { |
while (!feof(f)) { |
memset(szLine, 0, MAX_STR + 1); |
memset(szLine, 0, MAX_STR + 1); |
fgets((char*) szLine, MAX_STR, f); |
fgets((char*) szLine, MAX_STR, f); |
trim(szLine); | io_TrimStr(szLine); |
#ifdef __DEBUG |
#ifdef __DEBUG |
cfgDbg(stdout, "DEBUG:: RAW |%s|\n", szLine); |
cfgDbg(stdout, "DEBUG:: RAW |%s|\n", szLine); |
#endif |
#endif |
Line 109 int ReadConfig(FILE *f, sl_config * __restrict cfg)
|
Line 221 int ReadConfig(FILE *f, sl_config * __restrict cfg)
|
psAttr = szLine; |
psAttr = szLine; |
psVal = (szLine + pos + 1); |
psVal = (szLine + pos + 1); |
szLine[pos] = 0; |
szLine[pos] = 0; |
rtrim(psAttr); | io_RTrimStr(psAttr); |
ltrim(psVal); | io_LTrimStr(psVal); |
| io_UnquotStr(psVal); |
#ifdef __DEBUG |
#ifdef __DEBUG |
cfgDbg(stdout, "DEBUG:: Attr(%p) ->%s size=%d Value(%p) ->%s size=%d\n", |
cfgDbg(stdout, "DEBUG:: Attr(%p) ->%s size=%d Value(%p) ->%s size=%d\n", |
psAttr, psAttr, strlen((char*) psAttr), psVal, psVal, strlen((char*) psVal)); |
psAttr, psAttr, strlen((char*) psAttr), psVal, psVal, strlen((char*) psVal)); |
Line 148 int ReadConfig(FILE *f, sl_config * __restrict cfg)
|
Line 261 int ReadConfig(FILE *f, sl_config * __restrict cfg)
|
*/ |
*/ |
int WriteConfig(FILE *f, sl_config * __restrict cfg) |
int WriteConfig(FILE *f, sl_config * __restrict cfg) |
{ |
{ |
struct tagPair *av; | return cfgWrite(f, cfg, 1); |
time_t tim; | } |
char szTime[MAX_STR + 1]; | |
u_char szSection[MAX_STR + 1]; | |
|
|
bzero(szSection, MAX_STR + 1); | /* |
| * cfg_WriteConfig() Write to file from items in config list without whitespaces! |
| * @f = file resource |
| * @cfg = Head list element |
| * return: 0 ok; -1 error:: can`t write to file |
| */ |
| int cfg_WriteConfig(FILE *f, sl_config * __restrict cfg) |
| { |
| return cfgWrite(f, cfg, 0); |
| } |
|
|
bzero(szTime, MAX_STR + 1); | /* |
time(&tim); | * ConcatConfig() Concat two list in one |
strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); | * @cfg = Head list element of main list |
if (!cfgDbg(f, "## Write Config :: %s\n#\n", szTime)) { | * @add_cfg = Head list element of added list |
LOGERR; | * return: 0 ok; -1 error:: can`t concat lists |
| */ |
| int ConcatConfig(sl_config * __restrict cfg, sl_config * __restrict add_cfg) |
| { |
| struct tagPair *item; |
| int ret = 0; |
| |
| if (!cfg || !add_cfg) |
return -1; |
return -1; |
} |
|
|
|
for (av = cfg->slh_first; av; av = av->sle_next) { | for (item = cfg->slh_first; item->sle_next; item = item->sle_next); |
if (av->psSection && strcmp((char*) av->psSection, (char*) szSection)) { | item->sle_next = add_cfg->slh_first; |
strlcpy((char*) szSection, (char*) av->psSection, MAX_STR + 1); | |
if (!cfgDbg(f, "\n[%s]\n", av->psSection)) { | add_cfg->slh_first = NULL; |
LOGERR; | |
return -1; | return ret; |
| } |
| |
| /* |
| * MergeConfig() Marge two list in one cfg and destroy add_cfg |
| * @cfg = Head list element of main list |
| * @add_cfg = Head list element of merged list (destroy after all!) |
| * return: 0 ok; -1 error:: can`t merge lists |
| */ |
| int MergeConfig(sl_config * __restrict cfg, sl_config * __restrict add_cfg) |
| { |
| struct tagPair *item, *merge, *add_next, *next = NULL; |
| int flg; |
| |
| if (!cfg || !add_cfg) |
| return -1; |
| |
| item = add_cfg->slh_first; |
| while (item) { |
| add_next = item->sle_next; |
| |
| for (flg = 0, merge = cfg->slh_first, next = merge->sle_next; next; |
| merge = merge->sle_next, next = merge->sle_next) { |
| if (!merge->psSection && !item->psSection) { |
| flg = 1; |
| merge->sle_next = item; |
| item->sle_next = next; |
| break; |
} |
} |
} | if (merge->psSection && item->psSection && |
if (!av->psSection && *szSection) { | !strcmp((char*) merge->psSection, (char*) item->psSection)) { |
bzero(szSection, MAX_STR + 1); | flg = 1; |
if (!cfgDbg(f, "\n[]\n")) { | merge->sle_next = item; |
LOGERR; | item->sle_next = next; |
return -1; | break; |
} |
} |
} |
} |
|
|
if (!cfgDbg(f, "%s = %s\n", av->psAttribute, av->psValue)) { | if (!flg) { |
LOGERR; | if (!merge->sle_next) { |
return -1; | merge->sle_next = item; |
| item->sle_next = NULL; |
| } else |
| return -1; |
} |
} |
} |
|
|
|
bzero(szTime, MAX_STR + 1); | item = add_next; |
time(&tim); | |
strftime(szTime, MAX_STR, "(UTC) %Y-%m-%d %H:%M:%S", gmtime(&tim)); | |
if (!cfgDbg(f, "\n#\n## Done. :: %s\n", szTime)) { | |
LOGERR; | |
return -1; | |
} |
} |
|
|
|
add_cfg->slh_first = NULL; |
|
|
return 0; |
return 0; |
} |
} |