• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision7953 (tree)
Zeit2019-08-14 12:40:48
Autoryutakapon

Log Message

SCPファイル受信をブロック解除する処理を共通化し、受信をキャンセルした場合にも
ブロック解除するようにした。
#34056

Ändern Zusammenfassung

Diff

--- branches/scp_flowctrl/ttssh2/ttxssh/pkt.c (revision 7952)
+++ branches/scp_flowctrl/ttssh2/ttxssh/pkt.c (revision 7953)
@@ -273,10 +273,8 @@
273273 return amount_in_buf;
274274
275275 }
276- else {
277- amount_read = recv_data(pvar, READAMOUNT);
278276
279- }
277+ amount_read = recv_data(pvar, READAMOUNT);
280278
281279 if (amount_read == SOCKET_ERROR) {
282280 if (amount_in_buf == 0) {
--- branches/scp_flowctrl/ttssh2/ttxssh/ssh.c (revision 7952)
+++ branches/scp_flowctrl/ttssh2/ttxssh/ssh.c (revision 7953)
@@ -139,6 +139,7 @@
139139 static void ssh2_scp_get_packetlist(PTInstVar pvar, Channel_t *c, unsigned char **buf, unsigned int *buflen);
140140 static void ssh2_scp_free_packetlist(PTInstVar pvar, Channel_t *c);
141141 static void get_window_pixel_size(PTInstVar pvar, int *x, int *y);
142+static void ssh2_scp_recv_unblocked(PTInstVar pvar);
142143
143144 // マクロ
144145 #define remained_payload(pvar) ((pvar)->ssh_state.payload + payload_current_offset(pvar))
@@ -222,7 +223,6 @@
222223 c->scp.localfp = NULL;
223224 c->scp.filemtime = 0;
224225 c->scp.fileatime = 0;
225- c->scp.pvar = NULL;
226226 }
227227 if (type == TYPE_AGENT) {
228228 c->agent_msg = buffer_init();
@@ -2879,7 +2879,6 @@
28792879 pvar->agentfwd_enable = FALSE;
28802880 pvar->use_subsystem = FALSE;
28812881 pvar->nosession = FALSE;
2882- pvar->recv_suspended = FALSE;
28832882
28842883 }
28852884
@@ -8189,6 +8188,10 @@
81898188 {
81908189 scp_dlg_parm_t *parm = (scp_dlg_parm_t *)wp;
81918190
8191+ // SCPの受信処理を中断した場合にも、recv()のブロックを解除する。
8192+ // これをやらないと、Tera Termが固まったままになってしまう。
8193+ ssh2_scp_recv_unblocked(parm->pvar);
8194+
81928195 ssh2_channel_send_close(parm->pvar, parm->c);
81938196 }
81948197 return TRUE;
@@ -8558,10 +8561,6 @@
85588561 ShowWindow(c->scp.progress_window, SW_HIDE);
85598562
85608563 cancel_abort:
8561- // SCPの受信処理が終了した場合は、recv()のブロックを解除する。
8562- // これをやらないと、Tera Termが固まったままになってしまう。
8563- pvar->recv_suspended = FALSE;
8564-
85658564 // チャネルのクローズを行いたいが、直接 ssh2_channel_send_close() を呼び出すと、
85668565 // 当該関数がスレッドセーフではないため、SCP処理が正常に終了しない場合がある。
85678566 // (2011.6.1 yutaka)
@@ -8572,6 +8571,18 @@
85728571 return 0;
85738572 }
85748573
8574+// SCPファイル受信処理中に recv をブロックしている場合は、ブロックを解除する。
8575+static void ssh2_scp_recv_unblocked(PTInstVar pvar)
8576+{
8577+ // ブロックしている場合
8578+ if (pvar->recv_suspended) {
8579+ // recv()のブロックを解除する。
8580+ pvar->recv_suspended = FALSE;
8581+ // FD_READメッセージを投げて recv() の再開を促す。
8582+ PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY, pvar->socket, MAKELPARAM(FD_READ, 0));
8583+ }
8584+}
8585+
85758586 // SSHサーバから送られてきたファイルのデータをリストにつなぐ。
85768587 // リストの取り出しは ssh_scp_receive_thread スレッドで行う。
85778588 static void ssh2_scp_add_packetlist(PTInstVar pvar, Channel_t *c, unsigned char *buf, unsigned int buflen)
@@ -8652,11 +8663,7 @@
86528663 // SSHサーバからの受信を再開するように指示を出す。
86538664 if (c->scp.pktlist_cursize <= SCPRCV_LOW_WATER_MARK) {
86548665 // recv()のブロックを解除する。
8655- if (pvar->recv_suspended) {
8656- pvar->recv_suspended = FALSE;
8657- // FD_READメッセージを投げて recv() の再開を促す。
8658- PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY, pvar->socket, MAKELPARAM(FD_READ, 0));
8659- }
8666+ ssh2_scp_recv_unblocked(pvar);
86608667 }
86618668
86628669 logprintf(LOG_LEVEL_NOTICE,
Show on old repository browser