int fd_cmd;
int fd_data;
- char *psz_epsv_ip;
+ char sz_epsv_ip[NI_MAXNUMERICHOST];
};
static int ftp_SendCommand( access_t *, char *, ... );
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;
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;
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
*/
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;
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 );
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" );
return VLC_EGENERIC;
}
- psz_ip = p_sys->psz_epsv_ip;
if( psz_ip != NULL )
{
char psz_fmt[7] = "(|||%u";
}
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 ) )
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;