]> git.sesse.net Git - vlc/commitdiff
(Hopefully) fixed the network connect() bug under UNIX. I need
authorChristophe Massiot <massiot@videolan.org>
Wed, 21 Nov 2001 16:47:46 +0000 (16:47 +0000)
committerChristophe Massiot <massiot@videolan.org>
Wed, 21 Nov 2001 16:47:46 +0000 (16:47 +0000)
confirmation that I didn't break the Win32 port, please.

src/input/input.c
src/misc/netutils.c

index 3190b3d081e40f54c0972e9dde69eda5cab6229c..f15b9d80e4c1e708da28463a1bfd671edc6ae9aa 100644 (file)
@@ -4,7 +4,7 @@
  * decoders.
  *****************************************************************************
  * Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: input.c,v 1.156 2001/11/15 18:50:49 sam Exp $
+ * $Id: input.c,v 1.157 2001/11/21 16:47:46 massiot Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *
@@ -731,7 +731,6 @@ static void NetworkOpen( input_thread_t * p_input )
     int                 i_opt;
     int                 i_opt_size;
     struct sockaddr_in  sock;
-    unsigned int        i_mc_group;
 
     /* Get the remote server */
     if( p_input->p_source != NULL )
@@ -895,15 +894,6 @@ static void NetworkOpen( input_thread_t * p_input )
         return;
     }
 
-    /* Required for IP_ADD_MEMBERSHIP */
-    i_mc_group = sock.sin_addr.s_addr;
-
-#if defined( WIN32 )
-    sock.sin_addr.s_addr = INADDR_ANY;
-    
-#define IN_MULTICAST(a)         IN_CLASSD(a)
-#endif
-
     /* Bind it */
     if( bind( p_input->i_handle, (struct sockaddr *)&sock, 
               sizeof( sock ) ) < 0 )
@@ -916,13 +906,18 @@ static void NetworkOpen( input_thread_t * p_input )
 
     /* Join the multicast group if the socket is a multicast address */
 
+#if defined( WIN32 )
+#   define IN_MULTICAST(a)         IN_CLASSD(a)
+#endif
+
+    /* TODO : make this compile under Win32 */
 #ifndef WIN32    
-    if( IN_MULTICAST( ntohl(i_mc_group) ) )
+    if( IN_MULTICAST( ntohl(sock.sin_addr.s_addr) ) )
     {
         struct ip_mreq imr;
 
-        imr.imr_interface.s_addr = htonl(INADDR_ANY);
-        imr.imr_multiaddr.s_addr = i_mc_group;
+        imr.imr_interface.s_addr = INADDR_ANY;
+        imr.imr_multiaddr.s_addr = sock.sin_addr.s_addr;
         if( setsockopt( p_input->i_handle, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                         (char*)&imr, sizeof(struct ip_mreq) ) == -1 )
         {
index 12c15503aad842a368483bff8b992f681f4fea4b..87f03249418a713bebbb700b85413f3e8e2e7617 100644 (file)
@@ -2,7 +2,7 @@
  * netutils.c: various network functions
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: netutils.c,v 1.46 2001/11/16 00:29:52 stef Exp $
+ * $Id: netutils.c,v 1.47 2001/11/21 16:47:46 massiot Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Benoit Steiner <benny@via.ecp.fr>
@@ -115,54 +115,41 @@ int network_BuildLocalAddr( struct sockaddr_in * p_socket, int i_port,
                             char * psz_broadcast )
 {
 #if defined( SYS_BEOS )
-    intf_ErrMsg( "error: channel changing is not yet supported under BeOS" );
+    intf_ErrMsg( "error: networking is not yet supported under BeOS" );
     return( 1 );
 
 #else
-    char                psz_hostname[INPUT_MAX_SOURCE_LENGTH];
-    struct hostent    * p_hostent;
-
     /* Reset struct */
     memset( p_socket, 0, sizeof( struct sockaddr_in ) );
     p_socket->sin_family = AF_INET;                                /* family */
     p_socket->sin_port = htons( i_port );
     if( psz_broadcast == NULL )
     {
-        /* Try to get our own IP */
-        if( gethostname( psz_hostname, sizeof(psz_hostname) ) )
-        {
-            intf_ErrMsg( "BuildLocalAddr : unable to resolve local name : %s",
-                         strerror( errno ) );
-            return( -1 );
-        }
-
+        p_socket->sin_addr.s_addr = INADDR_ANY;
     }
     else
     {
-        /* I didn't manage to make INADDR_ANYT work, even with setsockopt
-         * so, as it's kludgy to try and determine the broadcast addr
-         * it is passed as an argument in the command line */
-        strncpy( psz_hostname, psz_broadcast, INPUT_MAX_SOURCE_LENGTH );
-    }
+        struct hostent    * p_hostent;
 
-    /* Try to convert address directly from in_addr - this will work if
-     * psz_in_addr is dotted decimal. */
+        /* Try to convert address directly from in_addr - this will work if
+         * psz_broadcast is dotted decimal. */
 #ifdef HAVE_ARPA_INET_H
-    if( !inet_aton( psz_hostname, &p_socket->sin_addr) )
+        if( !inet_aton( psz_broadcast, &p_socket->sin_addr) )
 #else
-    if( (p_socket->sin_addr.s_addr = inet_addr( psz_hostname )) == -1 )
+        if( (p_socket->sin_addr.s_addr = inet_addr( psz_broadcast )) == -1 )
 #endif
-    {
-        /* We have a fqdn, try to find its address */
-        if ( (p_hostent = gethostbyname( psz_hostname )) == NULL )
         {
-            intf_ErrMsg( "BuildLocalAddr: unknown host %s", psz_hostname );
-            return( -1 );
+            /* We have a fqdn, try to find its address */
+            if ( (p_hostent = gethostbyname( psz_broadcast )) == NULL )
+            {
+                intf_ErrMsg( "BuildLocalAddr: unknown host %s", psz_broadcast );
+                return( -1 );
+            }
+
+            /* Copy the first address of the host in the socket address */
+            memcpy( &p_socket->sin_addr, p_hostent->h_addr_list[0],
+                     p_hostent->h_length );
         }
-
-        /* Copy the first address of the host in the socket address */
-        memcpy( &p_socket->sin_addr, p_hostent->h_addr_list[0],
-                 p_hostent->h_length );
     }
     return( 0 );
 #endif
@@ -174,7 +161,7 @@ int network_BuildLocalAddr( struct sockaddr_in * p_socket, int i_port,
 int network_BuildRemoteAddr( struct sockaddr_in * p_socket, char * psz_server )
 {
 #if defined( SYS_BEOS )
-    intf_ErrMsg( "error: channel changing is not yet supported under BeOS" );
+    intf_ErrMsg( "error: networking is not yet supported under BeOS" );
     return( 1 );
 
 #else