Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
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-gpu
Commits
e34b5beb
Commit
e34b5beb
authored
Jun 06, 2004
by
Clément Stenac
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Patch by Rémi Denis-Courmont to include TCP listening sockets in the abstraction layer
parent
ae605781
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
364 additions
and
138 deletions
+364
-138
include/network.h
include/network.h
+4
-0
modules/control/telnet.c
modules/control/telnet.c
+2
-91
modules/misc/network/ipv4.c
modules/misc/network/ipv4.c
+108
-28
modules/misc/network/ipv6.c
modules/misc/network/ipv6.c
+198
-19
src/misc/net.c
src/misc/net.c
+52
-0
No files found.
include/network.h
View file @
e34b5beb
...
...
@@ -46,6 +46,7 @@ struct network_socket_t
/* Socket types */
#define NETWORK_UDP 1
#define NETWORK_TCP 2
#define NETWORK_TCP_PASSIVE 3
typedef
struct
...
...
@@ -165,6 +166,9 @@ static inline void vlc_UrlClean( vlc_url_t *url )
#define net_OpenTCP(a, b, c) __net_OpenTCP(VLC_OBJECT(a), b, c)
VLC_EXPORT
(
int
,
__net_OpenTCP
,
(
vlc_object_t
*
p_this
,
char
*
psz_host
,
int
i_port
)
);
#define net_ListenTCP(a, b, c) __net_ListenTCP(VLC_OBJECT(a), b, c)
VLC_EXPORT
(
int
,
__net_ListenTCP
,
(
vlc_object_t
*
p_this
,
char
*
psz_localaddr
,
int
i_port
)
);
#define net_OpenUDP(a, b, c, d, e ) __net_OpenUDP(VLC_OBJECT(a), b, c, d, e)
VLC_EXPORT
(
int
,
__net_OpenUDP
,
(
vlc_object_t
*
p_this
,
char
*
psz_bind
,
int
i_bind
,
char
*
psz_server
,
int
i_server
)
);
...
...
modules/control/telnet.c
View file @
e34b5beb
...
...
@@ -49,17 +49,8 @@
# include <winsock.h>
#elif defined( WIN32 )
# include <winsock2.h>
# include <ws2tcpip.h>
# ifndef IN_MULTICAST
# define IN_MULTICAST(a) IN_CLASSD(a)
# endif
#else
# include <netdb.h>
/* hostent ... */
# include <sys/socket.h>
# include <netinet/in.h>
# ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
/* inet_ntoa(), inet_aton() */
# endif
#endif
#include "network.h"
...
...
@@ -72,8 +63,6 @@
#define SOCKET_CLOSE(a) close(a)
#endif
#define LISTEN_BACKLOG 100
#define READ_MODE_PWD 1
#define READ_MODE_CMD 2
#define WRITE_MODE_PWD 3 // when we write the word "Password:"
...
...
@@ -127,7 +116,6 @@ typedef struct
static
char
*
MessageToString
(
vlm_message_t
*
,
int
);
static
void
Write_message
(
telnet_client_t
*
,
vlm_message_t
*
,
char
*
,
int
);
static
int
SocketListen
(
intf_thread_t
*
,
int
);
struct
intf_sys_t
{
...
...
@@ -159,7 +147,7 @@ static int Open( vlc_object_t *p_this )
p_intf
->
pf_run
=
Run
;
p_intf
->
p_sys
=
malloc
(
sizeof
(
intf_sys_t
)
);
if
(
(
p_intf
->
p_sys
->
fd
=
SocketListen
(
p_intf
,
i_telnetport
)
)
<
0
)
if
(
(
p_intf
->
p_sys
->
fd
=
net_ListenTCP
(
p_intf
,
""
,
i_telnetport
)
)
<
0
)
{
msg_Err
(
p_intf
,
"cannot listen for telnet"
);
free
(
p_intf
->
p_sys
);
...
...
@@ -207,7 +195,6 @@ static void Run( intf_thread_t *p_intf )
{
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
struct
timeval
timeout
;
int
i_sock_size
=
sizeof
(
struct
sockaddr_in
);
char
*
s_password
;
s_password
=
config_GetPsz
(
p_intf
,
"telnet-password"
);
...
...
@@ -218,13 +205,12 @@ static void Run( intf_thread_t *p_intf )
fd_set
fds_write
;
int
i_handle_max
=
0
;
int
i_ret
;
struct
sockaddr_in
sock2
;
int
i_len
;
int
fd
;
int
i
;
/* if a new client wants to communicate */
fd
=
accept
(
p_sys
->
fd
,
(
struct
sockaddr
*
)
&
sock2
,
&
i_sock_size
);
fd
=
accept
(
p_sys
->
fd
,
NULL
,
NULL
);
if
(
fd
>
0
)
{
telnet_client_t
*
cl
;
...
...
@@ -440,81 +426,6 @@ static void Write_message( telnet_client_t * client, vlm_message_t * message, ch
free
(
psz_message
);
}
/* Does what we want except select and accept */
static
int
SocketListen
(
intf_thread_t
*
p_intf
,
int
i_port
)
{
struct
sockaddr_in
sock
;
int
fd
;
int
i_opt
;
int
i_flags
;
/* open socket */
fd
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
if
(
fd
<
0
)
{
msg_Err
(
p_intf
,
"cannot open socket"
);
goto
socket_failed
;
}
/* reuse socket */
i_opt
=
1
;
if
(
setsockopt
(
fd
,
SOL_SOCKET
,
SO_REUSEADDR
,
(
void
*
)
&
i_opt
,
sizeof
(
i_opt
)
)
<
0
)
{
msg_Warn
(
p_intf
,
"cannot configure socket (SO_REUSEADDR)"
);
}
/* fill p_socket structure */
memset
(
&
sock
,
0
,
sizeof
(
struct
sockaddr_in
)
);
sock
.
sin_family
=
AF_INET
;
/* family */
sock
.
sin_port
=
htons
(
(
uint16_t
)
i_port
);
sock
.
sin_addr
.
s_addr
=
INADDR_ANY
;
/* bind it */
if
(
bind
(
fd
,
(
struct
sockaddr
*
)
&
sock
,
sizeof
(
struct
sockaddr_in
)
)
<
0
)
{
msg_Err
(
p_intf
,
"cannot bind socket"
);
goto
socket_failed
;
}
/* set to non-blocking */
#if defined( WIN32 ) || defined( UNDER_CE )
{
unsigned
long
i_dummy
=
1
;
if
(
ioctlsocket
(
fd
,
FIONBIO
,
&
i_dummy
)
!=
0
)
{
msg_Err
(
p_intf
,
"cannot set socket to non-blocking mode"
);
goto
socket_failed
;
}
}
#else
if
(
(
i_flags
=
fcntl
(
fd
,
F_GETFL
,
0
)
)
<
0
)
{
msg_Err
(
p_intf
,
"cannot F_GETFL socket"
);
goto
socket_failed
;
}
if
(
fcntl
(
fd
,
F_SETFL
,
i_flags
|
O_NONBLOCK
)
<
0
)
{
msg_Err
(
p_intf
,
"cannot F_SETFL O_NONBLOCK"
);
goto
socket_failed
;
}
#endif
/* listen */
if
(
listen
(
fd
,
LISTEN_BACKLOG
)
<
0
)
{
msg_Err
(
p_intf
,
"cannot listen socket"
);
goto
socket_failed
;
}
return
fd
;
socket_failed:
if
(
fd
>=
0
)
{
SOCKET_CLOSE
(
fd
);
}
return
-
1
;
}
/* we need the level of the message to put a beautiful indentation.
first level is 0 */
static
char
*
MessageToString
(
vlm_message_t
*
message
,
int
i_level
)
...
...
modules/misc/network/ipv4.c
View file @
e34b5beb
...
...
@@ -437,43 +437,24 @@ static int OpenUDP( vlc_object_t * p_this, network_socket_t * p_socket )
}
/*****************************************************************************
*
OpenTCP: open
a TCP socket
*
SocketTCP: create
a TCP socket
*****************************************************************************
* psz_server_addr, i_server_port : address and port used for the connect()
* system call. If i_server_port == 0, 80 is used.
* Other parameters are ignored.
* This function returns -1 in case of error.
*****************************************************************************/
static
int
OpenTCP
(
vlc_object_t
*
p_this
,
network_socket_t
*
p_socket
)
static
int
SocketTCP
(
vlc_object_t
*
p_this
)
{
char
*
psz_server_addr
=
p_socket
->
psz_server_addr
;
int
i_server_port
=
p_socket
->
i_server_port
;
int
i_handle
;
struct
sockaddr_in
sock
;
if
(
i_server_port
==
0
)
{
i_server_port
=
80
;
}
/* Open a SOCK_STREAM (TCP) socket, in the
A
F_INET domain, automatic (0)
/* Open a SOCK_STREAM (TCP) socket, in the
P
F_INET domain, automatic (0)
* protocol */
if
(
(
i_handle
=
socket
(
A
F_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
if
(
(
i_handle
=
socket
(
P
F_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
{
#ifdef HAVE_ERRNO_H
msg_Warn
(
p_this
,
"cannot create socket (%s)"
,
strerror
(
errno
)
);
#else
msg_Warn
(
p_this
,
"cannot create socket"
);
#endif
goto
error
;
}
/* Build remote address */
if
(
BuildAddr
(
&
sock
,
psz_server_addr
,
i_server_port
)
==
-
1
)
{
msg_Dbg
(
p_this
,
"could not build local address"
);
goto
error
;
return
-
1
;
}
/* Set to non-blocking */
...
...
@@ -496,6 +477,40 @@ static int OpenTCP( vlc_object_t * p_this, network_socket_t * p_socket )
}
#endif
return
i_handle
;
}
/*****************************************************************************
* OpenTCP: open a TCP socket
*****************************************************************************
* psz_server_addr, i_server_port : address and port used for the connect()
* system call. If i_server_port == 0, 80 is used.
* Other parameters are ignored.
* This function returns -1 in case of error.
*****************************************************************************/
static
int
OpenTCP
(
vlc_object_t
*
p_this
,
network_socket_t
*
p_socket
)
{
char
*
psz_server_addr
=
p_socket
->
psz_server_addr
;
int
i_server_port
=
p_socket
->
i_server_port
;
int
i_handle
;
struct
sockaddr_in
sock
;
if
(
i_server_port
==
0
)
{
i_server_port
=
80
;
}
if
(
(
i_handle
=
SocketTCP
(
p_this
))
==
-
1
)
return
VLC_EGENERIC
;
/* Build remote address */
if
(
BuildAddr
(
&
sock
,
psz_server_addr
,
i_server_port
)
==
-
1
)
{
msg_Dbg
(
p_this
,
"could not build local address"
);
goto
error
;
}
/* Connect the socket */
if
(
connect
(
i_handle
,
(
struct
sockaddr
*
)
&
sock
,
sizeof
(
sock
)
)
==
-
1
)
{
...
...
@@ -580,15 +595,76 @@ static int OpenTCP( vlc_object_t * p_this, network_socket_t * p_socket )
return
VLC_SUCCESS
;
error:
if
(
i_handle
>
0
)
{
close
(
i_handle
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
* ListenTCP: open a TCP passive socket (server-side)
*****************************************************************************
* psz_server_addr, i_server_port : address and port used for the bind()
* system call. If i_server_port == 0, 80 is used.
* Other parameters are ignored.
* This function returns -1 in case of error.
*****************************************************************************/
static
int
ListenTCP
(
vlc_object_t
*
p_this
,
network_socket_t
*
p_socket
)
{
char
*
psz_server_addr
=
p_socket
->
psz_server_addr
;
int
i_server_port
=
p_socket
->
i_server_port
;
int
i_handle
,
i_dummy
=
1
;
struct
sockaddr_in
sock
;
if
(
(
i_handle
=
SocketTCP
(
p_this
))
==
-
1
)
return
VLC_EGENERIC
;
if
(
setsockopt
(
i_handle
,
SOL_SOCKET
,
SO_REUSEADDR
,
(
void
*
)
&
i_dummy
,
sizeof
(
i_dummy
)
)
==
-
1
)
{
msg_Warn
(
p_this
,
"cannot configure socket (SO_REUSEADDR)"
);
}
/* Build remote address */
if
(
BuildAddr
(
&
sock
,
psz_server_addr
,
i_server_port
)
==
-
1
)
{
msg_Dbg
(
p_this
,
"could not build local address"
);
return
VLC_EGENERIC
;
}
/* Bind the socket */
if
(
bind
(
i_handle
,
(
struct
sockaddr
*
)
&
sock
,
sizeof
(
sock
))
==
-
1
)
{
#ifdef HAVE_ERRNO_H
msg_Err
(
p_this
,
"cannot bind socket (%s)"
,
strerror
(
errno
)
);
#else
msg_Err
(
p_this
,
"cannot bind socket"
);
#endif
goto
error
;
}
/* Listen */
if
(
listen
(
i_handle
,
100
)
==
-
1
)
{
#ifdef HAVE_ERRNO_H
msg_Err
(
p_this
,
"cannot bring the socket in listening mode (%s)"
,
strerror
(
errno
)
);
#else
msg_Err
(
p_this
,
"cannot bring the socket in listening mode"
);
#endif
goto
error
;
}
p_socket
->
i_handle
=
i_handle
;
p_socket
->
i_mtu
=
0
;
/* There is no MTU notion in TCP */
return
VLC_SUCCESS
;
error:
close
(
i_handle
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
* NetOpen: wrapper around OpenUDP and OpenTCP
* NetOpen: wrapper around OpenUDP
, ListenTCP
and OpenTCP
*****************************************************************************/
static
int
NetOpen
(
vlc_object_t
*
p_this
)
{
...
...
@@ -598,6 +674,10 @@ static int NetOpen( vlc_object_t * p_this )
{
return
OpenUDP
(
p_this
,
p_socket
);
}
else
if
(
p_socket
->
i_type
==
NETWORK_TCP_PASSIVE
)
{
return
ListenTCP
(
p_this
,
p_socket
);
}
else
{
return
OpenTCP
(
p_this
,
p_socket
);
...
...
modules/misc/network/ipv6.c
View file @
e34b5beb
...
...
@@ -77,7 +77,7 @@ static const struct in6_addr in6addr_any = {{IN6ADDR_ANY_INIT}};
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
int
Net
Open
(
vlc_object_t
*
);
/*****************************************************************************
* Module descriptor
...
...
@@ -85,7 +85,7 @@ static int Open( vlc_object_t * );
vlc_module_begin
();
set_description
(
_
(
"IPv6 network abstraction layer"
)
);
set_capability
(
"network"
,
40
);
set_callbacks
(
Open
,
NULL
);
set_callbacks
(
Net
Open
,
NULL
);
vlc_module_end
();
/*****************************************************************************
...
...
@@ -437,6 +437,50 @@ static int OpenUDP( vlc_object_t * p_this, network_socket_t * p_socket )
return
(
0
);
}
/*****************************************************************************
* SocketTCP: create a TCP socket
*****************************************************************************
* This function returns -1 in case of error.
*****************************************************************************/
static
int
SocketTCP
(
vlc_object_t
*
p_this
)
{
int
i_handle
;
/* Open a SOCK_STREAM (TCP) socket, in the PF_INET6 domain, automatic (0)
* protocol */
if
(
(
i_handle
=
socket
(
PF_INET6
,
SOCK_STREAM
,
0
))
==
-
1
)
{
#ifdef HAVE_ERRNO_H
msg_Warn
(
p_this
,
"cannot create socket (%s)"
,
strerror
(
errno
)
);
#else
msg_Warn
(
p_this
,
"cannot create socket"
);
#endif
return
-
1
;
}
/* Set to non-blocking */
#if defined( WIN32 ) || defined( UNDER_CE )
{
unsigned
long
i_dummy
=
1
;
if
(
ioctlsocket
(
i_handle
,
FIONBIO
,
&
i_dummy
)
!=
0
)
{
msg_Err
(
p_this
,
"cannot set socket to non-blocking mode"
);
}
}
#elif defined( HAVE_ERRNO_H )
{
int
i_flags
;
if
(
(
i_flags
=
fcntl
(
i_handle
,
F_GETFL
,
0
)
)
<
0
||
fcntl
(
i_handle
,
F_SETFL
,
i_flags
|
O_NONBLOCK
)
<
0
)
{
msg_Err
(
p_this
,
"cannot set socket to non-blocking mode"
);
}
}
#endif
return
i_handle
;
}
/*****************************************************************************
* OpenTCP: open a TCP socket
*****************************************************************************
...
...
@@ -458,40 +502,171 @@ static int OpenTCP( vlc_object_t * p_this, network_socket_t * p_socket )
i_server_port
=
80
;
}
/* Open a SOCK_STREAM (TCP) socket, in the AF_INET6 domain, automatic (0)
* protocol */
if
(
(
i_handle
=
socket
(
AF_INET6
,
SOCK_STREAM
,
0
))
==
-
1
)
{
msg_Warn
(
p_this
,
"cannot create socket (%s)"
,
strerror
(
errno
)
);
return
(
-
1
);
}
if
(
(
i_handle
=
SocketTCP
(
p_this
))
==
-
1
)
return
VLC_EGENERIC
;
/* Build remote address */
if
(
BuildAddr
(
p_this
,
&
sock
,
psz_server_addr
,
i_server_port
)
==
-
1
)
goto
error
;
/* Connect the socket */
if
(
connect
(
i_handle
,
(
struct
sockaddr
*
)
&
sock
,
sizeof
(
sock
)
)
==
-
1
)
{
close
(
i_handle
);
return
(
-
1
);
#if defined( WIN32 ) || defined( UNDER_CE )
if
(
WSAGetLastError
()
==
WSAEWOULDBLOCK
)
#elif defined( HAVE_ERRNO_H )
if
(
errno
==
EINPROGRESS
)
#else
if
(
0
)
#endif
{
int
i_ret
,
i_opt
,
i_opt_size
=
sizeof
(
i_opt
),
i_max_count
;
struct
timeval
timeout
;
vlc_value_t
val
;
fd_set
fds
;
/* FIXME: There is no ipv6-timeout option, so we use ipv4-timeout
* instead */
if
(
!
var_Type
(
p_this
,
"ipv4-timeout"
)
)
{
var_Create
(
p_this
,
"ipv4-timeout"
,
VLC_VAR_INTEGER
|
VLC_VAR_DOINHERIT
);
}
var_Get
(
p_this
,
"ipv4-timeout"
,
&
val
);
i_max_count
=
val
.
i_int
*
1000
/
100000
/* timeout.tv_usec */
;
/* Connect the socket */
if
(
connect
(
i_handle
,
(
struct
sockaddr
*
)
&
sock
,
sizeof
(
sock
)
)
==
(
-
1
)
)
msg_Dbg
(
p_this
,
"connection in progress"
);
do
{
if
(
p_this
->
b_die
||
i_max_count
<=
0
)
{
msg_Dbg
(
p_this
,
"connection aborted"
);
goto
error
;
}
i_max_count
--
;
/* Initialize file descriptor set */
FD_ZERO
(
&
fds
);
FD_SET
(
i_handle
,
&
fds
);
/* We'll wait 0.1 second if nothing happens */
timeout
.
tv_sec
=
0
;
timeout
.
tv_usec
=
100000
;
}
while
(
(
i_ret
=
select
(
i_handle
+
1
,
NULL
,
&
fds
,
NULL
,
&
timeout
)
)
==
0
||
#if defined( WIN32 ) || defined( UNDER_CE )
(
i_ret
<
0
&&
WSAGetLastError
()
==
WSAEWOULDBLOCK
)
);
#elif defined( HAVE_ERRNO_H )
(
i_ret
<
0
&&
errno
==
EINTR
)
);
#else
(
i_ret
<
0
)
);
#endif
if
(
i_ret
<
0
)
{
msg_Warn
(
p_this
,
"cannot connect socket (select failed)"
);
goto
error
;
}
#if !defined( SYS_BEOS )
if
(
getsockopt
(
i_handle
,
SOL_SOCKET
,
SO_ERROR
,
(
void
*
)
&
i_opt
,
&
i_opt_size
)
==
-
1
||
i_opt
!=
0
)
{
msg_Warn
(
p_this
,
"cannot connect socket (SO_ERROR)"
);
goto
error
;
}
#endif
}
else
{
#if defined( HAVE_ERRNO_H )
msg_Warn
(
p_this
,
"cannot connect socket (%s)"
,
strerror
(
errno
)
);
#else
msg_Warn
(
p_this
,
"cannot connect socket"
);
#endif
goto
error
;
}
}
p_socket
->
i_handle
=
i_handle
;
p_socket
->
i_mtu
=
0
;
/* There is no MTU notion in TCP */
return
VLC_SUCCESS
;
error:
close
(
i_handle
);
return
(
-
1
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
* ListenTCP: open a TCP passive socket (server-side)
*****************************************************************************
* psz_server_addr, i_server_port : address and port used for the bind()
* system call. If i_server_port == 0, 80 is used.
* Other parameters are ignored.
* This function returns -1 in case of error.
*****************************************************************************/
static
int
ListenTCP
(
vlc_object_t
*
p_this
,
network_socket_t
*
p_socket
)
{
char
*
psz_server_addr
=
p_socket
->
psz_server_addr
;
int
i_server_port
=
p_socket
->
i_server_port
;
int
i_handle
,
i_dummy
=
1
;
struct
sockaddr_in6
sock
;
if
(
(
i_handle
=
SocketTCP
(
p_this
))
==
-
1
)
return
VLC_EGENERIC
;
if
(
setsockopt
(
i_handle
,
SOL_SOCKET
,
SO_REUSEADDR
,
(
void
*
)
&
i_dummy
,
sizeof
(
i_dummy
)
)
==
-
1
)
{
msg_Warn
(
p_this
,
"cannot configure socket (SO_REUSEADDR)"
);
}
/* Build remote address */
if
(
BuildAddr
(
p_this
,
&
sock
,
psz_server_addr
,
i_server_port
)
==
-
1
)
{
msg_Dbg
(
p_this
,
"could not build local address"
);
return
VLC_EGENERIC
;
}
/* Bind the socket */
if
(
bind
(
i_handle
,
(
struct
sockaddr
*
)
&
sock
,
sizeof
(
sock
))
==
-
1
)
{
#ifdef HAVE_ERRNO_H
msg_Err
(
p_this
,
"cannot bind socket (%s)"
,
strerror
(
errno
)
);
#else
msg_Err
(
p_this
,
"cannot bind socket"
);
#endif
goto
error
;
}
/* Listen */
if
(
listen
(
i_handle
,
100
)
==
-
1
)
{
#ifdef HAVE_ERRNO_H
msg_Err
(
p_this
,
"cannot bring the socket in listening mode (%s)"
,
strerror
(
errno
)
);
#else
msg_Err
(
p_this
,
"cannot bring the socket in listening mode"
);
#endif
goto
error
;
}
p_socket
->
i_handle
=
i_handle
;
p_socket
->
i_mtu
=
0
;
/* There is no MTU notion in TCP */
return
VLC_SUCCESS
;
return
(
0
);
error:
close
(
i_handle
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
*
Open: wrapper around OpenUD
P and OpenTCP
*
NetOpen: wrapper around OpenUDP, ListenTC
P and OpenTCP
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
static
int
Net
Open
(
vlc_object_t
*
p_this
)
{
network_socket_t
*
p_socket
=
p_this
->
p_private
;
...
...
@@ -499,6 +674,10 @@ static int Open( vlc_object_t * p_this )
{
return
OpenUDP
(
p_this
,
p_socket
);
}
else
if
(
p_socket
->
i_type
==
NETWORK_TCP_PASSIVE
)
{
return
ListenTCP
(
p_this
,
p_socket
);
}
else
{
return
OpenTCP
(
p_this
,
p_socket
);
...
...
src/misc/net.c
View file @
e34b5beb
...
...
@@ -110,6 +110,58 @@ int __net_OpenTCP( vlc_object_t *p_this, char *psz_host, int i_port )
return
sock
.
i_handle
;
}
/*****************************************************************************
* __net_ListenTCP:
*****************************************************************************
* Open a TCP listening socket and return it
*****************************************************************************/
int
__net_ListenTCP
(
vlc_object_t
*
p_this
,
char
*
psz_host
,
int
i_port
)
{
vlc_value_t
val
;
void
*
private
;
char
*
psz_network
=
""
;
network_socket_t
sock
;
module_t
*
p_network
;
/* Check if we have force ipv4 or ipv6 */
var_Create
(
p_this
,
"ipv4"
,
VLC_VAR_BOOL
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_this
,
"ipv4"
,
&
val
);
if
(
val
.
b_bool
)
{
psz_network
=
"ipv4"
;
}
var_Create
(
p_this
,
"ipv6"
,
VLC_VAR_BOOL
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_this
,
"ipv6"
,
&
val
);
if
(
val
.
b_bool
)
{
psz_network
=
"ipv6"
;
}
/* Prepare the network_socket_t structure */
sock
.
i_type
=
NETWORK_TCP_PASSIVE
;
sock
.
psz_bind_addr
=
""
;
sock
.
i_bind_port
=
0
;
sock
.
psz_server_addr
=
psz_host
;
sock
.
i_server_port
=
i_port
;
sock
.
i_ttl
=
0
;
msg_Dbg
(
p_this
,
"net: listening 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
)
)
)
{
msg_Dbg
(
p_this
,
"net: listening to '%s:%d' failed"
,
psz_host
,
i_port
);
return
-
1
;
}
module_Unneed
(
p_this
,
p_network
);
p_this
->
p_private
=
private
;
return
sock
.
i_handle
;
}
/*****************************************************************************
* __net_OpenUDP:
*****************************************************************************
...
...
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