[PATCH] virnetlibsshsession: Reflect API change in libssh

Michal Privoznik posted 1 patch 3 months, 1 week ago
meson.build                   |  3 +++
src/rpc/virnetlibsshsession.c | 39 +++++++++++++++++++++++++++++------
2 files changed, 36 insertions(+), 6 deletions(-)
[PATCH] virnetlibsshsession: Reflect API change in libssh
Posted by Michal Privoznik 3 months, 1 week ago
As of libssh commit of libssh-0.11.0~70 [1] the
ssh_channel_get_exit_status() function is deprecated and a new
one is introduced instead: ssh_channel_get_exit_state().
It's not a drop-in replacement, but it's simple enough.
Adapt our libssh handling code to this change.

1: https://git.libssh.org/projects/libssh.git/commit/?id=04d86aeeae73c78af8b3dcdabb2e588cd31a8923

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 meson.build                   |  3 +++
 src/rpc/virnetlibsshsession.c | 39 +++++++++++++++++++++++++++++------
 2 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/meson.build b/meson.build
index 06d88ad1f3..f31485c395 100644
--- a/meson.build
+++ b/meson.build
@@ -1096,6 +1096,9 @@ if conf.has('WITH_REMOTE')
   libssh_dep = dependency('libssh', version: '>=' + libssh_version, required: get_option('libssh'))
   if libssh_dep.found()
     conf.set('WITH_LIBSSH', 1)
+    if cc.has_function('ssh_channel_get_exit_state', dependencies: libssh_dep)
+      conf.set('WITH_SSH_CHANNEL_GET_EXIT_STATE', 1)
+    endif
   endif
 else
   libssh_dep = dependency('', required: false)
diff --git a/src/rpc/virnetlibsshsession.c b/src/rpc/virnetlibsshsession.c
index 6632e4a9ef..e496d3334e 100644
--- a/src/rpc/virnetlibsshsession.c
+++ b/src/rpc/virnetlibsshsession.c
@@ -170,6 +170,25 @@ virNetLibsshSessionOnceInit(void)
 }
 VIR_ONCE_GLOBAL_INIT(virNetLibsshSession);
 
+
+static int virNetLibsshChannelGetExitStatus(ssh_channel channel,
+                                            uint32_t *exit_status)
+{
+#ifdef WITH_SSH_CHANNEL_GET_EXIT_STATE
+    return ssh_channel_get_exit_state(channel, exit_status, NULL, NULL);
+#else
+    int rc;
+
+    rc = *exit_status = ssh_channel_get_exit_status(channel);
+
+    if (rc != SSH_OK)
+        return SSH_ERROR;
+
+    return *exit_status;
+#endif
+}
+
+
 static virNetLibsshAuthMethod *
 virNetLibsshSessionAuthMethodNew(virNetLibsshSession *sess)
 {
@@ -1179,12 +1198,16 @@ virNetLibsshChannelRead(virNetLibsshSession *sess,
     }
 
     if (ssh_channel_is_eof(sess->channel)) {
+        uint32_t exit_status;
+        int rc;
  eof:
-        if (ssh_channel_get_exit_status(sess->channel)) {
+
+        rc = virNetLibsshChannelGetExitStatus(sess->channel, &exit_status);
+        if (rc != SSH_OK || exit_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);
+                           exit_status);
+            sess->channelCommandReturnValue = exit_status;
             sess->state = VIR_NET_LIBSSH_STATE_ERROR_REMOTE;
             virObjectUnlock(sess);
             return -1;
@@ -1227,12 +1250,16 @@ virNetLibsshChannelWrite(virNetLibsshSession *sess,
     }
 
     if (ssh_channel_is_eof(sess->channel)) {
-        if (ssh_channel_get_exit_status(sess->channel)) {
+        uint32_t exit_status;
+        int rc;
+
+        rc = virNetLibsshChannelGetExitStatus(sess->channel, &exit_status);
+        if (rc != SSH_OK || exit_status != 0) {
             virReportError(VIR_ERR_LIBSSH,
                            _("Remote program terminated with non-zero code: %1$d"),
-                           ssh_channel_get_exit_status(sess->channel));
+                           exit_status);
             sess->state = VIR_NET_LIBSSH_STATE_ERROR_REMOTE;
-            sess->channelCommandReturnValue = ssh_channel_get_exit_status(sess->channel);
+            sess->channelCommandReturnValue = exit_status;
 
             ret = -1;
             goto cleanup;
-- 
2.44.2
Re: [PATCH] virnetlibsshsession: Reflect API change in libssh
Posted by Daniel P. Berrangé 3 months, 1 week ago
On Mon, Aug 12, 2024 at 03:04:36PM +0200, Michal Privoznik wrote:
> As of libssh commit of libssh-0.11.0~70 [1] the
> ssh_channel_get_exit_status() function is deprecated and a new
> one is introduced instead: ssh_channel_get_exit_state().
> It's not a drop-in replacement, but it's simple enough.
> Adapt our libssh handling code to this change.
> 
> 1: https://git.libssh.org/projects/libssh.git/commit/?id=04d86aeeae73c78af8b3dcdabb2e588cd31a8923
> 
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  meson.build                   |  3 +++
>  src/rpc/virnetlibsshsession.c | 39 +++++++++++++++++++++++++++++------
>  2 files changed, 36 insertions(+), 6 deletions(-)


Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|