summaryrefslogtreecommitdiffstats
path: root/src/channels.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/channels.c')
-rw-r--r--src/channels.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/channels.c b/src/channels.c
index 6bf8543..83d0102 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -430,8 +430,10 @@ SSH_PACKET_CALLBACK(channel_rcv_change_window) {
SSH_PACKET_CALLBACK(channel_rcv_data){
ssh_channel channel;
ssh_string str;
+ ssh_buffer buf;
size_t len;
int is_stderr;
+ int rest;
(void)user;
enter_function();
if(type==SSH2_MSG_CHANNEL_DATA)
@@ -495,6 +497,25 @@ SSH_PACKET_CALLBACK(channel_rcv_data){
channel->remote_window);
ssh_string_free(str);
+
+ if(ssh_callbacks_exists(channel->callbacks, channel_data_function)) {
+ if(is_stderr) {
+ buf = channel->stderr_buffer;
+ } else {
+ buf = channel->stdout_buffer;
+ }
+ rest = channel->callbacks->channel_data_function(channel->session,
+ channel,
+ buffer_get_rest(buf),
+ buffer_get_rest_len(buf),
+ is_stderr,
+ channel->callbacks->userdata);
+ if(rest > 0) {
+ buffer_pass_bytes(buf, rest);
+ channel->local_window += rest;
+ }
+ }
+
leave_function();
return SSH_PACKET_USED;
}
@@ -519,6 +540,12 @@ SSH_PACKET_CALLBACK(channel_rcv_eof) {
/* channel->remote_window = 0; */
channel->remote_eof = 1;
+ if(ssh_callbacks_exists(channel->callbacks, channel_eof_function)) {
+ channel->callbacks->channel_eof_function(channel->session,
+ channel,
+ channel->callbacks->userdata);
+ }
+
leave_function();
return SSH_PACKET_USED;
}
@@ -560,6 +587,12 @@ SSH_PACKET_CALLBACK(channel_rcv_close) {
* buffer because the eof is ignored until the buffer is empty.
*/
+ if(ssh_callbacks_exists(channel->callbacks, channel_close_function)) {
+ channel->callbacks->channel_close_function(channel->session,
+ channel,
+ channel->callbacks->userdata);
+ }
+
leave_function();
return SSH_PACKET_USED;
}