[Ttssh2-commit] [8924] D&DによるSCP送信で、多数のファイルを一括送信するとエラーになる問題を修正した。

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 8月 24日 (月) 19:53:55 JST


Revision: 8924
          https://osdn.net/projects/ttssh2/scm/svn/commits/8924
Author:   youlab
Date:     2020-08-24 19:53:55 +0900 (Mon, 24 Aug 2020)
Log Message:
-----------
D&DによるSCP送信で、多数のファイルを一括送信するとエラーになる問題を修正した。
sshd_configのMaxSessions=10の場合、10個目の送信でエラーとなっていた。

Modified Paths:
--------------
    branches/4-stable/doc/en/html/about/history.html
    branches/4-stable/doc/ja/html/about/history.html
    branches/4-stable/teraterm/common/tttypes.h
    branches/4-stable/teraterm/teraterm/vtwin.cpp
    branches/4-stable/ttssh2/ttxssh/ssh.c
    branches/4-stable/ttssh2/ttxssh/ssh.h
    branches/4-stable/ttssh2/ttxssh/ttxssh.c
    branches/4-stable/ttssh2/ttxssh/ttxssh.def

-------------- next part --------------
Modified: branches/4-stable/doc/en/html/about/history.html
===================================================================
--- branches/4-stable/doc/en/html/about/history.html	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/doc/en/html/about/history.html	2020-08-24 10:53:55 UTC (rev 8924)
@@ -3281,6 +3281,7 @@
       <!-- li>\x83V\x83X\x83e\x83\x80\x82̃\x81\x83\x82\x83\x8A\x82\xAA\x95s\x91\xAB\x82\xB5\x82Ă\xA2\x82鎞\x81A\x8C\xAE\x8C\xF0\x8A\xB7\x8E\x9E\x82̃z\x83X\x83g\x8C\xAE\x82ɂ\xE6\x82鏐\x96\xBC\x8C\x9F\x8F؂ŕs\x90\xB3\x82ȏ\x90\x96\xBC\x82𐳂\xB5\x82\xA2\x95\xA8\x82Ƃ\xB5\x82Ĉ\xB5\x82\xA4\x89”\\x90\xAB\x82\xAA\x97L\x82\xC1\x82\xBD\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li -->
       <li>Resizing the VT window immediately after user authentication was completed, connection is closed by server.</li>
       <!-- li>SSH\x94F\x8F؃_\x83C\x83A\x83\x8D\x83O\x82ňꕔ\x82̃R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82\xAA\x8F\xED\x82ɗL\x8C\xF8\x82ɂȂ\xC1\x82Ă\xA2\x82\xBD</li -->
+      <li>When many files are sent in a batch by using D&D's SCP sending, an error occurs.</li>
     </ul>
   </li>
 

Modified: branches/4-stable/doc/ja/html/about/history.html
===================================================================
--- branches/4-stable/doc/ja/html/about/history.html	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/doc/ja/html/about/history.html	2020-08-24 10:53:55 UTC (rev 8924)
@@ -3287,6 +3287,7 @@
       <li>\x83V\x83X\x83e\x83\x80\x82̃\x81\x83\x82\x83\x8A\x82\xAA\x95s\x91\xAB\x82\xB5\x82Ă\xA2\x82鎞\x81A\x8C\xAE\x8C\xF0\x8A\xB7\x8E\x9E\x82̃z\x83X\x83g\x8C\xAE\x82ɂ\xE6\x82鏐\x96\xBC\x8C\x9F\x8F؂ŕs\x90\xB3\x82ȏ\x90\x96\xBC\x82𐳂\xB5\x82\xA2\x95\xA8\x82Ƃ\xB5\x82Ĉ\xB5\x82\xA4\x89”\\x90\xAB\x82\xAA\x97L\x82\xC1\x82\xBD\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
       <li>\x83\x86\x81[\x83U\x94F\x8F؂\xAA\x8A\xAE\x97\xB9\x82\xB5\x82\xBD\x92\xBC\x8C\xE3\x82\xC9VT\x83E\x83B\x83\x93\x83h\x83E\x82̃T\x83C\x83Y\x82\xF0\x95ύX\x82\xB7\x82\xE9\x82ƁA\x83T\x81[\x83o\x82\xA9\x82\xE7\x90ؒf\x82\xB3\x82\xEA\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
       <li>SSH\x94F\x8F؃_\x83C\x83A\x83\x8D\x83O\x82ňꕔ\x82̃R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82\xAA\x8F\xED\x82ɗL\x8C\xF8\x82ɂȂ\xC1\x82Ă\xA2\x82\xBD</li>
+      <li>D&D\x82ɂ\xE6\x82\xE9SCP\x91\x97\x90M\x82ŁA\x91\xBD\x90\x94\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x88ꊇ\x91\x97\x90M\x82\xB7\x82\xE9\x82ƃG\x83\x89\x81[\x82ɂȂ\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
     </ul>
   </li>
 

Modified: branches/4-stable/teraterm/common/tttypes.h
===================================================================
--- branches/4-stable/teraterm/common/tttypes.h	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/teraterm/common/tttypes.h	2020-08-24 10:53:55 UTC (rev 8924)
@@ -45,6 +45,7 @@
 #define IdPrnProcTimer       9
 #define IdCancelConnectTimer 10  // add (2007.1.10 yutaka)
 #define IdPasteDelayTimer    11
+#define IdScpSendingTimer    12
 
   /* Window Id */
 #define IdVT  1

Modified: branches/4-stable/teraterm/teraterm/vtwin.cpp
===================================================================
--- branches/4-stable/teraterm/teraterm/vtwin.cpp	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/teraterm/teraterm/vtwin.cpp	2020-08-24 10:53:55 UTC (rev 8924)
@@ -145,6 +145,11 @@
 #define WM_IME_COMPOSITION              0x010F
 #endif
 
+static BOOL SendScpDoing;
+static TCHAR **DropListsSendScp;
+static int DropListCountSendScp;
+static int DropListsSendScpIndex;
+
 /////////////////////////////////////////////////////////////////////////////
 // CVTWindow
 
@@ -1977,7 +1982,9 @@
 static bool SendScp(char *Filenames[], int FileCount, const char *SendDir)
 {
 	typedef int (CALLBACK *PSSH_start_scp)(char *, char *);
+	typedef int (CALLBACK *PSSH_scp_sending_status)(void);
 	static PSSH_start_scp func = NULL;
+	static PSSH_scp_sending_status func_status = NULL;
 	static HMODULE h = NULL;
 	char msg[128];
 
@@ -1996,14 +2003,33 @@
 			goto scp_send_error;
 		}
 	}
+	if (func_status == NULL) {
+		func_status = (PSSH_scp_sending_status)GetProcAddress(h, "TTXScpSendingStatus");
+		if (func_status == NULL) {
+			_snprintf_s(msg, sizeof(msg), _TRUNCATE, "GetProcAddress(\"TTXScpSendingStatus\")) %d", GetLastError());
+			goto scp_send_error;
+		}
+	}
 
-	for (int i = 0; i < FileCount; i++) {
-		const char *FileName = Filenames[i];
-		func((char *)FileName, ts.ScpSendDir);
+	if (SendScpDoing) {
+		if (func_status()) {
+			return false;
+		} else {
+			DropListsSendScpIndex++;
+		}
 	}
+
+	func(Filenames[0], ts.ScpSendDir);
+
 	return true;
 }
 
+static void StartSendScpTimer(void)
+{
+	DropListsSendScpIndex = 0;
+	SetTimer(HVTWin, IdScpSendingTimer, 100, NULL);
+}
+
 void CVTWindow::DropListFree()
 {
 	if (DropListCount > 0) {
@@ -2186,14 +2212,43 @@
 		}
 		case DROP_TYPE_SCP:
 		{
-			// send by scp
-			char **FileNames = &DropLists[i];
-			int FileCount = DoSameProcess ? DropListCount - i : 1;
-			if (!SendScp(FileNames, FileCount, ts.ScpSendDir)) {
+			// \x82\xB7\x82ł\xC9SCP\x91\x97\x90M\x92\x86\x82Ȃ牽\x82\xE0\x82\xB5\x82Ȃ\xA2\x81B
+			if (SendScpDoing) {
+				// do nothing.
 				goto finish;
+
+			} else {
+				// \x88ꊇ\x91\x97\x90M\x82̏ꍇ\x82̓^\x83C\x83}\x81[\x8F\x88\x97\x9D\x82\xF0\x8Ds\x82\xA4\x82\xB1\x82ƂŁA\x98A\x91\xB1\x91\x97\x90M\x82ɂ\xE6\x82\xE9
+				// \x83G\x83\x89\x81[\x82\xAA\x8BN\x82\xB1\x82\xE7\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9\x81B
+				if (DoSameProcess) {
+					int j;
+
+					DropListCountSendScp = DropListCount - i;
+					DropListsSendScp = (char **)malloc(sizeof(char *) * DropListCountSendScp);
+
+					for (j = 0 ; j < DropListCountSendScp ; j++) {
+						DropListsSendScp[j] = _strdup(DropLists[j]);
+					}
+					SendScpDoing = TRUE;
+
+					StartSendScpTimer();
+					goto finish;
+
+				} else {
+					// send by scp
+					char **FileNames = &DropLists[i];
+					int FileCount = 1;
+					if (!SendScp(FileNames, FileCount, ts.ScpSendDir)) {
+						goto finish;
+					}
+					i += FileCount - 1;
+					break;
+
+				}
+
 			}
-			i += FileCount - 1;
-			break;
+
+
 		}
 		}
 	}
@@ -2921,7 +2976,34 @@
 			//::PostMessage(HVTWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
 		}
 	}
+	else if (nIDEvent == IdScpSendingTimer) {
+		char **FileNames;
+		int FileCount;
+		int j;
 
+		if (DropListsSendScpIndex >= DropListCountSendScp) {
+			::KillTimer(HVTWin, IdScpSendingTimer);
+
+			for (j = 0 ; j < DropListCountSendScp; j++) {
+				free(DropListsSendScp[j]);
+				DropListsSendScp[j] = NULL;
+			}
+			free(DropListsSendScp);
+			DropListCountSendScp = 0;
+
+			SendScpDoing = FALSE;
+
+		} else {
+			FileNames = &DropListsSendScp[DropListsSendScpIndex];
+			FileCount = DropListCountSendScp;
+
+			SendScp(FileNames, FileCount, ts.ScpSendDir);
+
+		}
+
+		return;
+	}
+
 	::KillTimer(HVTWin, nIDEvent);
 
 	switch (nIDEvent) {

Modified: branches/4-stable/ttssh2/ttxssh/ssh.c
===================================================================
--- branches/4-stable/ttssh2/ttxssh/ssh.c	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/ttssh2/ttxssh/ssh.c	2020-08-24 10:53:55 UTC (rev 8924)
@@ -99,6 +99,8 @@
 
 static CRITICAL_SECTION g_ssh_scp_lock;   /* SCP\x8E\xF3\x90M\x97p\x83\x8D\x83b\x83N */
 
+static int g_scp_sending;  /* SCP\x91\x97\x90M\x92\x86\x82\xA9? */
+
 static void try_send_credentials(PTInstVar pvar);
 static void prep_compression(PTInstVar pvar);
 
@@ -357,6 +359,8 @@
 		// Windows9x\x82ŗ\x8E\x82\xBF\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B
 		if (c->scp.dir == FROMREMOTE) 
 			ssh2_scp_free_packetlist(c);
+
+		g_scp_sending = FALSE;
 	}
 	if (c->type == TYPE_AGENT) {
 		buffer_free(c->agent_msg);
@@ -4220,6 +4224,8 @@
 	finish_send_packet(pvar);
 	buffer_free(msg);
 
+	g_scp_sending = TRUE;
+
 	logputs(LOG_LEVEL_VERBOSE, "SSH2_MSG_CHANNEL_OPEN was sent at SSH_scp_transaction().");
 
 	return TRUE;
@@ -4238,6 +4244,11 @@
 	return SSH_scp_transaction(pvar, sendfile, dstfile, TOREMOTE);
 }
 
+int SSH_scp_sending_status(void)
+{
+	return g_scp_sending;
+}
+
 int SSH_start_scp_receive(PTInstVar pvar, char *filename)
 {
 	return SSH_scp_transaction(pvar, filename, NULL, FROMREMOTE);

Modified: branches/4-stable/ttssh2/ttxssh/ssh.h
===================================================================
--- branches/4-stable/ttssh2/ttxssh/ssh.h	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/ttssh2/ttxssh/ssh.h	2020-08-24 10:53:55 UTC (rev 8924)
@@ -756,6 +756,7 @@
                       char *originator, unsigned short originator_port);
 
 int SSH_start_scp(PTInstVar pvar, char *sendfile, char *dstfile);
+int SSH_scp_sending_status(void);
 int SSH_start_scp_receive(PTInstVar pvar, char *filename);
 int SSH_scp_transaction(PTInstVar pvar, char *sendfile, char *dstfile, enum scp_dir direction);
 int SSH_sftp_transaction(PTInstVar pvar);

Modified: branches/4-stable/ttssh2/ttxssh/ttxssh.c
===================================================================
--- branches/4-stable/ttssh2/ttxssh/ttxssh.c	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/ttssh2/ttxssh/ttxssh.c	2020-08-24 10:53:55 UTC (rev 8924)
@@ -3953,6 +3953,11 @@
 	return SSH_start_scp(pvar, filename, dstfile);
 }
 
+__declspec(dllexport) int CALLBACK TTXScpSendingStatus(void)
+{
+	return SSH_scp_sending_status();
+}
+
 __declspec(dllexport) int CALLBACK TTXScpReceivefile(char *remotefile, char *localfile)
 {
 	return SSH_scp_transaction(pvar, remotefile, localfile, FROMREMOTE);

Modified: branches/4-stable/ttssh2/ttxssh/ttxssh.def
===================================================================
--- branches/4-stable/ttssh2/ttxssh/ttxssh.def	2020-08-21 15:30:06 UTC (rev 8923)
+++ branches/4-stable/ttssh2/ttxssh/ttxssh.def	2020-08-24 10:53:55 UTC (rev 8924)
@@ -4,4 +4,5 @@
 	TTXScpSendfile @1
 	TTXScpReceivefile @2
 	TTXReadKnownHostsFile @3
+	TTXScpSendingStatus @4
 	
\ No newline at end of file


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