diff --git a/src/packet.c b/src/packet.c index 5c811292..2b4a4e78 100644 --- a/src/packet.c +++ b/src/packet.c @@ -1399,12 +1399,37 @@ error: return processed; } +static void ssh_packet_socket_controlflow_callback(int code, void *userdata) +{ + ssh_session session = userdata; + struct ssh_iterator *it; + ssh_channel channel; + + if (code == SSH_SOCKET_FLOW_WRITEWONTBLOCK) { + SSH_LOG(SSH_LOG_TRACE, "sending channel_write_wontblock callback"); + + /* the out pipe is empty so we can forward this to channels */ + it = ssh_list_get_iterator(session->channels); + while (it != NULL) { + channel = ssh_iterator_value(ssh_channel, it); + ssh_callbacks_execute_list(channel->callbacks, + ssh_channel_callbacks, + channel_write_wontblock_function, + session, + channel, + channel->remote_window); + it = it->next; + } + } +} + void ssh_packet_register_socket_callback(ssh_session session, ssh_socket s) { struct ssh_socket_callbacks_struct *callbacks = &session->socket_callbacks; callbacks->data = ssh_packet_socket_callback; callbacks->connected = NULL; + callbacks->controlflow = ssh_packet_socket_controlflow_callback; callbacks->userdata = session; ssh_socket_set_callbacks(s, callbacks); }