1 // SoftEther VPN Source Code - Developer Edition Master Branch 2 // Mayaqua Kernel 3 4 5 // Cfg.h 6 // Header of Cfg.c 7 8 #ifndef CFG_H 9 #define CFG_H 10 11 #include "Encrypt.h" 12 13 // Macro 14 //#define CHECK_CFG_NAME_EXISTS // Check duplication of the existing name 15 16 #define SAVE_BINARY_FILE_NAME_SWITCH L"$save_binary" 17 18 // Constants 19 #define TAG_DECLARE "declare" 20 #define TAG_STRING "string" 21 #define TAG_INT "uint" 22 #define TAG_INT64 "uint64" 23 #define TAG_BOOL "bool" 24 #define TAG_BYTE "byte" 25 #define TAG_TRUE "true" 26 #define TAG_FALSE "false" 27 #define TAG_END "end" 28 #define TAG_ROOT "root" 29 30 #define TAG_CPYRIGHT "\xef\xbb\xbf# Software Configuration File\r\n# ---------------------------\r\n# \r\n# You may edit this file when the VPN Server / Client / Bridge program is not running.\r\n# \r\n# In prior to edit this file manually by your text editor,\r\n# shutdown the VPN Server / Client / Bridge background service.\r\n# Otherwise, all changes will be lost.\r\n# \r\n" 31 #define TAG_BINARY "SEVPN_DB" 32 33 // Data type 34 #define ITEM_TYPE_INT 1 // int 35 #define ITEM_TYPE_INT64 2 // int64 36 #define ITEM_TYPE_BYTE 3 // byte 37 #define ITEM_TYPE_STRING 4 // string 38 #define ITEM_TYPE_BOOL 5 // bool 39 40 // Folder 41 struct FOLDER 42 { 43 char *Name; // Folder name 44 LIST *Items; // List of items 45 LIST *Folders; // Subfolder 46 struct FOLDER *Parent; // Parent Folder 47 }; 48 49 // Item 50 struct ITEM 51 { 52 char *Name; // Item Name 53 UINT Type; // Data type 54 void *Buf; // Data 55 UINT size; // Data size 56 FOLDER *Parent; // Parent Folder 57 }; 58 59 // Configuration file reader and writer 60 struct CFG_RW 61 { 62 LOCK *lock; // Lock 63 char *FileName; // File name (ANSI) 64 wchar_t *FileNameW; // File name (Unicode) 65 IO *Io; // IO 66 UCHAR LashHash[SHA1_SIZE]; // Hash value which is written last 67 bool DontBackup; // Do not use the backup 68 wchar_t LastSavedDateStr[MAX_SIZE]; // Date and time string that last saved 69 }; 70 71 typedef bool (*ENUM_FOLDER)(FOLDER *f, void *param); 72 typedef bool (*ENUM_ITEM)(ITEM *t, void *param); 73 74 // Parameters for the enumeration 75 struct CFG_ENUM_PARAM 76 { 77 BUF *b; 78 FOLDER *f; 79 UINT depth; 80 }; 81 82 int CmpItemName(void *p1, void *p2); 83 int CmpFolderName(void *p1, void *p2); 84 ITEM *CfgCreateItem(FOLDER *parent, char *name, UINT type, void *buf, UINT size); 85 void CfgDeleteFolder(FOLDER *f); 86 FOLDER *CfgCreateFolder(FOLDER *parent, char *name); 87 void CfgEnumFolder(FOLDER *f, ENUM_FOLDER proc, void *param); 88 TOKEN_LIST *CfgEnumFolderToTokenList(FOLDER *f); 89 TOKEN_LIST *CfgEnumItemToTokenList(FOLDER *f); 90 void CfgEnumItem(FOLDER *f, ENUM_ITEM proc, void *param); 91 FOLDER *CfgFindFolder(FOLDER *parent, char *name); 92 ITEM *CfgFindItem(FOLDER *parent, char *name); 93 ITEM *CfgAddInt(FOLDER *f, char *name, UINT i); 94 ITEM *CfgAddBool(FOLDER *f, char *name, bool b); 95 ITEM *CfgAddInt64(FOLDER *f, char *name, UINT64 i); 96 ITEM *CfgAddByte(FOLDER *f, char *name, void *buf, UINT size); 97 ITEM *CfgAddBuf(FOLDER *f, char *name, BUF *b); 98 ITEM *CfgAddStr(FOLDER *f, char *name, char *str); 99 ITEM *CfgAddUniStr(FOLDER *f, char *name, wchar_t *str); 100 FOLDER *CfgGetFolder(FOLDER *parent, char *name); 101 UINT CfgGetInt(FOLDER *f, char *name); 102 bool CfgGetBool(FOLDER *f, char *name); 103 UINT64 CfgGetInt64(FOLDER *f, char *name); 104 UINT CfgGetByte(FOLDER *f, char *name, void *buf, UINT size); 105 BUF *CfgGetBuf(FOLDER *f, char *name); 106 bool CfgGetStr(FOLDER *f, char *name, char *str, UINT size); 107 bool CfgGetUniStr(FOLDER *f, char *name, wchar_t *str, UINT size); 108 bool CfgIsItem(FOLDER *f, char *name); 109 char *CfgEscape(char *name); 110 bool CfgCheckCharForName(char c); 111 char *CfgUnescape(char *str); 112 BUF *CfgFolderToBuf(FOLDER *f, bool textmode); 113 BUF *CfgFolderToBufEx(FOLDER *f, bool textmode, bool no_banner); 114 BUF *CfgFolderToBufTextEx(FOLDER *f, bool no_banner); 115 BUF *CfgFolderToBufBin(FOLDER *f); 116 void CfgOutputFolderText(BUF *b, FOLDER *f, UINT depth); 117 void CfgOutputFolderBin(BUF *b, FOLDER *f); 118 void CfgAddLine(BUF *b, char *str, UINT depth); 119 void CfgAddDeclare(BUF *b, char *name, UINT depth); 120 void CfgAddEnd(BUF *b, UINT depth); 121 void CfgAddData(BUF *b, UINT type, char *name, char *data, char *sub, UINT depth); 122 char *CfgTypeToStr(UINT type); 123 void CfgAddItemText(BUF *b, ITEM *t, UINT depth); 124 bool CfgEnumFolderProc(FOLDER *f, void *param); 125 bool CfgEnumItemProc(ITEM *t, void *param); 126 FOLDER *CfgBufTextToFolder(BUF *b); 127 FOLDER *CfgBufBinToFolder(BUF *b); 128 void CfgReadNextFolderBin(BUF *b, FOLDER *parent); 129 char *CfgReadNextLine(BUF *b); 130 bool CfgReadNextTextBUF(BUF *b, FOLDER *current); 131 void CfgSave(FOLDER *f, char *name); 132 void CfgSaveW(FOLDER *f, wchar_t *name); 133 bool CfgSaveEx(CFG_RW *rw, FOLDER *f, char *name); 134 bool CfgSaveExW(CFG_RW *rw, FOLDER *f, wchar_t *name); 135 bool CfgSaveExW2(CFG_RW *rw, FOLDER *f, wchar_t *name, UINT *written_size); 136 bool CfgSaveExW3(CFG_RW *rw, FOLDER *f, wchar_t *name, UINT *written_size, bool write_binary); 137 FOLDER *CfgRead(char *name); 138 FOLDER *CfgReadW(wchar_t *name); 139 FOLDER *CfgCreateRoot(); 140 void CfgTest(); 141 void CfgTest2(FOLDER *f, UINT n); 142 CFG_RW *NewCfgRw(FOLDER **root, char *cfg_name); 143 CFG_RW *NewCfgRwEx(FOLDER **root, char *cfg_name, bool dont_backup); 144 CFG_RW *NewCfgRwExW(FOLDER **root, wchar_t *cfg_name, bool dont_backup); 145 CFG_RW *NewCfgRwEx2W(FOLDER **root, wchar_t *cfg_name, bool dont_backup, wchar_t *template_name); 146 CFG_RW *NewCfgRwEx2A(FOLDER **root, char *cfg_name_a, bool dont_backup, char *template_name_a); 147 UINT SaveCfgRw(CFG_RW *rw, FOLDER *f); 148 UINT SaveCfgRwEx(CFG_RW *rw, FOLDER *f, UINT revision_number); 149 void FreeCfgRw(CFG_RW *rw); 150 ITEM *CfgAddIp32(FOLDER *f, char *name, UINT ip); 151 UINT CfgGetIp32(FOLDER *f, char *name); 152 bool CfgGetIp6Addr(FOLDER *f, char *name, IPV6_ADDR *addr); 153 ITEM *CfgAddIp6Addr(FOLDER *f, char *name, IPV6_ADDR *addr); 154 bool FileCopy(char *src, char *dst); 155 bool FileCopyW(wchar_t *src, wchar_t *dst); 156 bool FileCopyExW(wchar_t *src, wchar_t *dst, bool read_lock); 157 void BackupCfgWEx(CFG_RW *rw, FOLDER *f, wchar_t *original, UINT revision_number); 158 159 #if (!defined(CFG_C)) || (!defined(OS_UNIX)) 160 bool CfgGetIp(FOLDER *f, char *name, struct IP *ip); 161 ITEM *CfgAddIp(FOLDER *f, char *name, struct IP *ip); 162 #endif 163 164 #endif // CFG_H 165 166 167 168