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
043b5c89
Commit
043b5c89
authored
Nov 12, 2001
by
Sam Hocevar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* Automatic handling of the Channel Server's response in network mode.
parent
b70a26fa
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
147 additions
and
166 deletions
+147
-166
.cvsignore
.cvsignore
+1
-0
include/netutils.h
include/netutils.h
+5
-5
plugins/gtk/gtk_callbacks.c
plugins/gtk/gtk_callbacks.c
+8
-4
src/input/input.c
src/input/input.c
+8
-2
src/interface/intf_playlist.c
src/interface/intf_playlist.c
+12
-12
src/misc/netutils.c
src/misc/netutils.c
+113
-143
No files found.
.cvsignore
View file @
043b5c89
.*
core
core.*
.dep
gmon.out
vlc-debug.log
...
...
include/netutils.h
View file @
043b5c89
...
...
@@ -4,7 +4,7 @@
* modules.
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: netutils.h,v 1.1
5 2001/10/22 12:28:53 massiot
Exp $
* $Id: netutils.h,v 1.1
6 2001/11/12 04:12:37 sam
Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Henri Fallon <henri@videolan.org>
...
...
@@ -32,7 +32,7 @@
*****************************************************************************/
struct
sockaddr_in
;
int
network_BuildLocalAddr
(
struct
sockaddr_in
*
,
int
,
char
*
);
int
network_BuildRemoteAddr
(
struct
sockaddr_in
*
,
char
*
);
int
network_BuildRemoteAddr
(
struct
sockaddr_in
*
,
char
*
);
int
network_ChannelJoin
(
int
);
int
network_ChannelCreate
(
void
);
plugins/gtk/gtk_callbacks.c
View file @
043b5c89
...
...
@@ -2,7 +2,7 @@
* gtk_callbacks.c : Callbacks for the Gtk+ plugin.
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
* $Id: gtk_callbacks.c,v 1.2
4 2001/05/31 16:10:05 stef
Exp $
* $Id: gtk_callbacks.c,v 1.2
5 2001/11/12 04:12:37 sam
Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stphane Borel <stef@via.ecp.fr>
...
...
@@ -326,12 +326,16 @@ void GtkChannelGo( GtkButton * button, gpointer user_data )
/* FIXME: ugly hack to close input and outputs */
p_intf
->
pf_manage
(
p_intf
);
}
network_ChannelJoin
(
i_channel
);
/* FIXME 2 */
p_main
->
p_playlist
->
b_stopped
=
0
;
p_intf
->
pf_manage
(
p_intf
);
}
vlc_mutex_unlock
(
&
p_intf
->
change_lock
);
network_ChannelJoin
(
i_channel
);
input_SetStatus
(
p_intf
->
p_input
,
INPUT_STATUS_PLAY
);
}
...
...
src/input/input.c
View file @
043b5c89
...
...
@@ -4,7 +4,7 @@
* decoders.
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: input.c,v 1.15
2 2001/11/09 13:49:26 massiot
Exp $
* $Id: input.c,v 1.15
3 2001/11/12 04:12:37 sam
Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
...
...
@@ -534,7 +534,6 @@ static void EndThread( input_thread_t * p_input )
/* Release modules */
module_Unneed
(
p_input
->
p_input_module
);
}
/*****************************************************************************
...
...
@@ -812,6 +811,11 @@ static void NetworkOpen( input_thread_t * p_input )
psz_server
=
NULL
;
}
}
else
{
/* This is required or NetworkClose will never be called */
p_input
->
p_source
=
"ts: network input"
;
}
/* Check that we got a valid server */
if
(
psz_server
==
NULL
)
...
...
@@ -986,6 +990,8 @@ static void NetworkOpen( input_thread_t * p_input )
*****************************************************************************/
static
void
NetworkClose
(
input_thread_t
*
p_input
)
{
intf_WarnMsg
(
2
,
"input: closing network target `%s'"
,
p_input
->
p_source
);
close
(
p_input
->
i_handle
);
#ifdef WIN32
...
...
src/interface/intf_playlist.c
View file @
043b5c89
...
...
@@ -2,7 +2,7 @@
* intf_playlist.c : Playlist management functions
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
* $Id: intf_playlist.c,v 1.
8 2001/08/09 08:20:26
sam Exp $
* $Id: intf_playlist.c,v 1.
9 2001/11/12 04:12:38
sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
...
...
src/misc/netutils.c
View file @
043b5c89
...
...
@@ -2,7 +2,7 @@
* netutils.c: various network functions
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: netutils.c,v 1.4
0 2001/11/12 03:07:13 stef
Exp $
* $Id: netutils.c,v 1.4
1 2001/11/12 04:12:38 sam
Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Benoit Steiner <benny@via.ecp.fr>
...
...
@@ -33,6 +33,10 @@
#include <errno.h>
/* errno() */
#include <string.h>
/* memset() */
#ifdef STRNCASECMP_IN_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
/* gethostname() */
#elif defined( _MSC_VER ) && defined( _WIN32 )
...
...
@@ -77,6 +81,7 @@
#include "main.h"
#include "intf_msg.h"
#include "intf_playlist.h"
#include "netutils.h"
...
...
@@ -97,7 +102,7 @@ typedef struct input_channel_s
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
GetMacAddress
(
int
i_
socket
,
char
*
psz_mac
);
static
int
GetMacAddress
(
int
i_
fd
,
char
*
psz_mac
);
#ifdef WIN32
static
int
GetAdapterInfo
(
int
i_adapter
,
char
*
psz_string
);
#endif
...
...
@@ -213,14 +218,7 @@ int network_BuildRemoteAddr( struct sockaddr_in * p_socket, char * psz_server )
*****************************************************************************/
int
network_ChannelCreate
(
void
)
{
/* Even when BSD are supported, BeOS is not likely to be supported, so
* I prefer to put it apart */
#if defined( SYS_BEOS )
intf_ErrMsg
(
"error: channel changing is not yet supported under BeOS"
);
return
(
1
);
/* FIXME : channel handling only work for linux */
#elif defined( SYS_LINUX ) || defined( WIN32 )
#if defined( SYS_LINUX ) || defined( WIN32 )
/* Allocate structure */
p_main
->
p_channel
=
malloc
(
sizeof
(
input_channel_t
)
);
...
...
@@ -234,11 +232,11 @@ int network_ChannelCreate( void )
p_main
->
p_channel
->
i_channel
=
0
;
p_main
->
p_channel
->
last_change
=
0
;
intf_
Msg
(
"network: channels initialized"
);
intf_
WarnMsg
(
2
,
"network: channels initialized"
);
return
(
0
);
#else
intf_ErrMsg
(
"network error : channels not supported"
);
intf_ErrMsg
(
"network error : channels not supported
on this platform
"
);
return
(
1
);
#endif
...
...
@@ -251,182 +249,154 @@ int network_ChannelCreate( void )
* already on the good channel, nothing will be done. Else, and if possible
* (if the interface is not locked), the channel server will be contacted
* and a change will be requested. The function will block until the change
* is effective. Note that once a channel is no more used, it
'
s interface
* is effective. Note that once a channel is no more used, its interface
* should be unlocked using input_ChannelLeave().
* Non 0 will be returned in case of error.
*****************************************************************************/
int
network_ChannelJoin
(
int
i_channel
)
{
/* I still prefer to put BeOS a bit apart */
#if defined( SYS_BEOS )
intf_ErrMsg
(
"network error: channels are not yet supported under BeOS"
);
return
(
-
1
);
#if defined( SYS_LINUX ) || defined( WIN32 )
#define VLCS_VERSION 12
#define MESSAGE_LENGTH 80
#elif defined( SYS_LINUX ) || defined( WIN32 )
int
i_socket
;
int
i_fromlen
;
char
psz_mess
[
MESSAGE_LENGTH
];
char
psz_mac
[
40
];
int
i_fd
,
i_dummy
,
i_port
;
char
*
psz_vlcs
;
struct
sockaddr_in
sa_server
;
struct
sockaddr_in
sa_client
;
unsigned
int
i_version
=
12
;
char
psz_mess
[
80
];
char
psz_mac
[
40
];
char
i_mess_length
=
80
;
unsigned
long
int
i_date
;
struct
timeval
answer_delay
;
int
i_nbanswer
;
char
i_answer
;
struct
timeval
delay
;
fd_set
fds
;
unsigned
int
i_rc
;
char
*
psz_channel_server
;
if
(
!
main_GetIntVariable
(
INPUT_NETWORK_CHANNEL_VAR
,
INPUT_NETWORK_CHANNEL_DEFAULT
)
)
{
intf_ErrMsg
(
"network: channels disabled, to enable them, use the"
"--channels option"
);
return
(
-
1
)
;
return
-
1
;
}
/* debug */
intf_DbgMsg
(
"network: ChannelJoin : %d"
,
i_channel
);
/* If last change is too recent, wait a while */
if
(
mdate
()
-
p_main
->
p_channel
->
last_change
<
INPUT_CHANNEL_CHANGE_DELAY
)
{
intf_WarnMsg
(
2
,
"network: waiting before changing channel"
);
/* XXX Isn't this completely brain-damaged ??? -- Sam */
mwait
(
p_main
->
p_channel
->
last_change
+
INPUT_CHANNEL_CHANGE_DELAY
);
}
p_main
->
p_channel
->
last_change
=
mdate
();
p_main
->
p_channel
->
i_channel
=
i_channel
;
intf_WarnMsg
(
2
,
"network: joining channel %d"
,
i_channel
);
/* Initializing the socket */
i_fd
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
/*
* Initializing the socket
*/
i_socket
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
/* Getting information about the channel server */
psz_vlcs
=
main_GetPszVariable
(
INPUT_CHANNEL_SERVER_VAR
,
INPUT_CHANNEL_SERVER_DEFAULT
);
i_port
=
main_GetIntVariable
(
INPUT_CHANNEL_PORT_VAR
,
INPUT_CHANNEL_PORT_DEFAULT
);
/*
* Getting the server's information
*/
intf_WarnMsg
(
6
,
"Channel server: %s port: %d"
,
main_GetPszVariable
(
INPUT_CHANNEL_SERVER_VAR
,
INPUT_CHANNEL_SERVER_DEFAULT
),
main_GetIntVariable
(
INPUT_CHANNEL_PORT_VAR
,
INPUT_CHANNEL_PORT_DEFAULT
)
);
intf_WarnMsg
(
6
,
"network: vlcs '%s', port %d"
,
psz_vlcs
,
i_port
);
memset
(
&
sa_client
,
0x00
,
sizeof
(
struct
sockaddr_in
)
);
memset
(
&
sa_server
,
0x00
,
sizeof
(
struct
sockaddr_in
)
);
sa_client
.
sin_family
=
AF_INET
;
sa_server
.
sin_family
=
AF_INET
;
sa_server
.
sin_port
=
htons
(
main_GetIntVariable
(
INPUT_CHANNEL_PORT_VAR
,
INPUT_CHANNEL_PORT_DEFAULT
)
);
psz_channel_server
=
strdup
(
main_GetPszVariable
(
INPUT_CHANNEL_SERVER_VAR
,
INPUT_CHANNEL_SERVER_DEFAULT
)
);
sa_client
.
sin_port
=
htons
(
4312
);
sa_server
.
sin_port
=
htons
(
i_port
);
sa_client
.
sin_addr
.
s_addr
=
INADDR_ANY
;
#ifdef HAVE_ARPA_INET_H
inet_aton
(
psz_
channel_server
,
&
sa_server
.
sin_addr
);
inet_aton
(
psz_
vlcs
,
&
sa_server
.
sin_addr
);
#else
sa_server
.
sin_addr
.
s_addr
=
inet_addr
(
psz_
channel_server
);
sa_server
.
sin_addr
.
s_addr
=
inet_addr
(
psz_
vlcs
);
#endif
free
(
psz_channel_server
);
/*
* Looking for the interface MAC address
*/
if
(
GetMacAddress
(
i_socket
,
psz_mac
)
)
/* Bind the socket */
i_dummy
=
bind
(
i_fd
,
(
struct
sockaddr
*
)(
&
sa_client
),
sizeof
(
struct
sockaddr
)
);
if
(
i_dummy
)
{
intf_ErrMsg
(
"network: unable to bind vlcs socket: %i"
,
i_dummy
);
return
-
1
;
}
/* Look for the interface MAC address */
if
(
GetMacAddress
(
i_fd
,
psz_mac
)
)
{
intf_ErrMsg
(
"network error: failed getting MAC address"
);
return
(
-
1
)
;
return
-
1
;
}
/*
* Getting date of the client in seconds
*/
i_date
=
mdate
()
/
1000000
;
intf_DbgMsg
(
"vlcs: date %lu"
,
i_date
);
intf_WarnMsg
(
6
,
"network: MAC address is %s"
,
psz_mac
);
/*
* Build of the message
*/
sprintf
(
psz_mess
,
"%d %u %lu %s
\n
"
,
i_channel
,
i_version
,
i_date
,
psz_mac
);
/* Build the message */
sprintf
(
psz_mess
,
"%d %u %lu %s
\n
"
,
i_channel
,
VLCS_VERSION
,
(
unsigned
long
)(
mdate
()
/
(
unsigned
long
long
)
1000000
),
psz_mac
);
intf_DbgMsg
(
"vlcs: The message is %s"
,
psz_mess
);
/* Send the message */
sendto
(
i_fd
,
psz_mess
,
MESSAGE_LENGTH
,
0
,
(
struct
sockaddr
*
)(
&
sa_server
),
sizeof
(
struct
sockaddr
)
);
/*
* Open the socket 2
*/
memset
(
&
sa_client
,
0x00
,
sizeof
(
struct
sockaddr_in
)
);
sa_client
.
sin_family
=
AF_INET
;
sa_client
.
sin_port
=
htons
(
4312
);
sa_client
.
sin_addr
.
s_addr
=
INADDR_ANY
;
i_fromlen
=
sizeof
(
struct
sockaddr
);
i_rc
=
bind
(
i_socket
,
(
struct
sockaddr
*
)(
&
sa_client
),
\
sizeof
(
struct
sockaddr
)
);
if
(
i_rc
)
{
intf_ErrMsg
(
"vlcs: Unable to bind socket:%u "
,
i_rc
);
/* TODO put CS_R_BIND in types.h*/
/* return CS_R_SOCKET;*/
return
-
1
;
}
intf_WarnMsg
(
2
,
"network: attempting to join channel %d"
,
i_channel
);
/*
* Send the message
*/
sendto
(
i_socket
,
psz_mess
,
i_mess_length
,
0
,
\
(
struct
sockaddr
*
)(
&
sa_server
),
\
sizeof
(
struct
sockaddr
)
);
/* We have changed channels ! (or at least, we tried) */
p_main
->
p_channel
->
last_change
=
mdate
();
p_main
->
p_channel
->
i_channel
=
i_channel
;
/*
* Waiting 5 sec for one answer from the server
*/
answer_delay
.
tv_sec
=
5
;
answer_delay
.
tv_usec
=
0
;
/* Wait 5 sec for an answer from the server */
delay
.
tv_sec
=
5
;
delay
.
tv_usec
=
0
;
FD_ZERO
(
&
fds
);
FD_SET
(
i_
socket
,
&
fds
);
i_
nbanswer
=
select
(
i_socket
+
1
,
&
fds
,
NULL
,
NULL
,
&
answer_
delay
);
FD_SET
(
i_
fd
,
&
fds
);
i_
dummy
=
select
(
i_fd
+
1
,
&
fds
,
NULL
,
NULL
,
&
delay
);
switch
(
i_
nbanswer
)
switch
(
i_
dummy
)
{
case
0
:
intf_DbgMsg
(
"vlcs: no answer"
);
intf_ErrMsg
(
"network error: no answer from vlcs"
);
close
(
i_fd
);
return
-
1
;
break
;
case
-
1
:
intf_DbgMsg
(
"vlcs: unable to receive the answer "
);
intf_ErrMsg
(
"network error: error while listening to vlcs"
);
close
(
i_fd
);
return
-
1
;
break
;
}
default:
recvfrom
(
i_socket
,
&
i_answer
,
sizeof
(
char
),
0
,
\
(
struct
sockaddr
*
)(
&
sa_client
),
&
i_fromlen
);
intf_DbgMsg
(
"vlcs: the answer : %i"
,
i_answer
);
i_dummy
=
sizeof
(
struct
sockaddr
);
recvfrom
(
i_fd
,
psz_mess
,
MESSAGE_LENGTH
,
0
,
(
struct
sockaddr
*
)(
&
sa_client
),
&
i_dummy
);
psz_mess
[
MESSAGE_LENGTH
-
1
]
=
0
;
switch
(
i_answer
)
if
(
!
strncasecmp
(
psz_mess
,
"E: "
,
3
)
)
{
case
-
1
:
intf_DbgMsg
(
"vlcs: the server failed to create the thread"
);
break
;
case
0
:
intf_DbgMsg
(
"vlcs: the server tries to change the channel"
);
break
;
default:
intf_DbgMsg
(
"vlcs: unknown answer !"
);
break
;
intf_ErrMsg
(
"network error: vlcs said '%s'"
,
psz_mess
+
3
);
close
(
i_fd
);
return
-
1
;
}
break
;
else
if
(
!
strncasecmp
(
psz_mess
,
"I: "
,
3
)
)
{
intf_WarnMsg
(
2
,
"network info: vlcs said '%s'"
,
psz_mess
+
3
);
}
else
/* We got something to play ! FIXME: not very nice */
{
# define p_item \
(&p_main->p_playlist->p_item[ p_main->p_playlist->i_index + 1])
vlc_mutex_lock
(
&
p_main
->
p_playlist
->
change_lock
);
free
(
p_item
->
psz_name
);
p_item
->
psz_name
=
strdup
(
psz_mess
);
vlc_mutex_unlock
(
&
p_main
->
p_playlist
->
change_lock
);
}
/*
* Close the socket
*/
close
(
i_socket
);
/* Close the socket and return nicely */
close
(
i_fd
);
return
(
0
)
;
return
0
;
#else
intf_ErrMsg
(
"network error: channels not supported"
);
return
(
-
1
)
;
intf_ErrMsg
(
"network error: channels not supported
on this platform
"
);
return
NULL
;
#endif
}
...
...
@@ -436,7 +406,7 @@ int network_ChannelJoin( int i_channel )
/*****************************************************************************
* GetMacAddress: extract the MAC Address
*****************************************************************************/
static
int
GetMacAddress
(
int
i_
socket
,
char
*
psz_mac
)
static
int
GetMacAddress
(
int
i_
fd
,
char
*
psz_mac
)
{
#if defined( SYS_LINUX )
struct
ifreq
interface
;
...
...
@@ -449,7 +419,7 @@ static int GetMacAddress( int i_socket, char *psz_mac )
strcpy
(
interface
.
ifr_name
,
main_GetPszVariable
(
INPUT_IFACE_VAR
,
INPUT_IFACE_DEFAULT
)
);
i_ret
=
ioctl
(
i_
socket
,
SIOCGIFHWADDR
,
&
interface
);
i_ret
=
ioctl
(
i_
fd
,
SIOCGIFHWADDR
,
&
interface
);
if
(
i_ret
)
{
...
...
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