diff options
author | milo <milo@r0ot.me> | 2010-09-29 16:58:48 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-02 22:51:14 +0200 |
commit | c4356531f78fdcf2f3b6a9861f6129eac81990f8 (patch) | |
tree | b9250f0a5fff64564f1f859be7d6b8a30f2ca769 /src | |
parent | 873e02fc6a0de3792a2a0a713ef21d4b67c308d2 (diff) | |
download | libssh-c4356531f78fdcf2f3b6a9861f6129eac81990f8.tar.gz libssh-c4356531f78fdcf2f3b6a9861f6129eac81990f8.tar.xz libssh-c4356531f78fdcf2f3b6a9861f6129eac81990f8.zip |
Add new callbacks in session and channels
Diffstat (limited to 'src')
-rw-r--r-- | src/callbacks.c | 18 | ||||
-rw-r--r-- | src/channels.c | 33 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/callbacks.c b/src/callbacks.c index 1568d51..bb42b4b 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -41,3 +41,21 @@ int ssh_set_callbacks(ssh_session session, ssh_callbacks cb) { leave_function(); return 0; } + +int ssh_set_channel_callbacks(ssh_channel channel, ssh_channel_callbacks cb) { + ssh_session session = NULL; + if (channel == NULL || cb == NULL) { + return SSH_ERROR; + } + session = channel->session; + enter_function(); + if(cb->size <= 0 || cb->size > 1024 * sizeof(void *)){ + ssh_set_error(session,SSH_FATAL, + "Invalid channel callback passed in (badly initialized)"); + leave_function(); + return SSH_ERROR; + } + channel->callbacks = cb; + leave_function(); + return 0; +} 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; } |