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
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
Hide 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 @@
#include "stream_output.h"
#include "vlc_interface.h"
#include "vlc_meta.h"
/*****************************************************************************
* Local prototypes
...
...
@@ -56,6 +55,7 @@ static vlc_bool_t Control( input_thread_t *, int, vlc_value_t );
static
int
UpdateFromAccess
(
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
);
...
...
@@ -130,6 +130,7 @@ input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
p_input
->
i_rate
=
INPUT_RATE_DEFAULT
;
p_input
->
i_bookmark
=
0
;
p_input
->
bookmark
=
NULL
;
p_input
->
p_meta
=
NULL
;
p_input
->
p_es_out
=
NULL
;
p_input
->
p_sout
=
NULL
;
p_input
->
b_out_pace_control
=
VLC_FALSE
;
...
...
@@ -513,7 +514,7 @@ static int Init( input_thread_t * p_input )
char
*
psz_subtitle
;
vlc_value_t
val
;
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
,
i_delay
;
...
...
@@ -802,7 +803,7 @@ static int Init( input_thread_t * p_input )
}
/* Get meta data from users */
p_meta_
user
=
InputMetaUser
(
p_input
);
p_meta_
tmp
=
InputMetaUser
(
p_input
);
/* Get meta data from master input */
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 )
/* Merge them */
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_Delete
(
p_meta_user
);
vlc_meta_Merge
(
p_meta
,
p_meta_tmp
);
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 */
...
...
@@ -824,7 +838,8 @@ static int Init( input_thread_t * p_input )
{
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
)
{
...
...
@@ -836,60 +851,25 @@ static int Init( input_thread_t * p_input )
vlc_meta_Delete
(
p_meta_slave
);
}
}
}
if
(
p_meta
&&
p_meta
->
i_meta
>
0
)
{
msg_Dbg
(
p_input
,
"meta information:"
);
for
(
i
=
0
;
i
<
p_meta
->
i_meta
;
i
++
)
if
(
!
access2_Control
(
p_input
->
slave
[
i
]
->
p_access
,
ACCESS_GET_META
,
&
p_meta_slave
)
)
{
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
)
if
(
p_meta
==
NULL
)
{
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
]
);
}
p_meta
=
p_meta_slave
;
}
else
if
(
p_meta_slave
)
{
vlc_meta_Merge
(
p_meta
,
p_meta_slave
);
vlc_meta_Delete
(
p_meta_slave
);
}
}
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"
,
p_input
->
input
.
p_item
->
psz_uri
);
...
...
@@ -995,6 +975,10 @@ static void End( input_thread_t * p_input )
vlc_object_release
(
p_pl
);
}
/* Delete meta */
if
(
p_input
->
p_meta
)
vlc_meta_Delete
(
p_input
->
p_meta
);
/* Tell we're dead */
p_input
->
b_dead
=
VLC_TRUE
;
}
...
...
@@ -1507,6 +1491,27 @@ static int UpdateFromAccess( input_thread_t *p_input )
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
;
/* Hmmm only works with master input */
...
...
@@ -1536,6 +1541,65 @@ static int UpdateFromAccess( input_thread_t *p_input )
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:
*****************************************************************************/
...
...
src/libvlc.h
View file @
57fe689b
...
...
@@ -405,6 +405,22 @@ static char *ppsz_align_descriptions[] =
"If you check this box, IPv4 will be used by default for all UDP and " \
"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_LONGTEXT N_( \
"Allows you to specify a \"title\" metadata for an input.")
...
...
@@ -932,6 +948,14 @@ vlc_module_begin();
add_bool
(
"ipv4"
,
0
,
NULL
,
IPV4_TEXT
,
IPV4_LONGTEXT
,
VLC_FALSE
);
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
,
META_TITLE_LONGTEXT
,
VLC_TRUE
);
add_string
(
"meta-author"
,
NULL
,
NULL
,
META_AUTHOR_TEXT
,
...
...
src/misc/net.c
View file @
57fe689b
...
...
@@ -57,6 +57,59 @@
#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:
*****************************************************************************
...
...
@@ -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
.
psz_bind_addr
=
""
;
sock
.
i_bind_port
=
0
;
sock
.
psz_server_addr
=
(
char
*
)
psz_host
;
sock
.
i_server_port
=
i_port
;
sock
.
i_ttl
=
0
;
msg_Dbg
(
p_this
,
"net: connecting to '%s:%d'"
,
psz_host
,
i_port
);
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
);
}
private
=
p_this
->
p_private
;
p_this
->
p_private
=
(
void
*
)
&
sock
;
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 )
module_Unneed
(
p_this
,
p_network
);
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
;
}
...
...
@@ -667,3 +760,196 @@ int __net_vaPrintf( vlc_object_t *p_this, int fd, v_socket_t *p_vs,
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