Commit bf805a8b authored by Laurent Aimar's avatar Laurent Aimar

* modules/demux/mp4/libmp4.c: use vasprintf

 * modules/access/ftp.c: cleaned up.
parent 516fba50
/***************************************************************************** /*****************************************************************************
* ftp.c: * ftp.c:
***************************************************************************** *****************************************************************************
* Copyright (C) 2001-2003 VideoLAN * Copyright (C) 2001-2004 VideoLAN
* $Id: ftp.c,v 1.23 2004/01/03 18:41:36 rocky Exp $ * $Id: ftp.c,v 1.24 2004/01/08 00:37:18 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -25,63 +25,18 @@ ...@@ -25,63 +25,18 @@
* Preamble * Preamble
*****************************************************************************/ *****************************************************************************/
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <vlc/vlc.h> #include <vlc/vlc.h>
#include <vlc/input.h> #include <vlc/input.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifdef WIN32
# include <winsock2.h>
# include <ws2tcpip.h>
# ifndef IN_MULTICAST
# define IN_MULTICAST(a) IN_CLASSD(a)
# endif
#else
# include <sys/socket.h>
# include <netinet/in.h>
# if HAVE_ARPA_INET_H
# include <arpa/inet.h>
# elif defined( SYS_BEOS )
# include <net/netdb.h>
# endif
#endif
#include "network.h" #include "network.h"
/***************************************************************************** /*****************************************************************************
* Local prototypes * Module descriptor
*****************************************************************************/ *****************************************************************************/
static int Open ( vlc_object_t * ); static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * ); static void Close ( vlc_object_t * );
static ssize_t Read ( input_thread_t * p_input, byte_t * p_buffer,
size_t i_len );
static void Seek ( input_thread_t *, off_t );
static ssize_t NetRead ( input_thread_t *, input_socket_t *, byte_t *, size_t );
static void NetClose( input_thread_t *, input_socket_t *);
static int ftp_SendCommand( input_thread_t *, char *, ... );
static int ftp_ReadCommand( input_thread_t *, int *, char ** );
static int ftp_StartStream( input_thread_t *, off_t );
static int ftp_StopStream ( input_thread_t *);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
#define CACHING_TEXT N_("Caching value in ms") #define CACHING_TEXT N_("Caching value in ms")
#define CACHING_LONGTEXT N_( \ #define CACHING_LONGTEXT N_( \
"Allows you to modify the default caching value for ftp streams. This " \ "Allows you to modify the default caching value for ftp streams. This " \
...@@ -100,46 +55,26 @@ vlc_module_begin(); ...@@ -100,46 +55,26 @@ vlc_module_begin();
set_callbacks( Open, Close ); set_callbacks( Open, Close );
vlc_module_end(); vlc_module_end();
/* url: [/]host[:port][/path] */ /*****************************************************************************
typedef struct url_s * Local prototypes
{ *****************************************************************************/
char *psz_server_addr; static ssize_t Read ( input_thread_t *, byte_t *, size_t );
int i_server_port; static void Seek ( input_thread_t *, off_t );
char *psz_bind_addr;
int i_bind_port;
char *psz_path;
/* private */
char *psz_private;
} url_t;
static void ftp_ParseURL( url_t *, char * );
#define FREE( p ) if( p ) free( p )
typedef struct access_s struct access_sys_t
{ {
input_socket_t socket_cmd; vlc_url_t url;
input_socket_t socket_data;
url_t url; /* connect to this server */
off_t i_filesize; int fd_cmd;
int fd_data;
int i_eos; int64_t i_size;
};
} access_t; static int ftp_SendCommand( input_thread_t *, char *, ... );
static int ftp_ReadCommand( input_thread_t *, int *, char ** );
static int ftp_StartStream( input_thread_t *, off_t );
/**************************************************************************** static int ftp_StopStream ( input_thread_t *);
****************************************************************************
******************* *******************
******************* Main functions *******************
******************* *******************
****************************************************************************
****************************************************************************/
/**************************************************************************** /****************************************************************************
* Open: connect to ftp server and ask for file * Open: connect to ftp server and ask for file
...@@ -147,112 +82,72 @@ typedef struct access_s ...@@ -147,112 +82,72 @@ typedef struct access_s
static int Open( vlc_object_t *p_this ) static int Open( vlc_object_t *p_this )
{ {
input_thread_t *p_input = (input_thread_t*)p_this; input_thread_t *p_input = (input_thread_t*)p_this;
access_sys_t *p_sys;
char *psz;
vlc_value_t val;
access_t *p_access; int i_answer;
char *psz_network; char *psz_arg;
module_t *p_network;
network_socket_t socket_desc;
url_t *p_url;
int i_answer;
char *psz_user, *psz_pwd, *psz_account;
char *psz_arg;
/* *** allocate p_access_data *** */ /* *** allocate access_sys_t *** */
p_input->p_access_data = p_sys = p_input->p_access_data = malloc( sizeof( access_sys_t ) );
(void*)p_access = malloc( sizeof( access_t ) ); memset( p_sys, 0, sizeof( access_sys_t ) );
memset( p_access, 0, sizeof( access_t ) ); p_sys->fd_cmd = -1;
p_url = &p_access->url; p_sys->fd_data = -1;
/* *** Parse URL and get server addr/port and path *** */ /* *** Parse URL and get server addr/port and path *** */
ftp_ParseURL( p_url, p_input->psz_name ); psz = p_input->psz_name;
while( *psz == '/' )
if( p_url->psz_server_addr == NULL ||
!( *p_url->psz_server_addr ) )
{ {
FREE( p_url->psz_private ); psz++;
msg_Err( p_input, "invalid server name" );
return( -1 );
}
if( p_url->i_server_port == 0 )
{
p_url->i_server_port = 21; /* default port */
} }
vlc_UrlParse( &p_sys->url, psz, 0 );
/* 2: look at ip version ipv4/ipv6 */ if( p_sys->url.psz_host == NULL || *p_sys->url.psz_host == '\0' )
psz_network = "";
if( config_GetInt( p_input, "ipv4" ) )
{ {
psz_network = "ipv4"; msg_Err( p_input, "invalid server name" );
goto exit_error;
} }
else if( config_GetInt( p_input, "ipv6" ) ) if( p_sys->url.i_port <= 0 )
{ {
psz_network = "ipv6"; p_sys->url.i_port = 21; /* default port */
} }
/* 3: Open a TCP connection with server *** */ /* *** Open a TCP connection with server *** */
msg_Dbg( p_input, "waiting for connection..." ); msg_Dbg( p_input, "waiting for connection..." );
socket_desc.i_type = NETWORK_TCP; p_sys->fd_cmd = net_OpenTCP( p_input, p_sys->url.psz_host, p_sys->url.i_port );
socket_desc.psz_server_addr = p_url->psz_server_addr; if( p_sys->fd_cmd < 0 )
socket_desc.i_server_port = p_url->i_server_port;
socket_desc.psz_bind_addr = "";
socket_desc.i_bind_port = 0;
socket_desc.i_ttl = 0;
p_input->p_private = (void*)&socket_desc;
if( !( p_network = module_Need( p_input, "network", psz_network ) ) )
{ {
msg_Err( p_input, "failed to connect with server" ); msg_Err( p_input, "failed to connect with server" );
FREE( p_access->url.psz_private ); goto exit_error;
FREE( p_input->p_access_data );
return( -1 );
} }
module_Unneed( p_input, p_network ); p_input->i_mtu = 0;
p_access->socket_cmd.i_handle = socket_desc.i_handle;
p_input->i_mtu = socket_desc.i_mtu;
msg_Dbg( p_input,
"connection with \"%s:%d\" successful",
p_url->psz_server_addr,
p_url->i_server_port );
for( ;; ) for( ;; )
{ {
if( ftp_ReadCommand( p_input, &i_answer, NULL ) < 0) if( ftp_ReadCommand( p_input, &i_answer, NULL ) != 1 )
{
msg_Err( p_input, "failed to get answer" );
goto exit_error;
}
if( i_answer / 100 != 1 )
{ {
break; break;
} }
} }
if( i_answer / 100 != 2 ) if( i_answer / 100 != 2 )
{ {
msg_Err( p_input, "connection rejected" ); msg_Err( p_input, "connection rejected" );
goto exit_error; goto exit_error;
} }
else
{
msg_Dbg( p_input, "connection accepted (%d)", i_answer );
}
psz_user = config_GetPsz( p_input, "ftp-user" ); msg_Dbg( p_input, "connection accepted (%d)", i_answer );
if( ftp_SendCommand( p_input, "USER %s", psz_user ) < 0 )
{
FREE( psz_user );
goto exit_error;
}
FREE( psz_user );
if( ftp_ReadCommand( p_input, &i_answer, NULL ) < 0) var_Create( p_input, "ftp-user", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
var_Get( p_input, "ftp-user", &val );
if( ftp_SendCommand( p_input, "USER %s", val.psz_string ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, NULL ) < 0 )
{ {
msg_Err( p_input, "failed to get answer" ); if( val.psz_string ) free( val.psz_string );
goto exit_error; goto exit_error;
} }
if( val.psz_string ) free( val.psz_string );
switch( i_answer / 100 ) switch( i_answer / 100 )
{ {
case 2: case 2:
...@@ -260,18 +155,16 @@ static int Open( vlc_object_t *p_this ) ...@@ -260,18 +155,16 @@ static int Open( vlc_object_t *p_this )
break; break;
case 3: case 3:
msg_Dbg( p_input, "password needed" ); msg_Dbg( p_input, "password needed" );
psz_pwd = config_GetPsz( p_input, "ftp-pwd" ); var_Create( p_input, "ftp-pwd", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
if( ftp_SendCommand( p_input, "PASS %s", psz_pwd ) < 0 ) var_Get( p_input, "ftp-pwd", &val );
if( ftp_SendCommand( p_input, "PASS %s", val.psz_string ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, NULL ) < 0 )
{ {
FREE( psz_pwd ); if( val.psz_string ) free( val.psz_string );
goto exit_error;
}
FREE( psz_pwd );
if( ftp_ReadCommand( p_input, &i_answer, NULL ) < 0)
{
msg_Err( p_input, "failed to get answer" );
goto exit_error; goto exit_error;
} }
if( val.psz_string ) free( val.psz_string );
switch( i_answer / 100 ) switch( i_answer / 100 )
{ {
case 2: case 2:
...@@ -279,28 +172,24 @@ static int Open( vlc_object_t *p_this ) ...@@ -279,28 +172,24 @@ static int Open( vlc_object_t *p_this )
break; break;
case 3: case 3:
msg_Dbg( p_input, "account needed" ); msg_Dbg( p_input, "account needed" );
psz_account = config_GetPsz( p_input, "ftp-account" ); var_Create( p_input, "ftp-account", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
if( ftp_SendCommand( p_input, "ACCT %s", psz_account ) < 0 ) var_Get( p_input, "ftp-account", &val );
if( ftp_SendCommand( p_input, "ACCT %s", val.psz_string ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, NULL ) < 0 )
{ {
FREE( psz_account ); if( val.psz_string ) free( val.psz_string );
goto exit_error;
}
FREE( psz_account );
if( ftp_ReadCommand( p_input, &i_answer, NULL ) < 0)
{
msg_Err( p_input, "failed to get answer" );
goto exit_error; goto exit_error;
} }
if( val.psz_string ) free( val.psz_string );
if( i_answer / 100 != 2 ) if( i_answer / 100 != 2 )
{ {
msg_Err( p_input, "account rejected" ); msg_Err( p_input, "account rejected" );
goto exit_error; goto exit_error;
} }
else msg_Dbg( p_input, "account accepted" );
{
msg_Dbg( p_input, "account accepted" );
}
break; break;
default: default:
msg_Err( p_input, "password rejected" ); msg_Err( p_input, "password rejected" );
goto exit_error; goto exit_error;
...@@ -311,34 +200,26 @@ static int Open( vlc_object_t *p_this ) ...@@ -311,34 +200,26 @@ static int Open( vlc_object_t *p_this )
goto exit_error; goto exit_error;
} }
if( ftp_SendCommand( p_input, "TYPE I" ) < 0 ) /* binary mode */
{ if( ftp_SendCommand( p_input, "TYPE I" ) < 0 ||
msg_Err( p_input, "cannot set binary transfert mode" ); ftp_ReadCommand( p_input, &i_answer, NULL ) != 2 )
goto exit_error;
}
if( ftp_ReadCommand( p_input, &i_answer, NULL ) != 2 )
{ {
msg_Err( p_input, "cannot set binary transfert mode" ); msg_Err( p_input, "cannot set binary transfert mode" );
goto exit_error; goto exit_error;
} }
/* get size */ /* get size */
if( ftp_SendCommand( p_input, "SIZE %s", p_url->psz_path ) < 0 ) if( ftp_SendCommand( p_input, "SIZE %s", p_sys->url.psz_path ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, &psz_arg ) != 2 )
{ {
msg_Err( p_input, "cannot get file size" ); msg_Err( p_input, "cannot get file size" );
goto exit_error; goto exit_error;
} }
if( ftp_ReadCommand( p_input, &i_answer, &psz_arg ) != 2 ) p_sys->i_size = atoll( &psz_arg[4] );
{ free( psz_arg );
msg_Err( p_input, "cannot get file size" ); msg_Dbg( p_input, "file size: "I64Fd, p_sys->i_size );
goto exit_error;
}
p_access->i_filesize = atoll( psz_arg + 4 );
msg_Dbg( p_input, "file size: "I64Fd, p_access->i_filesize );
FREE( psz_arg );
/* Start the 'stream' */
if( ftp_StartStream( p_input, 0 ) < 0 ) if( ftp_StartStream( p_input, 0 ) < 0 )
{ {
msg_Err( p_input, "cannot retrieve file" ); msg_Err( p_input, "cannot retrieve file" );
...@@ -354,23 +235,28 @@ static int Open( vlc_object_t *p_this ) ...@@ -354,23 +235,28 @@ static int Open( vlc_object_t *p_this )
/* *** finished to set some variable *** */ /* *** finished to set some variable *** */
vlc_mutex_lock( &p_input->stream.stream_lock ); vlc_mutex_lock( &p_input->stream.stream_lock );
p_input->stream.b_pace_control = 1; p_input->stream.b_pace_control = VLC_TRUE;
p_input->stream.p_selected_area->i_tell = 0; p_input->stream.p_selected_area->i_tell = 0;
p_input->stream.b_seekable = 1; p_input->stream.b_seekable = VLC_TRUE;
p_input->stream.p_selected_area->i_size = p_access->i_filesize; p_input->stream.p_selected_area->i_size = p_sys->i_size;
p_input->stream.i_method = INPUT_METHOD_NETWORK; p_input->stream.i_method = INPUT_METHOD_NETWORK;
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
/* Update default_pts to a suitable value for ftp access */ /* Update default_pts to a suitable value for ftp access */
p_input->i_pts_delay = config_GetInt( p_input, "ftp-caching" ) * 1000; var_Create( p_input, "ftp-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Get( p_input, "ftp-caching", &val );
p_input->i_pts_delay = val.i_int * 1000;
return( 0 ); return VLC_SUCCESS;
exit_error: exit_error:
NetClose( p_input, &p_access->socket_cmd ); if( p_sys->fd_cmd > 0 )
FREE( p_access->url.psz_private ); {
FREE( p_input->p_access_data ); net_Close( p_sys->fd_cmd );
return( -1 ); }
vlc_UrlClean( &p_sys->url );
free( p_sys );
return VLC_EGENERIC;
} }
/***************************************************************************** /*****************************************************************************
...@@ -379,25 +265,24 @@ exit_error: ...@@ -379,25 +265,24 @@ exit_error:
static void Close( vlc_object_t *p_this ) static void Close( vlc_object_t *p_this )
{ {
input_thread_t *p_input = (input_thread_t *)p_this; input_thread_t *p_input = (input_thread_t *)p_this;
access_t *p_access = (access_t*)p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
msg_Dbg( p_input, "stopping stream" ); msg_Dbg( p_input, "stopping stream" );
ftp_StopStream( p_input ); ftp_StopStream( p_input );
if( ftp_SendCommand( p_input, "QUIT" ) < 0 ) if( ftp_SendCommand( p_input, "QUIT" ) < 0 )
{ {
msg_Err( p_input, "cannot quit" ); msg_Warn( p_input, "cannot quit" );
} }
else else
{ {
ftp_ReadCommand( p_input, NULL, NULL ); ftp_ReadCommand( p_input, NULL, NULL );
} }
net_Close( p_sys->fd_cmd );
NetClose( p_input, &p_access->socket_cmd );
/* free memory */ /* free memory */
FREE( p_access->url.psz_private ); vlc_UrlClean( &p_sys->url );
free( p_sys );
} }
/***************************************************************************** /*****************************************************************************
...@@ -405,7 +290,6 @@ static void Close( vlc_object_t *p_this ) ...@@ -405,7 +290,6 @@ static void Close( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
static void Seek( input_thread_t * p_input, off_t i_pos ) static void Seek( input_thread_t * p_input, off_t i_pos )
{ {
//access_t *p_access = (access_t*)p_input->p_access_data;
if( i_pos < 0 ) if( i_pos < 0 )
{ {
return; return;
...@@ -421,63 +305,45 @@ static void Seek( input_thread_t * p_input, off_t i_pos ) ...@@ -421,63 +305,45 @@ static void Seek( input_thread_t * p_input, off_t i_pos )
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
} }
/*****************************************************************************
* Read:
*****************************************************************************/
static ssize_t Read ( input_thread_t * p_input, byte_t * p_buffer, static ssize_t Read ( input_thread_t * p_input, byte_t * p_buffer,
size_t i_len ) size_t i_len )
{ {
access_t *p_access = (access_t*)p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
size_t i_data;
i_data = NetRead( p_input, &p_access->socket_data, p_buffer, i_len );
return( i_data ); return net_Read( p_input, p_sys->fd_data, p_buffer, i_len, VLC_FALSE );
} }
/*****************************************************************************
* ftp_*:
*****************************************************************************/
static int ftp_SendCommand( input_thread_t *p_input, char *psz_fmt, ... ) static int ftp_SendCommand( input_thread_t *p_input, char *psz_fmt, ... )
{ {
access_t *p_access = (access_t*)p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
va_list args; va_list args;
char *psz_buffer; char *psz_cmd;
#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS) int i_ret;
size_t i_size;
#endif
va_start( args, psz_fmt ); va_start( args, psz_fmt );
vasprintf( &psz_cmd, psz_fmt, args );
va_end( args );
#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) && !defined(SYS_BEOS) msg_Dbg( p_input, "ftp_SendCommand:\"%s\"", psz_cmd);
vasprintf( &psz_buffer, psz_fmt, args ); if( ( i_ret = net_Printf( VLC_OBJECT(p_input), p_sys->fd_cmd, "%s", psz_cmd ) ) > 0 )
#else
i_size = strlen( psz_fmt ) + 2048;
psz_buffer = calloc( i_size, sizeof( char ) );
vsnprintf( psz_buffer, i_size, psz_fmt, args );
psz_buffer[i_size - 1] = 0;
#endif
if( !strncmp( psz_buffer, "PASS", 4 ) )
{ {
msg_Dbg( p_input, "ftp_SendCommand:\"PASS xxx\"" ); i_ret = net_Printf( VLC_OBJECT(p_input), p_sys->fd_cmd, "\n" );
} }
else
{ if( i_ret < 0 )
msg_Dbg( p_input, "ftp_SendCommand:\"%s\"", psz_buffer );
}
psz_buffer = realloc( psz_buffer, strlen( psz_buffer ) + 3 );
strcat( psz_buffer, "\r\n" );
if( send( p_access->socket_cmd.i_handle,
psz_buffer,
strlen( psz_buffer ),
0 ) == -1 )
{ {
FREE( psz_buffer );
msg_Err( p_input, "failed to send command" ); msg_Err( p_input, "failed to send command" );
return( -1 ); return VLC_EGENERIC;
} }
FREE( psz_buffer ); return VLC_SUCCESS;
va_end( args );
return( 0 );
} }
#define BLOCK_SIZE 1024
/* TODO support this s**t : /* TODO support this s**t :
RFC 959 allows the client to send certain TELNET strings at any moment, RFC 959 allows the client to send certain TELNET strings at any moment,
even in the middle of a request: even in the middle of a request:
...@@ -493,75 +359,41 @@ static int ftp_SendCommand( input_thread_t *p_input, char *psz_fmt, ... ) ...@@ -493,75 +359,41 @@ static int ftp_SendCommand( input_thread_t *p_input, char *psz_fmt, ... )
These strings are not part of the requests, except in the case \377\377, These strings are not part of the requests, except in the case \377\377,
where the request contains one \377. */ where the request contains one \377. */
static int ftp_ReadCommand( input_thread_t *p_input, static int ftp_ReadCommand( input_thread_t *p_input,
int *pi_answer, char **ppsz_answer ) int *pi_answer, char **ppsz_answer )
{ {
access_t *p_access = (access_t*)p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
uint8_t *p_buffer; char *psz_line;
int i_buffer; int i_answer;
int i_buffer_size;
psz_line = net_Gets( p_input, p_sys->fd_cmd );
int i_answer; msg_Dbg( p_input, "answer=%s", psz_line );
if( psz_line == NULL || strlen( psz_line ) < 3 )
i_buffer = 0; {
i_buffer_size = BLOCK_SIZE + 1; msg_Err( p_input, "cannot get answer" );
p_buffer = malloc( BLOCK_SIZE + 1); if( psz_line ) free( psz_line );
if( pi_answer ) *pi_answer = 500;
for( ;; ) if( ppsz_answer ) *ppsz_answer = NULL;
{ return -1;
ssize_t i_read;
i_read = NetRead( p_input, &p_access->socket_cmd,
p_buffer + i_buffer, BLOCK_SIZE );
if( i_read <= 0 || p_input->b_die || p_input->b_error )
{
free( p_buffer );
if( pi_answer ) *pi_answer = 500;
if( ppsz_answer ) *ppsz_answer = NULL;
return( -1 );
}
if( i_read == 0 )
{
// continue;
}
i_buffer += i_read;
if( i_read < BLOCK_SIZE )
{
p_buffer[i_buffer] = '\0';
break;
}
i_buffer_size += BLOCK_SIZE;
p_buffer = realloc( p_buffer, i_buffer_size );
}
if( i_buffer < 3 )
{
goto exit_error;
} }
i_answer = atoi( p_buffer ); i_answer = atoi( psz_line );
if( pi_answer ) *pi_answer = i_answer; if( pi_answer ) *pi_answer = i_answer;
if( ppsz_answer ) if( ppsz_answer )
{ {
*ppsz_answer = p_buffer; *ppsz_answer = psz_line;
} }
else else
{ {
free( p_buffer ); free( psz_line );
} }
return( i_answer / 100 ); return( i_answer / 100 );
exit_error:
free( p_buffer );
if( pi_answer ) *pi_answer = 500;
if( ppsz_answer ) *ppsz_answer = NULL;
return( -1 );
} }
static int ftp_StartStream( input_thread_t *p_input, off_t i_start ) static int ftp_StartStream( input_thread_t *p_input, off_t i_start )
{ {
access_t *p_access = (access_t*)p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
char psz_ip[1000]; char psz_ip[1000];
int i_answer; int i_answer;
...@@ -569,281 +401,80 @@ static int ftp_StartStream( input_thread_t *p_input, off_t i_start ) ...@@ -569,281 +401,80 @@ static int ftp_StartStream( input_thread_t *p_input, off_t i_start )
int a1,a2,a3,a4; int a1,a2,a3,a4;
int p1,p2; int p1,p2;
int i_port; int i_port;
module_t *p_network;
network_socket_t socket_desc;
if( ftp_SendCommand( p_input, "PASV" ) < 0 ) if( ftp_SendCommand( p_input, "PASV" ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, &psz_arg ) != 2 )
{ {
msg_Err( p_input, "cannot set passive transfert mode" ); msg_Err( p_input, "cannot set passive transfert mode" );
return( -1 ); return VLC_EGENERIC;
}
if( ftp_ReadCommand( p_input, &i_answer, &psz_arg ) != 2 )
{
msg_Err( p_input, "cannot set passive transfert mode" );
return( -1 );
} }
psz_parser = strchr( psz_arg, '(' ); psz_parser = strchr( psz_arg, '(' );
if( !psz_parser || sscanf( psz_parser, "(%d,%d,%d,%d,%d,%d", &a1, &a2, &a3, &a4, &p1, &p2 ) < 6 ) if( !psz_parser || sscanf( psz_parser, "(%d,%d,%d,%d,%d,%d", &a1, &a2, &a3, &a4, &p1, &p2 ) < 6 )
{ {
FREE( psz_arg ); free( psz_arg );
msg_Err( p_input, "cannot get ip/port for passive transfert mode" ); msg_Err( p_input, "cannot get ip/port for passive transfert mode" );
return( -1 ); return VLC_EGENERIC;
} }
FREE( psz_arg ); free( psz_arg );
sprintf( psz_ip, "%d.%d.%d.%d", a1, a2, a3, a4 ); sprintf( psz_ip, "%d.%d.%d.%d", a1, a2, a3, a4 );
i_port = p1 * 256 + p2; i_port = p1 * 256 + p2;
msg_Dbg( p_input, "ip:%s port:%d", psz_ip, i_port ); msg_Dbg( p_input, "ip:%s port:%d", psz_ip, i_port );
if( ftp_SendCommand( p_input, "TYPE I" ) < 0 ) if( ftp_SendCommand( p_input, "TYPE I" ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, NULL ) != 2 )
{ {
msg_Err( p_input, "cannot set binary transfert mode" ); msg_Err( p_input, "cannot set binary transfert mode" );
return( -1 ); return VLC_EGENERIC;
}
if( ftp_ReadCommand( p_input, &i_answer, NULL ) != 2 )
{
msg_Err( p_input, "cannot set binary transfert mode" );
return( -1 );
} }
if( i_start > 0 ) if( i_start > 0 )
{ {
if( ftp_SendCommand( p_input, "REST "I64Fu, i_start ) < 0 ) if( ftp_SendCommand( p_input, "REST "I64Fu, i_start ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, NULL ) > 3 )
{ {
msg_Err( p_input, "cannot set restart point" ); msg_Err( p_input, "cannot set restart point" );
return( -1 ); return VLC_EGENERIC;
}
if( ftp_ReadCommand( p_input, &i_answer, NULL ) > 3 )
{
msg_Err( p_input, "cannot set restart point" );
return( -1 );
} }
} }
msg_Dbg( p_input, "waiting for data connection..." ); msg_Dbg( p_input, "waiting for data connection..." );
socket_desc.i_type = NETWORK_TCP; p_sys->fd_data = net_OpenTCP( p_input, psz_ip, i_port );
socket_desc.psz_server_addr = psz_ip; if( p_sys->fd_data < 0 )
socket_desc.i_server_port = i_port;
socket_desc.psz_bind_addr = "";
socket_desc.i_bind_port = 0;
socket_desc.i_ttl = 0;
p_input->p_private = (void*)&socket_desc;
if( !( p_network = module_Need( p_input, "network", "" ) ) )
{ {
msg_Err( p_input, "failed to connect with server" ); msg_Err( p_input, "failed to connect with server" );
return( -1 ); return VLC_EGENERIC;
} }
module_Unneed( p_input, p_network ); msg_Dbg( p_input, "connection with \"%s:%d\" successful",
p_access->socket_data.i_handle = socket_desc.i_handle;
p_input->i_mtu = socket_desc.i_mtu;
msg_Dbg( p_input,
"connection with \"%s:%d\" successful",
psz_ip, i_port ); psz_ip, i_port );
if( ftp_SendCommand( p_input, "RETR %s", p_access->url.psz_path ) < 0 )
{
msg_Err( p_input, "cannot retreive file" );
return( -1 );
}
/* "1xx" message */ /* "1xx" message */
if( ftp_ReadCommand( p_input, &i_answer, NULL ) > 2 ) if( ftp_SendCommand( p_input, "RETR %s", p_sys->url.psz_path ) < 0 ||
ftp_ReadCommand( p_input, &i_answer, NULL ) > 2 )
{ {
msg_Err( p_input, "cannot retreive file" ); msg_Err( p_input, "cannot retreive file" );
return( -1 ); return VLC_EGENERIC;
} }
return VLC_SUCCESS;
return( 0 );
} }
static int ftp_StopStream ( input_thread_t *p_input) static int ftp_StopStream ( input_thread_t *p_input)
{ {
access_t *p_access = (access_t*)p_input->p_access_data; access_sys_t *p_sys = p_input->p_access_data;
int i_answer; int i_answer;
NetClose( p_input, &p_access->socket_data );
if( ftp_SendCommand( p_input, "ABOR" ) < 0 ) if( ftp_SendCommand( p_input, "ABOR" ) < 0 )
{ {
msg_Err( p_input, "cannot abord file" ); msg_Warn( p_input, "cannot abord file" );
} net_Close( p_sys->fd_data ); p_sys->fd_data = -1;
else return VLC_EGENERIC;
{
ftp_ReadCommand( p_input, &i_answer, NULL );
ftp_ReadCommand( p_input, &i_answer, NULL );
}
return( 0 );
}
/****************************************************************************
*
****************************************************************************/
static void ftp_ParseURL( url_t *p_url, char *psz_url )
{
char *psz_parser;
char *psz_server_port;
p_url->psz_private = strdup( psz_url );
psz_parser = p_url->psz_private;
while( *psz_parser == '/' )
{
psz_parser++;
} }
p_url->psz_server_addr = psz_parser; net_Close( p_sys->fd_data ); p_sys->fd_data = -1;
ftp_ReadCommand( p_input, &i_answer, NULL );
while( *psz_parser && ftp_ReadCommand( p_input, &i_answer, NULL );
*psz_parser != ':' && *psz_parser != '/' && *psz_parser != '@' )
{
psz_parser++;
}
if( *psz_parser == ':' )
{
*psz_parser = '\0';
psz_parser++;
psz_server_port = psz_parser;
while( *psz_parser && *psz_parser != '/' )
{
psz_parser++;
}
}
else
{
psz_server_port = "";
}
if( *psz_parser == '@' )
{
char *psz_bind_port;
*psz_parser = '\0'; return VLC_SUCCESS;
psz_parser++;
p_url->psz_bind_addr = psz_parser;
while( *psz_parser && *psz_parser != ':' && *psz_parser != '/' )
{
psz_parser++;
}
if( *psz_parser == ':' )
{
*psz_parser = '\0';
psz_parser++;
psz_bind_port = psz_parser;
while( *psz_parser && *psz_parser != '/' )
{
psz_parser++;
}
}
else
{
psz_bind_port = "";
}
if( *psz_bind_port )
{
p_url->i_bind_port = strtol( psz_bind_port, &psz_parser, 10 );
}
else
{
p_url->i_bind_port = 0;
}
}
else
{
p_url->psz_bind_addr = "";
p_url->i_bind_port = 0;
}
if( *psz_parser == '/' )
{
*psz_parser = '\0';
psz_parser++;
p_url->psz_path = psz_parser;
}
if( *psz_server_port )
{
p_url->i_server_port = strtol( psz_server_port, &psz_parser, 10 );
}
else
{
p_url->i_server_port = 0;
}
}
/*****************************************************************************
* Read: read on a file descriptor, checking b_die periodically
*****************************************************************************/
static ssize_t NetRead( input_thread_t *p_input,
input_socket_t *p_socket,
byte_t *p_buffer, size_t i_len )
{
#ifdef UNDER_CE
return -1;
#else
struct timeval timeout;
fd_set fds;
ssize_t i_recv;
int i_ret;
/* Initialize file descriptor set */
FD_ZERO( &fds );
FD_SET( p_socket->i_handle, &fds );
/* We'll wait 1 second if nothing happens */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
/* Find if some data is available */
while( (i_ret = select( p_socket->i_handle + 1, &fds,
NULL, NULL, &timeout )) == 0
|| (i_ret < 0 && errno == EINTR) )
{
FD_ZERO( &fds );
FD_SET( p_socket->i_handle, &fds );
timeout.tv_sec = 1;
timeout.tv_usec = 0;
if( p_input->b_die || p_input->b_error )
{
return 0;
}
}
if( i_ret < 0 )
{
msg_Err( p_input, "network select error (%s)", strerror(errno) );
return -1;
}
i_recv = recv( p_socket->i_handle, p_buffer, i_len, 0 );
if( i_recv < 0 )
{
msg_Err( p_input, "recv failed (%s)", strerror(errno) );
}
return i_recv;
#endif
}
static void NetClose( input_thread_t *p_input, input_socket_t *p_socket )
{
#if defined( UNDER_CE )
CloseHandle( (HANDLE)p_socket->i_handle );
#elif defined( WIN32 )
closesocket( p_socket->i_handle );
#else
close( p_socket->i_handle );
#endif
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* libmp4.c : LibMP4 library for mp4 module for vlc * libmp4.c : LibMP4 library for mp4 module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: libmp4.c,v 1.41 2004/01/06 01:41:10 jlj Exp $ * $Id: libmp4.c,v 1.42 2004/01/08 00:37:18 fenrir Exp $
* *
* Author: Laurent Aimar <fenrir@via.ecp.fr> * Author: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -2460,9 +2460,6 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result, ...@@ -2460,9 +2460,6 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result,
MP4_Box_t *p_box, char *psz_fmt, va_list args) MP4_Box_t *p_box, char *psz_fmt, va_list args)
{ {
char *psz_path; char *psz_path;
#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS)
size_t i_size;
#endif
if( !p_box ) if( !p_box )
{ {
...@@ -2470,14 +2467,7 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result, ...@@ -2470,14 +2467,7 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result,
return; return;
} }
#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) && !defined(SYS_BEOS)
vasprintf( &psz_path, psz_fmt, args ); vasprintf( &psz_path, psz_fmt, args );
#else
i_size = strlen( psz_fmt ) + 1024;
psz_path = calloc( i_size, sizeof( char ) );
vsnprintf( psz_path, i_size, psz_fmt, args );
psz_path[i_size - 1] = 0;
#endif
if( !psz_path || !psz_path[0] ) if( !psz_path || !psz_path[0] )
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment