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
e45c692c
Commit
e45c692c
authored
Sep 09, 2006
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Untested FTP access output (closes #605)
parent
4a0c164d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
234 additions
and
121 deletions
+234
-121
modules/access/ftp.c
modules/access/ftp.c
+234
-121
No files found.
modules/access/ftp.c
View file @
e45c692c
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
* Preamble
* Preamble
*****************************************************************************/
*****************************************************************************/
#include <stdlib.h>
#include <stdlib.h>
#include <assert.h>
#include <vlc/vlc.h>
#include <vlc/vlc.h>
#include <vlc/input.h>
#include <vlc/input.h>
...
@@ -34,12 +35,15 @@
...
@@ -34,12 +35,15 @@
#include "network.h"
#include "network.h"
#include "vlc_url.h"
#include "vlc_url.h"
#include "stream_output.h"
/*****************************************************************************
/*****************************************************************************
* Module descriptor
* Module descriptor
*****************************************************************************/
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
int
InOpen
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
static
void
InClose
(
vlc_object_t
*
);
static
int
OutOpen
(
vlc_object_t
*
);
static
void
OutClose
(
vlc_object_t
*
);
#define CACHING_TEXT N_("Caching value in ms")
#define CACHING_TEXT N_("Caching value in ms")
#define CACHING_LONGTEXT N_( \
#define CACHING_LONGTEXT N_( \
...
@@ -70,14 +74,25 @@ vlc_module_begin();
...
@@ -70,14 +74,25 @@ vlc_module_begin();
add_string
(
"ftp-account"
,
"anonymous"
,
NULL
,
ACCOUNT_TEXT
,
add_string
(
"ftp-account"
,
"anonymous"
,
NULL
,
ACCOUNT_TEXT
,
ACCOUNT_LONGTEXT
,
VLC_FALSE
);
ACCOUNT_LONGTEXT
,
VLC_FALSE
);
add_shortcut
(
"ftp"
);
add_shortcut
(
"ftp"
);
set_callbacks
(
Open
,
Close
);
set_callbacks
(
InOpen
,
InClose
);
add_submodule
();
set_shortname
(
"FTP"
);
set_description
(
_
(
"FTP upload output"
)
);
set_capability
(
"sout access"
,
0
);
set_category
(
CAT_SOUT
);
set_subcategory
(
SUBCAT_SOUT_ACO
);
add_shortcut
(
"ftp"
);
set_callbacks
(
OutOpen
,
OutClose
);
vlc_module_end
();
vlc_module_end
();
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
*****************************************************************************/
*****************************************************************************/
static
int
Read
(
access_t
*
,
uint8_t
*
,
int
);
static
int
Read
(
access_t
*
,
uint8_t
*
,
int
);
static
int
Write
(
sout_access_out_t
*
,
block_t
*
);
static
int
Seek
(
access_t
*
,
int64_t
);
static
int
Seek
(
access_t
*
,
int64_t
);
static
int
OutSeek
(
sout_access_out_t
*
,
int64_t
);
static
int
Control
(
access_t
*
,
int
,
va_list
);
static
int
Control
(
access_t
*
,
int
,
va_list
);
struct
access_sys_t
struct
access_sys_t
...
@@ -89,20 +104,22 @@ struct access_sys_t
...
@@ -89,20 +104,22 @@ struct access_sys_t
char
sz_epsv_ip
[
NI_MAXNUMERICHOST
];
char
sz_epsv_ip
[
NI_MAXNUMERICHOST
];
};
};
#define GET_OUT_SYS( p_this ) \
((access_sys_t *)(((sout_access_out_t *)(p_this))->p_sys))
static
int
ftp_SendCommand
(
access_t
*
,
char
*
,
...
);
static
int
ftp_SendCommand
(
vlc_object_t
*
,
access_sys_t
*
,
const
char
*
,
...
);
static
int
ftp_ReadCommand
(
acces
s_t
*
,
int
*
,
char
**
);
static
int
ftp_ReadCommand
(
vlc_object_t
*
,
access_sy
s_t
*
,
int
*
,
char
**
);
static
int
ftp_StartStream
(
acces
s_t
*
,
int64_t
);
static
int
ftp_StartStream
(
vlc_object_t
*
,
access_sy
s_t
*
,
int64_t
);
static
int
ftp_StopStream
(
access_t
*
);
static
int
ftp_StopStream
(
vlc_object_t
*
,
access_sys_t
*
);
static
int
Connect
(
access
_t
*
p_access
,
access_sys_t
*
p_sys
)
static
int
Login
(
vlc_object
_t
*
p_access
,
access_sys_t
*
p_sys
)
{
{
int
fd
,
i_answer
;
int
i_answer
;
char
*
psz
;
char
*
psz
;
/* *** Open a TCP connection with server *** */
/* *** Open a TCP connection with server *** */
p_sys
->
fd_cmd
=
f
d
=
net_ConnectTCP
(
p_access
,
p_sys
->
url
.
psz_host
,
int
fd
=
p_sys
->
fd_cm
d
=
net_ConnectTCP
(
p_access
,
p_sys
->
url
.
psz_host
,
p_sys
->
url
.
i_port
);
p_sys
->
url
.
i_port
);
if
(
fd
==
-
1
)
if
(
fd
==
-
1
)
{
{
msg_Err
(
p_access
,
"connection failed"
);
msg_Err
(
p_access
,
"connection failed"
);
...
@@ -111,7 +128,7 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
...
@@ -111,7 +128,7 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
return
-
1
;
return
-
1
;
}
}
while
(
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
==
1
);
while
(
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
NULL
)
==
1
);
if
(
i_answer
/
100
!=
2
)
if
(
i_answer
/
100
!=
2
)
{
{
...
@@ -128,8 +145,8 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
...
@@ -128,8 +145,8 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
else
else
psz
=
var_CreateGetString
(
p_access
,
"ftp-user"
);
psz
=
var_CreateGetString
(
p_access
,
"ftp-user"
);
if
(
ftp_SendCommand
(
p_access
,
"USER %s"
,
psz
)
<
0
||
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"USER %s"
,
psz
)
<
0
||
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
<
0
)
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
NULL
)
<
0
)
{
{
free
(
psz
);
free
(
psz
);
return
-
1
;
return
-
1
;
...
@@ -148,8 +165,8 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
...
@@ -148,8 +165,8 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
else
else
psz
=
var_CreateGetString
(
p_access
,
"ftp-pwd"
);
psz
=
var_CreateGetString
(
p_access
,
"ftp-pwd"
);
if
(
ftp_SendCommand
(
p_access
,
"PASS %s"
,
psz
)
<
0
||
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"PASS %s"
,
psz
)
<
0
||
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
<
0
)
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
NULL
)
<
0
)
{
{
free
(
psz
);
free
(
psz
);
return
-
1
;
return
-
1
;
...
@@ -164,9 +181,9 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
...
@@ -164,9 +181,9 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
case
3
:
case
3
:
msg_Dbg
(
p_access
,
"account needed"
);
msg_Dbg
(
p_access
,
"account needed"
);
psz
=
var_CreateGetString
(
p_access
,
"ftp-account"
);
psz
=
var_CreateGetString
(
p_access
,
"ftp-account"
);
if
(
ftp_SendCommand
(
p_access
,
"ACCT %s"
,
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"ACCT %s"
,
psz
)
<
0
||
psz
)
<
0
||
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
<
0
)
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
NULL
)
<
0
)
{
{
free
(
psz
);
free
(
psz
);
return
-
1
;
return
-
1
;
...
@@ -203,61 +220,26 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
...
@@ -203,61 +220,26 @@ static int Connect( access_t *p_access, access_sys_t *p_sys )
return
0
;
return
0
;
}
}
/****************************************************************************
static
int
Connect
(
vlc_object_t
*
p_access
,
access_sys_t
*
p_sys
)
* Open: connect to ftp server and ask for file
****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
{
access_t
*
p_access
=
(
access_t
*
)
p_this
;
if
(
Login
(
p_access
,
p_sys
)
<
0
)
access_sys_t
*
p_sys
;
return
-
1
;
char
*
psz
;
int
i_answer
;
char
*
psz_arg
;
/* Init p_access */
STANDARD_READ_ACCESS_INIT
p_sys
->
fd_cmd
=
-
1
;
p_sys
->
fd_data
=
-
1
;
/* *** Parse URL and get server addr/port and path *** */
psz
=
p_access
->
psz_path
;
while
(
*
psz
==
'/'
)
{
psz
++
;
}
vlc_UrlParse
(
&
p_sys
->
url
,
psz
,
0
);
if
(
p_sys
->
url
.
psz_host
==
NULL
||
*
p_sys
->
url
.
psz_host
==
'\0'
)
{
msg_Err
(
p_access
,
"invalid server name"
);
goto
exit_error
;
}
if
(
p_sys
->
url
.
i_port
<=
0
)
{
p_sys
->
url
.
i_port
=
21
;
/* default port */
}
/* FTP URLs are relative to user's default directory (RFC1738)
For absolute path use ftp://foo.bar//usr/local/etc/filename */
if
(
*
p_sys
->
url
.
psz_path
==
'/'
)
p_sys
->
url
.
psz_path
++
;
if
(
Connect
(
p_access
,
p_sys
)
<
0
)
goto
exit_error
;
/* Extended passive mode */
/* Extended passive mode */
if
(
ftp_SendCommand
(
p_access
,
"EPSV ALL"
)
<
0
)
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"EPSV ALL"
)
<
0
)
{
{
msg_Err
(
p_access
,
"cannot request extended passive mode"
);
msg_Err
(
p_access
,
"cannot request extended passive mode"
);
net_Close
(
p_sys
->
fd_cmd
);
return
-
1
;
return
-
1
;
}
}
if
(
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
==
2
)
if
(
ftp_ReadCommand
(
p_access
,
p_sys
,
NULL
,
NULL
)
==
2
)
{
{
if
(
net_GetPeerAddress
(
p_sys
->
fd_cmd
,
p_sys
->
sz_epsv_ip
,
NULL
)
)
if
(
net_GetPeerAddress
(
p_sys
->
fd_cmd
,
p_sys
->
sz_epsv_ip
,
NULL
)
)
goto
exit_error
;
{
net_Close
(
p_sys
->
fd_cmd
);
return
-
1
;
}
}
}
else
else
{
{
...
@@ -266,29 +248,81 @@ static int Open( vlc_object_t *p_this )
...
@@ -266,29 +248,81 @@ static int Open( vlc_object_t *p_this )
* understands EPSV ALL in the way, and hence won't allow PASV on
* understands EPSV ALL in the way, and hence won't allow PASV on
* the initial connection.
* the initial connection.
*/
*/
net_Close
(
p_sys
->
fd_cmd
);
p_sys
->
fd_cmd
=
-
1
;
*
p_sys
->
sz_epsv_ip
=
'\0'
;
msg_Info
(
p_access
,
"FTP Extended passive mode disabled"
);
msg_Info
(
p_access
,
"FTP Extended passive mode disabled"
);
net_Close
(
p_sys
->
fd_cmd
);
if
(
(
p_sys
->
fd_cmd
=
Connect
(
p_access
,
p_sys
)
)
<
0
)
if
(
(
p_sys
->
fd_cmd
=
Login
(
p_access
,
p_sys
)
)
<
0
)
goto
exit_error
;
{
net_Close
(
p_sys
->
fd_cmd
);
return
-
1
;
}
}
}
/*
binary mode
*/
/*
check binary mode support
*/
if
(
ftp_SendCommand
(
p_access
,
"TYPE I"
)
<
0
||
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"TYPE I"
)
<
0
||
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
!=
2
)
ftp_ReadCommand
(
p_access
,
p_sys
,
NULL
,
NULL
)
!=
2
)
{
{
msg_Err
(
p_access
,
"cannot set binary transfer mode"
);
msg_Err
(
p_access
,
"cannot set binary transfer mode"
);
goto
exit_error
;
net_Close
(
p_sys
->
fd_cmd
);
return
-
1
;
}
}
return
0
;
}
static
int
parseURL
(
vlc_url_t
*
url
,
const
char
*
path
)
{
if
(
path
==
NULL
)
return
-
1
;
/* *** Parse URL and get server addr/port and path *** */
while
(
*
path
==
'/'
)
path
++
;
vlc_UrlParse
(
url
,
path
,
0
);
if
(
url
->
psz_host
==
NULL
||
*
url
->
psz_host
==
'\0'
)
return
-
1
;
if
(
url
->
i_port
<=
0
)
url
->
i_port
=
IPPORT_FTP
;
/* default port */
/* FTP URLs are relative to user's default directory (RFC1738)
For absolute path use ftp://foo.bar//usr/local/etc/filename */
if
(
*
url
->
psz_path
==
'/'
)
url
->
psz_path
++
;
return
0
;
}
/****************************************************************************
* Open: connect to ftp server and ask for file
****************************************************************************/
static
int
InOpen
(
vlc_object_t
*
p_this
)
{
access_t
*
p_access
=
(
access_t
*
)
p_this
;
access_sys_t
*
p_sys
;
char
*
psz_arg
;
/* Init p_access */
STANDARD_READ_ACCESS_INIT
p_sys
->
fd_data
=
-
1
;
if
(
parseURL
(
&
p_sys
->
url
,
p_access
->
psz_path
)
)
goto
exit_error
;
if
(
Connect
(
p_this
,
p_sys
)
)
goto
exit_error
;
/* get size */
/* get size */
if
(
ftp_SendCommand
(
p_
acces
s
,
"SIZE %s"
,
p_sys
->
url
.
psz_path
)
<
0
||
if
(
ftp_SendCommand
(
p_
this
,
p_sy
s
,
"SIZE %s"
,
p_sys
->
url
.
psz_path
)
<
0
||
ftp_ReadCommand
(
p_
access
,
&
i_answer
,
&
psz_arg
)
!=
2
)
ftp_ReadCommand
(
p_
this
,
p_sys
,
NULL
,
&
psz_arg
)
!=
2
)
{
{
msg_Err
(
p_access
,
"cannot get file size"
);
msg_Err
(
p_access
,
"cannot get file size"
);
net_Close
(
p_sys
->
fd_cmd
);
goto
exit_error
;
goto
exit_error
;
}
}
p_access
->
info
.
i_size
=
atoll
(
&
psz_arg
[
4
]
);
p_access
->
info
.
i_size
=
atoll
(
&
psz_arg
[
4
]
);
...
@@ -296,9 +330,10 @@ static int Open( vlc_object_t *p_this )
...
@@ -296,9 +330,10 @@ static int Open( vlc_object_t *p_this )
msg_Dbg
(
p_access
,
"file size: "
I64Fd
,
p_access
->
info
.
i_size
);
msg_Dbg
(
p_access
,
"file size: "
I64Fd
,
p_access
->
info
.
i_size
);
/* Start the 'stream' */
/* Start the 'stream' */
if
(
ftp_StartStream
(
p_
acces
s
,
0
)
<
0
)
if
(
ftp_StartStream
(
p_
this
,
p_sy
s
,
0
)
<
0
)
{
{
msg_Err
(
p_access
,
"cannot retrieve file"
);
msg_Err
(
p_access
,
"cannot retrieve file"
);
net_Close
(
p_sys
->
fd_cmd
);
goto
exit_error
;
goto
exit_error
;
}
}
...
@@ -308,31 +343,64 @@ static int Open( vlc_object_t *p_this )
...
@@ -308,31 +343,64 @@ static int Open( vlc_object_t *p_this )
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
exit_error:
exit_error:
if
(
p_sys
->
fd_cmd
!=
-
1
)
net_Close
(
p_sys
->
fd_cmd
);
vlc_UrlClean
(
&
p_sys
->
url
);
vlc_UrlClean
(
&
p_sys
->
url
);
free
(
p_sys
);
free
(
p_sys
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
static
int
OutOpen
(
vlc_object_t
*
p_this
)
{
sout_access_out_t
*
p_access
=
(
sout_access_out_t
*
)
p_this
;
access_sys_t
*
p_sys
;
p_sys
=
malloc
(
sizeof
(
*
p_sys
)
);
if
(
p_sys
==
NULL
)
return
VLC_ENOMEM
;
memset
(
p_sys
,
0
,
sizeof
(
*
p_sys
)
);
/* Init p_access */
p_sys
->
fd_data
=
-
1
;
if
(
parseURL
(
&
p_sys
->
url
,
p_access
->
psz_name
)
)
goto
exit_error
;
if
(
Connect
(
p_this
,
p_sys
)
)
goto
exit_error
;
/* Start the 'stream' */
if
(
ftp_StartStream
(
p_this
,
p_sys
,
0
)
<
0
)
{
msg_Err
(
p_access
,
"cannot store file"
);
net_Close
(
p_sys
->
fd_cmd
);
goto
exit_error
;
}
p_access
->
pf_seek
=
OutSeek
;
p_access
->
pf_write
=
Write
;
return
VLC_SUCCESS
;
exit_error:
vlc_UrlClean
(
&
p_sys
->
url
);
free
(
p_sys
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
/*****************************************************************************
* Close: free unused data structures
* Close: free unused data structures
*****************************************************************************/
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_
thi
s
)
static
void
Close
(
vlc_object_t
*
p_
access
,
access_sys_t
*
p_sy
s
)
{
{
access_t
*
p_access
=
(
access_t
*
)
p_this
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
msg_Dbg
(
p_access
,
"stopping stream"
);
msg_Dbg
(
p_access
,
"stopping stream"
);
ftp_StopStream
(
p_access
);
ftp_StopStream
(
p_access
,
p_sys
);
if
(
ftp_SendCommand
(
p_access
,
"QUIT"
)
<
0
)
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"QUIT"
)
<
0
)
{
{
msg_Warn
(
p_access
,
"cannot quit"
);
msg_Warn
(
p_access
,
"cannot quit"
);
}
}
else
else
{
{
ftp_ReadCommand
(
p_access
,
NULL
,
NULL
);
ftp_ReadCommand
(
p_access
,
p_sys
,
NULL
,
NULL
);
}
}
net_Close
(
p_sys
->
fd_cmd
);
net_Close
(
p_sys
->
fd_cmd
);
...
@@ -341,23 +409,39 @@ static void Close( vlc_object_t *p_this )
...
@@ -341,23 +409,39 @@ static void Close( vlc_object_t *p_this )
free
(
p_sys
);
free
(
p_sys
);
}
}
static
void
InClose
(
vlc_object_t
*
p_this
)
{
Close
(
p_this
,
((
access_t
*
)
p_this
)
->
p_sys
);
}
static
void
OutClose
(
vlc_object_t
*
p_this
)
{
Close
(
p_this
,
GET_OUT_SYS
(
p_this
));
}
/*****************************************************************************
/*****************************************************************************
* Seek: try to go at the right place
* Seek: try to go at the right place
*****************************************************************************/
*****************************************************************************/
static
int
Seek
(
access_t
*
p_acces
s
,
int64_t
i_pos
)
static
int
_Seek
(
vlc_object_t
*
p_access
,
access_sys_t
*
p_sy
s
,
int64_t
i_pos
)
{
{
if
(
i_pos
<
0
)
if
(
i_pos
<
0
)
{
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
msg_Dbg
(
p_access
,
"seeking to "
I64Fd
,
i_pos
);
msg_Dbg
(
p_access
,
"seeking to "
I64Fd
,
i_pos
);
ftp_StopStream
(
p_access
);
ftp_StopStream
(
(
vlc_object_t
*
)
p_access
,
p_sys
);
if
(
ftp_StartStream
(
p_access
,
i_pos
)
<
0
)
if
(
ftp_StartStream
(
(
vlc_object_t
*
)
p_access
,
p_sys
,
i_pos
)
<
0
)
{
p_access
->
info
.
b_eof
=
VLC_TRUE
;
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
return
VLC_SUCCESS
;
}
static
int
Seek
(
access_t
*
p_access
,
int64_t
i_pos
)
{
int
val
=
_Seek
(
(
vlc_object_t
*
)
p_access
,
p_access
->
p_sys
,
i_pos
);
if
(
val
)
return
val
;
p_access
->
info
.
b_eof
=
VLC_FALSE
;
p_access
->
info
.
b_eof
=
VLC_FALSE
;
p_access
->
info
.
i_pos
=
i_pos
;
p_access
->
info
.
i_pos
=
i_pos
;
...
@@ -365,6 +449,11 @@ static int Seek( access_t *p_access, int64_t i_pos )
...
@@ -365,6 +449,11 @@ static int Seek( access_t *p_access, int64_t i_pos )
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
static
int
OutSeek
(
sout_access_out_t
*
p_access
,
off_t
i_pos
)
{
return
_Seek
(
(
vlc_object_t
*
)
p_access
,
GET_OUT_SYS
(
p_access
),
i_pos
);
}
/*****************************************************************************
/*****************************************************************************
* Read:
* Read:
*****************************************************************************/
*****************************************************************************/
...
@@ -373,6 +462,9 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
...
@@ -373,6 +462,9 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
int
i_read
;
int
i_read
;
assert
(
p_sys
->
fd_data
!=
-
1
);
assert
(
p_access
->
i_object_type
==
VLC_OBJECT_ACCESS
);
if
(
p_access
->
info
.
b_eof
)
if
(
p_access
->
info
.
b_eof
)
return
0
;
return
0
;
...
@@ -386,6 +478,30 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
...
@@ -386,6 +478,30 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
return
i_read
;
return
i_read
;
}
}
/*****************************************************************************
* Write:
*****************************************************************************/
static
int
Write
(
sout_access_out_t
*
p_access
,
block_t
*
p_buffer
)
{
access_sys_t
*
p_sys
=
GET_OUT_SYS
(
p_access
);
size_t
i_write
=
0
;
assert
(
p_sys
->
fd_data
!=
-
1
);
while
(
p_buffer
!=
NULL
)
{
block_t
*
p_next
=
p_buffer
->
p_next
;;
i_write
+=
net_Write
(
p_access
,
p_sys
->
fd_data
,
NULL
,
p_buffer
->
p_buffer
,
p_buffer
->
i_buffer
);
block_Release
(
p_buffer
);
p_buffer
=
p_next
;
}
return
i_write
;
}
/*****************************************************************************
/*****************************************************************************
* Control:
* Control:
*****************************************************************************/
*****************************************************************************/
...
@@ -450,9 +566,9 @@ static int Control( access_t *p_access, int i_query, va_list args )
...
@@ -450,9 +566,9 @@ static int Control( access_t *p_access, int i_query, va_list args )
/*****************************************************************************
/*****************************************************************************
* ftp_*:
* ftp_*:
*****************************************************************************/
*****************************************************************************/
static
int
ftp_SendCommand
(
access_t
*
p_access
,
char
*
psz_fmt
,
...
)
static
int
ftp_SendCommand
(
vlc_object_t
*
p_access
,
access_sys_t
*
p_sys
,
const
char
*
psz_fmt
,
...
)
{
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
va_list
args
;
va_list
args
;
char
*
psz_cmd
;
char
*
psz_cmd
;
...
@@ -485,10 +601,9 @@ static int ftp_SendCommand( access_t *p_access, char *psz_fmt, ... )
...
@@ -485,10 +601,9 @@ static int ftp_SendCommand( access_t *p_access, 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
(
access_t
*
p_acces
s
,
static
int
ftp_ReadCommand
(
vlc_object_t
*
p_access
,
access_sys_t
*
p_sy
s
,
int
*
pi_answer
,
char
**
ppsz_answer
)
int
*
pi_answer
,
char
**
ppsz_answer
)
{
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
char
*
psz_line
;
char
*
psz_line
;
int
i_answer
;
int
i_answer
;
...
@@ -540,19 +655,18 @@ static int ftp_ReadCommand( access_t *p_access,
...
@@ -540,19 +655,18 @@ static int ftp_ReadCommand( access_t *p_access,
return
(
i_answer
/
100
);
return
(
i_answer
/
100
);
}
}
static
int
ftp_StartStream
(
access_t
*
p_access
,
off_t
i_start
)
static
int
ftp_StartStream
(
vlc_object_t
*
p_access
,
access_sys_t
*
p_sys
,
off_t
i_start
)
{
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
char
psz_ipv4
[
16
],
*
psz_ip
=
p_sys
->
sz_epsv_ip
;
char
psz_ipv4
[
16
],
*
psz_ip
;
int
i_answer
;
int
i_answer
;
char
*
psz_arg
,
*
psz_parser
;
char
*
psz_arg
,
*
psz_parser
;
int
i_port
;
int
i_port
;
psz_ip
=
p_sys
->
sz_epsv_ip
;
assert
(
p_sys
->
fd_data
==
-
1
)
;
if
(
(
ftp_SendCommand
(
p_access
,
*
psz_ip
?
"EPSV"
:
"PASV"
)
<
0
)
if
(
(
ftp_SendCommand
(
p_access
,
p_sys
,
*
psz_ip
?
"EPSV"
:
"PASV"
)
<
0
)
||
(
ftp_ReadCommand
(
p_access
,
&
i_answer
,
&
psz_arg
)
!=
2
)
)
||
(
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
&
psz_arg
)
!=
2
)
)
{
{
msg_Err
(
p_access
,
"cannot set passive mode"
);
msg_Err
(
p_access
,
"cannot set passive mode"
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
...
@@ -599,8 +713,8 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
...
@@ -599,8 +713,8 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
msg_Dbg
(
p_access
,
"ip:%s port:%d"
,
psz_ip
,
i_port
);
msg_Dbg
(
p_access
,
"ip:%s port:%d"
,
psz_ip
,
i_port
);
if
(
ftp_SendCommand
(
p_access
,
"TYPE I"
)
<
0
||
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"TYPE I"
)
<
0
||
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
!=
2
)
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
NULL
)
!=
2
)
{
{
msg_Err
(
p_access
,
"cannot set binary transfer mode"
);
msg_Err
(
p_access
,
"cannot set binary transfer mode"
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
...
@@ -608,10 +722,10 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
...
@@ -608,10 +722,10 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
if
(
i_start
>
0
)
if
(
i_start
>
0
)
{
{
if
(
ftp_SendCommand
(
p_access
,
"REST "
I64Fu
,
i_start
)
<
0
||
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"REST "
I64Fu
,
i_start
)
<
0
||
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
>
3
)
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
NULL
)
>
3
)
{
{
msg_Err
(
p_access
,
"cannot set restart
poin
t"
);
msg_Err
(
p_access
,
"cannot set restart
offse
t"
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
}
}
...
@@ -627,8 +741,11 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
...
@@ -627,8 +741,11 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
psz_ip
,
i_port
);
psz_ip
,
i_port
);
/* "1xx" message */
/* "1xx" message */
if
(
ftp_SendCommand
(
p_access
,
"RETR %s"
,
p_sys
->
url
.
psz_path
)
<
0
||
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"%s %s"
,
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
)
>
2
)
(
p_access
->
i_object_type
==
VLC_OBJECT_ACCESS
)
?
"RETR"
:
"STOR"
,
p_sys
->
url
.
psz_path
)
<
0
||
ftp_ReadCommand
(
p_access
,
p_sys
,
&
i_answer
,
NULL
)
>
2
)
{
{
msg_Err
(
p_access
,
"cannot retreive file"
);
msg_Err
(
p_access
,
"cannot retreive file"
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
...
@@ -636,13 +753,9 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
...
@@ -636,13 +753,9 @@ static int ftp_StartStream( access_t *p_access, off_t i_start )
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
static
int
ftp_StopStream
(
access_t
*
p_acces
s
)
static
int
ftp_StopStream
(
vlc_object_t
*
p_access
,
access_sys_t
*
p_sy
s
)
{
{
access_sys_t
*
p_sys
=
p_access
->
p_sys
;
if
(
ftp_SendCommand
(
p_access
,
p_sys
,
"ABOR"
)
<
0
)
int
i_answer
;
if
(
ftp_SendCommand
(
p_access
,
"ABOR"
)
<
0
)
{
{
msg_Warn
(
p_access
,
"cannot abort file"
);
msg_Warn
(
p_access
,
"cannot abort file"
);
if
(
p_sys
->
fd_data
>
0
)
if
(
p_sys
->
fd_data
>
0
)
...
@@ -650,14 +763,14 @@ static int ftp_StopStream ( access_t *p_access )
...
@@ -650,14 +763,14 @@ static int ftp_StopStream ( access_t *p_access )
p_sys
->
fd_data
=
-
1
;
p_sys
->
fd_data
=
-
1
;
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
if
(
p_sys
->
fd_data
>
0
)
if
(
p_sys
->
fd_data
!=
-
1
)
{
{
net_Close
(
p_sys
->
fd_data
);
net_Close
(
p_sys
->
fd_data
);
p_sys
->
fd_data
=
-
1
;
p_sys
->
fd_data
=
-
1
;
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
);
ftp_ReadCommand
(
p_access
,
p_sys
,
NULL
,
NULL
);
}
}
ftp_ReadCommand
(
p_access
,
&
i_answer
,
NULL
);
ftp_ReadCommand
(
p_access
,
p_sys
,
NULL
,
NULL
);
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
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