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
57fe689b
Commit
57fe689b
authored
Nov 15, 2004
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* input: access meta data support.
* net: support for SOCKS proxy support (for all TCP connections).
parent
2ca48ef0
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
432 additions
and
58 deletions
+432
-58
src/input/input.c
src/input/input.c
+119
-55
src/libvlc.h
src/libvlc.h
+24
-0
src/misc/net.c
src/misc/net.c
+289
-3
No files found.
src/input/input.c
View file @
57fe689b
...
@@ -38,7 +38,6 @@
...
@@ -38,7 +38,6 @@
#include "stream_output.h"
#include "stream_output.h"
#include "vlc_interface.h"
#include "vlc_interface.h"
#include "vlc_meta.h"
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
...
@@ -56,6 +55,7 @@ static vlc_bool_t Control( input_thread_t *, int, vlc_value_t );
...
@@ -56,6 +55,7 @@ static vlc_bool_t Control( input_thread_t *, int, vlc_value_t );
static
int
UpdateFromAccess
(
input_thread_t
*
);
static
int
UpdateFromAccess
(
input_thread_t
*
);
static
int
UpdateFromDemux
(
input_thread_t
*
);
static
int
UpdateFromDemux
(
input_thread_t
*
);
static
int
UpdateMeta
(
input_thread_t
*
);
static
void
UpdateItemLength
(
input_thread_t
*
,
int64_t
i_length
);
static
void
UpdateItemLength
(
input_thread_t
*
,
int64_t
i_length
);
...
@@ -130,6 +130,7 @@ input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
...
@@ -130,6 +130,7 @@ input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
p_input
->
i_rate
=
INPUT_RATE_DEFAULT
;
p_input
->
i_rate
=
INPUT_RATE_DEFAULT
;
p_input
->
i_bookmark
=
0
;
p_input
->
i_bookmark
=
0
;
p_input
->
bookmark
=
NULL
;
p_input
->
bookmark
=
NULL
;
p_input
->
p_meta
=
NULL
;
p_input
->
p_es_out
=
NULL
;
p_input
->
p_es_out
=
NULL
;
p_input
->
p_sout
=
NULL
;
p_input
->
p_sout
=
NULL
;
p_input
->
b_out_pace_control
=
VLC_FALSE
;
p_input
->
b_out_pace_control
=
VLC_FALSE
;
...
@@ -513,7 +514,7 @@ static int Init( input_thread_t * p_input )
...
@@ -513,7 +514,7 @@ static int Init( input_thread_t * p_input )
char
*
psz_subtitle
;
char
*
psz_subtitle
;
vlc_value_t
val
;
vlc_value_t
val
;
double
f_fps
;
double
f_fps
;
vlc_meta_t
*
p_meta
,
*
p_meta_
user
;
vlc_meta_t
*
p_meta
,
*
p_meta_
tmp
;
int
i_es_out_mode
;
int
i_es_out_mode
;
int
i
,
i_delay
;
int
i
,
i_delay
;
...
@@ -802,7 +803,7 @@ static int Init( input_thread_t * p_input )
...
@@ -802,7 +803,7 @@ static int Init( input_thread_t * p_input )
}
}
/* Get meta data from users */
/* Get meta data from users */
p_meta_
user
=
InputMetaUser
(
p_input
);
p_meta_
tmp
=
InputMetaUser
(
p_input
);
/* Get meta data from master input */
/* Get meta data from master input */
if
(
demux2_Control
(
p_input
->
input
.
p_demux
,
DEMUX_GET_META
,
&
p_meta
)
)
if
(
demux2_Control
(
p_input
->
input
.
p_demux
,
DEMUX_GET_META
,
&
p_meta
)
)
...
@@ -811,12 +812,25 @@ static int Init( input_thread_t * p_input )
...
@@ -811,12 +812,25 @@ static int Init( input_thread_t * p_input )
/* Merge them */
/* Merge them */
if
(
p_meta
==
NULL
)
if
(
p_meta
==
NULL
)
{
{
p_meta
=
p_meta_
user
;
p_meta
=
p_meta_
tmp
;
}
}
else
if
(
p_meta_
user
)
else
if
(
p_meta_
tmp
)
{
{
vlc_meta_Merge
(
p_meta
,
p_meta_user
);
vlc_meta_Merge
(
p_meta
,
p_meta_tmp
);
vlc_meta_Delete
(
p_meta_user
);
vlc_meta_Delete
(
p_meta_tmp
);
}
if
(
access2_Control
(
p_input
->
input
.
p_access
,
ACCESS_GET_META
,
&
p_meta_tmp
))
p_meta_tmp
=
NULL
;
if
(
p_meta
==
NULL
)
{
p_meta
=
p_meta_tmp
;
}
else
if
(
p_meta_tmp
)
{
vlc_meta_Merge
(
p_meta
,
p_meta_tmp
);
vlc_meta_Delete
(
p_meta_tmp
);
}
}
/* Get meta data from slave input */
/* Get meta data from slave input */
...
@@ -824,7 +838,8 @@ static int Init( input_thread_t * p_input )
...
@@ -824,7 +838,8 @@ static int Init( input_thread_t * p_input )
{
{
vlc_meta_t
*
p_meta_slave
;
vlc_meta_t
*
p_meta_slave
;
if
(
!
demux2_Control
(
p_input
->
slave
[
i
]
->
p_demux
,
DEMUX_GET_META
,
&
p_meta_slave
)
)
if
(
!
demux2_Control
(
p_input
->
slave
[
i
]
->
p_demux
,
DEMUX_GET_META
,
&
p_meta_slave
)
)
{
{
if
(
p_meta
==
NULL
)
if
(
p_meta
==
NULL
)
{
{
...
@@ -836,60 +851,25 @@ static int Init( input_thread_t * p_input )
...
@@ -836,60 +851,25 @@ static int Init( input_thread_t * p_input )
vlc_meta_Delete
(
p_meta_slave
);
vlc_meta_Delete
(
p_meta_slave
);
}
}
}
}
}
if
(
p_meta
&&
p_meta
->
i_meta
>
0
)
if
(
!
access2_Control
(
p_input
->
slave
[
i
]
->
p_access
,
ACCESS_GET_META
,
&
p_meta_slave
)
)
{
{
msg_Dbg
(
p_input
,
"meta information:"
);
if
(
p_meta
==
NULL
)
for
(
i
=
0
;
i
<
p_meta
->
i_meta
;
i
++
)
{
{
msg_Dbg
(
p_input
,
" - '%s' = '%s'"
,
p_meta
=
p_meta_slave
;
_
(
p_meta
->
name
[
i
]),
p_meta
->
value
[
i
]
);
if
(
!
strcmp
(
p_meta
->
name
[
i
],
VLC_META_TITLE
)
&&
p_meta
->
value
[
i
]
)
input_Control
(
p_input
,
INPUT_SET_NAME
,
p_meta
->
value
[
i
]
);
if
(
!
strcmp
(
p_meta
->
name
[
i
],
VLC_META_AUTHOR
)
)
input_Control
(
p_input
,
INPUT_ADD_INFO
,
_
(
"General"
),
_
(
"Author"
),
p_meta
->
value
[
i
]
);
input_Control
(
p_input
,
INPUT_ADD_INFO
,
_
(
"Meta-information"
),
_
(
p_meta
->
name
[
i
]),
"%s"
,
p_meta
->
value
[
i
]
);
}
}
else
if
(
p_meta_slave
)
for
(
i
=
0
;
i
<
p_meta
->
i_track
;
i
++
)
{
vlc_meta_t
*
tk
=
p_meta
->
track
[
i
];
int
j
;
if
(
tk
->
i_meta
>
0
)
{
char
*
psz_cat
=
malloc
(
strlen
(
_
(
"Stream"
))
+
10
);
msg_Dbg
(
p_input
,
" - track[%d]:"
,
i
);
sprintf
(
psz_cat
,
"%s %d"
,
_
(
"Stream"
),
i
);
for
(
j
=
0
;
j
<
tk
->
i_meta
;
j
++
)
{
{
msg_Dbg
(
p_input
,
" - '%s' = '%s'"
,
_
(
tk
->
name
[
j
]),
vlc_meta_Merge
(
p_meta
,
p_meta_slave
);
tk
->
value
[
j
]
);
vlc_meta_Delete
(
p_meta_slave
);
input_Control
(
p_input
,
INPUT_ADD_INFO
,
psz_cat
,
_
(
tk
->
name
[
j
]),
"%s"
,
tk
->
value
[
j
]
);
}
}
}
}
}
if
(
p_input
->
p_sout
&&
p_input
->
p_sout
->
p_meta
==
NULL
)
{
p_input
->
p_sout
->
p_meta
=
p_meta
;
}
else
{
vlc_meta_Delete
(
p_meta
);
}
}
}
else
if
(
p_meta
)
vlc_meta_Delete
(
p_meta
);
p_input
->
p_meta
=
p_meta
;
UpdateMeta
(
p_input
);
msg_Dbg
(
p_input
,
"`%s' sucessfully opened"
,
msg_Dbg
(
p_input
,
"`%s' sucessfully opened"
,
p_input
->
input
.
p_item
->
psz_uri
);
p_input
->
input
.
p_item
->
psz_uri
);
...
@@ -995,6 +975,10 @@ static void End( input_thread_t * p_input )
...
@@ -995,6 +975,10 @@ static void End( input_thread_t * p_input )
vlc_object_release
(
p_pl
);
vlc_object_release
(
p_pl
);
}
}
/* Delete meta */
if
(
p_input
->
p_meta
)
vlc_meta_Delete
(
p_input
->
p_meta
);
/* Tell we're dead */
/* Tell we're dead */
p_input
->
b_dead
=
VLC_TRUE
;
p_input
->
b_dead
=
VLC_TRUE
;
}
}
...
@@ -1507,6 +1491,27 @@ static int UpdateFromAccess( input_thread_t *p_input )
...
@@ -1507,6 +1491,27 @@ static int UpdateFromAccess( input_thread_t *p_input )
p_access
->
info
.
i_update
&=
~
INPUT_UPDATE_SEEKPOINT
;
p_access
->
info
.
i_update
&=
~
INPUT_UPDATE_SEEKPOINT
;
}
}
if
(
p_access
->
info
.
i_update
&
INPUT_UPDATE_META
)
{
/* TODO maybe multi - access ? */
vlc_meta_t
*
p_meta
;
if
(
!
access2_Control
(
p_input
->
input
.
p_access
,
ACCESS_GET_META
,
&
p_meta
))
{
if
(
p_input
->
p_meta
)
{
vlc_meta_Merge
(
p_input
->
p_meta
,
p_meta
);
vlc_meta_Delete
(
p_meta
);
}
else
{
p_input
->
p_meta
=
p_meta
;
}
UpdateMeta
(
p_input
);
}
p_access
->
info
.
i_update
&=
~
INPUT_UPDATE_META
;
}
p_access
->
info
.
i_update
&=
~
INPUT_UPDATE_SIZE
;
p_access
->
info
.
i_update
&=
~
INPUT_UPDATE_SIZE
;
/* Hmmm only works with master input */
/* Hmmm only works with master input */
...
@@ -1536,6 +1541,65 @@ static int UpdateFromAccess( input_thread_t *p_input )
...
@@ -1536,6 +1541,65 @@ static int UpdateFromAccess( input_thread_t *p_input )
return
1
;
return
1
;
}
}
/*****************************************************************************
* UpdateMeta:
*****************************************************************************/
static
int
UpdateMeta
(
input_thread_t
*
p_input
)
{
vlc_meta_t
*
p_meta
=
p_input
->
p_meta
;
int
i
;
if
(
!
p_meta
||
p_meta
->
i_meta
==
0
)
return
VLC_SUCCESS
;
msg_Dbg
(
p_input
,
"meta information:"
);
for
(
i
=
0
;
i
<
p_meta
->
i_meta
;
i
++
)
{
msg_Dbg
(
p_input
,
" - '%s' = '%s'"
,
_
(
p_meta
->
name
[
i
]),
p_meta
->
value
[
i
]
);
if
(
!
strcmp
(
p_meta
->
name
[
i
],
VLC_META_TITLE
)
&&
p_meta
->
value
[
i
]
)
input_Control
(
p_input
,
INPUT_SET_NAME
,
p_meta
->
value
[
i
]
);
if
(
!
strcmp
(
p_meta
->
name
[
i
],
VLC_META_AUTHOR
)
)
input_Control
(
p_input
,
INPUT_ADD_INFO
,
_
(
"General"
),
_
(
"Author"
),
p_meta
->
value
[
i
]
);
input_Control
(
p_input
,
INPUT_ADD_INFO
,
_
(
"Meta-information"
),
_
(
p_meta
->
name
[
i
]),
"%s"
,
p_meta
->
value
[
i
]
);
}
for
(
i
=
0
;
i
<
p_meta
->
i_track
;
i
++
)
{
vlc_meta_t
*
tk
=
p_meta
->
track
[
i
];
int
j
;
if
(
tk
->
i_meta
>
0
)
{
char
*
psz_cat
=
malloc
(
strlen
(
_
(
"Stream"
))
+
10
);
msg_Dbg
(
p_input
,
" - track[%d]:"
,
i
);
sprintf
(
psz_cat
,
"%s %d"
,
_
(
"Stream"
),
i
);
for
(
j
=
0
;
j
<
tk
->
i_meta
;
j
++
)
{
msg_Dbg
(
p_input
,
" - '%s' = '%s'"
,
_
(
tk
->
name
[
j
]),
tk
->
value
[
j
]
);
input_Control
(
p_input
,
INPUT_ADD_INFO
,
psz_cat
,
_
(
tk
->
name
[
j
]),
"%s"
,
tk
->
value
[
j
]
);
}
}
}
if
(
p_input
->
p_sout
&&
p_input
->
p_sout
->
p_meta
==
NULL
)
{
p_input
->
p_sout
->
p_meta
=
vlc_meta_Duplicate
(
p_meta
);
}
return
VLC_SUCCESS
;
}
/*****************************************************************************
/*****************************************************************************
* UpdateItemLength:
* UpdateItemLength:
*****************************************************************************/
*****************************************************************************/
...
...
src/libvlc.h
View file @
57fe689b
...
@@ -405,6 +405,22 @@ static char *ppsz_align_descriptions[] =
...
@@ -405,6 +405,22 @@ static char *ppsz_align_descriptions[] =
"If you check this box, IPv4 will be used by default for all UDP and " \
"If you check this box, IPv4 will be used by default for all UDP and " \
"HTTP connections.")
"HTTP connections.")
#define SOCKS_SERVER_TEXT N_("SOCKS server")
#define SOCKS_SERVER_LONGTEXT N_( \
"Allow you to specify a SOCKS server to use. It must be of the form " \
"address:port . It will be used for all TCP connections" )
#define SOCKS_USER_TEXT N_("SOCKS user name")
#define SOCKS_USER_LONGTEXT N_("Allows you to modify the user name that will " \
"be used for the connection to the SOCKS server.")
#define SOCKS_PASS_TEXT N_("SOCKS password")
#define SOCKS_PASS_LONGTEXT N_("Allows you to modify the password that will " \
"be used for the connection to the SOCKS server.")
#define META_TITLE_TEXT N_("Title metadata")
#define META_TITLE_TEXT N_("Title metadata")
#define META_TITLE_LONGTEXT N_( \
#define META_TITLE_LONGTEXT N_( \
"Allows you to specify a \"title\" metadata for an input.")
"Allows you to specify a \"title\" metadata for an input.")
...
@@ -932,6 +948,14 @@ vlc_module_begin();
...
@@ -932,6 +948,14 @@ vlc_module_begin();
add_bool
(
"ipv4"
,
0
,
NULL
,
IPV4_TEXT
,
IPV4_LONGTEXT
,
VLC_FALSE
);
add_bool
(
"ipv4"
,
0
,
NULL
,
IPV4_TEXT
,
IPV4_LONGTEXT
,
VLC_FALSE
);
change_short
(
'4'
);
change_short
(
'4'
);
add_string
(
"socks"
,
NULL
,
NULL
,
SOCKS_SERVER_TEXT
,
SOCKS_SERVER_LONGTEXT
,
VLC_TRUE
);
add_string
(
"socks-user"
,
NULL
,
NULL
,
SOCKS_USER_TEXT
,
SOCKS_USER_LONGTEXT
,
VLC_TRUE
);
add_string
(
"socks-pwd"
,
NULL
,
NULL
,
SOCKS_PASS_TEXT
,
SOCKS_PASS_LONGTEXT
,
VLC_TRUE
);
add_string
(
"meta-title"
,
NULL
,
NULL
,
META_TITLE_TEXT
,
add_string
(
"meta-title"
,
NULL
,
NULL
,
META_TITLE_TEXT
,
META_TITLE_LONGTEXT
,
VLC_TRUE
);
META_TITLE_LONGTEXT
,
VLC_TRUE
);
add_string
(
"meta-author"
,
NULL
,
NULL
,
META_AUTHOR_TEXT
,
add_string
(
"meta-author"
,
NULL
,
NULL
,
META_AUTHOR_TEXT
,
...
...
src/misc/net.c
View file @
57fe689b
...
@@ -57,6 +57,59 @@
...
@@ -57,6 +57,59 @@
#include "network.h"
#include "network.h"
#ifndef INADDR_ANY
# define INADDR_ANY 0x00000000
#endif
#ifndef INADDR_NONE
# define INADDR_NONE 0xFFFFFFFF
#endif
static
int
SocksNegociate
(
vlc_object_t
*
,
int
fd
,
int
i_socks_version
,
char
*
psz_socks_user
,
char
*
psz_socks_passwd
);
static
int
SocksHandshakeTCP
(
vlc_object_t
*
,
int
fd
,
int
i_socks_version
,
char
*
psz_socks_user
,
char
*
psz_socks_passwd
,
const
char
*
psz_host
,
int
i_port
);
/*****************************************************************************
* net_ConvertIPv4:
*****************************************************************************
* Open a TCP connection and return a handle
*****************************************************************************/
int
net_ConvertIPv4
(
uint32_t
*
p_addr
,
const
char
*
psz_address
)
{
/* Reset struct */
if
(
!*
psz_address
)
{
*
p_addr
=
INADDR_ANY
;
}
else
{
struct
hostent
*
p_hostent
;
/* Try to convert address directly from in_addr - this will work if
* psz_address is dotted decimal. */
#ifdef HAVE_ARPA_INET_H
if
(
!
inet_aton
(
psz_address
,
&
p_addr
)
)
#else
*
p_addr
=
inet_addr
(
psz_address
);
if
(
*
p_addr
==
INADDR_NONE
)
#endif
{
/* We have a fqdn, try to find its address */
if
(
(
p_hostent
=
gethostbyname
(
psz_address
))
==
NULL
)
{
return
VLC_EGENERIC
;
}
/* Copy the first address of the host in the socket address */
memcpy
(
p_addr
,
p_hostent
->
h_addr_list
[
0
],
p_hostent
->
h_length
);
}
}
return
VLC_SUCCESS
;
}
/*****************************************************************************
/*****************************************************************************
* __net_OpenTCP:
* __net_OpenTCP:
*****************************************************************************
*****************************************************************************
...
@@ -90,11 +143,32 @@ int __net_OpenTCP( vlc_object_t *p_this, const char *psz_host, int i_port )
...
@@ -90,11 +143,32 @@ int __net_OpenTCP( vlc_object_t *p_this, const char *psz_host, int i_port )
sock
.
i_type
=
NETWORK_TCP
;
sock
.
i_type
=
NETWORK_TCP
;
sock
.
psz_bind_addr
=
""
;
sock
.
psz_bind_addr
=
""
;
sock
.
i_bind_port
=
0
;
sock
.
i_bind_port
=
0
;
sock
.
psz_server_addr
=
(
char
*
)
psz_host
;
sock
.
i_server_port
=
i_port
;
sock
.
i_ttl
=
0
;
sock
.
i_ttl
=
0
;
var_Create
(
p_this
,
"socks"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_this
,
"socks"
,
&
val
);
if
(
*
val
.
psz_string
&&
*
val
.
psz_string
!=
':'
)
{
char
*
psz
=
strchr
(
val
.
psz_string
,
':'
);
if
(
psz
)
*
psz
++
=
'\0'
;
sock
.
psz_server_addr
=
(
char
*
)
val
.
psz_string
;
sock
.
i_server_port
=
psz
?
atoi
(
psz
)
:
1080
;
msg_Dbg
(
p_this
,
"net: connecting to '%s:%d' for '%s:%d'"
,
sock
.
psz_server_addr
,
sock
.
i_server_port
,
psz_host
,
i_port
);
}
else
{
sock
.
psz_server_addr
=
(
char
*
)
psz_host
;
sock
.
i_server_port
=
i_port
;
msg_Dbg
(
p_this
,
"net: connecting to '%s:%d'"
,
psz_host
,
i_port
);
msg_Dbg
(
p_this
,
"net: connecting to '%s:%d'"
,
psz_host
,
i_port
);
}
private
=
p_this
->
p_private
;
private
=
p_this
->
p_private
;
p_this
->
p_private
=
(
void
*
)
&
sock
;
p_this
->
p_private
=
(
void
*
)
&
sock
;
if
(
!
(
p_network
=
module_Need
(
p_this
,
"network"
,
psz_network
,
0
)
)
)
if
(
!
(
p_network
=
module_Need
(
p_this
,
"network"
,
psz_network
,
0
)
)
)
...
@@ -106,6 +180,25 @@ int __net_OpenTCP( vlc_object_t *p_this, const char *psz_host, int i_port )
...
@@ -106,6 +180,25 @@ int __net_OpenTCP( vlc_object_t *p_this, const char *psz_host, int i_port )
module_Unneed
(
p_this
,
p_network
);
module_Unneed
(
p_this
,
p_network
);
p_this
->
p_private
=
private
;
p_this
->
p_private
=
private
;
if
(
*
val
.
psz_string
&&
*
val
.
psz_string
!=
':'
)
{
char
*
psz_user
=
var_CreateGetString
(
p_this
,
"socks-user"
);
char
*
psz_pwd
=
var_CreateGetString
(
p_this
,
"socks-pwd"
);
if
(
SocksHandshakeTCP
(
p_this
,
sock
.
i_handle
,
5
,
psz_user
,
psz_pwd
,
psz_host
,
i_port
)
)
{
msg_Err
(
p_this
,
"failed to use the SOCKS server"
);
net_Close
(
sock
.
i_handle
);
return
-
1
;
}
free
(
psz_user
);
free
(
psz_pwd
);
}
free
(
val
.
psz_string
);
return
sock
.
i_handle
;
return
sock
.
i_handle
;
}
}
...
@@ -667,3 +760,196 @@ int __net_vaPrintf( vlc_object_t *p_this, int fd, v_socket_t *p_vs,
...
@@ -667,3 +760,196 @@ int __net_vaPrintf( vlc_object_t *p_this, int fd, v_socket_t *p_vs,
return
i_ret
;
return
i_ret
;
}
}
/*****************************************************************************
* SocksNegociate:
*****************************************************************************
* Negociate authentication with a SOCKS server.
*****************************************************************************/
static
int
SocksNegociate
(
vlc_object_t
*
p_obj
,
int
fd
,
int
i_socks_version
,
char
*
psz_socks_user
,
char
*
psz_socks_passwd
)
{
uint8_t
buffer
[
128
+
2
*
256
];
int
i_len
;
vlc_bool_t
b_auth
=
VLC_FALSE
;
if
(
i_socks_version
!=
5
)
return
VLC_SUCCESS
;
/* We negociate authentication */
if
(
psz_socks_user
&&
psz_socks_passwd
&&
*
psz_socks_user
&&
*
psz_socks_passwd
)
b_auth
=
VLC_TRUE
;
buffer
[
0
]
=
i_socks_version
;
/* SOCKS version */
if
(
b_auth
)
{
buffer
[
1
]
=
2
;
/* Number of methods */
buffer
[
2
]
=
0x00
;
/* - No auth required */
buffer
[
3
]
=
0x02
;
/* - USer/Password */
i_len
=
4
;
}
else
{
buffer
[
1
]
=
1
;
/* Number of methods */
buffer
[
2
]
=
0x00
;
/* - No auth required */
i_len
=
3
;
}
if
(
net_Write
(
p_obj
,
fd
,
NULL
,
buffer
,
i_len
)
!=
i_len
)
return
VLC_EGENERIC
;
if
(
net_Read
(
p_obj
,
fd
,
NULL
,
buffer
,
2
,
VLC_TRUE
)
!=
2
)
return
VLC_EGENERIC
;
msg_Dbg
(
p_obj
,
"socks: v=%d method=%x"
,
buffer
[
0
],
buffer
[
1
]
);
if
(
buffer
[
1
]
==
0x00
)
{
msg_Dbg
(
p_obj
,
"socks: no authentication required"
);
}
else
if
(
buffer
[
1
]
==
0x02
)
{
int
i_len1
=
__MIN
(
strlen
(
psz_socks_user
),
255
);
int
i_len2
=
__MIN
(
strlen
(
psz_socks_passwd
),
255
);
msg_Dbg
(
p_obj
,
"socks: username/password authentication"
);
/* XXX: we don't support user/pwd > 255 (truncated)*/
buffer
[
0
]
=
i_socks_version
;
/* Version */
buffer
[
1
]
=
i_len1
;
/* User length */
memcpy
(
&
buffer
[
2
],
psz_socks_user
,
i_len1
);
buffer
[
2
+
i_len1
]
=
i_len2
;
/* Password length */
memcpy
(
&
buffer
[
2
+
i_len1
+
1
],
psz_socks_passwd
,
i_len2
);
i_len
=
3
+
i_len1
+
i_len2
;
if
(
net_Write
(
p_obj
,
fd
,
NULL
,
buffer
,
i_len
)
!=
i_len
)
return
VLC_EGENERIC
;
if
(
net_Read
(
p_obj
,
fd
,
NULL
,
buffer
,
2
,
VLC_TRUE
)
!=
2
)
return
VLC_EGENERIC
;
msg_Dbg
(
p_obj
,
"socks: v=%d status=%x"
,
buffer
[
0
],
buffer
[
1
]
);
if
(
buffer
[
1
]
!=
0x00
)
{
msg_Err
(
p_obj
,
"socks: authentication rejected"
);
return
VLC_EGENERIC
;
}
}
else
{
if
(
b_auth
)
msg_Err
(
p_obj
,
"socks: unsupported authentication method %x"
,
buffer
[
0
]
);
else
msg_Err
(
p_obj
,
"socks: authentification needed"
);
return
VLC_EGENERIC
;
}
return
VLC_SUCCESS
;
}
/*****************************************************************************
* SocksHandshakeTCP:
*****************************************************************************
* Open a TCP connection using a SOCKS server and return a handle (RFC 1928)
*****************************************************************************/
static
int
SocksHandshakeTCP
(
vlc_object_t
*
p_obj
,
int
fd
,
int
i_socks_version
,
char
*
psz_socks_user
,
char
*
psz_socks_passwd
,
const
char
*
psz_host
,
int
i_port
)
{
uint8_t
buffer
[
128
+
2
*
256
];
if
(
i_socks_version
!=
4
&&
i_socks_version
!=
5
)
{
msg_Warn
(
p_obj
,
"invalid socks protocol version %d"
,
i_socks_version
);
i_socks_version
=
5
;
}
if
(
i_socks_version
==
5
&&
SocksNegociate
(
p_obj
,
fd
,
i_socks_version
,
psz_socks_user
,
psz_socks_passwd
)
)
return
VLC_EGENERIC
;
if
(
i_socks_version
==
4
)
{
uint32_t
addr
;
/* v4 only support ipv4 */
if
(
net_ConvertIPv4
(
&
addr
,
psz_host
)
)
return
VLC_EGENERIC
;
buffer
[
0
]
=
i_socks_version
;
buffer
[
1
]
=
0x01
;
/* CONNECT */
SetWBE
(
&
buffer
[
2
],
i_port
);
/* Port */
memcpy
(
&
buffer
[
4
],
&
addr
,
4
);
/* Addresse */
buffer
[
8
]
=
0
;
/* Empty user id */
if
(
net_Write
(
p_obj
,
fd
,
NULL
,
buffer
,
9
)
!=
9
)
return
VLC_EGENERIC
;
if
(
net_Read
(
p_obj
,
fd
,
NULL
,
buffer
,
8
,
VLC_TRUE
)
!=
8
)
return
VLC_EGENERIC
;
msg_Dbg
(
p_obj
,
"socks: v=%d cd=%d"
,
buffer
[
0
],
buffer
[
1
]
);
if
(
buffer
[
1
]
!=
90
)
return
VLC_EGENERIC
;
}
else
if
(
i_socks_version
==
5
)
{
int
i_hlen
=
__MIN
(
strlen
(
psz_host
),
255
);
int
i_len
;
buffer
[
0
]
=
i_socks_version
;
/* Version */
buffer
[
1
]
=
0x01
;
/* Cmd: connect */
buffer
[
2
]
=
0x00
;
/* Reserved */
buffer
[
3
]
=
3
;
/* ATYP: for now domainname */
buffer
[
4
]
=
i_hlen
;
memcpy
(
&
buffer
[
5
],
psz_host
,
i_hlen
);
SetWBE
(
&
buffer
[
5
+
i_hlen
],
i_port
);
i_len
=
5
+
i_hlen
+
2
;
if
(
net_Write
(
p_obj
,
fd
,
NULL
,
buffer
,
i_len
)
!=
i_len
)
return
VLC_EGENERIC
;
/* Read the header */
if
(
net_Read
(
p_obj
,
fd
,
NULL
,
buffer
,
5
,
VLC_TRUE
)
!=
5
)
return
VLC_EGENERIC
;
msg_Dbg
(
p_obj
,
"socks: v=%d rep=%d atyp=%d"
,
buffer
[
0
],
buffer
[
1
],
buffer
[
3
]
);
if
(
buffer
[
1
]
!=
0x00
)
{
msg_Err
(
p_obj
,
"socks: CONNECT request failed
\n
"
);
return
VLC_EGENERIC
;
}
/* Read the remaining bytes */
if
(
buffer
[
3
]
==
0x01
)
i_len
=
4
-
1
+
2
;
else
if
(
buffer
[
3
]
==
0x03
)
i_len
=
buffer
[
4
]
+
2
;
else
if
(
buffer
[
3
]
==
0x04
)
i_len
=
16
-
1
+
2
;
else
return
VLC_EGENERIC
;
if
(
net_Read
(
p_obj
,
fd
,
NULL
,
buffer
,
i_len
,
VLC_TRUE
)
!=
i_len
)
return
VLC_EGENERIC
;
}
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