firmware/src/conf.c

1272 lines
41 KiB
C
Raw Normal View History

2018-03-12 07:01:29 +00:00
/*
* Copyright (c) 2018 Savens Liu
*
* The original has been patented, Open source is not equal to open rights.
* Anyone can clone, download, learn and discuss for free. Without the permission
* of the copyright owner or author, it shall not be merged, published, licensed or sold.
* The copyright owner or author has the right to pursue his responsibility.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "tvm.h"
#include "tmain.h"
/*************************************************************************************************
global
*************************************************************************************************/
TBoot g_stBoot = {0};
/*************************************************************************************************
descriptionget the config of boot
parameters:
return:
void*
*************************************************************************************************/
void* pGetBoot()
{
return &g_stBoot;
}
/*************************************************************************************************
descriptionget log file
parameters:
return:
void*
*************************************************************************************************/
char* pGetLog()
{
return g_stBoot.m_szLog;
}
/*************************************************************************************************
descriptionGet the current node
parameters:
return:
void*
*************************************************************************************************/
char* sGetNode()
{
return g_stBoot.m_szNode;
}
/*************************************************************************************************
descriptionSet the current node
parameters:
return:
*************************************************************************************************/
void vSetNode(char *s)
{
if(!s) return ;
strncpy(g_stBoot.m_szNode, s, sizeof(g_stBoot.m_szNode));
}
/*************************************************************************************************
descriptionSet STVM boot type
parameters:
return:
*************************************************************************************************/
void vSetBootType(long lType)
{
g_stBoot.m_lBootType = lType;
}
/*************************************************************************************************
descriptionGet current type of boot
parameters:
return:
lBootType
*************************************************************************************************/
long lGetBootType()
{
return g_stBoot.m_lBootType;
}
/*************************************************************************************************
void --
*************************************************************************************************/
char* sGetLog()
{
return g_stBoot.m_szLog;
}
/*************************************************************************************************
descriptioncreate default config
parameters:
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lDefaultBoot()
{
FILE *fp = NULL;
char szPath[512];
TBoot *pstBoot = (TBoot *)pGetBoot();
memset(szPath, 0, sizeof(szPath));
memset(pstBoot, 0, sizeof(TBoot));
snprintf(szPath, sizeof(szPath), "%s", getenv("TVMCFG"));
pstBoot->m_lMaxTable = 255;
pstBoot->m_lMaxField = 3000;
pstBoot->m_lMaxDomain = 1024;
pstBoot->m_lMaxSeque = 1024;
pstBoot->m_lBootExec = get_nprocs();
pstBoot->m_lBootPort = 2000;
pstBoot->m_lBootType = TVM_BOOT_SIMPLE;
strcpy(pstBoot->m_szNode, "STVM");
strcpy(pstBoot->m_szLog, "stvm.log");
if(NULL == (fp = fopen(szPath, "wb")))
{
fprintf(stderr, "create default param failed, %s\n", strerror(errno));
return RC_FAIL;
}
fwrite(TVM_RUNCFG_TAG, 4, 1, fp);
fwrite(pstBoot, sizeof(TBoot), 1, fp);
fclose(fp);
return RC_SUCC;
}
/*************************************************************************************************
descriptionfrom the config to boot system
parameters:
pstSavm --stvm handle
pstBoot --boot paramer
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lGetBootConfig(SATvm *pstSavm, TBoot *pstBoot)
{
FILE *fp = NULL;
char szPath[512], szVersion[10];
if(!pstSavm || !pstBoot)
{
pstSavm->m_lErrno = CONDIT_IS_NIL;
return RC_FAIL;
}
memset(szPath, 0, sizeof(szPath));
memset(szVersion, 0, sizeof(szVersion));
snprintf(szPath, sizeof(szPath), "%s", getenv("TVMCFG"));
if(NULL == (fp = fopen(szPath, "rb")))
{
pstSavm->m_lErrno = FILE_NOTFOUND;
return RC_FAIL;
}
fread(szVersion, 4, 1, fp);
if(memcmp(szVersion, TVM_RUNCFG_TAG, 4))
{
fclose(fp);
pstSavm->m_lErrno = BOOT_VER_ICMP;
return RC_FAIL;
}
fread(pstBoot, sizeof(TBoot), 1, fp);
fclose(fp);
return RC_SUCC;
}
/*************************************************************************************************
description Startup initialization
parameters:
return:
void *
*************************************************************************************************/
TBoot* pBootInitial()
{
static int i = 0;
SATvm *pstSavm = (SATvm *)pGetSATvm();
if(1 == i ++) return &g_stBoot;
memset(&g_stBoot, 0, sizeof(TBoot));
pstSavm->m_lErrno = TVM_DONE_SUCC;
lGetBootConfig(pstSavm, &g_stBoot);
return &g_stBoot;
}
/*************************************************************************************************
descriptionfrom the config to initial table index
parameters:
pstSavm --stvm handle
plOut --number
ppstIndex --out of index group
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lGetLocalIndex(SATvm *pstSavm, long *plOut, TIndex **ppstIndex)
{
FILE *fp = NULL;
char szPath[512], szVersion[10];
if(!pstSavm || !ppstIndex || !plOut)
{
pstSavm->m_lErrno = CONDIT_IS_NIL;
return RC_FAIL;
}
memset(szPath, 0, sizeof(szPath));
memset(szVersion, 0, sizeof(szVersion));
snprintf(szPath, sizeof(szPath), "%s", getenv("TVMCFG"));
if(NULL == (fp = fopen(szPath, "rb")))
{
pstSavm->m_lErrno = FILE_NOTFOUND;
return RC_FAIL;
}
fread(szVersion, 4, 1, fp);
if(memcmp(szVersion, TVM_RUNCFG_TAG, 4))
{
fclose(fp);
pstSavm->m_lErrno = BOOT_VER_ICMP;
return RC_FAIL;
}
fseek(fp, sizeof(TBoot), SEEK_CUR);
fread((void *)plOut, sizeof(long), 1, fp);
if(*plOut <= 0)
{
fclose(fp);
return RC_SUCC;
}
if(NULL == (*ppstIndex = (void *)calloc(*plOut, sizeof(TIndex))))
{
fclose(fp);
pstSavm->m_lErrno = MALLC_MEM_ERR;
return RC_FAIL;
}
fread(*ppstIndex, (*plOut) * sizeof(TIndex), 1, fp);
fclose(fp);
return RC_SUCC;
}
/*************************************************************************************************
descriptionfrom the config to initial domain
parameters:
pstSavm --stvm handle
plOut --number
ppstIndex --out of index group
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lGetDomainIndex(SATvm *pstSavm, long *plOut, TIndex **ppstIndex)
{
FILE *fp = NULL;
char szPath[512], szVersion[10];
if(!pstSavm || !ppstIndex || !plOut)
{
pstSavm->m_lErrno = CONDIT_IS_NIL;
return RC_FAIL;
}
memset(szPath, 0, sizeof(szPath));
memset(szVersion, 0, sizeof(szVersion));
snprintf(szPath, sizeof(szPath), "%s", getenv("TVMCFG"));
if(NULL == (fp = fopen(szPath, "rb")))
{
pstSavm->m_lErrno = FILE_NOTFOUND;
return RC_FAIL;
}
fread(szVersion, 4, 1, fp);
if(memcmp(szVersion, TVM_RUNCFG_TAG, 4))
{
fclose(fp);
pstSavm->m_lErrno = BOOT_VER_ICMP;
return RC_FAIL;
}
fseek(fp, sizeof(TBoot), SEEK_CUR);
fread((void *)plOut, sizeof(long), 1, fp);
if(*plOut <= 0)
{
fclose(fp);
return RC_SUCC;
}
fseek(fp, (*plOut) * sizeof(TIndex), SEEK_CUR);
fread((void *)plOut, sizeof(long), 1, fp);
if(NULL == (*ppstIndex = (void *)calloc(*plOut, sizeof(TIndex))))
{
fclose(fp);
pstSavm->m_lErrno = MALLC_MEM_ERR;
return RC_FAIL;
}
fread(*ppstIndex, (*plOut) * sizeof(TIndex), 1, fp);
fclose(fp);
return RC_SUCC;
}
/*************************************************************************************************
descriptionfrom the config to initial table of domain
parameters:
pstSavm --stvm handle
plOut --number
ppstIndex --out of index group
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lGetDomainTable(SATvm *pstSavm, long *plOut, TDomain **ppstDomain)
{
FILE *fp = NULL;
char szPath[512], szVersion[10];
if(!pstSavm || !ppstDomain || !plOut)
{
pstSavm->m_lErrno = CONDIT_IS_NIL;
return RC_FAIL;
}
memset(szPath, 0, sizeof(szPath));
memset(szVersion, 0, sizeof(szVersion));
snprintf(szPath, sizeof(szPath), "%s", getenv("TVMCFG"));
if(NULL == (fp = fopen(szPath, "rb")))
{
pstSavm->m_lErrno = FILE_NOTFOUND;
return RC_FAIL;
}
fread(szVersion, 4, 1, fp);
if(memcmp(szVersion, TVM_RUNCFG_TAG, 4))
{
fclose(fp);
pstSavm->m_lErrno = BOOT_VER_ICMP;
return RC_FAIL;
}
fseek(fp, sizeof(TBoot), SEEK_CUR);
fread((void *)plOut, sizeof(long), 1, fp);
fseek(fp, (*plOut) * sizeof(TIndex), SEEK_CUR);
fread((void *)plOut, sizeof(long), 1, fp);
fseek(fp, (*plOut) * sizeof(TIndex), SEEK_CUR);
fread((void *)plOut, sizeof(long), 1, fp);
if(*plOut <= 0)
{
fclose(fp);
return RC_SUCC;
}
if(NULL == (*ppstDomain = (void *)calloc(*plOut, sizeof(TDomain))))
{
fclose(fp);
pstSavm->m_lErrno = MALLC_MEM_ERR;
return RC_FAIL;
}
fread(*ppstDomain, (*plOut) * sizeof(TDomain), 1, fp);
fclose(fp);
return RC_SUCC;
}
/*************************************************************************************************
descriptionparse config field
parameters:
pszBuffer --file content
pszTarg --target
nTarg --target length
pszValue --The label value
nValue --value max length
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lPraseField(char *pszBuffer, char *pszTarg, long nTarg, char *pszValue, long nValue)
{
char szAttr[512];
memset(szAttr, 0, sizeof(szAttr));
strncpy(szAttr, pszBuffer, sizeof(szAttr));
if(!strstr(szAttr, "="))
{
fprintf(stdout, "%s\n*may be lost '='\n", szAttr);
return RC_FAIL;
}
strncpy(pszTarg, sgetvalue(szAttr, "=", 1), nTarg);
strncpy(pszValue, sgetvalue(szAttr, "=", 2), nValue);
srtrim(pszTarg);
sltrim(pszValue);
strimabout(pszValue, "\"", "\"");
if(!strlen(pszValue))
{
fprintf(stdout, "%s\n*config error, The initial value is not set\n", szAttr);
return RC_FAIL;
}
return RC_SUCC;
}
/*************************************************************************************************
descriptionfrom the config to initial table index
parameters:
pstSavm --stvm handle
ppstRoot --content list
pszFile --config file
pszTarge --target
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long _lParseFile(SATvm *pstSavm, CMList **ppstRoot, char *pszFile, const char *pszTarget)
{
FILE *fp = NULL;
char szLine[4098];
BOOL bFlag = FALSE;
CMList *pstList = NULL;
if(NULL == (fp = fopen(pszFile, "rb")))
{
pstSavm->m_lErrno = FILE_NOTFOUND;
return RC_FAIL;
}
memset(szLine, 0, sizeof(szLine));
while(fgets(szLine, sizeof(szLine), fp))
{
strimcrlf(szLine);
sltrim(szLine);
srtrim(szLine);
if(!strlen(szLine))
continue;
if('#' == szLine[0] || !memcmp("//", szLine, 2) || !memcmp("/*", szLine, 2) ||
!memcmp("", szLine, 2) || !memcmp("--", szLine, 2))
continue;
if(!strcmp(pszTarget, szLine) && !bFlag)
{
bFlag = TRUE;
memset(szLine, 0, sizeof(szLine));
continue;
}
else if(szLine[0] == '*' && bFlag)
break;
if(!bFlag)
{
memset(szLine, 0, sizeof(szLine));
continue;
}
if(NULL == (pstList = pInsertList(pstList, (void *)szLine, sizeof(szLine))))
{
fclose(fp);
vDestroyList(pstList);
return RC_FAIL;
}
}
fclose(fp);
*ppstRoot = pstList;
return RC_SUCC;
}
/*************************************************************************************************
descriptionparse STVM boot parameter
parameters:
pstSavm --stvm handle
pszFile --config file
pstBoot --target
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lParseBoot(SATvm *pstSavm, char *pszFile, TBoot *pstBoot)
{
char szTarg[128], szValue[64];
CMList *pstNode = NULL, *pstRoot = NULL;
if(RC_SUCC != _lParseFile(pstSavm, &pstRoot, pszFile, "*GLOBLE"))
{
fprintf(stderr, "parse file, err:(%d)(%s)\n", pstSavm->m_lErrno, sGetTError(pstSavm->m_lErrno));
return RC_FAIL;
}
for(pstNode = pstRoot; pstNode; pstNode = pstNode->pstNext)
{
memset(szTarg, 0, sizeof(szTarg));
memset(szValue, 0, sizeof(szValue));
if(RC_SUCC != lPraseField((char *)pstNode->m_psvData, szTarg, sizeof(szTarg), szValue,
sizeof(szValue)))
goto PBOOT_ERROR;
if(!strcasecmp(szTarg, "MACHINE"))
strncpy(pstBoot->m_szNode, szValue, sizeof(pstBoot->m_szNode));
else if(!strcasecmp(szTarg, "LOGNAME"))
strncpy(pstBoot->m_szLog, szValue, sizeof(pstBoot->m_szLog));
else if(!strcasecmp(szTarg, "DEPLOY"))
{
if(!strcasecmp(szValue, "cluster"))
pstBoot->m_lBootType = TVM_BOOT_CLUSTER;
else if(!strcasecmp(szValue, "local"))
pstBoot->m_lBootType = TVM_BOOT_LOCAL;
else // local
pstBoot->m_lBootType = TVM_BOOT_SIMPLE;
}
else if(!strcasecmp(szTarg, "MAXTABLE"))
{
pstBoot->m_lMaxTable = atol(szValue);
if(pstBoot->m_lMaxTable <= 5)
{
fprintf(stdout, "%s\n*Set STVM maximum support table number error\n",
(char *)pstNode->m_psvData);
}
else if(pstBoot->m_lMaxTable > 255)
{
fprintf(stdout, "%s\n*STVM maximum support table 255\n",
(char *)pstNode->m_psvData);
goto PBOOT_ERROR;
}
}
else if(!strcasecmp(szTarg, "MAXFILED"))
{
pstBoot->m_lMaxField = atol(szValue);
if(pstBoot->m_lMaxField <= 100)
{
fprintf(stdout, "%s\n*Set the number of STVM field details error\n",
(char *)pstNode->m_psvData);
goto PBOOT_ERROR;
}
}
else if(!strcasecmp(szTarg, "MAXDOMAIN"))
{
pstBoot->m_lMaxDomain = atol(szValue);
if(pstBoot->m_lMaxDomain <= 0)
{
fprintf(stdout, "%s\n*Error in setting maximum number of domain\n",
(char *)pstNode->m_psvData);
goto PBOOT_ERROR;
}
}
else if(!strcasecmp(szTarg, "MAXSEQUE"))
{
pstBoot->m_lMaxSeque = atol(szValue);
if(pstBoot->m_lMaxSeque <= 0)
{
fprintf(stdout, "%s\n*Error in setting maximum number of sequences\n",
(char *)pstNode->m_psvData);
goto PBOOT_ERROR;
}
}
else if(!strcasecmp(szTarg, "SERVER_EXEC"))
{
pstBoot->m_lBootExec = atol(szValue);
if(pstBoot->m_lBootExec <= 0)
{
fprintf(stdout, "%s\n*LIS.tvm: startup number set error",
(char *)pstNode->m_psvData);
goto PBOOT_ERROR;
}
}
else if(!strcasecmp(szTarg, "SERVER_PORT"))
{
pstBoot->m_lBootPort = atol(szValue);
if(pstBoot->m_lBootPort <= 0)
{
fprintf(stdout, "%s\n*LIS.tvm: Error starting port setting\n",
(char *)pstNode->m_psvData);
goto PBOOT_ERROR;
}
}
else
{
fprintf(stdout, "%s\n*Invalid parameter\n", (char *)pstNode->m_psvData);
goto PBOOT_ERROR;
}
}
if(!strlen(pstBoot->m_szNode))
{
fprintf(stdout, "MACHINE\n*The local node is not set\n");
goto PBOOT_ERROR;
}
if(pstBoot->m_lMaxTable <= 0)
pstBoot->m_lMaxTable = TVM_MAX_TABLE;
if(pstBoot->m_lMaxField <= 0)
pstBoot->m_lMaxField = 3000;
if(pstBoot->m_lMaxDomain <= 0)
pstBoot->m_lMaxDomain = 500;
if(pstBoot->m_lMaxSeque <= 0)
pstBoot->m_lMaxSeque = 500;
if(pstBoot->m_lBootExec <= 0)
pstBoot->m_lBootExec = get_nprocs() > 0 ? get_nprocs() : 1;
if(pstBoot->m_lBootPort <= 0)
pstBoot->m_lBootPort = TVM_PORT_LISTEN;
vDestroyList(pstRoot);
return RC_SUCC;
PBOOT_ERROR:
vDestroyList(pstRoot);
return RC_FAIL;
}
/*************************************************************************************************
descriptionget config domain resource
parameters:
lDomain --number of domain
pstDomain --domain group
pszDomain --domain
return:
void* --domain
*************************************************************************************************/
TDomain* pGetResourse(long lDomain, TDomain *pstDomain, char *pszDomain)
{
long i = 0;
for(i = 0; i < lDomain; i ++)
{
if(!strcmp(pstDomain[i].m_szOwner, pszDomain))
return &pstDomain[i];
}
return NULL;
}
/*************************************************************************************************
descriptionparse local table config
parameters:
pstSavm --stvm handle
pszFile --config
plOut --number
ppstIndex --out of index group
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lParseIndex(SATvm *pstSavm, char *pszFile, long *plOut, TIndex **ppstIndex)
{
long i, j, n;
TIndex *pstIndex = NULL;
CMList *pstNode = NULL, *pstRoot = NULL;
char szTarg[128], szValue[64], szAttr[1024];
memset(szTarg, 0, sizeof(szTarg));
memset(szAttr, 0, sizeof(szAttr));
memset(szValue, 0, sizeof(szValue));
if(RC_SUCC != _lParseFile(pstSavm, &pstRoot, pszFile, "*LOCAL_RESOURCE"))
{
fprintf(stderr, "parse file, err:(%d)(%s)\n", pstSavm->m_lErrno, sGetTError(pstSavm->m_lErrno));
return RC_FAIL;
}
for(pstNode = pstRoot, j = 0; pstNode; pstNode = pstNode->pstNext)
{
sfieldreplace((char *)pstNode->m_psvData, '\t', ' ');
if(!strlen((char *)pstNode->m_psvData)) continue;
if(NULL == (pstIndex = (TIndex *)realloc(pstIndex, (++ j) * sizeof(TIndex))))
{
pstSavm->m_lErrno = MALLC_MEM_ERR;
return RC_FAIL;
}
memset(&pstIndex[j - 1], 0, sizeof(TIndex));
for(i = 0, n = lfieldnum((char *)pstNode->m_psvData, " "); i < n; i ++)
{
memset(szTarg, 0, sizeof(szTarg));
memset(szValue, 0, sizeof(szValue));
if(RC_SUCC != lPraseField(sfieldvalue((char *)pstNode->m_psvData, " ", i + 1),
szTarg, sizeof(szTarg), szValue, sizeof(szValue)))
goto PINDEX_ERROR;
if(!strcasecmp(szTarg, "TABLE"))
pstIndex[j - 1].m_table = atol(szValue);
else if(!strcasecmp(szTarg, "PERMIT"))
pstIndex[j - 1].m_lPers = atol(szValue);
else
{
fprintf(stdout, "%s\n*Invalid parameter\n", (char *)pstNode->m_psvData);
goto PINDEX_ERROR;
}
}
if(pstIndex[j - 1].m_table <= 0)
{
fprintf(stdout, "%s\n*Table setting error\n", (char *)pstNode->m_psvData);
goto PINDEX_ERROR;
}
if(pstIndex[j - 1].m_lPers <= 0)
pstIndex[j - 1].m_lPers = OPERATE_DEFAULT;
}
*plOut = j;
*ppstIndex = pstIndex;
vDestroyList(pstRoot);
return RC_SUCC;
PINDEX_ERROR:
TFree(*ppstIndex);
vDestroyList(pstRoot);
return RC_FAIL;
}
/*************************************************************************************************
descriptionparse domain
parameters:
pstSavm --stvm handle
pszFile --config
plCount --number
ppstDom --out of domain group
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lParseResouce(SATvm *pstSavm, char *pszFile, long *plCout, TDomain **ppstDom)
{
TDomain *pv;
long i, n;
char szTarg[128], szValue[64];
CMList *pstNode = NULL, *pstRoot = NULL;
if(RC_SUCC != _lParseFile(pstSavm, &pstRoot, pszFile, "*REMOTE_DOMAIN"))
{
fprintf(stderr, "parse file, err:(%d)(%s)\n", pstSavm->m_lErrno, sGetTError(pstSavm->m_lErrno));
return RC_FAIL;
}
for(pstNode = pstRoot, *plCout = 0; pstNode; pstNode = pstNode->pstNext)
{
sfieldreplace((char *)pstNode->m_psvData, '\t', ' ');
if(!strlen((char *)pstNode->m_psvData)) continue;
if(NULL == (*ppstDom = (TDomain *)realloc(*ppstDom, (++ (*plCout)) * sizeof(TDomain))))
{
pstSavm->m_lErrno = MALLC_MEM_ERR;
return RC_FAIL;
}
pv = &(*ppstDom)[(*plCout) - 1];
memset(pv, 0, sizeof(TDomain));
for(i = 0, n = lfieldnum((char *)pstNode->m_psvData, " "); i < n; i ++)
{
memset(szTarg, 0, sizeof(szTarg));
memset(szValue, 0, sizeof(szValue));
if(RC_SUCC != lPraseField(sfieldvalue((char *)pstNode->m_psvData, " ", i + 1),
szTarg, sizeof(szTarg), szValue, sizeof(szValue)))
goto PDOMAIN_ERROR;
if(!strcasecmp(szTarg, "DOMAINID"))
strncpy(pv->m_szOwner, szValue, sizeof(pv->m_szOwner));
else if(!strcasecmp(szTarg, "GROUP"))
pv->m_lGroup = atol(szValue);
else if(!strcasecmp(szTarg, "WSADDR"))
{
strncpy(pv->m_szIp, sgetvalue(szValue, ":", 1), sizeof(pv->m_szIp));
pv->m_lPort = atol(sgetvalue(szValue, ":", 2));
}
else if(!strcasecmp(szTarg, "TIMTOUT"))
pv->m_lTimeOut = atol(szValue);
else if(!strcasecmp(szTarg, "MAXTRY"))
pv->m_lTryMax = atol(szValue);
else if(!strcasecmp(szTarg, "KEEPALIVE"))
pv->m_lKeepLive = atol(szValue);
}
if(!strlen(pv->m_szOwner))
{
fprintf(stdout, "%s\n*域名未设置\n", (char *)pstNode->m_psvData);
goto PDOMAIN_ERROR;
}
if(!strlen(pv->m_szIp))
{
fprintf(stdout, "%s\n*域地址未设置\n", (char *)pstNode->m_psvData);
goto PDOMAIN_ERROR;
}
if(pv->m_lPort <= 0)
{
fprintf(stdout, "%s\n*The domain port is set incorrectly or unset\n",
(char *)pstNode->m_psvData);
goto PDOMAIN_ERROR;
}
pv->m_lGroup = pv->m_lGroup > 0 ? pv->m_lGroup : 1;
pv->m_lTimeOut = pv->m_lTimeOut > 0 ? pv->m_lTimeOut : 5;
pv->m_lTryMax = pv->m_lTryMax > 0 ? pv->m_lTryMax : 3;
pv->m_lKeepLive= pv->m_lKeepLive > 0 ? pv->m_lKeepLive : 30;
}
TFlst(pstRoot);
return RC_SUCC;
PDOMAIN_ERROR:
TFree(*ppstDom);
TFlst(pstRoot);
return RC_FAIL;
}
/*************************************************************************************************
descriptionparse the table of domain
parameters:
pszNode --node
pszBuffer --content
plOut --number
ppIndx --out of index
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lParseTable(char *pszNode, char *pszBuffer, long *plOut, TIndex **ppIndx)
{
long i, n;
TIndex *pv = NULL;
char szTarg[128], szValue[64];
if(NULL == (*ppIndx = (TIndex *)realloc(*ppIndx, (++ (*plOut)) * sizeof(TIndex))))
return RC_FAIL;
pv = &(*ppIndx)[(*plOut) - 1];
memset(pv, 0, sizeof(TIndex));
sfieldreplace(pszBuffer, '\t', ' ');
for(i = 0, n = lfieldnum(pszBuffer, " "); i < n; i ++)
{
memset(szTarg, 0, sizeof(szTarg));
memset(szValue, 0, sizeof(szValue));
if(RC_SUCC != lPraseField(sfieldvalue(pszBuffer, " ", i + 1), szTarg, sizeof(szTarg),
szValue, sizeof(szValue)))
return RC_FAIL;
if(!strcasecmp(szTarg, "TABLE"))
pv->m_table = atol(szValue);
else if(!strcasecmp(szTarg, "TABLENAME"))
strncpy(pv->m_szTable, szValue, sizeof(pv->m_szTable));
else if(!strcasecmp(szTarg, "PART"))
strncpy(pv->m_szPart, szValue, sizeof(pv->m_szPart));
if(!strlen(pv->m_szPart))
strcpy(pv->m_szPart, pszNode);
strcpy(pv->m_szOwner, pszNode);
}
pv->m_lLocal = RES_REMOT_SID;
pv->m_lPers = OPERATE_NULL;
pv->m_lType = TYPE_CLIENT;
strncpy(pv->m_szTime, sGetUpdTime(), sizeof(pv->m_szTime));
return RC_SUCC;
}
/*************************************************************************************************
descriptionparse domain resource
parameters:
pszBuffer --content
pstIndex --index
pstDom --domain
plDom --number
ppstDom --domain list
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lParseDomain(char *pszBuffer, TIndex *pstIndex, TDomain *pstDom, long *plDom,
TDomain **ppstDom)
{
long i, n;
TDomain *pv = NULL;
char szTarg[128], szValue[64];
if(NULL == (*ppstDom = (TDomain *)realloc(*ppstDom, (++ (*plDom)) * sizeof(TDomain))))
return RC_FAIL;
pv = &(*ppstDom)[(*plDom) - 1];
memset(pv, 0, sizeof(TDomain));
for(i = 0, n = lfieldnum(pszBuffer, " "); i < n; i ++)
{
memset(szTarg, 0, sizeof(szTarg));
memset(szValue, 0, sizeof(szValue));
if(RC_SUCC != lPraseField(sfieldvalue(pszBuffer, " ", i + 1), szTarg, sizeof(szTarg),
szValue, sizeof(szValue)))
return RC_FAIL;
if(!strcasecmp(szTarg, "MTABLE"))
pv->m_mtable = atol(szValue);
else if(!strcasecmp(szTarg, "DOMAINID"))
strncpy(pv->m_szOwner, szValue, sizeof(pv->m_szOwner));
else
{
fprintf(stdout, "%s\n*Invalid parameter\n", pszBuffer);
return RC_FAIL;
}
}
pv->m_lTryMax = 0;
pv->m_lLastTime = 0;
pv->m_lStatus = RESOURCE_INIT;
pv->m_table = pstIndex->m_table;
pv->m_lPort = pstDom->m_lPort;
pv->m_lGroup = pstDom->m_lGroup;
pv->m_lKeepLive = pstDom->m_lKeepLive;
pv->m_lTimeOut = pstDom->m_lTimeOut;
pv->m_lTryMax = pstDom->m_lTryMax;
strcpy(pv->m_szIp, pstDom->m_szIp);
strcpy(pv->m_szTable, pstIndex->m_szTable);
strcpy(pv->m_szOwner, pstDom->m_szOwner);
if(!strlen(pv->m_szPart))
strcpy(pv->m_szPart, pstDom->m_szOwner);
return RC_SUCC;
}
/*************************************************************************************************
descriptionparse domain table of remote
parameters:
pstSavm --stvm handle
pszFile --config
pstBoot --boot paramter
plOut --number of index
ppstIndex --out of index list
plDom --number of domain
ppstDom --out of domain list
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lParseRemote(SATvm *pstSavm, char *pszFile, TBoot *pstBoot, long *plOut, TIndex **ppstIndex,
long *plDom, TDomain **ppstDom)
{
long i, lResource;
TIndex *pv = NULL;
CMList *pstNode = NULL, *pstRoot = NULL;
TDomain *pstRes = NULL, *pstResouce = NULL;
char szTarg[128], szValue[64], *p = NULL;
if(RC_SUCC != lParseResouce(pstSavm, pszFile, &lResource, &pstResouce))
return RC_FAIL;
if(RC_SUCC != _lParseFile(pstSavm, &pstRoot, pszFile, "*REMOTE_TABLE"))
{
fprintf(stderr, "parse file, err:(%d)(%s)\n", pstSavm->m_lErrno, sGetTError(pstSavm->m_lErrno));
return RC_FAIL;
}
if(!pstRoot)
{
for(i = 0; i < lResource; i ++)
{
pstResouce[i].m_table = SYS_TVM_INDEX;
pstResouce[i].m_mtable = SYS_TVM_INDEX;
strcpy(pstResouce[i].m_szTable, "SYS_TVM_INDEX");
strcpy(pstResouce[i].m_szPart, pstResouce[i].m_szOwner);
}
*plOut = 0;
*ppstIndex = NULL;
*plDom = lResource;
*ppstDom = pstResouce;
return RC_SUCC;
}
else
{
for(pstNode = pstRoot, *plDom = 0, *plOut = 0; pstNode; pstNode = pstNode->pstNext)
{
sfieldreplace((char *)pstNode->m_psvData, '\t', ' ');
if(!strncmp((char *)pstNode->m_psvData, "TABLE", 5))
{
if(RC_SUCC != lParseTable(pstBoot->m_szNode, (char *)pstNode->m_psvData,
plOut, ppstIndex))
goto PREMOTE_ERROR;
pv = &(*ppstIndex)[(*plOut) - 1];
continue;
}
if(NULL == (p = strstr((char *)pstNode->m_psvData, "DOMAINID")))
{
fprintf(stderr, "set error:%s\n", (char *)pstNode->m_psvData);
goto PREMOTE_ERROR;
}
if(NULL == (pstRes = pGetResourse(lResource, pstResouce,
strimabout(sfieldvalue(p, "=", 2), "\"", "\""))))
{
fprintf(stderr, "No domain (%s) is found\n", sfieldvalue(p, "=", 2));
goto PREMOTE_ERROR;
}
if(RC_SUCC != lParseDomain((char *)pstNode->m_psvData, pv, pstRes, plDom, ppstDom))
{
TFlst(pstRoot);
return RC_FAIL;
}
}
}
TFree(pstResouce);
TFlst(pstRoot);
return RC_SUCC;
PREMOTE_ERROR:
TFlst(pstRoot);
TFree(*ppstIndex);
TFree(pstResouce);
return RC_FAIL;
}
/*************************************************************************************************
descriptionDomain uniqueness checks
parameters:
lCount --number
pstDomain --domain list
return:
true --repeat
false
*************************************************************************************************/
BOOL bDomIsRepeat(long lCount, TDomain *pstDomain)
{
int i, j;
for(i = 0; i < lCount; i ++)
{
for(j = 0; j < lCount; j ++)
{
if(i == j) continue;
if(pstDomain[i].m_lPort == pstDomain[j].m_lPort &&
!strcmp(pstDomain[i].m_szIp, pstDomain[j].m_szIp) &&
!strcmp(pstDomain[i].m_szPart, pstDomain[j].m_szPart) &&
!strcmp(pstDomain[i].m_szTable, pstDomain[j].m_szTable))
{
if(SYS_TVM_INDEX == pstDomain[i].m_table)
{
fprintf(stderr, "*domain(%s)(%s:%ld)repeate\n", pstDomain[i].m_szOwner,
pstDomain[i].m_szIp, pstDomain[i].m_lPort);
}
else
{
fprintf(stderr, "*table(%s)(%s)repeate\n", pstDomain[i].m_szTable,
pstDomain[i].m_szPart);
}
return true;
}
}
}
return false;
}
/*************************************************************************************************
descriptionCompile configuration file
parameters:
pszFile --config file
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lMakeConfig(char *pszFile)
{
TBoot stBoot;
FILE *fp = NULL;
TIndex *pstIndex = NULL;
TDomain *pstDomain = NULL;
long i, lOut = 0, lCount = 0;
SATvm *pstSavm = (SATvm *)pGetSATvm();
if(!pszFile || !strlen(pszFile))
{
fprintf(stderr, "The configuration file is not set\n");
return RC_FAIL;
}
if(RC_SUCC != access(pszFile, R_OK | F_OK ))
{
fprintf(stderr, "Insufficient authority(%s), please confirm!!!\n\n", pszFile);
return RC_FAIL;
}
memset(&stBoot, 0, sizeof(TBoot));
if(NULL == (fp = fopen(getenv("TVMCFG"), "wb")))
{
fprintf(stderr, "open (%s) failure, err:(%d)(%s)", getenv("TVMCFG"),
errno, strerror(errno));
return RC_FAIL;
}
fwrite(TVM_RUNCFG_TAG, 4, 1, fp);
if(RC_SUCC != lParseBoot(pstSavm, pszFile, &stBoot))
goto CREATE_ERROR;
fwrite(&stBoot, sizeof(stBoot), 1, fp);
if(TVM_BOOT_CLUSTER != stBoot.m_lBootType) // 单机部署
{
fclose(fp);
fprintf(stdout, "create completed successfully!!!\n");
return RC_FAIL;
}
if(RC_SUCC != lParseIndex(pstSavm, pszFile, &lOut, &pstIndex))
goto CREATE_ERROR;
fwrite(&lOut, sizeof(long), 1, fp);
fwrite(pstIndex, sizeof(TIndex), lOut, fp);
TFree(pstIndex);
if(RC_SUCC != lParseRemote(pstSavm, pszFile, &stBoot, &lOut, &pstIndex,
&lCount, &pstDomain))
goto CREATE_ERROR;
if(bDomIsRepeat(lCount, pstDomain))
goto CREATE_ERROR;
fwrite(&lOut, sizeof(long), 1, fp);
if(lOut > 0)
{
fwrite(pstIndex, sizeof(TIndex), lOut, fp);
TFree(pstIndex);
}
fwrite(&lCount, sizeof(long), 1, fp);
if(lCount > 0)
{
fwrite(pstDomain, sizeof(TDomain), lCount, fp);
TFree(pstDomain);
}
fclose(fp);
fprintf(stdout, "create completed successfully!!!\n");
return RC_SUCC;
CREATE_ERROR:
TFree(pstDomain);
TFree(pstIndex);
fclose(fp);
return RC_FAIL;
}
/*************************************************************************************************
descriptionDecompilate compilation configuration
parameters:
pszFile --config file
return:
RC_SUCC --success
RC_FAIL --failure
*************************************************************************************************/
long lUnmakeConfig(char *pszFile)
{
char ch;
TBoot stBoot;
FILE *fp = NULL;
BOOL bf = false;
TIndex *pstIndex = NULL;
TDomain *pstDomain = NULL;
long i, j, lOut = 0, lCount = 0;
SATvm *pstSavm = (SATvm *)pGetSATvm();
if(RC_SUCC == access(pszFile, F_OK))
{
fprintf(stderr, "The configuration already exists, Confirm the cover(Y/N)?:");
ch = getchar();
if(ch != 'y' && 'Y' != ch)
return RC_SUCC;
}
if(NULL == (fp = fopen(pszFile, "w")))
{
fprintf(stderr, "open file error, %s\n", strerror(errno));
return RC_FAIL;
}
if(RC_SUCC != lGetBootConfig(pstSavm, &stBoot))
goto UNMAKE_ERR;
fprintf(fp, "*GLOBLE\n");
fprintf(fp, "MACHINE=\"%s\"\n", stBoot.m_szNode);
fprintf(fp, "MAXTABLE=%ld\n", stBoot.m_lMaxTable);
fprintf(fp, "MAXFILED=%ld\n", stBoot.m_lMaxField);
fprintf(fp, "MAXDOMAIN=%ld\n", stBoot.m_lMaxDomain);
fprintf(fp, "MAXSEQUE=%ld\n", stBoot.m_lMaxSeque);
fprintf(fp, "SERVER_EXEC=%ld\n", stBoot.m_lBootExec);
fprintf(fp, "SERVER_PORT=%ld\n", stBoot.m_lBootPort);
fprintf(fp, "LOGNAME=\"%s\"\n\n", stBoot.m_szLog);
fprintf(fp, "*LOCAL_RESOURCE\n");
if(RC_SUCC != lGetLocalIndex(pstSavm, &lCount, (void *)&pstIndex))
goto UNMAKE_ERR;
for(i = 0; i < lCount; i ++)
fprintf(fp, "TABLE=%d PERMIT=%ld\n", pstIndex[i].m_table, pstIndex[i].m_lPers);
TFree(pstIndex);
fprintf(fp, "\n*REMOTE_DOMAIN");
if(RC_SUCC != lGetDomainIndex(pstSavm, &lCount, &pstIndex))
goto UNMAKE_ERR;
if(RC_SUCC != lGetDomainTable(pstSavm, &lOut, &pstDomain))
goto UNMAKE_ERR;
for(i = 0; i < lCount; i ++)
{
fprintf(fp, "\nTABLE=%d TABLENAME=\"%s\" PART=\"%s\" ", pstIndex[i].m_table,
pstIndex[i].m_szTable, pstIndex[i].m_szPart);
for(j = 0, bf = false; j < lOut; j ++)
{
if(strcmp(pstDomain[j].m_szTable, pstIndex[i].m_szTable) ||
strcmp(pstDomain[j].m_szPart, pstIndex[i].m_szPart))
continue;
if(!bf)
{
bf = !bf;
fprintf(fp, "GROUP=%ld TIMTOUT=%ld MAXTRY=%ld KEEPALIVE=%ld\n",
pstDomain[j].m_lGroup, pstDomain[j].m_lTimeOut, pstDomain[j].m_lTryMax,
pstDomain[j].m_lKeepLive);
}
fprintf(fp, "\tDOMAINID=\"%s\" WSADDR=\"%s:%ld\"\n", pstDomain[j].m_szOwner,
pstDomain[j].m_szIp, pstDomain[j].m_lPort);
}
}
TFree(pstIndex);
TFree(pstDomain);
fclose(fp);
fprintf(stdout, "导出文件(%s)成功completed successfully!!!\n", pszFile);
return RC_SUCC;
UNMAKE_ERR:
fclose(fp);
TFree(pstIndex);
TFree(pstDomain);
fprintf(stderr, "get config err:(%d)(%s)\n", pstSavm->m_lErrno, sGetTError(pstSavm->m_lErrno));
return RC_FAIL;
}
/**************************************************************************************************
code end
**************************************************************************************************/