// Read an INI file LIST *ReadIni(BUF *b) { LIST *o; // Validate arguments if (b == NULL) { return NULL; } o = NewListFast(NULL); SeekBuf(b, 0, 0); while (true) { char *line = CfgReadNextLine(b); if (line == NULL) { break; } Trim(line); if (IsEmptyStr(line) == false) { if (StartWith(line, "#") == false && StartWith(line, "//") == false && StartWith(line, ";") == false) { char *key, *value; UINT size = StrLen(line) + 1; key = ZeroMalloc(size); value = ZeroMalloc(size); if (GetKeyAndValue(line, key, size, value, size, NULL)) { UINT uni_size; INI_ENTRY *e = ZeroMalloc(sizeof(INI_ENTRY)); e->Key = CopyStr(key); e->Value = CopyStr(value); uni_size = CalcUtf8ToUni((BYTE *)value, StrLen(value)); e->UnicodeValue = ZeroMalloc(uni_size); Utf8ToUni(e->UnicodeValue, uni_size, (BYTE *)value, StrLen(value)); Add(o, e); } Free(key); Free(value); } } Free(line); } return o; }
bool LoadTableW(wchar_t *filename) { bool ret; BUF *b; wchar_t replace_name[MAX_PATH]; Zero(replace_name, sizeof(replace_name)); TrackingDisable(); b = ReadDump("@table_name.txt"); if (b != NULL) { char *s = CfgReadNextLine(b); if (s != NULL) { if (IsEmptyStr(s) == false) { StrToUni(replace_name, sizeof(replace_name), s); filename = replace_name; } Free(s); } FreeBuf(b); } ret = LoadTableMain(filename); TrackingEnable(); return ret; }
// Initialize net service list void InitNetSvcList(CEDAR *cedar) { char filename[MAX_PATH] = "/etc/services"; BUF *b; // Validate arguments if (cedar == NULL) { return; } #ifdef OS_WIN32 Format(filename, sizeof(filename), "%s\\drivers\\etc\\services", MsGetSystem32Dir()); #endif cedar->NetSvcList = NewList(CompareNetSvc); b = ReadDump(filename); if (b == NULL) { return; } while (true) { char *s = CfgReadNextLine(b); if (s == NULL) { break; } Trim(s); if (s[0] != '#') { TOKEN_LIST *t = ParseToken(s, " \t/"); if (t->NumTokens >= 3) { NETSVC *n = ZeroMalloc(sizeof(NETSVC)); n->Name = CopyStr(t->Token[0]); n->Udp = (StrCmpi(t->Token[2], "udp") == 0 ? true : false); n->Port = ToInt(t->Token[1]); Add(cedar->NetSvcList, n); } FreeToken(t); } Free(s); } FreeBuf(b); }
// Read the next line from the input file wchar_t *ConsoleReadNextFromInFile(CONSOLE *c) { LOCAL_CONSOLE_PARAM *p; char *str; // Validate arguments if (c == NULL) { return NULL; } p = (LOCAL_CONSOLE_PARAM *)c->Param; if (p->InBuf == NULL) { return NULL; } while (true) { str = CfgReadNextLine(p->InBuf); if (str == NULL) { return NULL; } Trim(str); if (IsEmptyStr(str) == false) { UINT size; wchar_t *ret; size = CalcUtf8ToUni((BYTE *)str, StrLen(str)); ret = ZeroMalloc(size + 32); Utf8ToUni(ret, size, (BYTE *)str, StrLen(str)); Free(str); return ret; } Free(str); } }
// Get interface description string bool EthGetInterfaceDescriptionUnix(char *name, char *str, UINT size) { char tmp[MAX_SIZE]; bool ret = false; BUF *b; // Validate arguments if (name == NULL || str == NULL) { return false; } StrCpy(str, size, name); Format(tmp, sizeof(tmp), "/etc/sysconfig/networking/devices/ifcfg-%s", name); b = ReadDump(tmp); if (b != NULL) { char *line = CfgReadNextLine(b); if (IsEmptyStr(line) == false) { if (StartWith(line, "#")) { char tmp[MAX_SIZE]; StrCpy(tmp, sizeof(tmp), line + 1); Trim(tmp); tmp[60] = 0; StrCpy(str, size, tmp); ret = true; } } Free(line); FreeBuf(b); } return ret; }
// Read the lang.config file bool LoadLangConfig(wchar_t *filename, char *str, UINT str_size) { BUF *b; bool ret = false; // Validate arguments if (filename == NULL || str == NULL) { return false; } b = ReadDumpW(filename); if (b == NULL) { return false; } while (true) { char *line = CfgReadNextLine(b); if (line == NULL) { break; } Trim(line); if (IsEmptyStr(line) == false) { if (StartWith(line, "#") == false && StartWith(line, "//") == false && StartWith(line, ";") == false && InStr(line, "#") == false) { StrCpy(str, str_size, line); ret = true; } } Free(line); } FreeBuf(b); return ret; }
// Read the inf file from the buffer bool ViLoadInfFromBuf(VI_SETTING *set, BUF *buf) { bool ret; if (set == NULL || buf == NULL) { return false; } Zero(set, sizeof(VI_SETTING)); SeekBuf(buf, 0, 0); while (true) { char *tmp = CfgReadNextLine(buf); TOKEN_LIST *tokens; if (tmp == NULL) { break; } tokens = ParseToken(tmp, " \t"); if (tokens != NULL) { if (tokens->NumTokens >= 2) { if (StartWith(tokens->Token[0], "#") == false || StartWith(tokens->Token[0], "//") == false) { char *name, *value; name = tokens->Token[0]; value = tokens->Token[1]; if (StrCmpi(name, "VpnInstallBuild") == 0) { set->VpnInstallBuild = ToInt(value); } else if (StrCmpi(name, "NormalMode") == 0) { set->NormalMode = ToBool(value); } else if (StrCmpi(name, "VpnSettingPath") == 0) { StrCpy(set->SettingPath, sizeof(set->SettingPath), value); } else if (StrCmpi(name, "VpnClientBuild") == 0) { set->x86.Build = ToInt(value); } else if (StrCmpi(name, "VpnClientPath") == 0) { StrCpy(set->x86.Path, sizeof(set->x86.Path), value); } } } FreeToken(tokens); } Free(tmp); } ret = false; StrCpy(set->x86.VpnCMgrExeFileName, sizeof(set->x86.VpnCMgrExeFileName), (MsIsX64() ? "vpncmgr_x64.exe" : "vpncmgr.exe")); if (set->VpnInstallBuild != 0) { if (set->x86.Build != 0 && IsEmptyStr(set->x86.Path) == false) { set->x86.Supported = true; ret = true; } } return ret; }
// Read the text stream bool CfgReadNextTextBUF(BUF *b, FOLDER *current) { char *buf; TOKEN_LIST *token; char *name; char *string; char *data; bool ret; FOLDER *f; // Validate arguments if (b == NULL || current == NULL) { return false; } ret = true; // Read one line buf = CfgReadNextLine(b); if (buf == NULL) { return false; } // Analyze this line token = ParseToken(buf, "\t "); if (token == NULL) { Free(buf); return false; } if (token->NumTokens >= 1) { if (!StrCmpi(token->Token[0], TAG_DECLARE)) { if (token->NumTokens >= 2) { // declare name = CfgUnescape(token->Token[1]); // Create a folder f = CfgCreateFolder(current, name); // Read the next folder while (true) { if (CfgReadNextTextBUF(b, f) == false) { break; } } Free(name); } } if (!StrCmpi(token->Token[0], "}")) { // end ret = false; } if (token->NumTokens >= 3) { name = CfgUnescape(token->Token[1]); data = token->Token[2]; if (!StrCmpi(token->Token[0], TAG_STRING)) { // string wchar_t *uni; UINT uni_size; string = CfgUnescape(data); uni_size = CalcUtf8ToUni(string, StrLen(string)); if (uni_size != 0) { uni = Malloc(uni_size); Utf8ToUni(uni, uni_size, string, StrLen(string)); CfgAddUniStr(current, name, uni); Free(uni); } Free(string); } if (!StrCmpi(token->Token[0], TAG_INT)) { // uint CfgAddInt(current, name, ToInt(data)); } if (!StrCmpi(token->Token[0], TAG_INT64)) { // uint64 CfgAddInt64(current, name, ToInt64(data)); } if (!StrCmpi(token->Token[0], TAG_BOOL)) { // bool bool b = false; if (!StrCmpi(data, TAG_TRUE)) { b = true; } else if (ToInt(data) != 0) { b = true; } CfgAddBool(current, name, b); } if (!StrCmpi(token->Token[0], TAG_BYTE)) { // byte char *unescaped_b64 = CfgUnescape(data); void *tmp = Malloc(StrLen(unescaped_b64) * 4 + 64); int size = B64_Decode(tmp, unescaped_b64, StrLen(unescaped_b64)); CfgAddByte(current, name, tmp, size); Free(tmp); Free(unescaped_b64); } Free(name); } } // Release of the token FreeToken(token); Free(buf); return ret; }
// Read the language list LIST *LoadLangList() { LIST *o = NewListFast(NULL); char *filename = LANGLIST_FILENAME; BUF *b; b = ReadDump(filename); if (b == NULL) { return NULL; } while (true) { char *line = CfgReadNextLine(b); if (line == NULL) { break; } Trim(line); if (IsEmptyStr(line) == false && StartWith(line, "#") == false) { TOKEN_LIST *t = ParseToken(line, "\t "); if (t != NULL) { if (t->NumTokens == 6) { LANGLIST *e = ZeroMalloc(sizeof(LANGLIST)); TOKEN_LIST *t2; e->Id = ToInt(t->Token[0]); StrCpy(e->Name, sizeof(e->Name), t->Token[1]); Utf8ToUni(e->TitleEnglish, sizeof(e->TitleEnglish), t->Token[2], StrLen(t->Token[2])); Utf8ToUni(e->TitleLocal, sizeof(e->TitleLocal), t->Token[3], StrLen(t->Token[3])); UniReplaceStrEx(e->TitleEnglish, sizeof(e->TitleEnglish), e->TitleEnglish, L"_", L" ", true); UniReplaceStrEx(e->TitleLocal, sizeof(e->TitleLocal), e->TitleLocal, L"_", L" ", true); e->LcidList = NewIntList(false); t2 = ParseToken(t->Token[4], ","); if (t2 != NULL) { UINT i; for (i = 0;i < t2->NumTokens;i++) { UINT id = ToInt(t2->Token[i]); AddIntDistinct(e->LcidList, id); } FreeToken(t2); } e->LangList = NewListFast(NULL); t2 = ParseToken(t->Token[5], ","); if (t2 != NULL) { UINT i; for (i = 0;i < t2->NumTokens;i++) { Add(e->LangList, CopyStr(t2->Token[i])); } FreeToken(t2); } Add(o, e); } FreeToken(t); } } Free(line); } FreeBuf(b); return o; }
// Read a string table from the buffer bool LoadTableFromBuf(BUF *b) { char *tmp; char prefix[MAX_SIZE]; LIST *replace_list = NULL; UINT i; // Validate arguments if (b == NULL) { return false; } // If the table already exists, delete it FreeTable(); // Create a list TableList = NewList(CmpTableName); Zero(prefix, sizeof(prefix)); replace_list = NewListFast(NULL); // Read the contents of the buffer line by line while (true) { TABLE *t; bool ok = true; tmp = CfgReadNextLine(b); if (tmp == NULL) { break; } if (tmp[0] == '$') { char key[128]; char value[MAX_SIZE]; if (GetKeyAndValue(tmp, key, sizeof(key), value, sizeof(value), " \t")) { if (StartWith(key, "$") && EndWith(key, "$") && StrLen(key) >= 3) { TABLE *t; wchar_t univalue[MAX_SIZE]; wchar_t uniname[MAX_SIZE]; t = ZeroMalloc(sizeof(TABLE)); Zero(univalue, sizeof(univalue)); Utf8ToUni(univalue, sizeof(univalue), value, StrLen(value)); StrToUni(uniname, sizeof(uniname), key); t->name = (char *)CopyUniStr(uniname); t->unistr = CopyUniStr(univalue); Add(replace_list, t); // Found a replacement definition ok = false; } } } if (ok) { t = ParseTableLine(tmp, prefix, sizeof(prefix), replace_list); if (t != NULL) { // Register Insert(TableList, t); } } Free(tmp); } for (i = 0;i < LIST_NUM(replace_list);i++) { TABLE *t = LIST_DATA(replace_list, i); Free(t->name); Free(t->str); Free(t->unistr); Free(t); } ReleaseList(replace_list); return true; }