This method is deprecated in libssh 0.11.0 in favour of the more flexible ssh_channel_get_exit_state. Rewrite our code to call the latter, and provide a compat shim that only fills out exit status. Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> --- src/rpc/virnetlibsshsession.c | 50 +++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/rpc/virnetlibsshsession.c b/src/rpc/virnetlibsshsession.c index 6632e4a9ef..faf7307725 100644 --- a/src/rpc/virnetlibsshsession.c +++ b/src/rpc/virnetlibsshsession.c @@ -48,6 +48,22 @@ VIR_LOG_INIT("rpc.netlibsshsession"); */ #define TRACE_LIBSSH 0 +#if LIBSSH_VERSION_INT < SSH_VERSION_INT(0, 11, 0) +static int ssh_channel_get_exit_state(ssh_channel channel, + uint32_t *pexit_code, + char **pexit_signal, + int *pcore_dumped) +{ + if (pexit_code) + *pexit_code = ssh_channel_get_exit_status(channel); + if (pexit_signal) + *pexit_signal = 0; + if (pcore_dumped) + *pcore_dumped = 0; + return 0; +} +#endif + typedef enum { VIR_NET_LIBSSH_STATE_NEW, VIR_NET_LIBSSH_STATE_HANDSHAKE_COMPLETE, @@ -1179,12 +1195,21 @@ virNetLibsshChannelRead(virNetLibsshSession *sess, } if (ssh_channel_is_eof(sess->channel)) { + uint32_t status; eof: - if (ssh_channel_get_exit_status(sess->channel)) { + if (ssh_channel_get_exit_state(sess->channel, &status, NULL, NULL) != 0) { + virReportError(VIR_ERR_LIBSSH, "%s", + _("Unable to fetch remote command exit status")); + sess->channelCommandReturnValue = 0; + sess->state = VIR_NET_LIBSSH_STATE_ERROR_REMOTE; + virObjectUnlock(sess); + return -1; + } + if (status != 0) { virReportError(VIR_ERR_LIBSSH, _("Remote command terminated with non-zero code: %1$d"), - ssh_channel_get_exit_status(sess->channel)); - sess->channelCommandReturnValue = ssh_channel_get_exit_status(sess->channel); + status); + sess->channelCommandReturnValue = status; sess->state = VIR_NET_LIBSSH_STATE_ERROR_REMOTE; virObjectUnlock(sess); return -1; @@ -1227,15 +1252,24 @@ virNetLibsshChannelWrite(virNetLibsshSession *sess, } if (ssh_channel_is_eof(sess->channel)) { - if (ssh_channel_get_exit_status(sess->channel)) { + uint32_t status; + if (ssh_channel_get_exit_state(sess->channel, &status, NULL, NULL) != 0) { + virReportError(VIR_ERR_LIBSSH, "%s", + _("Unable to fetch remote command exit status")); + sess->channelCommandReturnValue = 0; + sess->state = VIR_NET_LIBSSH_STATE_ERROR_REMOTE; + ret = -1; + goto cleanup; + } + if (status != 0) { virReportError(VIR_ERR_LIBSSH, - _("Remote program terminated with non-zero code: %1$d"), - ssh_channel_get_exit_status(sess->channel)); + _("Remote command terminated with non-zero code: %1$d"), + status); + sess->channelCommandReturnValue = status; sess->state = VIR_NET_LIBSSH_STATE_ERROR_REMOTE; - sess->channelCommandReturnValue = ssh_channel_get_exit_status(sess->channel); - ret = -1; goto cleanup; + } sess->state = VIR_NET_LIBSSH_STATE_CLOSED; -- 2.45.2