Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
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
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:
* ftp.c:
*****************************************************************************
*****************************************************************************
* Copyright (C) 2001-200
3
VideoLAN
* Copyright (C) 2001-200
4
VideoLAN
* $Id: ftp.c,v 1.2
3 2004/01/03 18:41:36 rocky
Exp $
* $Id: ftp.c,v 1.2
4 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
(
acces
s_t
)
);
memset
(
p_sys
,
0
,
sizeof
(
access_sy
s_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
)
{
{
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..."
);
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_file
size
;
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
(
p
sz_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
=
p
sz_line
;
}
}
else
else
{
{
free
(
p
_buffer
);
free
(
p
sz_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
}
}
modules/demux/mp4/libmp4.c
View file @
bf805a8b
...
@@ -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.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>
* 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
]
)
{
{
...
...
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