]> git.sesse.net Git - vlc/commitdiff
fixed a segfault under windows.
authorArnaud Schauly <gitan@videolan.org>
Tue, 10 Dec 2002 00:02:29 +0000 (00:02 +0000)
committerArnaud Schauly <gitan@videolan.org>
Tue, 10 Dec 2002 00:02:29 +0000 (00:02 +0000)
modules/misc/sap.c

index 2fd8d36469c6896b9ddd751a8b0ae251ab3045b5..e4d0fc38b96ae14caeae4d59918c50a6717aa696 100644 (file)
@@ -2,7 +2,7 @@
  * sap.c :  SAP interface module
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: sap.c,v 1.4 2002/12/06 22:44:03 gitan Exp $
+ * $Id: sap.c,v 1.5 2002/12/10 00:02:29 gitan Exp $
  *
  * Authors: Arnaud Schauly <gitan@via.ecp.fr>
  *
@@ -10,7 +10,7 @@
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@@ -67,8 +67,8 @@
 #define MAX_LINE_LENGTH 256
 
 /* SAP is always on that port */
-#define HELLO_PORT 9875  
-#define HELLO_GROUP "239.255.255.255"   
+#define HELLO_PORT 9875
+#define HELLO_GROUP "224.2.127.254"
 #define ADD_SESSION 1
 
 /*****************************************************************************
@@ -81,7 +81,7 @@ typedef struct sess_descr_t sess_descr_t;
 static int  Activate     ( vlc_object_t * );
 static void Run          ( intf_thread_t *p_intf );
 static int Kill          ( intf_thread_t * );
-        
+
 static ssize_t NetRead    ( intf_thread_t*, int , byte_t *, size_t );
 
 /* playlist related functions */
@@ -95,7 +95,7 @@ static sess_descr_t *  parse_sdp( char *,intf_thread_t * ) ;
 /* specific sdp fields parsing */
 
 static void cfield_parse( char *, char ** );
-static void mfield_parse( char *psz_mfield, char **ppsz_proto, 
+static void mfield_parse( char *psz_mfield, char **ppsz_proto,
                char **ppsz_port );
 
 static void free_sd( sess_descr_t * );
@@ -104,19 +104,19 @@ static int  ismult( char * );
 /* The struct that contains sdp informations */
 struct  sess_descr_t {
     char *psz_version;
-    char *psz_origin; 
-    char *psz_sessionname; 
-    char *psz_information; 
-    char *psz_uri; 
+    char *psz_origin;
+    char *psz_sessionname;
+    char *psz_information;
+    char *psz_uri;
     char *psz_emails;
-    char *psz_phone;  
-    char *psz_time;  
-    char *psz_repeat; 
-    char *psz_attribute; 
-    char *psz_connection; 
+    char *psz_phone;
+    char *psz_time;
+    char *psz_repeat;
+    char *psz_attribute;
+    char *psz_connection;
     int  i_media;
-    media_descr_t ** pp_media; 
-};  
+    media_descr_t ** pp_media;
+};
 
 /* All this informations are not useful yet.  */
 struct media_descr_t {
@@ -129,7 +129,7 @@ struct media_descr_t {
  *****************************************************************************/
 vlc_module_begin();
     add_category_hint( N_("SAP"), NULL );
-        add_string( "sap-addr", NULL, NULL, 
+        add_string( "sap-addr", NULL, NULL,
                      "SAP multicast address", "SAP multicast address" );
     set_description( _("SAP interface module") );
     set_capability( "interface", 0 );
@@ -164,14 +164,14 @@ static void Run( intf_thread_t *p_intf )
 
     module_t            *p_network;
     network_socket_t    socket_desc;
-    
+
     psz_buf = NULL;
 
     if( !(psz_addr = config_GetPsz( p_intf, "sap-addr" ) ) )
     {
         psz_addr = strdup( HELLO_GROUP );
     }
-    
+
     /* Prepare the network_socket_t structure */
     socket_desc.i_type = NETWORK_UDP;
     socket_desc.psz_bind_addr = psz_addr;
@@ -180,8 +180,8 @@ static void Run( intf_thread_t *p_intf )
     socket_desc.i_server_port     = 0;
     p_intf->p_private = (void*) &socket_desc;
 
-    psz_network = "ipv4"; // FIXME 
-    
+    psz_network = "ipv4"; // FIXME
+
     /* Create, Bind the socket, ... with the appropriate module  */
 
     if( !( p_network = module_Need( p_intf, "network", psz_network ) ) )
@@ -189,26 +189,25 @@ static void Run( intf_thread_t *p_intf )
         msg_Err( p_intf, "failed to open a connection (udp)" );
         return;
     }
-    module_Unneed( p_intf, p_network ); 
+    module_Unneed( p_intf, p_network );
 
     fd = socket_desc.i_handle;
-    
+
 
     /* read SAP packets */
-    
-    psz_buf = malloc( 2000 ); 
+
+    psz_buf = malloc( 2000 );
 
     while( !p_intf->b_die )
     {
         int i_read;
-        
         addrlen=sizeof(addr);
-    
-    
+
+
         memset(psz_buf, 0, 2000);
-        
+
         i_read = NetRead( p_intf, fd, psz_buf, 2000 );
-        
+
         if( i_read < 0 )
         {
             msg_Err( p_intf, "Cannot read in the socket" );
@@ -220,12 +219,12 @@ static void Run( intf_thread_t *p_intf )
 
 
         packet_handle( p_intf,  &psz_buf );
-                                   
+
     }
     free( psz_buf );
 
     /* Closing socket */
-    
+
 #ifdef UNDER_CE
     CloseHandle( socket_desc.i_handle );
 #elif defined( WIN32 )
@@ -233,13 +232,13 @@ static void Run( intf_thread_t *p_intf )
 #else
     close( socket_desc.i_handle );
 #endif
-                
+
 }
 
 /********************************************************************
- * Kill 
+ * Kill
  *******************************************************************
- * Kills the SAP interface. 
+ * Kills the SAP interface.
  ********************************************************************/
 static int Kill( intf_thread_t *p_intf )
 {
@@ -250,11 +249,11 @@ static int Kill( intf_thread_t *p_intf )
 }
 
 /*******************************************************************
- * sess_toitem : changes a sess_descr_t into a hurd of 
+ * sess_toitem : changes a sess_descr_t into a hurd of
  * playlist_item_t, which are enqueued.
  *******************************************************************
  * Note : does not support sessions that take place on consecutive
- * port or adresses yet. 
+ * port or adresses yet.
  *******************************************************************/
 
 static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
@@ -266,11 +265,10 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
     int i_multicast;
     int i_count;
     playlist_t *p_playlist;
-    
-    psz_uri_default = NULL; 
 
+    psz_uri_default = NULL;
     cfield_parse( p_sd->psz_connection, &psz_uri_default );
-    
+
     for( i_count=0 ; i_count <= p_sd->i_media ; i_count ++ )
     {
 
@@ -278,22 +276,22 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
         p_item->psz_name = strdup( p_sd->psz_sessionname );
         p_item->i_type = 0;
         p_item->i_status = 0;
-        p_item->b_autodeletion = VLC_FALSE; 
+        p_item->b_autodeletion = VLC_FALSE;
         p_item->psz_uri = NULL;
 
         psz_uri = NULL;
-        
+
         /* Build what we have to put in p_item->psz_uri, with the m and
          *  c fields  */
-        
+
         if( !p_sd->pp_media[i_count] )
         {
             return 0;
         }
-    
-        mfield_parse( p_sd->pp_media[i_count]->psz_medianame, 
-                        & psz_proto, & psz_port ); 
-    
+
+        mfield_parse( p_sd->pp_media[i_count]->psz_medianame,
+                        & psz_proto, & psz_port );
+
         if( !psz_proto || !psz_port )
         {
             return 0;
@@ -301,10 +299,10 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
 
         if( p_sd->pp_media[i_count]->psz_mediaconnection )
         {
-            cfield_parse( p_sd->pp_media[i_count]->psz_mediaconnection, 
+            cfield_parse( p_sd->pp_media[i_count]->psz_mediaconnection,
                             & psz_uri );
         }
-        else 
+        else
         {
             psz_uri = NULL;
         }
@@ -323,38 +321,39 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
 
 
         /* Filling p_item->psz_uri */
-        i_multicast = ismult( psz_uri );       
-        p_item->psz_uri = malloc( strlen( psz_proto ) + strlen( psz_uri ) + 
+        i_multicast = ismult( psz_uri );
+
+        p_item->psz_uri = malloc( strlen( psz_proto ) + strlen( psz_uri ) +
                         strlen( psz_port ) + 5 +i_multicast );
         if( p_item->psz_uri == NULL )
         {
             msg_Err( p_intf, "Not enough memory");
             return 0;
         }
-        
+
         if( i_multicast == 1)
         {
-            sprintf( p_item->psz_uri, "%s://@%s:%s", psz_proto, 
+            sprintf( p_item->psz_uri, "%s://@%s:%s", psz_proto,
                             psz_uri, psz_port );
         }
-        else 
+        else
         {
-            sprintf( p_item->psz_uri, "%s://%s:%s", psz_proto, 
+            sprintf( p_item->psz_uri, "%s://%s:%s", psz_proto,
                             psz_uri, psz_port );
         }
 
         /* Enqueueing p_item in the playlist */
-        
+
         if( p_item )
         {
             p_playlist = vlc_object_find( p_intf,
             VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
-    
+
             playlist_AddItem ( p_playlist, p_item,
             PLAYLIST_CHECK_INSERT, PLAYLIST_END);
             vlc_object_release( p_playlist );
         }
-       
+
 
     }
 
@@ -366,29 +365,29 @@ static int sess_toitem( intf_thread_t * p_intf, sess_descr_t * p_sd )
 /**********************************************************************
  * cfield_parse
  *********************************************************************
- * put into *ppsz_uri, the the uri in the cfield, psz_cfield. 
+ * put into *ppsz_uri, the the uri in the cfield, psz_cfield.
  *********************************************************************/
 
 static void cfield_parse( char *psz_cfield, char **ppsz_uri )
 {
 
-    char *psz_pos; 
+    char *psz_pos;
     if( psz_cfield )
     {
         psz_pos = psz_cfield;
-        
-        while( *psz_pos && *psz_pos != ' ' && *psz_pos !='\0' )
+
+        while( *psz_pos != ' ' && *psz_pos !='\0' )
         {
             psz_pos++;
         }
         psz_pos++;
-        while( *psz_pos && *psz_pos != ' ' && *psz_pos !='\0' )
+        while( *psz_pos != ' ' && *psz_pos !='\0' )
         {
             psz_pos++;
         }
         psz_pos++;
-        *ppsz_uri = psz_pos; 
-        while( *psz_pos && *psz_pos != ' ' && *psz_pos !='/' 
+        *ppsz_uri = psz_pos;
+        while( *psz_pos != ' ' && *psz_pos !='/'
                         && *psz_pos != '\0' )
         {
             psz_pos++;
@@ -400,51 +399,52 @@ static void cfield_parse( char *psz_cfield, char **ppsz_uri )
     {
         ppsz_uri = NULL;
     }
-    
-    return; 
+
+    return;
 
 }
 
 /**********************************************************************
- * mcfield_parse
+ * mfield_parse
  *********************************************************************
- * put into *ppsz_proto, and *ppsz_port, the protocol and the port. 
+ * put into *ppsz_proto, and *ppsz_port, the protocol and the port.
  *********************************************************************/
 
 
-static void mfield_parse( char *psz_mfield, char **ppsz_proto, 
+static void mfield_parse( char *psz_mfield, char **ppsz_proto,
                char **ppsz_port )
 {
-    char *psz_pos; 
+    char *psz_pos;
     if( psz_mfield )
     {
         psz_pos = psz_mfield;
-        while( *psz_pos && *psz_pos != ' ' )
+        while( *psz_pos != '\0' && *psz_pos != ' ' )
         {
             psz_pos++;
         }
         psz_pos++;
         *ppsz_port = psz_pos;
-        while( *psz_pos && *psz_pos !=' ' && *psz_pos!='/' )
+        while( *psz_pos != '\0' && *psz_pos && *psz_pos !=' ' && *psz_pos!='/' )
         {
-            psz_pos++;  
+            psz_pos++;
         }
         if( *psz_pos == '/' )  // FIXME does not support multi-port
         {
             *psz_pos = '\0';
-            while( *psz_pos && *psz_pos !=' ' )
+            psz_pos++;
+            while( *psz_pos != '\0' && *psz_pos !=' ' )
             {
             psz_pos++;
             }
-        } 
+        }
         *psz_pos = '\0';
         psz_pos++;
         *ppsz_proto = psz_pos;
-        while( *psz_pos && *psz_pos !=' ' && *psz_pos!='\0' &&
+        while( *psz_pos!='\0' && *psz_pos !=' ' && 
                         *psz_pos!='/' )
         {
             *psz_pos = tolower( *psz_pos );
-            psz_pos++; 
+            psz_pos++;
         }
         *psz_pos = '\0';
     }
@@ -459,7 +459,7 @@ static void mfield_parse( char *psz_mfield, char **ppsz_proto,
 /***********************************************************************
  * parse_sap : Takes care of the SAP headers
  ***********************************************************************
- * checks if the packet has the true headers ; 
+ * checks if the packet has the true headers ;
  ***********************************************************************/
 
 static int parse_sap( char **  ppsz_sa_packet ) {  /* Dummy Parser : does nothing !*/
@@ -468,30 +468,29 @@ static int parse_sap( char **  ppsz_sa_packet ) {  /* Dummy Parser : does nothin
 }
 
 /*************************************************************************
- * packet_handle : handle the received packet and enques the 
+ * packet_handle : handle the received packet and enques the
  * the understated session
  *************************************************************************/
 
 static int packet_handle( intf_thread_t * p_intf, char **  ppsz_packet )  {
     int j=0;
     sess_descr_t * p_sd;
-/*    playlist_t *p_playlist;
-    playlist_item_t *p_item; */
 
-    j=parse_sap( ppsz_packet ); 
-    
+    j=parse_sap( ppsz_packet );
+
     if(j != 0) {
-        p_sd = parse_sdp( *ppsz_packet, p_intf ); 
-        
-        
+
+        p_sd = parse_sdp( *ppsz_packet, p_intf );
+
+
         sess_toitem ( p_intf, p_sd );
 
         free_sd ( p_sd );
         return 1;
     }
-    return 0; // Invalid Packet 
+    return 0; // Invalid Packet
 }
-        
+
 
 
 
@@ -501,13 +500,13 @@ static int packet_handle( intf_thread_t * p_intf, char **  ppsz_packet )  {
  * Make a sess_descr_t with a psz
  ***********************************************************************/
 
-static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf ) 
+static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf )
 {
     int j,k;
     char **  ppsz_fill=NULL;
     sess_descr_t *  sd;
-    
-    sd = malloc( sizeof(sess_descr_t) ); 
+
+    sd = malloc( sizeof(sess_descr_t) );
 
 
     if( sd == NULL )
@@ -517,9 +516,9 @@ static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf )
     else
     {
         sd->pp_media = NULL;
-        sd->psz_origin = NULL; 
-        sd->psz_sessionname = NULL; 
-        sd->psz_information = NULL; 
+        sd->psz_origin = NULL;
+        sd->psz_sessionname = NULL;
+        sd->psz_information = NULL;
         sd->psz_uri = NULL;
         sd->psz_emails = NULL;
         sd->psz_phone = NULL;
@@ -529,17 +528,17 @@ static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf )
         sd->psz_connection = NULL;
 
         sd->i_media=-1;
-        j=0; 
-        while( psz_pct[j]!=EOF 
+        j=0;
+        while( psz_pct[j]!=EOF && psz_pct[j] != '\0' )
         {
            j++;
-           if (psz_pct[j] == '=') 
-           { 
+           if (psz_pct[j] == '=')
+           {
                switch(psz_pct[(j-1)]) {
                case ('v') : {
                      ppsz_fill = & sd->psz_version;
                      break;
-                } 
+                }
                 case ('o') : {
                    ppsz_fill = & sd->psz_origin;
                    break;
@@ -579,16 +578,16 @@ static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf )
                 case ('m') : {
                    sd->i_media++;
                    if( sd->pp_media ) {
-                       sd->pp_media = realloc( sd->pp_media, 
+                       sd->pp_media = realloc( sd->pp_media,
                                 ( sizeof( void * )  * (sd->i_media + 1)) );
                    }
-                   else  
+                   else
                    {
                        sd->pp_media = malloc( sizeof ( void * ) );
-                   } 
-                   sd->pp_media[sd->i_media] = 
+                   }
+                   sd->pp_media[sd->i_media] =
                            malloc( sizeof( media_descr_t ) );
-                   
+
                    sd->pp_media[sd->i_media]->psz_medianame = NULL;
                    sd->pp_media[sd->i_media]->psz_mediaconnection = NULL;
 
@@ -596,11 +595,11 @@ static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf )
                    break;
                 }
                 case ('c') : {
-                   if( sd->i_media == -1 ) 
+                   if( sd->i_media == -1 )
                    {
                        ppsz_fill = & sd->psz_connection;
                    }
-                   else 
+                   else
                    {
                        ppsz_fill = & sd->pp_media[sd->i_media]->
                                psz_mediaconnection;
@@ -608,19 +607,19 @@ static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf )
                    break;
                 }
 
-                default : { 
-               msg_Info( p_intf, "Warning : Ignored field \"%c\" ",
-                               psz_pct[j-1] ); 
+                default : {
                    ppsz_fill = NULL;
                 }
 
 
-             } 
+             }
           k=0;j++;
+
           while (psz_pct[j] != '\n'&& psz_pct[j] != EOF) {
              k++; j++;
           }
           j--;
+
           if( ppsz_fill != NULL )
           {
               *ppsz_fill= malloc( sizeof(char) * (k+1) );
@@ -637,11 +636,12 @@ static sess_descr_t *  parse_sdp( char *  psz_pct, intf_thread_t * p_intf )
 
 #define FREE( p ) \
     if( p ) { free( p ); (p) = NULL; }
-static void free_sd( sess_descr_t * p_sd ) 
+static void free_sd( sess_descr_t * p_sd )
 {
     int i;
     if( p_sd )
     {
+
     FREE( p_sd->psz_origin );
     FREE( p_sd->psz_sessionname );
     FREE( p_sd->psz_information );
@@ -661,7 +661,7 @@ static void free_sd( sess_descr_t * p_sd )
             FREE( p_sd->pp_media[i]->psz_mediaconnection );
         }
         FREE( p_sd->pp_media );
-    }  
+    }
     free( p_sd );
     }
     else
@@ -681,20 +681,21 @@ static int ismult( char *psz_uri )
     int i;
 
     psz_c = malloc( 3 );
-    
+
     memcpy( psz_c, psz_uri, 3 );
     if( psz_c[2] == '.' || psz_c[1] == '.' )
     {
         free( psz_c );
         return 0;
     }
-    
+
     i = atoi( psz_c );
     if( i < 224 )
     {
         free( psz_c );
         return 0;
     }
+
     free( psz_c );
     return 1;
 }
@@ -704,29 +705,29 @@ static int ismult( char *psz_uri )
  *****************************************************************************
  * Taken from udp.c
  ******************************************************************************/
-static ssize_t NetRead( intf_thread_t *p_intf, 
+static ssize_t NetRead( intf_thread_t *p_intf,
                         int i_handle, byte_t *p_buffer, size_t i_len)
 {
 #ifdef UNDER_CE
     return -1;
-    
+
 #else
     struct timeval  timeout;
     fd_set          fds;
     int             i_ret;
-    
+
     /* Initialize file descriptor set */
     FD_ZERO( &fds );
     FD_SET( i_handle, &fds );
-    
+
     /* We'll wait 0.5 second if nothing happens */
     timeout.tv_sec = 0;
     timeout.tv_usec = 500000;
-    
+
     /* Find if some data is available */
     i_ret = select( i_handle + 1, &fds,
     NULL, NULL, &timeout );
-    
+
     if( i_ret == -1 && errno != EINTR )
     {
         msg_Err( p_intf, "network select error (%s)", strerror(errno) );
@@ -734,15 +735,15 @@ static ssize_t NetRead( intf_thread_t *p_intf,
     else if( i_ret > 0 )
     {
         ssize_t i_recv = recv( i_handle, p_buffer, i_len, 0 );
-    
+
         if( i_recv < 0 )
         {
            msg_Err( p_intf, "recv failed (%s)", strerror(errno) );
         }
-    
+
         return i_recv;
     }
-    
+
     return 0;
 
 #endif