]> git.sesse.net Git - vlc/blobdiff - modules/control/http/mvar.c
DBus: remove unused macro, check memory allocation
[vlc] / modules / control / http / mvar.c
index a391b7ea1d3b292f04c189ed2092fb5ec83cd880..ae87e711bf4822e2299c88147198cde705a6d76b 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * mvar.c : Variables handling for the HTTP Interface
  *****************************************************************************
- * Copyright (C) 2001-2006 the VideoLAN team
+ * Copyright (C) 2001-2007 the VideoLAN team
  * $Id$
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
 
 #include "http.h"
+#include <limits.h>
 
 /* Utility function for scandir */
 static int Filter( const char *foo )
@@ -126,33 +130,26 @@ void E_(mvar_RemoveVar)( mvar_t *v, mvar_t *f )
 
 mvar_t *E_(mvar_GetVar)( mvar_t *s, const char *name )
 {
-    int i;
-    char base[512], *field, *p;
-    int  i_index;
-
     /* format: name[index].field */
+    const char *field = strchr( name, '.' );
+    char base[1 + (field ? (size_t)(field - name) : strlen( name ))];
+    char *p;
+    int i_index, i;
 
-    field = strchr( name, '.' );
-    if( field )
-    {
-        int i = field - name;
-        strncpy( base, name, i );
-        base[i] = '\0';
+    strlcpy( base, name, sizeof (base) );
+    if( field != NULL )
         field++;
-    }
-    else
-    {
-        strcpy( base, name );
-    }
 
-    if( ( p = strchr( base, '[' ) ) )
+    if( ( p = strchr( base, '[' ) ) != NULL )
     {
-        *p++ = '\0';
-        sscanf( p, "%d]", &i_index );
-        if( i_index < 0 )
-        {
+        char *end;
+        unsigned long l = strtoul( p, &end, 0 );
+
+        if( ( l > INT_MAX ) || strcmp( "]", end ) )
             return NULL;
-        }
+
+        *p++ = '\0';
+        i_index = (int)l;
     }
     else
     {
@@ -287,71 +284,54 @@ mvar_t *E_(mvar_IntegerSetNew)( const char *name, const char *arg )
 mvar_t *E_(mvar_PlaylistSetNew)( intf_thread_t *p_intf, char *name,
                                  playlist_t *p_pl )
 {
-    playlist_view_t *p_view;
     mvar_t *s = E_(mvar_New)( name, "set" );
-
-
     vlc_mutex_lock( &p_pl->object_lock );
-
-    p_view = playlist_ViewFind( p_pl, VIEW_CATEGORY ); /* FIXME */
-
-    if( p_view != NULL )
-        E_(PlaylistListNode)( p_intf, p_pl, p_view->p_root, name, s, 0 );
-
+    E_(PlaylistListNode)( p_intf, p_pl, p_pl->p_root_category , name, s, 0 );
     vlc_mutex_unlock( &p_pl->object_lock );
-
     return s;
 }
 
-mvar_t *E_(mvar_InfoSetNew)( intf_thread_t *p_intf, char *name,
-                             input_thread_t *p_input )
+mvar_t *E_(mvar_InfoSetNew)( char *name, input_thread_t *p_input )
 {
     mvar_t *s = E_(mvar_New)( name, "set" );
     int i, j;
 
-    if( p_input == NULL )
+    if( p_input == NULL || p_input->p == NULL /* workarround assert in input_GetItem */ )
     {
         return s;
     }
 
-    vlc_mutex_lock( &p_input->input.p_item->lock );
-    for ( i = 0; i < p_input->input.p_item->i_categories; i++ )
+    vlc_mutex_lock( &input_GetItem(p_input)->lock );
+    for ( i = 0; i < input_GetItem(p_input)->i_categories; i++ )
     {
-        info_category_t *p_category = p_input->input.p_item->pp_categories[i];
-        char *psz;
+        info_category_t *p_category = input_GetItem(p_input)->pp_categories[i];
 
         mvar_t *cat  = E_(mvar_New)( name, "set" );
         mvar_t *iset = E_(mvar_New)( "info", "set" );
 
-        psz = E_(FromUTF8)( p_intf, p_category->psz_name );
-        E_(mvar_AppendNewVar)( cat, "name", psz );
-        free( psz );
+        E_(mvar_AppendNewVar)( cat, "name", p_category->psz_name );
         E_(mvar_AppendVar)( cat, iset );
 
         for ( j = 0; j < p_category->i_infos; j++ )
         {
             info_t *p_info = p_category->pp_infos[j];
             mvar_t *info = E_(mvar_New)( "info", "" );
-            char *psz_name = E_(FromUTF8)( p_intf, p_info->psz_name );
-            char *psz_value = E_(FromUTF8)( p_intf, p_info->psz_value );
 
             /* msg_Dbg( p_input, "adding info name=%s value=%s",
                      psz_name, psz_value ); */
-            E_(mvar_AppendNewVar)( info, "name",  psz_name );
-            E_(mvar_AppendNewVar)( info, "value", psz_value );
-            free( psz_name );
-            free( psz_value );
+            E_(mvar_AppendNewVar)( info, "name",  p_info->psz_name );
+            E_(mvar_AppendNewVar)( info, "value", p_info->psz_value );
             E_(mvar_AppendVar)( iset, info );
         }
         E_(mvar_AppendVar)( s, cat );
     }
-    vlc_mutex_unlock( &p_input->input.p_item->lock );
+    vlc_mutex_unlock( &input_GetItem(p_input)->lock );
 
     return s;
 }
 
 mvar_t *E_(mvar_ObjectSetNew)( intf_thread_t *p_intf, char *psz_name,
-                               char *psz_capability )
+                               const char *psz_capability )
 {
     mvar_t *s = E_(mvar_New)( psz_name, "set" );
     int i;
@@ -362,13 +342,11 @@ mvar_t *E_(mvar_ObjectSetNew)( intf_thread_t *p_intf, char *psz_name,
     for( i = 0; i < p_list->i_count; i++ )
     {
         module_t *p_parser = (module_t *)p_list->p_values[i].p_object;
-        if( !strcmp( p_parser->psz_capability, psz_capability ) )
+        if( module_IsCapable( p_parser, psz_capability ) )
         {
-            mvar_t *sd = E_(mvar_New)( "sd", p_parser->psz_object_name );
+            mvar_t *sd = E_(mvar_New)( "sd", module_GetObjName( p_parser ) );
             E_(mvar_AppendNewVar)( sd, "name",
-                p_parser->psz_longname ? p_parser->psz_longname
-                : ( p_parser->psz_shortname ? p_parser->psz_shortname
-                : p_parser->psz_object_name ) );
+                                   module_GetName( p_parser, VLC_TRUE ) );
             E_(mvar_AppendVar)( s, sd );
         }
     }
@@ -442,11 +420,10 @@ mvar_t *E_(mvar_InputVarSetNew)( intf_thread_t *p_intf, char *name,
         {
         case VLC_VAR_STRING:
             itm = E_(mvar_New)( name, "set" );
-            psz = E_(FromUTF8)( p_intf, text_list.p_list->p_values[i].psz_string );
+            /* FIXME: Memory leak here?? (remove strdup?) */
+            psz = strdup( text_list.p_list->p_values[i].psz_string );
             E_(mvar_AppendNewVar)( itm, "name", psz );
-            psz = E_(FromUTF8)( p_intf, val_list.p_list->p_values[i].psz_string );
-            E_(mvar_AppendNewVar)( itm, "id", psz );
-            free( psz );
+            E_(mvar_AppendNewVar)( itm, "id", val_list.p_list->p_values[i].psz_string );
             snprintf( psz_int, sizeof(psz_int), "%d",
                       ( !strcmp( val.psz_string,
                                    val_list.p_list->p_values[i].psz_string )
@@ -457,7 +434,7 @@ mvar_t *E_(mvar_InputVarSetNew)( intf_thread_t *p_intf, char *name,
 
         case VLC_VAR_INTEGER:
             itm = E_(mvar_New)( name, "set" );
-            psz = E_(FromUTF8)( p_intf, text_list.p_list->p_values[i].psz_string );
+            psz = strdup( text_list.p_list->p_values[i].psz_string );
             E_(mvar_AppendNewVar)( itm, "name", psz );
             snprintf( psz_int, sizeof(psz_int), "%d",
                       val_list.p_list->p_values[i].i_int );
@@ -531,13 +508,6 @@ mvar_t *E_(mvar_FileSetNew)( intf_thread_t *p_intf, char *name,
 #endif
     char        **ppsz_dir_content;
     int           i_dir_content, i;
-    /* convert all / to native separator */
-#if defined( WIN32 )
-    const char sep = '\\';
-#else
-    const char sep = '/';
-#endif
-
     psz_dir = E_(RealPath)( p_intf, psz_dir );
 
 #ifdef HAVE_SYS_STAT_H
@@ -557,44 +527,37 @@ mvar_t *E_(mvar_FileSetNew)( intf_thread_t *p_intf, char *name,
     if( ( i_dir_content = utf8_scandir( psz_dir, &ppsz_dir_content, Filter,
                                         InsensitiveAlphasort ) ) == -1 )
     {
-        msg_Warn( p_intf, "error while scaning dir %s (%s)", psz_dir,
-                  strerror(errno) );
+        msg_Warn( p_intf, "error while scanning dir %s (%m)", psz_dir );
         free( psz_dir );
         return s;
     }
 
     for( i = 0; i < i_dir_content; i++ )
     {
-        char *psz_dir_content = ppsz_dir_content[i];
-        char psz_tmp[strlen( psz_dir ) + 1 + strlen( psz_dir_content ) + 1];
+        char *psz_name = ppsz_dir_content[i], *psz_ext, *psz_dummy;
+        char psz_tmp[strlen( psz_dir ) + 1 + strlen( psz_name ) + 1];
         mvar_t *f;
-        char *psz_name, *psz_ext, *psz_dummy;
 
 #if defined( WIN32 )
         if( psz_dir[0] == '\0' || (psz_dir[0] == '\\' && psz_dir[1] == '\0') )
         {
-            strcpy( psz_tmp, psz_dir_content );
+            strcpy( psz_tmp, psz_name );
         }
         else
 #endif
         {
-            sprintf( psz_tmp, "%s%c%s", psz_dir, sep, psz_dir_content );
+            sprintf( psz_tmp, "%s"DIR_SEP"%s", psz_dir, psz_name );
 
 #ifdef HAVE_SYS_STAT_H
             if( utf8_stat( psz_tmp, &stat_info ) == -1 )
             {
-                free( psz_dir_content );
+                free( psz_name );
                 continue;
             }
 #endif
         }
         f = E_(mvar_New)( name, "set" );
 
-        /* FIXME: merge vlc_fix_readdir_charset with utf8_readir */
-        psz_dummy = vlc_fix_readdir_charset( p_intf, psz_dir_content );
-        psz_name = E_(FromUTF8)( p_intf, psz_dummy );
-        free( psz_dummy );
-
         /* put lower-case file extension in 'ext' */
         psz_ext = strrchr( psz_name, '.' );
         psz_ext = strdup( psz_ext != NULL ? psz_ext + 1 : "" );
@@ -621,7 +584,7 @@ mvar_t *E_(mvar_FileSetNew)( intf_thread_t *p_intf, char *name,
             char psz_ctime[26];
             char psz_tmp[strlen( psz_dir ) + 1 + strlen( psz_name ) + 1];
 
-            sprintf( psz_tmp, "%s%c%s", psz_dir, sep, psz_name );
+            sprintf( psz_tmp, "%s"DIR_SEP"%s", psz_dir, psz_name );
             E_(mvar_AppendNewVar)( f, "name", psz_tmp );
             E_(mvar_AppendNewVar)( f, "basename", psz_name );
 
@@ -660,12 +623,10 @@ mvar_t *E_(mvar_FileSetNew)( intf_thread_t *p_intf, char *name,
         E_(mvar_AppendVar)( s, f );
 
         free( psz_name );
-        free( psz_dir_content );
     }
 
     free( psz_dir );
-    if( ppsz_dir_content != NULL )
-        free( ppsz_dir_content );
+    free( ppsz_dir_content );
     return s;
 }
 
@@ -730,7 +691,7 @@ mvar_t *E_(mvar_VlmSetNew)( char *name, vlm_t *vlm )
             /* Over name */
             vlm_message_t *el = ch->child[j];
             vlm_message_t *inf, *desc;
-            char          psz[500];
+            char          psz[6 + strlen(el->psz_name)];
 
             sprintf( psz, "show %s", el->psz_name );
             if( vlm_ExecuteCommand( vlm, psz, &inf ) )