[ttssh2-commit] [10276] 新しい接続でcomポートが存在する時、メモリリークしていたので修正

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2022年 9月 20日 (火) 00:40:58 JST


Revision: 10276
          https://osdn.net/projects/ttssh2/scm/svn/commits/10276
Author:   zmatsuo
Date:     2022-09-20 00:40:58 +0900 (Tue, 20 Sep 2022)
Log Message:
-----------
新しい接続でcomポートが存在する時、メモリリークしていたので修正

- ComPortInfoGet() を使用するようにした
  - DetectComPorts() を使用しないようにした
- ダイアログのプロシージャ関数内でstatic変数を使用しないようにした
- comポートの情報は動的なメモリ上に取得するので内部的には上限がなくなった
  - tttypes.h で MAXCOMPORT は 4096 としてある

Modified Paths:
--------------
    trunk/teraterm/ttpcmn/ttcmn.c
    trunk/teraterm/ttpdlg/ttdlg.c
    trunk/ttssh2/ttxssh/ttxssh.c

-------------- next part --------------
Modified: trunk/teraterm/ttpcmn/ttcmn.c
===================================================================
--- trunk/teraterm/ttpcmn/ttcmn.c	2022-09-19 15:40:47 UTC (rev 10275)
+++ trunk/teraterm/ttpcmn/ttcmn.c	2022-09-19 15:40:58 UTC (rev 10276)
@@ -67,16 +67,20 @@
 
 void WINAPI SetCOMFlag(int Com)
 {
+	if (Com <= 0 || MAXCOMPORT <= Com) return;
 	pm->ComFlag[(Com-1)/CHAR_BIT] |= 1 << ((Com-1)%CHAR_BIT);
 }
 
 void WINAPI ClearCOMFlag(int Com)
 {
+	if (Com <= 0 || MAXCOMPORT <= Com) return;
 	pm->ComFlag[(Com-1)/CHAR_BIT] &= ~(1 << ((Com-1)%CHAR_BIT));
 }
 
 int WINAPI CheckCOMFlag(int Com)
 {
+	if (Com <= 0) return 0;
+	if (Com > MAXCOMPORT) return 1;
 	return ((pm->ComFlag[(Com-1)/CHAR_BIT] & 1 << (Com-1)%CHAR_BIT) > 0);
 }
 

Modified: trunk/teraterm/ttpdlg/ttdlg.c
===================================================================
--- trunk/teraterm/ttpdlg/ttdlg.c	2022-09-19 15:40:47 UTC (rev 10275)
+++ trunk/teraterm/ttpdlg/ttdlg.c	2022-09-19 15:40:58 UTC (rev 10276)
@@ -1647,6 +1647,12 @@
 	return FALSE;
 }
 
+typedef struct {
+	PGetHNRec GetHNRec;
+	ComPortInfo_t *ComPortInfoPtr;
+	int ComPortInfoCount;
+} TTXHostDlgData;
+
 static INT_PTR CALLBACK HostDlg(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
 {
 	static const DlgTextInfo TextInfos[] = {
@@ -1660,19 +1666,20 @@
 		{ IDCANCEL, "BTN_CANCEL" },
 		{ IDC_HOSTHELP, "BTN_HELP" },
 	};
-	PGetHNRec GetHNRec;
-	char EntName[128];
-	WORD i, j, w;
-	BOOL Ok;
-	WORD ComPortTable[MAXCOMPORT];
-	static char *ComPortDesc[MAXCOMPORT];
-	int comports;
+	TTXHostDlgData *dlg_data = (TTXHostDlgData *)GetWindowLongPtr(Dialog, DWLP_USER);
+	PGetHNRec GetHNRec = dlg_data != NULL ? dlg_data->GetHNRec : NULL;
 
 	switch (Message) {
-		case WM_INITDIALOG:
+		case WM_INITDIALOG: {
+			WORD i;
+			int j;
 			GetHNRec = (PGetHNRec)lParam;
-			SetWindowLongPtr(Dialog, DWLP_USER, lParam);
+			dlg_data = (TTXHostDlgData *)calloc(sizeof(*dlg_data), 1);
+			SetWindowLongPtr(Dialog, DWLP_USER, (LPARAM)dlg_data);
+			dlg_data->GetHNRec = GetHNRec;
 
+			dlg_data->ComPortInfoPtr = ComPortInfoGet(&dlg_data->ComPortInfoCount, NULL);
+
 			SetDlgTexts(Dialog, TextInfos, _countof(TextInfos), UILanguageFile);
 
 			// \x83t\x83@\x83C\x83\x8B\x82\xA8\x82\xE6\x82і\xBC\x91O\x95t\x82\xAB\x83p\x83C\x83v\x82̏ꍇ\x81ATCP/IP\x88\xB5\x82\xA2\x82Ƃ\xB7\x82\xE9\x81B
@@ -1704,48 +1711,34 @@
 			SendDlgItemMessage(Dialog, IDC_HOSTTCPPROTOCOL, CB_SETCURSEL,0,0);
 
 			j = 0;
-			w = 1;
-			if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {
-				for (i=0; i<comports; i++) {
-					// MaxComPort \x82\xF0\x89z\x82\xA6\x82\xE9\x83|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
-					if (ComPortTable[i] > GetHNRec->MaxComPort) {
-						continue;
-					}
+			for (i = 0; i < dlg_data->ComPortInfoCount; i++) {
+				ComPortInfo_t *p = dlg_data->ComPortInfoPtr + i;
+				wchar_t *EntNameW;
+				int index;
 
-					// \x8Eg\x97p\x92\x86\x82̃|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
-					if (CheckCOMFlag(ComPortTable[i]) == 1) {
-						continue;
-					}
+				// MaxComPort \x82\xF0\x89z\x82\xA6\x82\xE9\x83|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
+				if (GetHNRec->MaxComPort >= 0 && i > GetHNRec->MaxComPort) {
+					continue;
+				}
+				j++;
 
-					_snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);
-					if (ComPortDesc[i] != NULL) {
-						strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
-						strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
-					}
-					SendDlgItemMessage(Dialog, IDC_HOSTCOM, CB_ADDSTRING,
-					                   0, (LPARAM)EntName);
-					j++;
-					if (GetHNRec->ComPort==ComPortTable[i]) {
-						w = j;
-					}
+				// \x8Eg\x97p\x92\x86\x82̃|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
+				if (CheckCOMFlag(p->port_no) == 1) {
+					continue;
 				}
-			} else {
-				for (i=1; i<=GetHNRec->MaxComPort ;i++) {
-					// \x8Eg\x97p\x92\x86\x82̃|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
-					if (CheckCOMFlag(i) == 1) {
-						continue;
-					}
-					_snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);
-					SendDlgItemMessage(Dialog, IDC_HOSTCOM, CB_ADDSTRING,
-					                   0, (LPARAM)EntName);
-					j++;
-					if (GetHNRec->ComPort==i) {
-						w = j;
-					}
+
+				if (p->friendly_name == NULL) {
+					aswprintf(&EntNameW, L"%s", p->port_name);
 				}
+				else {
+					aswprintf(&EntNameW, L"%s: %s", p->port_name, p->friendly_name);
+				}
+				index = (int)SendDlgItemMessageW(Dialog, IDC_HOSTCOM, CB_ADDSTRING, 0, (LPARAM)EntNameW);
+				SendDlgItemMessageA(Dialog, IDC_HOSTCOM, CB_SETITEMDATA, index, i);
+				free(EntNameW);
 			}
 			if (j>0) {
-				SendDlgItemMessage(Dialog, IDC_HOSTCOM, CB_SETCURSEL,w-1,0);
+				SendDlgItemMessage(Dialog, IDC_HOSTCOM, CB_SETCURSEL,0,0);
 			}
 			else { /* All com ports are already used */
 				GetHNRec->PortType = IdTCPIP;
@@ -1765,52 +1758,37 @@
 			CenterWindow(Dialog, GetParent(Dialog));
 
 			return TRUE;
-
+		}
 		case WM_COMMAND:
 			switch (LOWORD(wParam)) {
-				case IDOK:
-					GetHNRec = (PGetHNRec)GetWindowLongPtr(Dialog,DWLP_USER);
-					if ( GetHNRec!=NULL ) {
-						char afstr[BUFSIZ];
-						GetRB(Dialog,&GetHNRec->PortType,IDC_HOSTTCPIP,IDC_HOSTSERIAL);
-						if ( GetHNRec->PortType==IdTCPIP ) {
-							GetDlgItemTextW(Dialog, IDC_HOSTNAME, GetHNRec->HostName, HostNameMaxLength);
-						}
-						else {
-							GetHNRec->HostName[0] = 0;
-						}
-						GetRB(Dialog,&GetHNRec->Telnet,IDC_HOSTTELNET,IDC_HOSTTELNET);
-						i = GetDlgItemInt(Dialog,IDC_HOSTTCPPORT,&Ok,FALSE);
-						if (Ok) {
-							GetHNRec->TCPPort = i;
-						}
-#define getaf(str) \
-	((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
-	((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
-						memset(afstr, 0, sizeof(afstr));
-						GetDlgItemText(Dialog, IDC_HOSTTCPPROTOCOL, afstr, sizeof(afstr));
-						GetHNRec->ProtocolFamily = getaf(afstr);
-						memset(EntName,0,sizeof(EntName));
-						GetDlgItemText(Dialog, IDC_HOSTCOM, EntName, sizeof(EntName)-1);
-						if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
-#if 0
-							GetHNRec->ComPort = (BYTE)(EntName[3])-0x30;
-							if (strlen(EntName)>4)
-								GetHNRec->ComPort = GetHNRec->ComPort*10 + (BYTE)(EntName[4])-0x30;
-#else
-							GetHNRec->ComPort = atoi(&EntName[3]);
-#endif
-							if (GetHNRec->ComPort > GetHNRec->MaxComPort) {
-								GetHNRec->ComPort = 1;
-							}
-						}
-						else {
-							GetHNRec->ComPort = 1;
-						}
+				case IDOK: {
+					int i;
+					int pos;
+					int index;
+					BOOL Ok;
+
+					GetRB(Dialog,&GetHNRec->PortType,IDC_HOSTTCPIP,IDC_HOSTSERIAL);
+					if ( GetHNRec->PortType==IdTCPIP ) {
+						GetDlgItemTextW(Dialog, IDC_HOSTNAME, GetHNRec->HostName, HostNameMaxLength);
 					}
+					else {
+						GetHNRec->HostName[0] = 0;
+					}
+					GetRB(Dialog,&GetHNRec->Telnet,IDC_HOSTTELNET,IDC_HOSTTELNET);
+					i = GetDlgItemInt(Dialog,IDC_HOSTTCPPORT,&Ok,FALSE);
+					if (Ok) {
+						GetHNRec->TCPPort = i;
+					}
+					i = (int)SendDlgItemMessage(Dialog, IDC_HOSTTCPPROTOCOL, CB_GETCURSEL, 0, 0);
+					GetHNRec->ProtocolFamily =
+						i == 0 ? AF_UNSPEC :
+						i == 1 ? AF_INET6 : AF_INET;
+					pos = (int)SendDlgItemMessageA(Dialog, IDC_HOSTCOM, CB_GETCURSEL, 0, 0);
+					index = (int)SendDlgItemMessageA(Dialog, IDC_HOSTCOM, CB_GETITEMDATA, pos, 0);
+					GetHNRec->ComPort = dlg_data->ComPortInfoPtr[index].port_no;
 					EndDialog(Dialog, 1);
 					return TRUE;
-
+				}
 				case IDCANCEL:
 					EndDialog(Dialog, 0);
 					return TRUE;
@@ -1827,15 +1805,14 @@
 					DisableDlgItem(Dialog,IDC_HOSTTCPPROTOCOLLABEL,IDC_HOSTTCPPROTOCOL);
 					break;
 
-				case IDC_HOSTTELNET:
+				case IDC_HOSTTELNET: {
+					WORD i;
 					GetRB(Dialog,&i,IDC_HOSTTELNET,IDC_HOSTTELNET);
 					if ( i==1 ) {
-						GetHNRec = (PGetHNRec)GetWindowLongPtr(Dialog,DWLP_USER);
-						if ( GetHNRec!=NULL ) {
-							SetDlgItemInt(Dialog,IDC_HOSTTCPPORT,GetHNRec->TelPort,FALSE);
-						}
+						SetDlgItemInt(Dialog,IDC_HOSTTCPPORT,GetHNRec->TelPort,FALSE);
 					}
 					break;
+				}
 
 				case IDC_HOSTCOM:
 					if(HIWORD(wParam) == CBN_DROPDOWN) {
@@ -1864,6 +1841,11 @@
 					PostMessage(GetParent(Dialog),WM_USER_DLGHELP2,HlpFileNewConnection,0);
 					break;
 			}
+			break;
+		case WM_DESTROY:
+			ComPortInfoFree(dlg_data->ComPortInfoPtr, dlg_data->ComPortInfoCount);
+			free(dlg_data);
+			break;
 	}
 	return FALSE;
 }

Modified: trunk/ttssh2/ttxssh/ttxssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ttxssh.c	2022-09-19 15:40:47 UTC (rev 10275)
+++ trunk/ttssh2/ttxssh/ttxssh.c	2022-09-19 15:40:58 UTC (rev 10276)
@@ -96,6 +96,7 @@
 #include "inifile_com.h"
 #include "asprintf.h"
 #include "win32helper.h"
+#include "comportinfo.h"
 
 #include "libputty.h"
 
@@ -978,8 +979,13 @@
 	}
 }
 
-static INT_PTR CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
-								   LPARAM lParam)
+typedef struct {
+	PGetHNRec GetHNRec;
+	ComPortInfo_t *ComPortInfoPtr;
+	int ComPortInfoCount;
+} TTXHostDlgData;
+
+static INT_PTR CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
 {
 	static const DlgTextInfo text_info[] = {
 		{ 0, "DLG_HOST_TITLE" },
@@ -998,18 +1004,21 @@
 	};
 	static const char *ssh_version[] = {"SSH1", "SSH2", NULL};
 	static const char *ProtocolFamilyList[] = { "AUTO", "IPv6", "IPv4", NULL };
-	PGetHNRec GetHNRec;
-	char EntName[128];
-	WORD i, j, w;
-	WORD ComPortTable[MAXCOMPORT];
-	static char *ComPortDesc[MAXCOMPORT];
-	int comports;
+	TTXHostDlgData *dlg_data = (TTXHostDlgData *)GetWindowLongPtr(dlg, DWLP_USER);
+	PGetHNRec GetHNRec = dlg_data != NULL ? dlg_data->GetHNRec : NULL;
+	WORD i;
 
 	switch (msg) {
-	case WM_INITDIALOG:
-		GetHNRec = (PGetHNRec) lParam;
-		SetWindowLongPtr(dlg, DWLP_USER, lParam);
+	case WM_INITDIALOG: {
+		int j;
 
+		GetHNRec = (PGetHNRec)lParam;
+		dlg_data = (TTXHostDlgData *)calloc(sizeof(*dlg_data), 1);
+		SetWindowLongPtr(dlg, DWLP_USER, (LPARAM)dlg_data);
+		dlg_data->GetHNRec = GetHNRec;
+
+		dlg_data->ComPortInfoPtr = ComPortInfoGet(&dlg_data->ComPortInfoCount, NULL);
+
 		SetI18nDlgStrsW(dlg, "TTSSH", text_info, _countof(text_info), pvar->ts->UILanguageFileW);
 
 		// \x83z\x83X\x83g\x83q\x83X\x83g\x83\x8A\x82̃`\x83F\x83b\x83N\x83{\x83b\x83N\x83X\x82\xF0\x92lj\xC1 (2005.10.21 yutaka)
@@ -1070,50 +1079,35 @@
 
 
 		j = 0;
-		w = 1;
-		comports = DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc);
-		if (comports >= 0) {
-			for (i=0; i<comports; i++) {
-				// MaxComPort \x82\xF0\x89z\x82\xA6\x82\xE9\x83|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
-				if (ComPortTable[i] > GetHNRec->MaxComPort) {
-					continue;
-				}
+		for (i = 0; i < dlg_data->ComPortInfoCount; i++) {
+			ComPortInfo_t *p = dlg_data->ComPortInfoPtr + i;
+			wchar_t *EntNameW;
+			int index;
 
-				// \x8Eg\x97p\x92\x86\x82̃|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
-				if (CheckCOMFlag(ComPortTable[i]) == 1) {
-					continue;
-				}
+			// MaxComPort \x82\xF0\x89z\x82\xA6\x82\xE9\x83|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
+			if (GetHNRec->MaxComPort >= 0 && i > GetHNRec->MaxComPort) {
+				continue;
+			}
+			j++;
 
-				_snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);
-				if (ComPortDesc[i] != NULL) {
-					strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
-					strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
-				}
-				SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
-				                   0, (LPARAM)EntName);
-				j++;
-				if (GetHNRec->ComPort == ComPortTable[i])
-					w = j;
+			// \x8Eg\x97p\x92\x86\x82̃|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
+			if (CheckCOMFlag(p->port_no) == 1) {
+				continue;
 			}
 
-		} else {
-			for (i = 1; i <= GetHNRec->MaxComPort; i++) {
-				// \x8Eg\x97p\x92\x86\x82̃|\x81[\x83g\x82͕\\x8E\xA6\x82\xB5\x82Ȃ\xA2
-				if (CheckCOMFlag(i) == 1) {
-					continue;
-				}
-
-				_snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);
-				SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
-				                   0, (LPARAM) EntName);
-				j++;
-				if (GetHNRec->ComPort == i)
-					w = j;
+			if (p->friendly_name == NULL) {
+				aswprintf(&EntNameW, L"%s", p->port_name);
 			}
+			else {
+				aswprintf(&EntNameW, L"%s: %s", p->port_name, p->friendly_name);
+			}
+			index = (int)SendDlgItemMessageW(dlg, IDC_HOSTCOM, CB_ADDSTRING, 0, (LPARAM)EntNameW);
+			SendDlgItemMessageA(dlg, IDC_HOSTCOM, CB_SETITEMDATA, index, i);
+			free(EntNameW);
 		}
 
 		if (j > 0)
-			SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
+			SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, 0, 0);	// select first com port
 		else {					/* All com ports are already used */
 			GetHNRec->PortType = IdTCPIP;
 			enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
@@ -1160,69 +1154,63 @@
 		// (2004.11.23 yutaka)
 		return FALSE;
 		//return TRUE;
+	}
 
 	case WM_COMMAND:
 		switch (LOWORD(wParam)) {
 		case IDOK:
-			GetHNRec = (PGetHNRec) GetWindowLongPtr(dlg, DWLP_USER);
-			if (GetHNRec != NULL) {
-				if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
-					BOOL Ok;
-					i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
-					if (!Ok) {
-						// TODO IDC_HOSTTCPPORT\x82͐\x94\x92l\x82\xB5\x82\xA9\x93\xFC\x97͂ł\xAB\x82Ȃ\xA2\x81A\x95s\x97v?
-						static const TTMessageBoxInfoW info = {
-							"TTSSH",
-							NULL, L"Tera Term",
-							"MSG_TCPPORT_NAN_ERROR", L"The TCP port must be a number.",
-							MB_OK | MB_ICONEXCLAMATION
-						};
-						TTMessageBoxA(dlg, &info, pvar->ts->UILanguageFile);
-						return TRUE;
-					}
-					GetHNRec->TCPPort = i;
-					i = (int)SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_GETCURSEL, 0, 0);
-					GetHNRec->ProtocolFamily =
-						i == 0 ? AF_UNSPEC :
-						i == 1 ? AF_INET6 : AF_INET;
-					GetHNRec->PortType = IdTCPIP;
-					GetDlgItemTextW(dlg, IDC_HOSTNAME, GetHNRec->HostName, HostNameMaxLength);
-					pvar->hostdlg_activated = TRUE;
-					pvar->hostdlg_Enabled = FALSE;
-					if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
-						GetHNRec->Telnet = TRUE;
-					} else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
-						pvar->hostdlg_Enabled = TRUE;
+			if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
+				BOOL Ok;
+				i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
+				if (!Ok) {
+					// TODO IDC_HOSTTCPPORT\x82͐\x94\x92l\x82\xB5\x82\xA9\x93\xFC\x97͂ł\xAB\x82Ȃ\xA2\x81A\x95s\x97v?
+					static const TTMessageBoxInfoW info = {
+						"TTSSH",
+						NULL, L"Tera Term",
+						"MSG_TCPPORT_NAN_ERROR", L"The TCP port must be a number.",
+						MB_OK | MB_ICONEXCLAMATION
+					};
+					TTMessageBoxA(dlg, &info, pvar->ts->UILanguageFile);
+					return TRUE;
+				}
+				GetHNRec->TCPPort = i;
+				i = (int)SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_GETCURSEL, 0, 0);
+				GetHNRec->ProtocolFamily =
+					i == 0 ? AF_UNSPEC :
+					i == 1 ? AF_INET6 : AF_INET;
+				GetHNRec->PortType = IdTCPIP;
+				GetDlgItemTextW(dlg, IDC_HOSTNAME, GetHNRec->HostName, HostNameMaxLength);
+				pvar->hostdlg_activated = TRUE;
+				pvar->hostdlg_Enabled = FALSE;
+				if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
+					GetHNRec->Telnet = TRUE;
+				} else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
+					pvar->hostdlg_Enabled = TRUE;
 
-						// check SSH protocol version
-						i = (int)SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_GETCURSEL, 0, 0);
-						pvar->settings.ssh_protocol_version = (i == 0) ? 1 : 2;
-					}
-					else {	// IDC_HOSTOTHER
-						GetHNRec->Telnet = FALSE;
-					}
+					// check SSH protocol version
+					i = (int)SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_GETCURSEL, 0, 0);
+					pvar->settings.ssh_protocol_version = (i == 0) ? 1 : 2;
+				}
+				else {	// IDC_HOSTOTHER
+					GetHNRec->Telnet = FALSE;
+				}
 
-					// host history check button
-					if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
-						pvar->ts->HistoryList = 1;
-					} else {
-						pvar->ts->HistoryList = 0;
-					}
-
+				// host history check button
+				if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
+					pvar->ts->HistoryList = 1;
 				} else {
-					GetHNRec->PortType = IdSerial;
-					GetHNRec->HostName[0] = 0;
-					memset(EntName, 0, sizeof(EntName));
-					GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
-					               sizeof(EntName) - 1);
-					if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
-						GetHNRec->ComPort = atoi(&EntName[3]);
-						if (GetHNRec->ComPort > GetHNRec->MaxComPort)
-							GetHNRec->ComPort = 1;
-					} else {
-						GetHNRec->ComPort = 1;
-					}
+					pvar->ts->HistoryList = 0;
 				}
+
+			} else {
+				int pos;
+				int index;
+
+				GetHNRec->PortType = IdSerial;
+				GetHNRec->HostName[0] = 0;
+				pos = (int)SendDlgItemMessageA(dlg, IDC_HOSTCOM, CB_GETCURSEL, 0, 0);
+				index = (int)SendDlgItemMessageA(dlg, IDC_HOSTCOM, CB_GETITEMDATA, pos, 0);
+				GetHNRec->ComPort = dlg_data->ComPortInfoPtr[index].port_no;
 			}
 			EndDialog(dlg, 1);
 			return TRUE;
@@ -1272,12 +1260,8 @@
 			enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
 hostssh_enabled:
 
-			GetHNRec = (PGetHNRec) GetWindowLongPtr(dlg, DWLP_USER);
-
 			if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
-				if (GetHNRec != NULL)
-					SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
-					              FALSE);
+				SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort, FALSE);
 			} else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
 				SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
 			}
@@ -1286,6 +1270,11 @@
 		case IDC_HOSTHELP:
 			PostMessage(GetParent(dlg), WM_USER_DLGHELP2, HlpFileNewConnection, 0);
 		}
+		break;
+	case WM_DESTROY:
+		ComPortInfoFree(dlg_data->ComPortInfoPtr, dlg_data->ComPortInfoCount);
+		free(dlg_data);
+		break;
 	}
 	return FALSE;
 }
@@ -1301,8 +1290,7 @@
 	SetDialogFont(pvar->ts->DialogFontNameW, pvar->ts->DialogFontPoint, pvar->ts->DialogFontCharSet,
 	              pvar->ts->UILanguageFileW, "TTSSH", "DLG_TAHOMA_FONT");
 //	              pvar->ts->UILanguageFile, "TTSSH", "DLG_SYSTEM_FONT");
-	return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
-	                             parent, TTXHostDlg, (LPARAM)rec);
+	return (BOOL)DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG), parent, TTXHostDlg, (LPARAM)rec);
 }
 
 static void PASCAL TTXGetUIHooks(TTXUIHooks *hooks)


ttssh2-commit メーリングリストの案内
Back to archive index