[vlc-commits] ftp: factor network I/O code using vlc_tls_t

Rémi Denis-Courmont git at videolan.org
Thu Feb 23 20:08:28 CET 2017


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Feb 23 20:39:09 2017 +0200| [c6c7b68eae5a33b05452d0bb72a22102ea134c94] | committer: Rémi Denis-Courmont

ftp: factor network I/O code using vlc_tls_t

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

 modules/access/ftp.c | 158 +++++++++++++++++++++------------------------------
 1 file changed, 64 insertions(+), 94 deletions(-)

diff --git a/modules/access/ftp.c b/modules/access/ftp.c
index 280a808..67b212a 100644
--- a/modules/access/ftp.c
+++ b/modules/access/ftp.c
@@ -144,11 +144,8 @@ struct access_sys_t
     ftp_features_t   features;
     vlc_tls_creds_t *p_creds;
     enum tls_mode_e  tlsmode;
-    struct
-    {
-        vlc_tls_t   *p_tls;
-        int          fd;
-    } cmd, data;
+    vlc_tls_t *cmd;
+    vlc_tls_t *data;
 
     char       sz_epsv_ip[NI_MAXNUMERICHOST];
     bool       out;
@@ -182,9 +179,7 @@ static int ftp_SendCommand( vlc_object_t *obj, access_sys_t *sys,
     else
         msg_Dbg( obj, "sending request: \"%.*s XXXX\" (XX bytes)", 4, cmd );
 
-    if( ((sys->cmd.p_tls != NULL)
-            ? vlc_tls_Write( sys->cmd.p_tls, cmd, val )
-            : net_Write( obj, sys->cmd.fd, cmd, val )) != val )
+    if( vlc_tls_Write( sys->cmd, cmd, val ) != val )
     {
         msg_Err( obj, "request failure" );
         val = -1;
@@ -197,16 +192,9 @@ static int ftp_SendCommand( vlc_object_t *obj, access_sys_t *sys,
 
 static char *ftp_GetLine( vlc_object_t *obj, access_sys_t *sys )
 {
-    char *resp;
-
-    if( sys->cmd.p_tls != NULL )
-        resp = vlc_tls_GetLine( sys->cmd.p_tls );
-    else
-        resp = net_Gets( obj, sys->cmd.fd );
-
+    char *resp = vlc_tls_GetLine( sys->cmd );
     if( resp == NULL )
         msg_Err( obj, "response failure" );
-
     return resp;
 }
 
@@ -336,27 +324,31 @@ static int readTLSMode( vlc_object_t *obj, access_sys_t *p_sys,
     return (p_sys->p_creds != NULL) ? 0 : -1;
 }
 
-static int createCmdTLS( vlc_object_t *p_access, access_sys_t *p_sys, int fd,
+static int createCmdTLS( vlc_object_t *p_access, access_sys_t *p_sys,
                          const char *psz_session_name )
 {
     /* TLS/SSL handshake */
-    p_sys->cmd.p_tls = vlc_tls_ClientSessionCreateFD( p_sys->p_creds, fd,
-                                                      p_sys->url.psz_host,
-                                                      psz_session_name,
-                                                      NULL, NULL );
-    if( p_sys->cmd.p_tls == NULL )
+    vlc_tls_t *secure = vlc_tls_ClientSessionCreate( p_sys->p_creds,
+                                                     p_sys->cmd,
+                                                     p_sys->url.psz_host,
+                                                     psz_session_name,
+                                                     NULL, NULL );
+    if( secure == NULL )
     {
         msg_Err( p_access, "cannot establish FTP/TLS session on command channel" );
         return -1;
     }
-
+    p_sys->cmd = secure;
     return 0;
 }
 
-static void clearCmdTLS( access_sys_t *p_sys )
+static void clearCmd( access_sys_t *p_sys )
 {
-    if ( p_sys->cmd.p_tls ) vlc_tls_SessionDelete( p_sys->cmd.p_tls );
-    p_sys->cmd.p_tls = NULL;
+    if( p_sys->cmd != NULL )
+    {
+        vlc_tls_Close( p_sys->cmd );
+        p_sys->cmd = NULL;
+    }
 }
 
 static int Login( vlc_object_t *p_access, access_sys_t *p_sys )
@@ -364,9 +356,9 @@ static int Login( vlc_object_t *p_access, access_sys_t *p_sys )
     int i_answer;
 
     /* *** Open a TCP connection with server *** */
-    int fd = p_sys->cmd.fd = net_ConnectTCP( p_access, p_sys->url.psz_host,
-                                             p_sys->url.i_port );
-    if( fd == -1 )
+    p_sys->cmd = vlc_tls_SocketOpenTCP( p_access, p_sys->url.psz_host,
+                                        p_sys->url.i_port );
+    if( p_sys->cmd == NULL )
     {
         msg_Err( p_access, "connection failed" );
         vlc_dialog_display_error( p_access, _("Network interaction failed"), "%s",
@@ -376,7 +368,7 @@ static int Login( vlc_object_t *p_access, access_sys_t *p_sys )
 
     if ( p_sys->tlsmode == IMPLICIT ) /* FTPS Mode */
     {
-        if ( createCmdTLS( p_access, p_sys, fd, "ftps") < 0 )
+        if ( createCmdTLS( p_access, p_sys, "ftps") < 0 )
             goto error;
     }
 
@@ -419,7 +411,7 @@ static int Login( vlc_object_t *p_access, access_sys_t *p_sys )
              return -1;
         }
 
-        if ( createCmdTLS( p_access, p_sys, fd, "ftpes") < 0 )
+        if( createCmdTLS( p_access, p_sys, "ftpes") < 0 )
         {
             goto error;
         }
@@ -466,7 +458,7 @@ static int Login( vlc_object_t *p_access, access_sys_t *p_sys )
     vlc_credential_clean( &credential );
     vlc_UrlClean( &url );
 error:
-    clearCmdTLS( p_sys );
+    clearCmd( p_sys );
     return -1;
 }
 
@@ -581,7 +573,8 @@ static int Connect( vlc_object_t *p_access, access_sys_t *p_sys )
 
     if( ftp_RecvCommand( p_access, p_sys, NULL, NULL ) == 2 )
     {
-        if( net_GetPeerAddress( p_sys->cmd.fd, p_sys->sz_epsv_ip, NULL ) )
+        int fd = vlc_tls_GetFD(p_sys->cmd);
+        if( net_GetPeerAddress( fd, p_sys->sz_epsv_ip, NULL ) )
             goto error;
     }
     else
@@ -592,8 +585,7 @@ static int Connect( vlc_object_t *p_access, access_sys_t *p_sys )
          * the initial connection.
          */
         msg_Info( p_access, "FTP Extended passive mode disabled" );
-        clearCmdTLS( p_sys );
-        net_Close( p_sys->cmd.fd );
+        clearCmd( p_sys );
 
         if( Login( p_access, p_sys ) )
             goto error;
@@ -617,8 +609,7 @@ static int Connect( vlc_object_t *p_access, access_sys_t *p_sys )
     return 0;
 
 error:
-    clearCmdTLS( p_sys );
-    net_Close( p_sys->cmd.fd );
+    clearCmd( p_sys );
     return -1;
 }
 
@@ -682,7 +673,7 @@ static int InOpen( vlc_object_t *p_this )
     p_sys = p_access->p_sys = (access_sys_t*)calloc( 1, sizeof( access_sys_t ) );
     if( !p_sys )
         return VLC_ENOMEM;
-    p_sys->data.fd = -1;
+    p_sys->data = NULL;
     p_sys->out = false;
     p_sys->offset = 0;
     p_sys->size = UINT64_MAX;
@@ -745,16 +736,13 @@ static int InOpen( vlc_object_t *p_this )
     if( ftp_StartStream( p_this, p_sys, 0, b_directory ) < 0 )
     {
         msg_Err( p_this, "cannot retrieve file" );
-        clearCmdTLS( p_sys );
-        net_Close( p_sys->cmd.fd );
-        goto exit_error;
+        goto error;
     }
 
     return VLC_SUCCESS;
 
 error:
-    clearCmdTLS( p_sys );
-    net_Close( p_sys->cmd.fd );
+    clearCmd( p_sys );
 
 exit_error:
     vlc_UrlClean( &p_sys->url );
@@ -774,7 +762,7 @@ static int OutOpen( vlc_object_t *p_this )
         return VLC_ENOMEM;
 
     /* Init p_access */
-    p_sys->data.fd = -1;
+    p_sys->data = NULL;
     p_sys->out = true;
 
     if( readTLSMode( p_this, p_sys, p_access->psz_access ) )
@@ -795,8 +783,7 @@ static int OutOpen( vlc_object_t *p_this )
     if( ftp_StartStream( p_this, p_sys, 0, false ) < 0 )
     {
         msg_Err( p_access, "cannot store file" );
-        clearCmdTLS( p_sys );
-        net_Close( p_sys->cmd.fd );
+        clearCmd( p_sys );
         goto exit_error;
     }
 
@@ -831,8 +818,7 @@ static void Close( vlc_object_t *p_access, access_sys_t *p_sys )
         ftp_RecvCommand( p_access, p_sys, NULL, NULL );
     }
 
-    clearCmdTLS( p_sys );
-    net_Close( p_sys->cmd.fd );
+    clearCmd( p_sys );
 
     /* free memory */
     vlc_UrlClean( &p_sys->url );
@@ -893,16 +879,11 @@ static int OutSeek( sout_access_out_t *p_access, off_t i_pos )
 static ssize_t Read( access_t *p_access, void *p_buffer, size_t i_len )
 {
     access_sys_t *p_sys = p_access->p_sys;
-    int i_read;
 
-    assert( p_sys->data.fd != -1 );
+    assert( p_sys->data != NULL );
     assert( !p_sys->out );
 
-    if( p_sys->data.p_tls != NULL )
-        i_read = vlc_tls_Read( p_sys->data.p_tls, p_buffer, i_len, false );
-    else
-        i_read = vlc_recv_i11e( p_sys->data.fd, p_buffer, i_len, 0 );
-
+    ssize_t i_read = vlc_tls_Read( p_sys->data, p_buffer, i_len, false );
     if( i_read >= 0 )
         p_sys->offset += i_read;
     else if( errno != EINTR && errno != EAGAIN )
@@ -922,7 +903,7 @@ static int DirRead (access_t *p_access, input_item_node_t *p_current_node)
     access_sys_t *p_sys = p_access->p_sys;
     int i_ret = VLC_SUCCESS;
 
-    assert( p_sys->data.fd != -1 );
+    assert( p_sys->data != NULL );
     assert( !p_sys->out );
 
     struct access_fsdir fsdir;
@@ -930,13 +911,10 @@ static int DirRead (access_t *p_access, input_item_node_t *p_current_node)
 
     while (i_ret == VLC_SUCCESS)
     {
-        char *psz_line, *psz_file;
+        char *psz_file;
         int type = ITEM_TYPE_UNKNOWN;
-        if( p_sys->data.p_tls != NULL )
-            psz_line = vlc_tls_GetLine( p_sys->data.p_tls );
-        else
-            psz_line = net_Gets( p_access, p_sys->data.fd );
 
+        char *psz_line = vlc_tls_GetLine( p_sys->data );
         if( psz_line == NULL )
             break;
 
@@ -1008,17 +986,13 @@ static ssize_t Write( sout_access_out_t *p_access, block_t *p_buffer )
     access_sys_t *p_sys = GET_OUT_SYS(p_access);
     size_t i_write = 0;
 
-    assert( p_sys->data.fd != -1 );
+    assert( p_sys->data != NULL );
 
     while( p_buffer != NULL )
     {
-        block_t *p_next = p_buffer->p_next;;
+        block_t *p_next = p_buffer->p_next;
 
-        if( p_sys->data.p_tls != NULL )
-            i_write += vlc_tls_Write( p_sys->data.p_tls,
-                                      p_buffer->p_buffer, p_buffer->i_buffer );
-        else
-            i_write += net_Write( p_access, p_sys->data.fd,
+        i_write += vlc_tls_Write( p_sys->data,
                                   p_buffer->p_buffer, p_buffer->i_buffer );
         block_Release( p_buffer );
 
@@ -1089,7 +1063,7 @@ static int ftp_StartStream( vlc_object_t *p_access, access_sys_t *p_sys,
     char *psz_arg, *psz_parser;
     int  i_port;
 
-    assert( p_sys->data.fd == -1 );
+    assert( p_sys->data == NULL );
 
     if( ( ftp_SendCommand( p_access, p_sys, *psz_ip ? "EPSV" : "PASV" ) < 0 )
      || ( ftp_RecvCommand( p_access, p_sys, &i_answer, &psz_arg ) != 2 ) )
@@ -1154,8 +1128,8 @@ static int ftp_StartStream( vlc_object_t *p_access, access_sys_t *p_sys,
     }
 
     msg_Dbg( p_access, "waiting for data connection..." );
-    p_sys->data.fd = net_ConnectTCP( p_access, psz_ip, i_port );
-    if( p_sys->data.fd < 0 )
+    p_sys->data = vlc_tls_SocketOpenTCP( p_access, psz_ip, i_port );
+    if( p_sys->data == NULL )
     {
         msg_Err( p_access, "failed to connect with server" );
         return VLC_EGENERIC;
@@ -1197,50 +1171,46 @@ static int ftp_StartStream( vlc_object_t *p_access, access_sys_t *p_sys,
     {
         /* FIXME: Do Reuse TLS Session */
         /* TLS/SSL handshake */
-        p_sys->data.p_tls = vlc_tls_ClientSessionCreateFD( p_sys->p_creds,
-                            p_sys->data.fd, p_sys->url.psz_host,
+        vlc_tls_t *secure = vlc_tls_ClientSessionCreate( p_sys->p_creds,
+                            p_sys->data, p_sys->url.psz_host,
                             ( p_sys->tlsmode == EXPLICIT ) ? "ftpes-data"
                                                            : "ftps-data",
                                                          NULL, NULL );
-        if( p_sys->data.p_tls == NULL )
+        if( secure == NULL )
         {
             msg_Err( p_access, "cannot establish FTP/TLS session for data" \
                              ": server not allowing new session ?" );
             return VLC_EGENERIC;
         }
+        p_sys->data = secure;
     }
-    else
-        shutdown( p_sys->data.fd, p_sys->out ? SHUT_RD : SHUT_WR );
 
     return VLC_SUCCESS;
 }
 
 static int ftp_StopStream ( vlc_object_t *p_access, access_sys_t *p_sys )
 {
+    int ret = VLC_SUCCESS;
+
     if( ftp_SendCommand( p_access, p_sys, "ABOR" ) < 0 )
     {
         msg_Warn( p_access, "cannot abort file" );
-        if( p_sys->data.fd > 0 )
-        {
-            if ( p_sys->data.p_tls ) vlc_tls_SessionDelete( p_sys->data.p_tls );
-            net_Close( p_sys->data.fd );
-        }
-        p_sys->data.fd = -1;
-        p_sys->data.p_tls = NULL;
-        return VLC_EGENERIC;
+        ret = VLC_EGENERIC;
     }
 
-    if( p_sys->data.fd != -1 )
+    if( p_sys->data != NULL )
     {
-        if ( p_sys->data.p_tls ) vlc_tls_SessionDelete( p_sys->data.p_tls );
-        net_Close( p_sys->data.fd );
-        p_sys->data.fd = -1;
-        p_sys->data.p_tls = NULL;
-        /* Read the final response from RETR/STOR, i.e. 426 or 226 */
-        ftp_RecvCommand( p_access, p_sys, NULL, NULL );
+        vlc_tls_Close( p_sys->data );
+        p_sys->data = NULL;
+
+        if( ret == VLC_SUCCESS )
+            /* Read the final response from RETR/STOR, i.e. 426 or 226 */
+            ftp_RecvCommand( p_access, p_sys, NULL, NULL );
     }
-    /* Read the response from ABOR, i.e. 226 or 225 */
-    ftp_RecvCommand( p_access, p_sys, NULL, NULL );
 
-    return VLC_SUCCESS;
+    if( ret == VLC_SUCCESS )
+        /* Read the response from ABOR, i.e. 226 or 225 */
+        ftp_RecvCommand( p_access, p_sys, NULL, NULL );
+
+    return ret;
 }



More information about the vlc-commits mailing list