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