Commit f73d3dd2 authored by Alexis de Lattre's avatar Alexis de Lattre

* ipv4.c: IGMPv3 support (IP_ADD_SOURCE_MEMBERSHIP) for Win32

 * udp.c: restored the old syntax udp:server_addr@destination_addr
 * libvlc.h: updated 'vlc --help'

 To do an IGMPv3 query under Windows XP do:
 vlc udp:<source_addr>@<multicast_addr>
 Note: under previous versions of Windows, it will fail to join the group.
parent e4ee1c1b
$Id: NEWS,v 1.80 2004/01/23 11:54:48 rocky Exp $
$Id: NEWS,v 1.81 2004/01/31 18:02:31 alexis Exp $
Changes between 0.7.0 and 0.7.1:
---------------------------------
Core support:
* Fixed a nasty bug that causes preferences not to be saved some times.
* SVCD (Philips OGT) and CVD subtitles
* SVCD (Philips OGT) and CVD subtitles
* IGMPv3 support for VLC under Windows XP
Playlist:
* Internal improvments
......
......@@ -2,7 +2,7 @@
* udp.c: raw UDP & RTP input module
*****************************************************************************
* Copyright (C) 2001-2004 VideoLAN
* $Id: udp.c,v 1.28 2004/01/25 17:31:22 gbazin Exp $
* $Id: udp.c,v 1.29 2004/01/31 18:02:32 alexis Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Tristan Leteurtre <tooney@via.ecp.fr>
......@@ -193,19 +193,6 @@ static int Open( vlc_object_t *p_this )
i_bind_port = config_GetInt( p_this, "server-port" );
}
if( *psz_server_addr || i_server_port )
{
msg_Err( p_input, "this UDP syntax is deprecated; the server argument will be");
msg_Err( p_input, "ignored (%s:%d). If you wanted to enter a multicast address",
psz_server_addr, i_server_port);
msg_Err( p_input, "or local port, type : %s:@%s:%d",
*p_input->psz_access ? p_input->psz_access : "udp",
psz_server_addr, i_server_port );
i_server_port = 0;
psz_server_addr = "";
}
msg_Dbg( p_input, "opening server=%s:%d local=%s:%d",
psz_server_addr, i_server_port, psz_bind_addr, i_bind_port );
......
......@@ -2,10 +2,11 @@
* ipv4.c: IPv4 network abstraction layer
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
* $Id: ipv4.c,v 1.22 2004/01/15 14:57:00 gbazin Exp $
* $Id: ipv4.c,v 1.23 2004/01/31 18:02:32 alexis Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Mathias Kretschmer <mathias@research.att.com>
* Alexis de Lattre <alexis@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -281,7 +282,91 @@ static int OpenUDP( vlc_object_t * p_this, network_socket_t * p_socket )
}
}
#if !defined( UNDER_CE ) && !defined( SYS_BEOS )
#if defined( WIN32 )
/* Only Win32 has the support for IP_ADD_SOURCE_MEMBERSHIP
with the headers that are included */
/* Join the multicast group if the socket is a multicast address */
if( IN_MULTICAST( ntohl(sock.sin_addr.s_addr) ) )
{
/* Determine interface to be used for multicast */
char * psz_if_addr = config_GetPsz( p_this, "iface-addr" );
/* If we have a source address, we use IP_ADD_SOURCE_MEMBERSHIP
so that IGMPv3 aware OSes running on IGMPv3 aware networks
will do an IGMPv3 query on the network */
if( *psz_server_addr )
{
struct ip_mreq_source imr;
imr.imr_multiaddr.s_addr = sock.sin_addr.s_addr;
imr.imr_sourceaddr.s_addr = inet_addr(psz_server_addr);
if( psz_if_addr != NULL && *psz_if_addr
&& inet_addr(psz_if_addr) != INADDR_NONE )
{
imr.imr_interface.s_addr = inet_addr(psz_if_addr);
}
else
{
imr.imr_interface.s_addr = INADDR_ANY;
}
if( psz_if_addr != NULL ) free( psz_if_addr );
msg_Dbg( p_this, "IP_ADD_SOURCE_MEMBERSHIP multicast request" );
/* Join Multicast group with source filter */
if( setsockopt( i_handle, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,
(char*)&imr, sizeof(struct ip_mreq_source) ) == -1 )
{
#ifdef HAVE_ERRNO_H
msg_Err( p_this, "failed to join IP multicast group (%s)",
strerror(errno) );
#else
msg_Err( p_this, "failed to join IP multicast group" );
#endif
close( i_handle );
return( -1 );
}
}
/* If there is no source address, we use IP_ADD_MEMBERSHIP */
else
{
struct ip_mreq imr;
imr.imr_multiaddr.s_addr = sock.sin_addr.s_addr;
if( psz_if_addr != NULL && *psz_if_addr
&& inet_addr(psz_if_addr) != INADDR_NONE )
{
imr.imr_interface.s_addr = inet_addr(psz_if_addr);
}
else
{
imr.imr_interface.s_addr = INADDR_ANY;
}
if( psz_if_addr != NULL ) free( psz_if_addr );
msg_Dbg( p_this, "IP_ADD_MEMBERSHIP multicast request" );
/* Join Multicast group without source filter */
if( setsockopt( i_handle, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char*)&imr, sizeof(struct ip_mreq) ) == -1 )
{
#ifdef HAVE_ERRNO_H
msg_Err( p_this, "failed to join IP multicast group (%s)",
strerror(errno) );
#else
msg_Err( p_this, "failed to join IP multicast group" );
#endif
close( i_handle );
return( -1 );
}
}
}
#endif
#if !defined( UNDER_CE ) && !defined( SYS_BEOS ) && !defined( WIN32 )
/* This code is for the OSes that have multicast support but
don't have IP_ADD_SOURCE_MEMBERSHIP with the headers included */
/* Join the multicast group if the socket is a multicast address */
if( IN_MULTICAST( ntohl(sock.sin_addr.s_addr) ) )
{
......@@ -301,6 +386,7 @@ static int OpenUDP( vlc_object_t * p_this, network_socket_t * p_socket )
}
if( psz_if_addr != NULL ) free( psz_if_addr );
msg_Dbg( p_this, "IP_ADD_MEMBERSHIP multicast request" );
/* Join Multicast group */
if( setsockopt( i_handle, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char*)&imr, sizeof(struct ip_mreq) ) == -1 )
......@@ -315,7 +401,7 @@ static int OpenUDP( vlc_object_t * p_this, network_socket_t * p_socket )
return( -1 );
}
}
#endif /* UNDER_CE, SYS_BEOS */
#endif
if( *psz_server_addr )
{
......@@ -363,7 +449,7 @@ static int OpenUDP( vlc_object_t * p_this, network_socket_t * p_socket )
return( -1 );
}
}
#endif /* UNDER_CE, SYS_BEOS */
#endif
}
p_socket->i_handle = i_handle;
......
......@@ -2,7 +2,7 @@
* libvlc.h: main libvlc header
*****************************************************************************
* Copyright (C) 1998-2002 VideoLAN
* $Id: libvlc.h,v 1.131 2004/01/29 14:39:08 sigmunau Exp $
* $Id: libvlc.h,v 1.132 2004/01/31 18:02:32 alexis Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
......@@ -646,7 +646,7 @@ static char *ppsz_align_descriptions[] = { N_("Center"),
"\n DVD device" \
"\n [vcd:][device][@[title][,[chapter]]" \
"\n VCD device" \
"\n udpstream:[@[<bind address>][:<bind port>]]" \
"\n udpstream:[[<source address>]@[<bind address>][:<bind port>]]" \
"\n UDP stream sent by a streaming server" \
"\n vlc:pause pause execution of " \
"playlist items" \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment