リビジョン | 7953 (tree) |
---|---|
日時 | 2019-08-14 12:40:48 |
作者 | (del#24082) |
SCPファイル受信をブロック解除する処理を共通化し、受信をキャンセルした場合にも
ブロック解除するようにした。
#34056
@@ -273,10 +273,8 @@ | ||
273 | 273 | return amount_in_buf; |
274 | 274 | |
275 | 275 | } |
276 | - else { | |
277 | - amount_read = recv_data(pvar, READAMOUNT); | |
278 | 276 | |
279 | - } | |
277 | + amount_read = recv_data(pvar, READAMOUNT); | |
280 | 278 | |
281 | 279 | if (amount_read == SOCKET_ERROR) { |
282 | 280 | if (amount_in_buf == 0) { |
@@ -139,6 +139,7 @@ | ||
139 | 139 | static void ssh2_scp_get_packetlist(PTInstVar pvar, Channel_t *c, unsigned char **buf, unsigned int *buflen); |
140 | 140 | static void ssh2_scp_free_packetlist(PTInstVar pvar, Channel_t *c); |
141 | 141 | static void get_window_pixel_size(PTInstVar pvar, int *x, int *y); |
142 | +static void ssh2_scp_recv_unblocked(PTInstVar pvar); | |
142 | 143 | |
143 | 144 | // マクロ |
144 | 145 | #define remained_payload(pvar) ((pvar)->ssh_state.payload + payload_current_offset(pvar)) |
@@ -222,7 +223,6 @@ | ||
222 | 223 | c->scp.localfp = NULL; |
223 | 224 | c->scp.filemtime = 0; |
224 | 225 | c->scp.fileatime = 0; |
225 | - c->scp.pvar = NULL; | |
226 | 226 | } |
227 | 227 | if (type == TYPE_AGENT) { |
228 | 228 | c->agent_msg = buffer_init(); |
@@ -2879,7 +2879,6 @@ | ||
2879 | 2879 | pvar->agentfwd_enable = FALSE; |
2880 | 2880 | pvar->use_subsystem = FALSE; |
2881 | 2881 | pvar->nosession = FALSE; |
2882 | - pvar->recv_suspended = FALSE; | |
2883 | 2882 | |
2884 | 2883 | } |
2885 | 2884 |
@@ -8189,6 +8188,10 @@ | ||
8189 | 8188 | { |
8190 | 8189 | scp_dlg_parm_t *parm = (scp_dlg_parm_t *)wp; |
8191 | 8190 | |
8191 | + // SCPの受信処理を中断した場合にも、recv()のブロックを解除する。 | |
8192 | + // これをやらないと、Tera Termが固まったままになってしまう。 | |
8193 | + ssh2_scp_recv_unblocked(parm->pvar); | |
8194 | + | |
8192 | 8195 | ssh2_channel_send_close(parm->pvar, parm->c); |
8193 | 8196 | } |
8194 | 8197 | return TRUE; |
@@ -8558,10 +8561,6 @@ | ||
8558 | 8561 | ShowWindow(c->scp.progress_window, SW_HIDE); |
8559 | 8562 | |
8560 | 8563 | cancel_abort: |
8561 | - // SCPの受信処理が終了した場合は、recv()のブロックを解除する。 | |
8562 | - // これをやらないと、Tera Termが固まったままになってしまう。 | |
8563 | - pvar->recv_suspended = FALSE; | |
8564 | - | |
8565 | 8564 | // チャネルのクローズを行いたいが、直接 ssh2_channel_send_close() を呼び出すと、 |
8566 | 8565 | // 当該関数がスレッドセーフではないため、SCP処理が正常に終了しない場合がある。 |
8567 | 8566 | // (2011.6.1 yutaka) |
@@ -8572,6 +8571,18 @@ | ||
8572 | 8571 | return 0; |
8573 | 8572 | } |
8574 | 8573 | |
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 | + | |
8575 | 8586 | // SSHサーバから送られてきたファイルのデータをリストにつなぐ。 |
8576 | 8587 | // リストの取り出しは ssh_scp_receive_thread スレッドで行う。 |
8577 | 8588 | static void ssh2_scp_add_packetlist(PTInstVar pvar, Channel_t *c, unsigned char *buf, unsigned int buflen) |
@@ -8652,11 +8663,7 @@ | ||
8652 | 8663 | // SSHサーバからの受信を再開するように指示を出す。 |
8653 | 8664 | if (c->scp.pktlist_cursize <= SCPRCV_LOW_WATER_MARK) { |
8654 | 8665 | // 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); | |
8660 | 8667 | } |
8661 | 8668 | |
8662 | 8669 | logprintf(LOG_LEVEL_NOTICE, |