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
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
Hide 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>
...
...
@@ -31,8 +31,8 @@
* Prototypes
*****************************************************************************/
struct
sockaddr_in
;
int
network_BuildLocalAddr
(
struct
sockaddr_in
*
,
int
,
char
*
);
int
network_BuildRemoteAddr
(
struct
sockaddr_in
*
,
char
*
);
int
network_ChannelJoin
(
int
);
int
network_ChannelCreate
(
void
);
int
network_BuildLocalAddr
(
struct
sockaddr_in
*
,
int
,
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
);
p_main
->
p_playlist
->
b_stopped
=
0
;
p_intf
->
pf_manage
(
p_intf
);
}
vlc_mutex_unlock
(
&
p_intf
->
change_lock
);
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
);
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>
*
...
...
@@ -164,7 +164,7 @@ void intf_PlaylistNext( playlist_t * p_playlist )
void
intf_PlaylistPrev
(
playlist_t
*
p_playlist
)
{
vlc_mutex_lock
(
&
p_playlist
->
change_lock
);
p_playlist
->
i_mode
=
-
p_playlist
->
i_mode
;
NextItem
(
p_playlist
);
p_playlist
->
i_mode
=
-
p_playlist
->
i_mode
;
...
...
@@ -202,15 +202,15 @@ int intf_PlaylistDelete( playlist_t * p_playlist, int i_pos )
if
(
i_pos
<
p_playlist
->
i_index
)
p_playlist
->
i_index
--
;
/* Decrement playlist size */
p_playlist
->
i_size
--
;
p_playlist
->
p_item
=
realloc
(
p_playlist
->
p_item
,
p_playlist
->
i_size
*
sizeof
(
playlist_item_t
)
);
intf_WarnMsg
(
3
,
"intf: removed `%s' from playlist"
,
psz_name
);
/* Delete the item */
free
(
psz_name
);
...
...
@@ -252,9 +252,9 @@ void intf_PlaylistDestroy( playlist_t * p_playlist )
void
intf_PlaylistJumpto
(
playlist_t
*
p_playlist
,
int
i_pos
)
{
vlc_mutex_lock
(
&
p_playlist
->
change_lock
);
p_playlist
->
i_index
=
i_pos
;
if
(
p_playlist
->
i_index
!=
-
1
)
{
if
(
p_playlist
->
current
.
psz_name
!=
NULL
)
...
...
@@ -270,7 +270,7 @@ void intf_PlaylistJumpto( playlist_t * p_playlist , int i_pos)
p_main
->
p_playlist
->
b_stopped
=
0
;
vlc_mutex_unlock
(
&
p_playlist
->
change_lock
);
}
}
/* URL-decode a file: URL path, return NULL if it's not what we expect */
void
intf_UrlDecode
(
char
*
encoded_path
)
...
...
@@ -282,11 +282,11 @@ void intf_UrlDecode( char *encoded_path )
{
return
;
}
cur
=
encoded_path
;
tmp
=
calloc
(
strlen
(
encoded_path
)
+
1
,
sizeof
(
char
)
);
while
(
(
ext
=
strchr
(
cur
,
'%'
)
)
!=
NULL
)
{
strncat
(
tmp
,
cur
,
(
ext
-
cur
)
/
sizeof
(
char
));
...
...
@@ -299,7 +299,7 @@ void intf_UrlDecode( char *encoded_path )
}
tmp
[
strlen
(
tmp
)]
=
(
char
)
realchar
;
cur
=
ext
+
2
;
}
...
...
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
);
#elif defined( SYS_LINUX ) || defined( WIN32 )
int
i_socket
;
int
i_fromlen
;
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
;
fd_set
fds
;
unsigned
int
i_rc
;
char
*
psz_channel_server
;
#if defined( SYS_LINUX ) || defined( WIN32 )
#define VLCS_VERSION 12
#define MESSAGE_LENGTH 80
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
;
struct
timeval
delay
;
fd_set
fds
;
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
;
/* Initializing the socket */
i_fd
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
)
;
intf_WarnMsg
(
2
,
"network: joining channel %d"
,
i_channel
);
/* 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
);
/*
* Initializing the socket
*/
i_socket
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
/*
* 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_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_family
=
AF_INET
;
sa_server
.
sin_family
=
AF_INET
;
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"
);
break
;
case
-
1
:
intf_DbgMsg
(
"vlcs: unable to receive the answer "
);
break
;
default:
recvfrom
(
i_socket
,
&
i_answer
,
sizeof
(
char
),
0
,
\
(
struct
sockaddr
*
)(
&
sa_client
),
&
i_fromlen
);
case
0
:
intf_ErrMsg
(
"network error: no answer from vlcs"
);
close
(
i_fd
);
return
-
1
;
break
;
case
-
1
:
intf_ErrMsg
(
"network error: error while listening to vlcs"
);
close
(
i_fd
);
return
-
1
;
break
;
}
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
)
{
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
;
}
break
;
if
(
!
strncasecmp
(
psz_mess
,
"E: "
,
3
)
)
{
intf_ErrMsg
(
"network error: vlcs said '%s'"
,
psz_mess
+
3
);
close
(
i_fd
);
return
-
1
;
}
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