// Set the connection settings UINT NtSetClientConfig(NAT *n, RPC_CREATE_LINK *t) { Lock(n->lock); { if (n->ClientOption != NULL || n->ClientAuth != NULL) { Free(n->ClientOption); CiFreeClientAuth(n->ClientAuth); } n->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION)); Copy(n->ClientOption, t->ClientOption, sizeof(CLIENT_OPTION)); n->ClientAuth = CopyClientAuth(t->ClientAuth); } Unlock(n->lock); NiWriteConfig(n); if (n->Online) { NtOffline(n, NULL); NtOnline(n, NULL); } return ERR_NO_ERROR; }
// Offline UINT NtOffline(NAT *n, RPC_DUMMY *t) { UINT ret = ERR_NO_ERROR; Lock(n->lock); { if (n->Online == false) { // It is offline ret = ERR_OFFLINE; } else { // Offline StopVirtualHost(n->Virtual); ReleaseVirtual(n->Virtual); n->Virtual = NULL; n->Online = false; } } Unlock(n->lock); NiWriteConfig(n); return ret; }
// Online UINT NtOnline(NAT *n, RPC_DUMMY *t) { UINT ret = ERR_NO_ERROR; Lock(n->lock); { if (n->Online) { // It is already online ret = ERR_ALREADY_ONLINE; } else { if (n->ClientOption == NULL || n->ClientAuth == NULL) { // Setting is not yet done ret = ERR_ACCOUNT_NOT_PRESENT; } else { // OK n->Online = true; // Start connection n->Virtual = NewVirtualHostEx(n->Cedar, n->ClientOption, n->ClientAuth, &n->Option, n); } } } Unlock(n->lock); NiWriteConfig(n); return ret; }
// オンラインにする UINT NtOnline(NAT *n, RPC_DUMMY *t) { UINT ret = ERR_NO_ERROR; Lock(n->lock); { if (n->Online) { // すでにオンラインである ret = ERR_ALREADY_ONLINE; } else { if (n->ClientOption == NULL || n->ClientAuth == NULL) { // 設定がまだ ret = ERR_ACCOUNT_NOT_PRESENT; } else { // OK n->Online = true; // 接続開始 n->Virtual = NewVirtualHostEx(n->Cedar, n->ClientOption, n->ClientAuth, &n->Option, n); } } } Unlock(n->lock); NiWriteConfig(n); return ret; }
// Set a password UINT NtSetPassword(NAT *n, RPC_SET_PASSWORD *t) { Copy(n->HashedPassword, t->HashedPassword, SHA1_SIZE); NiWriteConfig(n); return ERR_NO_ERROR; }
// Set host options UINT NtSetHostOption(NAT *n, VH_OPTION *t) { UINT ret = ERR_NO_ERROR; Lock(n->lock); { Copy(&n->Option, t, sizeof(VH_OPTION)); } Unlock(n->lock); SetVirtualHostOption(n->Virtual, t); NiWriteConfig(n); return ret; }
// Release the NAT configuration void NiFreeConfig(NAT *n) { // Validate arguments if (n == NULL) { return; } // Write the latest configuration NiWriteConfig(n); // Release the configuration R/W FreeCfgRw(n->CfgRw); n->CfgRw = NULL; Free(n->ClientOption); CiFreeClientAuth(n->ClientAuth); FreeX(n->AdminX); FreeK(n->AdminK); }
// NAT の設定の解放 void NiFreeConfig(NAT *n) { // 引数チェック if (n == NULL) { return; } // 最新の設定の書き込み NiWriteConfig(n); // 設定 R/W の解放 FreeCfgRw(n->CfgRw); n->CfgRw = NULL; Free(n->ClientOption); CiFreeClientAuth(n->ClientAuth); FreeX(n->AdminX); FreeK(n->AdminK); }