]> git.sesse.net Git - vlc/blobdiff - src/network/udp.c
Doxygenization
[vlc] / src / network / udp.c
index db079d79e10f77f458bbe117e2d498d47bf2a44a..92a2c0d23411e1bc6539758de8a0bacbd6a867f1 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * udp.c:
  *****************************************************************************
- * Copyright (C) 2004-2005 the VideoLAN team
+ * Copyright (C) 2004-2006 the VideoLAN team
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@videolan.org>
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
 
 #include <errno.h>
 
-#ifdef HAVE_FCNTL_H
-#   include <fcntl.h>
-#endif
 #ifdef HAVE_SYS_TIME_H
 #    include <sys/time.h>
 #endif
-#ifdef HAVE_UNISTD_H
-#   include <unistd.h>
-#endif
 
 #include "network.h"
 
 #       define IP_ADD_MEMBERSHIP 5
 #   endif
 #   define EAFNOSUPPORT WSAEAFNOSUPPORT
+#   define if_nametoindex( str ) atoi( str )
+#else
+#   include <unistd.h>
+#   ifdef HAVE_NET_IF_H
+#       include <net/if.h>
+#   endif
 #endif
 
 #ifndef SOL_IP
@@ -109,42 +109,60 @@ static int net_SetMcastHopLimit( vlc_object_t *p_this,
 }
 
 
-static int net_SetMcastSource( vlc_object_t *p_this,
-                                int fd, int family, const char *str )
+static int net_SetMcastIface( vlc_object_t *p_this,
+                              int fd, int family, const char *str )
 {
-#ifndef SYS_BEOS
     switch( family )
     {
+#ifndef SYS_BEOS
         case AF_INET:
         {
             struct in_addr addr;
 
             if( inet_pton( AF_INET, str, &addr) <= 0 )
             {
-                msg_Err( p_this, "Invalid multicast interface %s",
-                         str );
+                msg_Err( p_this, "Invalid multicast interface %s", str );
                 return VLC_EGENERIC;
             }
 
-            if( setsockopt( fd, IPPROTO_IP, IP_MULTICAST_IF, &addr,
+            if( setsockopt( fd, SOL_IP, IP_MULTICAST_IF, &addr,
                             sizeof( addr ) ) < 0 )
             {
-                msg_Dbg( p_this, "Cannot set multicast interface (%s)",
-                         strerror(errno) );
+                msg_Err( p_this, "Cannot use %s as multicast interface: %s",
+                         str, strerror(errno) );
                 return VLC_EGENERIC;
             }
             break;
         }
+#endif /* SYS_BEOS */
 
 #ifdef IPV6_MULTICAST_IF
-/* FIXME: TODO */
+        case AF_INET6:
+        {
+            int scope = if_nametoindex( str );
+
+            if( scope == 0 )
+            {
+                msg_Err( p_this, "Invalid multicast interface %s", str );
+                return VLC_EGENERIC;
+            }
+
+            if( setsockopt( fd, SOL_IPV6, IPV6_MULTICAST_IF,
+                            &scope, sizeof( scope ) ) < 0 )
+            {
+                msg_Err( p_this, "Cannot use %s as multicast interface: %s",
+                         str, strerror( errno ) );
+                return VLC_EGENERIC;
+            }
+            break;
+        }
 #endif
+
         default:
             msg_Warn( p_this, "%s", strerror( EAFNOSUPPORT ) );
             return VLC_EGENERIC;
     }
 
-#endif
     return VLC_SUCCESS;
 }
 
@@ -165,11 +183,7 @@ int __net_ConnectUDP( vlc_object_t *p_this, const char *psz_host, int i_port,
         i_port = 1234; /* historical VLC thing */
 
     if( i_hlim < 1 )
-    {
         i_hlim = var_CreateGetInteger( p_this, "ttl" );
-        if( i_hlim < 1 )
-            i_hlim = 1;
-    }
 
     memset( &hints, 0, sizeof( hints ) );
     hints.ai_socktype = SOCK_DGRAM;
@@ -187,7 +201,7 @@ int __net_ConnectUDP( vlc_object_t *p_this, const char *psz_host, int i_port,
     for( ptr = res; ptr != NULL; ptr = ptr->ai_next )
     {
         int fd;
-        char *psz_mif_addr;
+        char *psz_mif;
 
         fd = net_Socket( p_this, ptr->ai_family, ptr->ai_socktype,
                          ptr->ai_protocol );
@@ -209,17 +223,19 @@ int __net_ConnectUDP( vlc_object_t *p_this, const char *psz_host, int i_port,
 
             /* Allow broadcast sending */
             i_val = 1;
-            setsockopt( i_handle, SOL_SOCKET, SO_BROADCAST, (void*)&i_val,
+            setsockopt( fd, SOL_SOCKET, SO_BROADCAST, (void*)&i_val,
                         sizeof( i_val ) );
         }
 #endif
 
-        net_SetMcastHopLimit( p_this, fd, ptr->ai_family, i_hlim );
-        psz_mif_addr = config_GetPsz( p_this, "miface-addr" );
-        if( psz_mif_addr != NULL )
+        if( i_hlim > 0 )
+            net_SetMcastHopLimit( p_this, fd, ptr->ai_family, i_hlim );
+        psz_mif = config_GetPsz( p_this, (ptr->ai_family != AF_INET)
+                                            ? "miface" : "miface-addr" );
+        if( psz_mif != NULL )
         {
-            net_SetMcastSource( p_this, fd, ptr->ai_family, psz_mif_addr );
-            free( psz_mif_addr );
+            net_SetMcastIface( p_this, fd, ptr->ai_family, psz_mif );
+            free( psz_mif );
         }
 
         if( connect( fd, ptr->ai_addr, ptr->ai_addrlen ) == 0 )
@@ -270,12 +286,12 @@ int __net_OpenUDP( vlc_object_t *p_this, const char *psz_bind, int i_bind,
     network_socket_t sock;
     module_t         *p_network = NULL;
 
-    if( ( psz_server != NULL ) && ( psz_server[0] == '\0' ) )
+/*    if( ( psz_server != NULL ) && ( psz_server[0] == '\0' ) )
         msg_Warn( p_this, "calling net_OpenUDP with an explicit destination "
                   "is obsolete - use net_ConnectUDP instead" );
     if( i_server != 0 )
         msg_Warn( p_this, "calling net_OpenUDP with an explicit destination "
-                  "port is obsolete - use __net_ConnectUDP instead" );
+                  "port is obsolete - use __net_ConnectUDP instead" );*/
 
     if( psz_server == NULL ) psz_server = "";
     if( psz_bind == NULL ) psz_bind = "";
@@ -341,8 +357,8 @@ int __net_OpenUDP( vlc_object_t *p_this, const char *psz_bind, int i_bind,
         {
             if( sock.i_handle != -1 )
             {
-                msg_Warn( p_this, "net: lame IPv6/IPv4 dual-stack present. "
-                                  "Using only IPv4." );
+                msg_Warn( p_this, "net: lame IPv6/IPv4 dual-stack present, "
+                                  "using only IPv4." );
                 net_Close( fd6 );
             }
             else