'exit-status' information packet handling added
This commit is contained in:
@@ -376,6 +376,7 @@ LIBSSH2_API void libssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel,
|
|||||||
LIBSSH2_API int libssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel, int streamid);
|
LIBSSH2_API int libssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel, int streamid);
|
||||||
#define libssh2_channel_flush(channel) libssh2_channel_flush_ex((channel), 0)
|
#define libssh2_channel_flush(channel) libssh2_channel_flush_ex((channel), 0)
|
||||||
#define libssh2_channel_flush_stderr(channel) libssh2_channel_flush_ex((channel), SSH_EXTENDED_DATA_STDERR)
|
#define libssh2_channel_flush_stderr(channel) libssh2_channel_flush_ex((channel), SSH_EXTENDED_DATA_STDERR)
|
||||||
|
LIBSSH2_API int libssh2_channel_get_exit_status(LIBSSH2_CHANNEL* channel);
|
||||||
|
|
||||||
LIBSSH2_API int libssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);
|
LIBSSH2_API int libssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);
|
||||||
LIBSSH2_API int libssh2_channel_eof(LIBSSH2_CHANNEL *channel);
|
LIBSSH2_API int libssh2_channel_eof(LIBSSH2_CHANNEL *channel);
|
||||||
|
@@ -112,6 +112,9 @@ struct _LIBSSH2_CHANNEL {
|
|||||||
|
|
||||||
int blocking;
|
int blocking;
|
||||||
|
|
||||||
|
/* channel's program exit status */
|
||||||
|
int exit_status;
|
||||||
|
|
||||||
libssh2_channel_data local, remote;
|
libssh2_channel_data local, remote;
|
||||||
unsigned long adjust_queue; /* Amount of bytes to be refunded to receive window (but not yet sent) */
|
unsigned long adjust_queue; /* Amount of bytes to be refunded to receive window (but not yet sent) */
|
||||||
|
|
||||||
|
@@ -787,6 +787,16 @@ LIBSSH2_API int libssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel, int streamid)
|
|||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
/* {{{ libssh2_channel_get_exit_status
|
||||||
|
* Return the channel's program exit status
|
||||||
|
*/
|
||||||
|
LIBSSH2_API int libssh2_channel_get_exit_status(LIBSSH2_CHANNEL* channel)
|
||||||
|
{
|
||||||
|
return channel->exit_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ libssh2_channel_receive_window_adjust
|
/* {{{ libssh2_channel_receive_window_adjust
|
||||||
* Adjust the receive window for a channel by adjustment bytes
|
* Adjust the receive window for a channel by adjustment bytes
|
||||||
* If the amount to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0
|
* If the amount to be adjusted is less than LIBSSH2_CHANNEL_MINADJUST and force is 0
|
||||||
|
17
src/packet.c
17
src/packet.c
@@ -497,6 +497,23 @@ static int libssh2_packet_add(LIBSSH2_SESSION *session, unsigned char *data, siz
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SSH_MSG_CHANNEL_REQUEST:
|
||||||
|
{
|
||||||
|
if (libssh2_ntohu32(data+5) == sizeof("exit-status") - 1
|
||||||
|
&& !memcmp("exit-status", data + 9, sizeof("exit-status") - 1)) {
|
||||||
|
|
||||||
|
/* we've got "exit-status" packet. Set the session value */
|
||||||
|
LIBSSH2_CHANNEL *channel = libssh2_channel_locate(session, libssh2_ntohu32(data+1));
|
||||||
|
|
||||||
|
if (channel) {
|
||||||
|
#ifdef LIBSSH2_DEBUG_CONNECTION
|
||||||
|
_libssh2_debug(session, LIBSSH2_DBG_CONN, "Exit status received for channel %lu/%lu", channel->local.id, channel->remote.id);
|
||||||
|
#endif
|
||||||
|
channel->exit_status = libssh2_ntohu32(data + 9 + sizeof("exit-status"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SSH_MSG_CHANNEL_CLOSE:
|
case SSH_MSG_CHANNEL_CLOSE:
|
||||||
{
|
{
|
||||||
LIBSSH2_CHANNEL *channel = libssh2_channel_locate(session, libssh2_ntohu32(data + 1));
|
LIBSSH2_CHANNEL *channel = libssh2_channel_locate(session, libssh2_ntohu32(data + 1));
|
||||||
|
Reference in New Issue
Block a user