X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fftp.c;h=246ebe8e6de0c84c376ebc1dc30a88e1ab6e22f5;hb=d18bfd92bb33df6e590efa02a55121ee75529b4f;hp=926e46fcba760642923cced870d2d5bd640cd22c;hpb=85c84889f0bff0bf944109e28822b41f741d7b38;p=vlc diff --git a/modules/access/ftp.c b/modules/access/ftp.c index 926e46fcba..246ebe8e6d 100644 --- a/modules/access/ftp.c +++ b/modules/access/ftp.c @@ -5,7 +5,7 @@ * $Id$ * * Authors: Laurent Aimar - original code - * Rémi Denis-Courmont - EPSV support + * Rémi Denis-Courmont - EPSV support * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -31,13 +31,7 @@ #include #include "network.h" -#if defined( UNDER_CE ) -# include -#elif defined( WIN32 ) -# include -#else -# include -#endif +#include "vlc_url.h" /***************************************************************************** * Module descriptor @@ -91,7 +85,7 @@ struct access_sys_t int fd_cmd; int fd_data; - char *psz_epsv_ip; + char sz_epsv_ip[NI_MAXNUMERICHOST]; }; static int ftp_SendCommand( access_t *, char *, ... ); @@ -106,7 +100,7 @@ static int Connect( access_t *p_access, access_sys_t *p_sys ) /* *** Open a TCP connection with server *** */ msg_Dbg( p_access, "waiting for connection..." ); - p_sys->fd_cmd = fd = net_OpenTCP( p_access, p_sys->url.psz_host, + p_sys->fd_cmd = fd = net_ConnectTCP( p_access, p_sys->url.psz_host, p_sys->url.i_port ); if( fd < 0 ) { @@ -219,7 +213,6 @@ static int Open( vlc_object_t *p_this ) memset( p_sys, 0, sizeof( access_sys_t ) ); p_sys->fd_cmd = -1; p_sys->fd_data = -1; - p_sys->psz_epsv_ip = NULL; /* *** Parse URL and get server addr/port and path *** */ psz = p_access->psz_path; @@ -239,6 +232,12 @@ static int Open( vlc_object_t *p_this ) p_sys->url.i_port = 21; /* default port */ } + /* FTP URLs are relative to user's default directory (RFC1738) + For absolute path use ftp://foo.bar//usr/local/etc/filename */ + + if( *p_sys->url.psz_path == '/' ) + p_sys->url.psz_path++; + if( Connect( p_access, p_sys ) < 0 ) goto exit_error; @@ -251,26 +250,7 @@ static int Open( vlc_object_t *p_this ) if( ftp_ReadCommand( p_access, &i_answer, NULL ) == 2 ) { - char hostaddr[NI_MAXNUMERICHOST]; - struct sockaddr_storage addr; - socklen_t len = sizeof (addr); - - if( getpeername( p_sys->fd_cmd, (struct sockaddr *)&addr, &len ) ) - { - msg_Err( p_access, "getpeername failed" ); - goto exit_error; - } - - i_answer = vlc_getnameinfo( (struct sockaddr *)&addr, len, hostaddr, - sizeof( hostaddr ), NULL, NI_NUMERICHOST ); - if( i_answer ) - { - msg_Err( p_access, "getnameinfo failed: %s", - vlc_gai_strerror( i_answer ) ); - goto exit_error; - } - p_sys->psz_epsv_ip = strdup( hostaddr ); - if( p_sys->psz_epsv_ip == NULL ) + if( net_GetPeerAddress( p_sys->fd_cmd, p_sys->sz_epsv_ip, NULL ) ) goto exit_error; } else @@ -282,6 +262,7 @@ static int Open( vlc_object_t *p_this ) */ net_Close( p_sys->fd_cmd ); p_sys->fd_cmd = -1; + *p_sys->sz_epsv_ip = '\0'; if( ( p_sys->fd_cmd = Connect( p_access, p_sys ) ) < 0 ) goto exit_error; @@ -348,8 +329,6 @@ static void Close( vlc_object_t *p_this ) ftp_ReadCommand( p_access, NULL, NULL ); } net_Close( p_sys->fd_cmd ); - if( p_sys->psz_epsv_ip != NULL ) - free( p_sys->psz_epsv_ip ); /* free memory */ vlc_UrlClean( &p_sys->url ); @@ -562,11 +541,11 @@ static int ftp_StartStream( access_t *p_access, off_t i_start ) char psz_ipv4[16], *psz_ip; int i_answer; char *psz_arg, *psz_parser; - unsigned a1, a2, a3, a4, p1, p2; int i_port; - if( ( ftp_SendCommand( p_access, p_sys->psz_epsv_ip != NULL - ? "EPSV" : "PASV" ) < 0 ) + psz_ip = p_sys->sz_epsv_ip; + + if( ( ftp_SendCommand( p_access, *psz_ip ? "EPSV" : "PASV" ) < 0 ) || ( ftp_ReadCommand( p_access, &i_answer, &psz_arg ) != 2 ) ) { msg_Err( p_access, "cannot set passive mode" ); @@ -581,7 +560,6 @@ static int ftp_StartStream( access_t *p_access, off_t i_start ) return VLC_EGENERIC; } - psz_ip = p_sys->psz_epsv_ip; if( psz_ip != NULL ) { char psz_fmt[7] = "(|||%u"; @@ -596,6 +574,8 @@ static int ftp_StartStream( access_t *p_access, off_t i_start ) } else { + unsigned a1, a2, a3, a4, p1, p2; + if( ( sscanf( psz_parser, "(%u,%u,%u,%u,%u,%u", &a1, &a2, &a3, &a4, &p1, &p2 ) < 6 ) || ( a1 > 255 ) || ( a2 > 255 ) || ( a3 > 255 ) || ( a4 > 255 ) || ( p1 > 255 ) || ( p2 > 255 ) ) @@ -631,7 +611,7 @@ static int ftp_StartStream( access_t *p_access, off_t i_start ) } msg_Dbg( p_access, "waiting for data connection..." ); - p_sys->fd_data = net_OpenTCP( p_access, psz_ip, i_port ); + p_sys->fd_data = net_ConnectTCP( p_access, psz_ip, i_port ); if( p_sys->fd_data < 0 ) { msg_Err( p_access, "failed to connect with server" ); @@ -658,7 +638,7 @@ static int ftp_StopStream ( access_t *p_access ) if( ftp_SendCommand( p_access, "ABOR" ) < 0 ) { - msg_Warn( p_access, "cannot abord file" ); + msg_Warn( p_access, "cannot abort file" ); if( p_sys->fd_data > 0 ) net_Close( p_sys->fd_data ); p_sys->fd_data = -1;