1
1

Add libssh2_channel_get_exit_signal.

Signed-off-by: Simon Josefsson <simon@josefsson.org>
Этот коммит содержится в:
Tommy Lindgren 2010-10-13 15:31:06 +02:00 коммит произвёл Simon Josefsson
родитель 70d6bd6c6f
Коммит 6140ec2de3
6 изменённых файлов: 117 добавлений и 1 удалений

Просмотреть файл

@ -26,6 +26,7 @@ dist_man_MANS = \
libssh2_channel_forward_listen_ex.3 \
libssh2_channel_free.3 \
libssh2_channel_get_exit_status.3 \
libssh2_channel_get_exit_signal.3 \
libssh2_channel_handle_extended_data.3 \
libssh2_channel_handle_extended_data2.3 \
libssh2_channel_ignore_extended_data.3 \

Просмотреть файл

@ -86,6 +86,7 @@ int main(int argc, char *argv[])
LIBSSH2_CHANNEL *channel;
int rc;
int exitcode;
char *exitsignal;
int bytecount = 0;
size_t len;
LIBSSH2_KNOWNHOSTS *nh;
@ -286,8 +287,13 @@ int main(int argc, char *argv[])
if( rc == 0 )
{
exitcode = libssh2_channel_get_exit_status( channel );
libssh2_channel_get_exit_signal(channel, &exitsignal, NULL, NULL, NULL, NULL, NULL);
}
printf("\nEXIT: %d bytecount: %d\n", exitcode, bytecount);
if (exitsignal)
printf("\nGot signal: %s\n", exitsignal);
else
printf("\nEXIT: %d bytecount: %d\n", exitcode, bytecount);
libssh2_channel_free(channel);
channel = NULL;

Просмотреть файл

@ -730,6 +730,13 @@ LIBSSH2_API int libssh2_channel_flush_ex(LIBSSH2_CHANNEL *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_get_exit_signal(LIBSSH2_CHANNEL* channel,
char **exitsignal,
size_t *exitsignal_len,
char **errmsg,
size_t *errmsg_len,
char **langtag,
size_t *langtag_len);
LIBSSH2_API int libssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);
LIBSSH2_API int libssh2_channel_eof(LIBSSH2_CHANNEL *channel);
LIBSSH2_API int libssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel);

Просмотреть файл

@ -1476,6 +1476,67 @@ libssh2_channel_get_exit_status(LIBSSH2_CHANNEL *channel)
return channel->exit_status;
}
/*
* libssh2_channel_get_exit_signal
*
* Get exit signal (without leading "SIG"), error message, and language
* tag into newly allocated buffers of indicated length. Caller can
* use NULL pointers to indicate that the value should not be set. The
* *_len variables are set if they are non-NULL even if the
* corresponding string parameter is NULL. Returns LIBSSH2_ERROR_NONE
* on success, or an API error code.
*/
LIBSSH2_API int
libssh2_channel_get_exit_signal(LIBSSH2_CHANNEL *channel,
char **exitsignal,
size_t *exitsignal_len,
char **errmsg,
size_t *errmsg_len,
char **langtag,
size_t *langtag_len)
{
LIBSSH2_SESSION *session = channel->session;
size_t namelen = 0;
if (channel) {
if (channel->exit_signal) {
namelen = strlen(channel->exit_signal);
if (exitsignal) {
*exitsignal = LIBSSH2_ALLOC(session, namelen + 1);
if (!*exitsignal) {
return _libssh2_error(session, LIBSSH2_ERROR_ALLOC,
"Unable to allocate memory for signal name");
}
memcpy(*exitsignal, channel->exit_signal, namelen);
(*exitsignal)[namelen] = '\0';
}
if (exitsignal_len)
*exitsignal_len = namelen;
} else {
if (exitsignal)
*exitsignal = NULL;
if (exitsignal_len)
*exitsignal_len = 0;
}
/* TODO: set error message and language tag */
if (errmsg)
*errmsg = NULL;
if (errmsg_len)
*errmsg_len = 0;
if (langtag)
*langtag = NULL;
if (langtag_len)
*langtag_len = 0;
}
return LIBSSH2_ERROR_NONE;
}
/*
* _libssh2_channel_receive_window_adjust
*
@ -2413,6 +2474,10 @@ int _libssh2_channel_free(LIBSSH2_CHANNEL *channel)
channel->free_state = libssh2_NB_state_idle;
if (channel->exit_signal) {
LIBSSH2_FREE(session, channel->exit_signal);
}
/*
* channel->remote.close *might* not be set yet, Well...
* We've sent the close packet, what more do you want?

Просмотреть файл

@ -340,6 +340,9 @@ struct _LIBSSH2_CHANNEL
/* channel's program exit status */
int exit_status;
/* channel's program exit signal (without the SIG prefix) */
char *exit_signal;
libssh2_channel_data local, remote;
/* Amount of bytes to be refunded to receive window (but not yet sent) */
unsigned long adjust_queue;

Просмотреть файл

@ -762,6 +762,40 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data,
return 0;
}
if (strlen == sizeof("exit-signal") - 1
&& !memcmp("exit-signal", data + 9,
sizeof("exit-signal") - 1)) {
/* command terminated due to signal */
session->packAdd_channel =
_libssh2_channel_locate(session, channel);
if (session->packAdd_channel) {
/* set signal name (without SIG prefix) */
uint32_t namelen = _libssh2_ntohu32(data + 9 + sizeof("exit-signal"));
session->packAdd_channel->exit_signal =
LIBSSH2_ALLOC(session, namelen + 1);
if (!session->packAdd_channel->exit_signal) {
_libssh2_error(session, LIBSSH2_ERROR_ALLOC,
"Unable to allocate memory for signal name");
} else {
memcpy(session->packAdd_channel->exit_signal,
data + 13 + sizeof("exit_signal"), namelen);
session->packAdd_channel->exit_signal[namelen] = '\0';
/* TODO: save error message and language tag */
_libssh2_debug(session, LIBSSH2_TRACE_CONN,
"Exit signal %s received for channel %lu/%lu",
session->packAdd_channel->exit_signal,
session->packAdd_channel->local.id,
session->packAdd_channel->remote.id);
}
}
LIBSSH2_FREE(session, data);
session->packAdd_state = libssh2_NB_state_idle;
return 0;
}
if (want_reply) {
libssh2_packet_add_jump_point4:
session->packAdd_state = libssh2_NB_state_jump4;