/* * 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}; /************************************************************************************************* description:get the config of boot parameters: return: void* *************************************************************************************************/ void* pGetBoot() { return &g_stBoot; } /************************************************************************************************* description:get log file parameters: return: void* *************************************************************************************************/ char* pGetLog() { return g_stBoot.m_szLog; } /************************************************************************************************* description:Get the current node parameters: return: void* *************************************************************************************************/ char* sGetNode() { return g_stBoot.m_szNode; } /************************************************************************************************* description:Set the current node parameters: return: *************************************************************************************************/ void vSetNode(char *s) { if(!s) return ; strncpy(g_stBoot.m_szNode, s, sizeof(g_stBoot.m_szNode)); } /************************************************************************************************* description:Set STVM boot type parameters: return: *************************************************************************************************/ void vSetBootType(long lType) { g_stBoot.m_lBootType = lType; } /************************************************************************************************* description:Get current type of boot parameters: return: lBootType *************************************************************************************************/ long lGetBootType() { return g_stBoot.m_lBootType; } /************************************************************************************************* 函数说明:获取配置日志名称 参数说明: 返回值: void --日志名 *************************************************************************************************/ char* sGetLog() { return g_stBoot.m_szLog; } /************************************************************************************************* description:create 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; } /************************************************************************************************* description:from 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; } /************************************************************************************************* description:from 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; } /************************************************************************************************* description:from 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; } /************************************************************************************************* description:from 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; } /************************************************************************************************* description:parse 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; } /************************************************************************************************* description:from 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; } /************************************************************************************************* description:parse 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; } /************************************************************************************************* description:get 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; } /************************************************************************************************* description:parse 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; } /************************************************************************************************* description:parse 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; } /************************************************************************************************* description:parse 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; } /************************************************************************************************* description:parse 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; } /************************************************************************************************* description:parse 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; } /************************************************************************************************* description:Domain 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; } /************************************************************************************************* description:Compile 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; } /************************************************************************************************* description:Decompilate 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 **************************************************************************************************/