aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/callbacks.c18
-rw-r--r--src/channels.c33
2 files changed, 51 insertions, 0 deletions
diff --git a/src/callbacks.c b/src/callbacks.c
index 1568d516..bb42b4be 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 6bf8543d..83d01023 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;
}