[vlc-commits] sftp: factor SSHSession initialization/destroy

Thomas Guillem git at videolan.org
Tue Oct 31 11:03:29 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Tue Oct 31 10:15:27 2017 +0100| [be8bc38f62dbc5b4376f5fb95a53fe74319bb453] | committer: Thomas Guillem

sftp: factor SSHSession initialization/destroy

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=be8bc38f62dbc5b4376f5fb95a53fe74319bb453
---

 modules/access/sftp.c | 79 +++++++++++++++++++++++++++++++++------------------
 1 file changed, 51 insertions(+), 28 deletions(-)

diff --git a/modules/access/sftp.c b/modules/access/sftp.c
index c8670228da..a589a6699a 100644
--- a/modules/access/sftp.c
+++ b/modules/access/sftp.c
@@ -173,6 +173,55 @@ static int AuthPublicKey( stream_t *p_access, const char *psz_home, const char *
     return i_result;
 }
 
+static void SSHSessionDestroy( stream_t *p_access )
+{
+    access_sys_t* p_sys = p_access->p_sys;
+
+    if( p_sys->ssh_session )
+    {
+        libssh2_session_free( p_sys->ssh_session );
+        p_sys->ssh_session = NULL;
+    }
+    if( p_sys->i_socket >= 0 )
+    {
+        net_Close( p_sys->i_socket );
+        p_sys->i_socket = -1;
+    }
+}
+
+static int SSHSessionInit( stream_t *p_access, const char *psz_host, int i_port )
+{
+    access_sys_t* p_sys = p_access->p_sys;
+
+    /* Connect to the server using a regular socket */
+    assert( p_sys->i_socket == -1 );
+    p_sys->i_socket = net_ConnectTCP( p_access, psz_host, i_port );
+    if( p_sys->i_socket < 0 )
+        goto error;
+
+    /* Create the ssh connexion and wait until the server answer */
+    p_sys->ssh_session = libssh2_session_init();
+    if( p_sys->ssh_session == NULL )
+        goto error;
+
+    int i_ret;
+    while( ( i_ret = libssh2_session_startup( p_sys->ssh_session, p_sys->i_socket ) )
+           == LIBSSH2_ERROR_EAGAIN );
+
+    if( i_ret != 0 )
+        goto error;
+
+    /* Set the socket in non-blocking mode */
+    libssh2_session_set_blocking( p_sys->ssh_session, 1 );
+    return VLC_SUCCESS;
+
+error:
+    msg_Err( p_access, "Impossible to open the connection to %s:%i",
+             psz_host, i_port );
+    SSHSessionDestroy( p_access );
+    return VLC_EGENERIC;
+}
+
 /**
  * Connect to the sftp server and ask for a file
  * @param p_this: the vlc_object
@@ -188,7 +237,6 @@ static int Open( vlc_object_t* p_this )
     char* psz_remote_home = NULL;
     char* psz_home = NULL;
     int i_port;
-    int i_ret;
     vlc_url_t url;
     size_t i_len;
     int i_type;
@@ -221,32 +269,10 @@ static int Open( vlc_object_t* p_this )
     else
         i_port = url.i_port;
 
-
-    /* Connect to the server using a regular socket */
-    p_sys->i_socket = net_ConnectTCP( p_access, url.psz_host, i_port );
-    if( p_sys->i_socket < 0 )
-    {
-        msg_Err( p_access, "Impossible to open the connection to %s:%i", url.psz_host, i_port );
-        goto error;
-    }
-
     /* Create the ssh connexion and wait until the server answer */
-    if( ( p_sys->ssh_session = libssh2_session_init() ) == NULL )
+    if( SSHSessionInit( p_access, url.psz_host, i_port ) != VLC_SUCCESS )
         goto error;
 
-    while( ( i_ret = libssh2_session_startup( p_sys->ssh_session,
-                                              p_sys->i_socket ) )
-           == LIBSSH2_ERROR_EAGAIN );
-
-    if( i_ret != 0 )
-    {
-        msg_Err( p_access, "Impossible to open the connection to %s:%i", url.psz_host, i_port );
-        goto error;
-    }
-
-    /* Set the socket in non-blocking mode */
-    libssh2_session_set_blocking( p_sys->ssh_session, 1 );
-
     /* List the know hosts */
     LIBSSH2_KNOWNHOSTS *ssh_knownhosts = libssh2_knownhost_init( p_sys->ssh_session );
     if( !ssh_knownhosts )
@@ -460,10 +486,7 @@ static void Close( vlc_object_t* p_this )
         libssh2_sftp_close_handle( p_sys->file );
     if( p_sys->sftp_session )
         libssh2_sftp_shutdown( p_sys->sftp_session );
-    if( p_sys->ssh_session )
-        libssh2_session_free( p_sys->ssh_session );
-    if( p_sys->i_socket >= 0 )
-        net_Close( p_sys->i_socket );
+    SSHSessionDestroy( p_access );
 
     free( p_sys->psz_base_url );
 }



More information about the vlc-commits mailing list