// Add a binary ITEM *CfgAddBuf(FOLDER *f, char *name, BUF *b) { // Validate arguments if (f == NULL || name == NULL || b == NULL) { return NULL; } return CfgAddByte(f, name, b->Buf, b->Size); }
// Write the configuration to a file void NiWriteConfig(NAT *n) { // Validate arguments if (n == NULL) { return; } Lock(n->lock); { FOLDER *root = CfgCreateFolder(NULL, TAG_ROOT); BUF *b; // Certificate b = XToBuf(n->AdminX, false); CfgAddBuf(root, "AdminCert", b); FreeBuf(b); // Secret key b = KToBuf(n->AdminK, false, NULL); CfgAddBuf(root, "AdminKey", b); FreeBuf(b); // Password CfgAddByte(root, "HashedPassword", n->HashedPassword, sizeof(n->HashedPassword)); CfgAddInt(root, "AdminPort", n->AdminPort); CfgAddBool(root, "Online", n->Online); // Virtual host option NiWriteVhOption(n, root); // Connection options if (n->ClientOption != NULL && n->ClientAuth != NULL) { NiWriteClientData(n, root); } SaveCfgRw(n->CfgRw, root); CfgDeleteFolder(root); } Unlock(n->lock); }
// 設定をファイルに書き込む void NiWriteConfig(NAT *n) { // 引数チェック if (n == NULL) { return; } Lock(n->lock); { FOLDER *root = CfgCreateFolder(NULL, TAG_ROOT); BUF *b; // 証明書 b = XToBuf(n->AdminX, false); CfgAddBuf(root, "AdminCert", b); FreeBuf(b); // 秘密鍵 b = KToBuf(n->AdminK, false, NULL); CfgAddBuf(root, "AdminKey", b); FreeBuf(b); // パスワード CfgAddByte(root, "HashedPassword", n->HashedPassword, sizeof(n->HashedPassword)); CfgAddInt(root, "AdminPort", n->AdminPort); CfgAddBool(root, "Online", n->Online); // 仮想ホストオプション NiWriteVhOption(n, root); // 接続オプション if (n->ClientOption != NULL && n->ClientAuth != NULL) { NiWriteClientData(n, root); } SaveCfgRw(n->CfgRw, root); CfgDeleteFolder(root); } Unlock(n->lock); }
// Write the configuration to the folder void ElSaveConfigToFolder(EL *e, FOLDER *root) { UINT i; FOLDER *devices; // Validate arguments if (e == NULL || root == NULL) { return; } CfgAddInt64(root, "AutoDeleteCheckDiskFreeSpaceMin", e->AutoDeleteCheckDiskFreeSpaceMin); CfgAddInt(root, "AdminPort", e->Port); CfgAddByte(root, "AdminPassword", e->HashedPassword, sizeof(e->HashedPassword)); if (ELOG_IS_BETA == false) { EiWriteLicenseManager(CfgCreateFolder(root, "LicenseManager"), e); } devices = CfgCreateFolder(root,"Devices"); LockList(e->DeviceList); { for (i = 0;i < LIST_NUM(e->DeviceList);i++) { FOLDER *f; EL_DEVICE *d = LIST_DATA(e->DeviceList, i); f = CfgCreateFolder(devices, d->DeviceName); SiWriteHubLogCfgEx(f, &d->LogSetting, true); CfgAddBool(f, "NoPromiscusMode", d->NoPromiscus); } } UnlockList(e->DeviceList); }
// Read the next folder void CfgReadNextFolderBin(BUF *b, FOLDER *parent) { char name[MAX_SIZE]; FOLDER *f; UINT n, i; UINT size; UCHAR *buf; wchar_t *string; // Validate arguments if (b == NULL || parent == NULL) { return; } // Folder name ReadBufStr(b, name, sizeof(name)); f = CfgCreateFolder(parent, name); // The number of the subfolder n = ReadBufInt(b); for (i = 0;i < n;i++) { // Subfolder CfgReadNextFolderBin(b, f); } // The number of items n = ReadBufInt(b); for (i = 0;i < n;i++) { UINT type; // Name ReadBufStr(b, name, sizeof(name)); // Type type = ReadBufInt(b); switch (type) { case ITEM_TYPE_INT: // int CfgAddInt(f, name, ReadBufInt(b)); break; case ITEM_TYPE_INT64: // int64 CfgAddInt64(f, name, ReadBufInt64(b)); break; case ITEM_TYPE_BYTE: // data size = ReadBufInt(b); buf = ZeroMalloc(size); ReadBuf(b, buf, size); CfgAddByte(f, name, buf, size); Free(buf); break; case ITEM_TYPE_STRING: // string size = ReadBufInt(b); buf = ZeroMalloc(size + 1); ReadBuf(b, buf, size); string = ZeroMalloc(CalcUtf8ToUni(buf, StrLen(buf)) + 4); Utf8ToUni(string, 0, buf, StrLen(buf)); CfgAddUniStr(f, name, string); Free(string); Free(buf); break; case ITEM_TYPE_BOOL: // bool CfgAddBool(f, name, ReadBufInt(b) == 0 ? false : true); break; } } }
// 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; }