From b0b2fd768c015a01f17eaa9827a8f5faafa58946 Mon Sep 17 00:00:00 2001 From: Aris Adamantiadis Date: Wed, 14 Sep 2011 22:53:01 +0200 Subject: SSH1: handle exit-status message (channels would not close) --- include/libssh/channels.h | 1 + src/channels1.c | 13 +++++++++++++ src/packet1.c | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/libssh/channels.h b/include/libssh/channels.h index c054374d..aa2b14d0 100644 --- a/include/libssh/channels.h +++ b/include/libssh/channels.h @@ -93,6 +93,7 @@ int channel_write_common(ssh_channel channel, const void *data, #ifdef WITH_SSH1 SSH_PACKET_CALLBACK(ssh_packet_data1); SSH_PACKET_CALLBACK(ssh_packet_close1); +SSH_PACKET_CALLBACK(ssh_packet_exist_status1); /* channels1.c */ int channel_open_session1(ssh_channel channel); diff --git a/src/channels1.c b/src/channels1.c index 7589d227..58dea903 100644 --- a/src/channels1.c +++ b/src/channels1.c @@ -269,6 +269,19 @@ SSH_PACKET_CALLBACK(ssh_packet_close1){ return SSH_PACKET_USED; } +SSH_PACKET_CALLBACK(ssh_packet_exist_status1){ + ssh_channel channel = ssh_get_channel1(session); + uint32_t status; + (void)type; + (void)user; + buffer_get_u32(packet, &status); + channel->state = SSH_CHANNEL_STATE_CLOSED; + channel->remote_eof = 1; + channel->exit_status = ntohl(status); + + return SSH_PACKET_USED; +} + int channel_write1(ssh_channel channel, const void *data, int len) { ssh_session session = channel->session; diff --git a/src/packet1.c b/src/packet1.c index b115abab..ddc64a3b 100644 --- a/src/packet1.c +++ b/src/packet1.c @@ -55,7 +55,7 @@ ssh_packet_callback default_packet_handlers1[]= { ssh_packet_data1, //SSH_SMSG_STDOUT_DATA 17 ssh_packet_data1, //SSH_SMSG_STDERR_DATA 18 NULL, //SSH_CMSG_EOF 19 - NULL, //SSH_SMSG_EXITSTATUS 20 + ssh_packet_exist_status1, //SSH_SMSG_EXITSTATUS 20 NULL, //SSH_MSG_CHANNEL_OPEN_CONFIRMATION 21 NULL, //SSH_MSG_CHANNEL_OPEN_FAILURE 22 NULL, //SSH_MSG_CHANNEL_DATA 23 -- cgit