Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
bf805a8b
Commit
bf805a8b
authored
Jan 08, 2004
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/demux/mp4/libmp4.c: use vasprintf
* modules/access/ftp.c: cleaned up.
parent
516fba50
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
163 additions
and
542 deletions
+163
-542
modules/access/ftp.c
modules/access/ftp.c
+162
-531
modules/demux/mp4/libmp4.c
modules/demux/mp4/libmp4.c
+1
-11
No files found.
modules/access/ftp.c
View file @
bf805a8b
/*****************************************************************************
* ftp.c:
*****************************************************************************
* Copyright (C) 2001-200
3
VideoLAN
* $Id: ftp.c,v 1.2
3 2004/01/03 18:41:36 rocky
Exp $
* Copyright (C) 2001-200
4
VideoLAN
* $Id: ftp.c,v 1.2
4 2004/01/08 00:37:18 fenrir
Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
...
...
@@ -25,63 +25,18 @@
* Preamble
*****************************************************************************/
#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/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"
/*****************************************************************************
*
Local prototypes
*
Module descriptor
*****************************************************************************/
static
int
Open
(
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_LONGTEXT N_( \
"Allows you to modify the default caching value for ftp streams. This " \
...
...
@@ -100,46 +55,26 @@ vlc_module_begin();
set_callbacks
(
Open
,
Close
);
vlc_module_end
();
/* url: [/]host[:port][/path] */
typedef
struct
url_s
{
char
*
psz_server_addr
;
int
i_server_port
;
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 )
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
ssize_t
Read
(
input_thread_t
*
,
byte_t
*
,
size_t
);
static
void
Seek
(
input_thread_t
*
,
off_t
);
typedef
struct
access_s
struct
access_sys_t
{
input_socket_t
socket_cmd
;
input_socket_t
socket_data
;
url_t
url
;
/* connect to this server */
vlc_url_t
url
;
off_t
i_filesize
;
int
fd_cmd
;
int
fd_data
;
int
i_eos
;
int64_t
i_size
;
};
}
access_t
;
/****************************************************************************
****************************************************************************
******************* *******************
******************* Main functions *******************
******************* *******************
****************************************************************************
****************************************************************************/
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
*
);
/****************************************************************************
* Open: connect to ftp server and ask for file
...
...
@@ -147,112 +82,72 @@ typedef struct access_s
static
int
Open
(
vlc_object_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
;
char
*
psz_network
;
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
;
int
i_answer
;
char
*
psz_arg
;
/* *** allocate
p_access_data
*** */
p_
input
->
p_access_data
=
(
void
*
)
p_access
=
malloc
(
sizeof
(
acces
s_t
)
);
memset
(
p_access
,
0
,
sizeof
(
access_t
)
)
;
p_
url
=
&
p_access
->
url
;
/* *** allocate
access_sys_t
*** */
p_
sys
=
p_input
->
p_access_data
=
malloc
(
sizeof
(
access_sys_t
)
);
memset
(
p_sys
,
0
,
sizeof
(
access_sy
s_t
)
);
p_sys
->
fd_cmd
=
-
1
;
p_
sys
->
fd_data
=
-
1
;
/* *** Parse URL and get server addr/port and path *** */
ftp_ParseURL
(
p_url
,
p_input
->
psz_name
);
if
(
p_url
->
psz_server_addr
==
NULL
||
!
(
*
p_url
->
psz_server_addr
)
)
psz
=
p_input
->
psz_name
;
while
(
*
psz
==
'/'
)
{
FREE
(
p_url
->
psz_private
);
msg_Err
(
p_input
,
"invalid server name"
);
return
(
-
1
);
}
if
(
p_url
->
i_server_port
==
0
)
{
p_url
->
i_server_port
=
21
;
/* default port */
psz
++
;
}
vlc_UrlParse
(
&
p_sys
->
url
,
psz
,
0
);
/* 2: look at ip version ipv4/ipv6 */
psz_network
=
""
;
if
(
config_GetInt
(
p_input
,
"ipv4"
)
)
if
(
p_sys
->
url
.
psz_host
==
NULL
||
*
p_sys
->
url
.
psz_host
==
'\0'
)
{
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
)
{
p
sz_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..."
);
socket_desc
.
i_type
=
NETWORK_TCP
;
socket_desc
.
psz_server_addr
=
p_url
->
psz_server_addr
;
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
)
)
)
p_sys
->
fd_cmd
=
net_OpenTCP
(
p_input
,
p_sys
->
url
.
psz_host
,
p_sys
->
url
.
i_port
);
if
(
p_sys
->
fd_cmd
<
0
)
{
msg_Err
(
p_input
,
"failed to connect with server"
);
FREE
(
p_access
->
url
.
psz_private
);
FREE
(
p_input
->
p_access_data
);
return
(
-
1
);
goto
exit_error
;
}
module_Unneed
(
p_input
,
p_network
);
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
);
p_input
->
i_mtu
=
0
;
for
(
;;
)
{
if
(
ftp_ReadCommand
(
p_input
,
&
i_answer
,
NULL
)
<
0
)
{
msg_Err
(
p_input
,
"failed to get answer"
);
goto
exit_error
;
}
if
(
i_answer
/
100
!=
1
)
if
(
ftp_ReadCommand
(
p_input
,
&
i_answer
,
NULL
)
!=
1
)
{
break
;
}
}
if
(
i_answer
/
100
!=
2
)
{
msg_Err
(
p_input
,
"connection rejected"
);
goto
exit_error
;
}
else
{
msg_Dbg
(
p_input
,
"connection accepted (%d)"
,
i_answer
);
}
psz_user
=
config_GetPsz
(
p_input
,
"ftp-user"
);
if
(
ftp_SendCommand
(
p_input
,
"USER %s"
,
psz_user
)
<
0
)
{
FREE
(
psz_user
);
goto
exit_error
;
}
FREE
(
psz_user
);
msg_Dbg
(
p_input
,
"connection accepted (%d)"
,
i_answer
);
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
;
}
if
(
val
.
psz_string
)
free
(
val
.
psz_string
);
switch
(
i_answer
/
100
)
{
case
2
:
...
...
@@ -260,18 +155,16 @@ static int Open( vlc_object_t *p_this )
break
;
case
3
:
msg_Dbg
(
p_input
,
"password needed"
);
psz_pwd
=
config_GetPsz
(
p_input
,
"ftp-pwd"
);
if
(
ftp_SendCommand
(
p_input
,
"PASS %s"
,
psz_pwd
)
<
0
)
var_Create
(
p_input
,
"ftp-pwd"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
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
);
goto
exit_error
;
}
FREE
(
psz_pwd
);
if
(
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
;
}
if
(
val
.
psz_string
)
free
(
val
.
psz_string
);
switch
(
i_answer
/
100
)
{
case
2
:
...
...
@@ -279,28 +172,24 @@ static int Open( vlc_object_t *p_this )
break
;
case
3
:
msg_Dbg
(
p_input
,
"account needed"
);
psz_account
=
config_GetPsz
(
p_input
,
"ftp-account"
);
if
(
ftp_SendCommand
(
p_input
,
"ACCT %s"
,
psz_account
)
<
0
)
var_Create
(
p_input
,
"ftp-account"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
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
);
goto
exit_error
;
}
FREE
(
psz_account
);
if
(
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
;
}
if
(
val
.
psz_string
)
free
(
val
.
psz_string
);
if
(
i_answer
/
100
!=
2
)
{
msg_Err
(
p_input
,
"account rejected"
);
goto
exit_error
;
}
else
{
msg_Dbg
(
p_input
,
"account accepted"
);
}
msg_Dbg
(
p_input
,
"account accepted"
);
break
;
default:
msg_Err
(
p_input
,
"password rejected"
);
goto
exit_error
;
...
...
@@ -311,34 +200,26 @@ static int Open( vlc_object_t *p_this )
goto
exit_error
;
}
if
(
ftp_SendCommand
(
p_input
,
"TYPE I"
)
<
0
)
{
msg_Err
(
p_input
,
"cannot set binary transfert mode"
);
goto
exit_error
;
}
if
(
ftp_ReadCommand
(
p_input
,
&
i_answer
,
NULL
)
!=
2
)
/* binary mode */
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"
);
goto
exit_error
;
}
/* 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"
);
goto
exit_error
;
}
if
(
ftp_ReadCommand
(
p_input
,
&
i_answer
,
&
psz_arg
)
!=
2
)
{
msg_Err
(
p_input
,
"cannot get file 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
);
p_sys
->
i_size
=
atoll
(
&
psz_arg
[
4
]
);
free
(
psz_arg
);
msg_Dbg
(
p_input
,
"file size: "
I64Fd
,
p_sys
->
i_size
);
/* Start the 'stream' */
if
(
ftp_StartStream
(
p_input
,
0
)
<
0
)
{
msg_Err
(
p_input
,
"cannot retrieve file"
);
...
...
@@ -354,23 +235,28 @@ static int Open( vlc_object_t *p_this )
/* *** finished to set some variable *** */
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
.
b_seekable
=
1
;
p_input
->
stream
.
p_selected_area
->
i_size
=
p_
access
->
i_file
size
;
p_input
->
stream
.
b_seekable
=
VLC_TRUE
;
p_input
->
stream
.
p_selected_area
->
i_size
=
p_
sys
->
i_
size
;
p_input
->
stream
.
i_method
=
INPUT_METHOD_NETWORK
;
vlc_mutex_unlock
(
&
p_input
->
stream
.
stream_lock
);
/* 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:
NetClose
(
p_input
,
&
p_access
->
socket_cmd
);
FREE
(
p_access
->
url
.
psz_private
);
FREE
(
p_input
->
p_access_data
);
return
(
-
1
);
if
(
p_sys
->
fd_cmd
>
0
)
{
net_Close
(
p_sys
->
fd_cmd
);
}
vlc_UrlClean
(
&
p_sys
->
url
);
free
(
p_sys
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
...
...
@@ -379,25 +265,24 @@ exit_error:
static
void
Close
(
vlc_object_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"
);
ftp_StopStream
(
p_input
);
if
(
ftp_SendCommand
(
p_input
,
"QUIT"
)
<
0
)
{
msg_
Err
(
p_input
,
"cannot quit"
);
msg_
Warn
(
p_input
,
"cannot quit"
);
}
else
{
ftp_ReadCommand
(
p_input
,
NULL
,
NULL
);
}
NetClose
(
p_input
,
&
p_access
->
socket_cmd
);
net_Close
(
p_sys
->
fd_cmd
);
/* 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 )
*****************************************************************************/
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
)
{
return
;
...
...
@@ -421,63 +305,45 @@ static void Seek( input_thread_t * p_input, off_t i_pos )
vlc_mutex_unlock
(
&
p_input
->
stream
.
stream_lock
);
}
/*****************************************************************************
* Read:
*****************************************************************************/
static
ssize_t
Read
(
input_thread_t
*
p_input
,
byte_t
*
p_buffer
,
size_t
i_len
)
{
access_t
*
p_access
=
(
access_t
*
)
p_input
->
p_access_data
;
size_t
i_data
;
i_data
=
NetRead
(
p_input
,
&
p_access
->
socket_data
,
p_buffer
,
i_len
);
access_sys_t
*
p_sys
=
p_input
->
p_access_data
;
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
,
...
)
{
access_t
*
p_access
=
(
access_t
*
)
p_input
->
p_access_data
;
va_list
args
;
char
*
psz_buffer
;
#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS)
size_t
i_size
;
#endif
access_sys_t
*
p_sys
=
p_input
->
p_access_data
;
va_list
args
;
char
*
psz_cmd
;
int
i_ret
;
va_start
(
args
,
psz_fmt
);
vasprintf
(
&
psz_cmd
,
psz_fmt
,
args
);
va_end
(
args
);
#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) && !defined(SYS_BEOS)
vasprintf
(
&
psz_buffer
,
psz_fmt
,
args
);
#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:
\"
%s
\"
"
,
psz_cmd
);
if
(
(
i_ret
=
net_Printf
(
VLC_OBJECT
(
p_input
),
p_sys
->
fd_cmd
,
"%s"
,
psz_cmd
)
)
>
0
)
{
msg_Dbg
(
p_input
,
"ftp_SendCommand:
\"
PASS xxx
\"
"
);
i_ret
=
net_Printf
(
VLC_OBJECT
(
p_input
),
p_sys
->
fd_cmd
,
"
\n
"
);
}
else
{
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
)
if
(
i_ret
<
0
)
{
FREE
(
psz_buffer
);
msg_Err
(
p_input
,
"failed to send command"
);
return
(
-
1
)
;
return
VLC_EGENERIC
;
}
FREE
(
psz_buffer
);
va_end
(
args
);
return
(
0
);
return
VLC_SUCCESS
;
}
#define BLOCK_SIZE 1024
/* TODO support this s**t :
RFC 959 allows the client to send certain TELNET strings at any moment,
even in the middle of a request:
...
...
@@ -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,
where the request contains one \377. */
static
int
ftp_ReadCommand
(
input_thread_t
*
p_input
,
int
*
pi_answer
,
char
**
ppsz_answer
)
{
access_t
*
p_access
=
(
access_t
*
)
p_input
->
p_access_data
;
uint8_t
*
p_buffer
;
int
i_buffer
;
int
i_buffer_size
;
int
i_answer
;
i_buffer
=
0
;
i_buffer_size
=
BLOCK_SIZE
+
1
;
p_buffer
=
malloc
(
BLOCK_SIZE
+
1
);
for
(
;;
)
{
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
;
access_sys_t
*
p_sys
=
p_input
->
p_access_data
;
char
*
psz_line
;
int
i_answer
;
psz_line
=
net_Gets
(
p_input
,
p_sys
->
fd_cmd
);
msg_Dbg
(
p_input
,
"answer=%s"
,
psz_line
);
if
(
psz_line
==
NULL
||
strlen
(
psz_line
)
<
3
)
{
msg_Err
(
p_input
,
"cannot get answer"
);
if
(
psz_line
)
free
(
psz_line
);
if
(
pi_answer
)
*
pi_answer
=
500
;
if
(
ppsz_answer
)
*
ppsz_answer
=
NULL
;
return
-
1
;
}
i_answer
=
atoi
(
p
_buffer
);
i_answer
=
atoi
(
p
sz_line
);
if
(
pi_answer
)
*
pi_answer
=
i_answer
;
if
(
ppsz_answer
)
{
*
ppsz_answer
=
p
_buffer
;
*
ppsz_answer
=
p
sz_line
;
}
else
{
free
(
p
_buffer
);
free
(
p
sz_line
);
}
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
)
{
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
];
int
i_answer
;
...
...
@@ -569,281 +401,80 @@ static int ftp_StartStream( input_thread_t *p_input, off_t i_start )
int
a1
,
a2
,
a3
,
a4
;
int
p1
,
p2
;
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"
);
return
(
-
1
);
}
if
(
ftp_ReadCommand
(
p_input
,
&
i_answer
,
&
psz_arg
)
!=
2
)
{
msg_Err
(
p_input
,
"cannot set passive transfert mode"
);
return
(
-
1
);
return
VLC_EGENERIC
;
}
psz_parser
=
strchr
(
psz_arg
,
'('
);
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"
);
return
(
-
1
)
;
return
VLC_EGENERIC
;
}
FREE
(
psz_arg
);
free
(
psz_arg
);
sprintf
(
psz_ip
,
"%d.%d.%d.%d"
,
a1
,
a2
,
a3
,
a4
);
i_port
=
p1
*
256
+
p2
;
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"
);
return
(
-
1
);
}
if
(
ftp_ReadCommand
(
p_input
,
&
i_answer
,
NULL
)
!=
2
)
{
msg_Err
(
p_input
,
"cannot set binary transfert mode"
);
return
(
-
1
);
return
VLC_EGENERIC
;
}
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"
);
return
(
-
1
);
}
if
(
ftp_ReadCommand
(
p_input
,
&
i_answer
,
NULL
)
>
3
)
{
msg_Err
(
p_input
,
"cannot set restart point"
);
return
(
-
1
);
return
VLC_EGENERIC
;
}
}
msg_Dbg
(
p_input
,
"waiting for data connection..."
);
socket_desc
.
i_type
=
NETWORK_TCP
;
socket_desc
.
psz_server_addr
=
psz_ip
;
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"
,
""
)
)
)
p_sys
->
fd_data
=
net_OpenTCP
(
p_input
,
psz_ip
,
i_port
);
if
(
p_sys
->
fd_data
<
0
)
{
msg_Err
(
p_input
,
"failed to connect with server"
);
return
(
-
1
)
;
return
VLC_EGENERIC
;
}
module_Unneed
(
p_input
,
p_network
);
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"
,
msg_Dbg
(
p_input
,
"connection with
\"
%s:%d
\"
successful"
,
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 */
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"
);
return
(
-
1
)
;
return
VLC_EGENERIC
;
}
return
(
0
);
return
VLC_SUCCESS
;
}
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
;
NetClose
(
p_input
,
&
p_access
->
socket_data
);
if
(
ftp_SendCommand
(
p_input
,
"ABOR"
)
<
0
)
{
msg_Err
(
p_input
,
"cannot abord file"
);
}
else
{
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
++
;
msg_Warn
(
p_input
,
"cannot abord file"
);
net_Close
(
p_sys
->
fd_data
);
p_sys
->
fd_data
=
-
1
;
return
VLC_EGENERIC
;
}
p_url
->
psz_server_addr
=
psz_parser
;
while
(
*
psz_parser
&&
*
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
;
net_Close
(
p_sys
->
fd_data
);
p_sys
->
fd_data
=
-
1
;
ftp_ReadCommand
(
p_input
,
&
i_answer
,
NULL
);
ftp_ReadCommand
(
p_input
,
&
i_answer
,
NULL
);
*
psz_parser
=
'\0'
;
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
return
VLC_SUCCESS
;
}
modules/demux/mp4/libmp4.c
View file @
bf805a8b
...
...
@@ -2,7 +2,7 @@
* libmp4.c : LibMP4 library for mp4 module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: libmp4.c,v 1.4
1 2004/01/06 01:41:10 jlj
Exp $
* $Id: libmp4.c,v 1.4
2 2004/01/08 00:37:18 fenrir
Exp $
*
* Author: Laurent Aimar <fenrir@via.ecp.fr>
*
...
...
@@ -2460,9 +2460,6 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result,
MP4_Box_t
*
p_box
,
char
*
psz_fmt
,
va_list
args
)
{
char
*
psz_path
;
#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS)
size_t
i_size
;
#endif
if
(
!
p_box
)
{
...
...
@@ -2470,14 +2467,7 @@ static void __MP4_BoxGet( MP4_Box_t **pp_result,
return
;
}
#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) && !defined(SYS_BEOS)
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
]
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment