[vlc-commits] luasd: probe scripts by name in separate helper

Pierre Ynard git at videolan.org
Wed Nov 16 14:11:01 CET 2016


vlc | branch: master | Pierre Ynard <linkfanel at yahoo.fr> | Wed Nov 16 14:06:41 2016 +0100| [20c426643a37e58cadbea05d44e2d0f2798812b5] | committer: Pierre Ynard

luasd: probe scripts by name in separate helper

Ref #3353

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=20c426643a37e58cadbea05d44e2d0f2798812b5
---

 modules/lua/services_discovery.c |  65 ++++++++++++++++++++++--
 modules/lua/vlc.c                | 104 +++++++--------------------------------
 modules/lua/vlc.h                |   5 +-
 3 files changed, 79 insertions(+), 95 deletions(-)

diff --git a/modules/lua/services_discovery.c b/modules/lua/services_discovery.c
index 1a17a85..84d5252 100644
--- a/modules/lua/services_discovery.c
+++ b/modules/lua/services_discovery.c
@@ -42,9 +42,8 @@ static int Control( services_discovery_t *p_sd, int i_command, va_list args );
 
 // When successful, the returned string is stored on top of the lua
 // stack and remains valid as long as it is kept in the stack.
-#undef vlclua_sd_description
-const char *vlclua_sd_description( vlc_object_t *obj, lua_State *L,
-                                   const char *filename )
+static const char *vlclua_sd_description( vlc_object_t *obj, lua_State *L,
+                                          const char *filename )
 {
     lua_getglobal( L, "descriptor" );
     if( !lua_isfunction( L, -1 ) )
@@ -74,7 +73,62 @@ const char *vlclua_sd_description( vlc_object_t *obj, lua_State *L,
 
     return lua_tostring( L, -1 );
 }
-#define vlclua_sd_description(a, b, c) vlclua_sd_description(VLC_OBJECT(a), b, c)
+
+int vlclua_probe_sd( vlc_object_t *obj, const char *name )
+{
+    vlc_probe_t *probe = (vlc_probe_t *)obj;
+
+    char *filename = vlclua_find_file( "sd", name );
+    if( filename == NULL )
+    {
+        // File suddenly disappeared - maybe a race condition, no problem
+        msg_Err( probe, "Couldn't probe lua services discovery script \"%s\".",
+                 name );
+        return VLC_PROBE_CONTINUE;
+    }
+
+    lua_State *L = luaL_newstate();
+    if( !L )
+    {
+        msg_Err( probe, "Could not create new Lua State" );
+        free( filename );
+        return VLC_ENOMEM;
+    }
+    luaL_openlibs( L );
+    if( vlclua_add_modules_path( L, filename ) )
+    {
+        msg_Err( probe, "Error while setting the module search path for %s",
+                 filename );
+        lua_close( L );
+        free( filename );
+        return VLC_ENOMEM;
+    }
+    if( vlclua_dofile( obj, L, filename ) )
+    {
+        msg_Err( probe, "Error loading script %s: %s", filename,
+                 lua_tostring( L, -1 ) );
+        lua_close( L );
+        free( filename );
+        return VLC_PROBE_CONTINUE;
+    }
+    const char *description = vlclua_sd_description( obj, L, filename );
+    if( description == NULL )
+        description = name;
+
+    int r = VLC_ENOMEM;
+    char *name_esc = config_StringEscape( name );
+    char *chain;
+    if( asprintf( &chain, "lua{sd='%s'}", name_esc ) != -1 )
+    {
+        r = vlc_sd_probe_Add( probe, chain, description, SD_CAT_INTERNET );
+        free( chain );
+    }
+    free( name_esc );
+
+    lua_close( L );
+    free( filename );
+    return r;
+}
 
 static const char * const ppsz_sd_options[] = { "sd", NULL };
 
@@ -169,7 +223,8 @@ int Open_LuaSD( vlc_object_t *p_this )
     }
 
     // No strdup(), just don't remove the string from the lua stack
-    p_sd->description = vlclua_sd_description( p_sd, L, p_sys->psz_filename );
+    p_sd->description = vlclua_sd_description( VLC_OBJECT(p_sd), L,
+                                               p_sys->psz_filename );
     if( p_sd->description == NULL )
         p_sd->description = p_sd->psz_name;
 
diff --git a/modules/lua/vlc.c b/modules/lua/vlc.c
index 2356b36..24d40cd 100644
--- a/modules/lua/vlc.c
+++ b/modules/lua/vlc.c
@@ -619,105 +619,35 @@ int vlclua_playlist_add_internal( vlc_object_t *p_this, lua_State *L,
 
 static int vlc_sd_probe_Open( vlc_object_t *obj )
 {
-    vlc_probe_t *probe = (vlc_probe_t *)obj;
-    char **ppsz_filelist = NULL;
-    char **ppsz_fileend  = NULL;
-    char **ppsz_file;
-    char *psz_name;
-    char **ppsz_dir_list = NULL;
-    char **ppsz_dir;
-    lua_State *L = NULL;
+    int r = VLC_PROBE_CONTINUE;
+    char **ppsz_dir_list;
     vlclua_dir_list( "sd", &ppsz_dir_list );
-    for( ppsz_dir = ppsz_dir_list; *ppsz_dir; ppsz_dir++ )
+    for( char **ppsz_dir = ppsz_dir_list; *ppsz_dir; ppsz_dir++ )
     {
-        int i_files;
-        if( ppsz_filelist )
-        {
-            for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend;
-                 ppsz_file++ )
-                free( *ppsz_file );
-            free( ppsz_filelist );
-            ppsz_filelist = NULL;
-        }
-        i_files = vlc_scandir( *ppsz_dir, &ppsz_filelist, file_select,
-                                file_compare );
+        char **ppsz_filelist;
+        int i_files = vlc_scandir( *ppsz_dir, &ppsz_filelist, file_select,
+                                    file_compare );
         if( i_files < 1 ) continue;
-        ppsz_fileend = ppsz_filelist + i_files;
-        for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend; ppsz_file++ )
-        {
-            char  *psz_filename;
-            if( asprintf( &psz_filename,
-                          "%s" DIR_SEP "%s", *ppsz_dir, *ppsz_file ) < 0 )
-            {
-                goto error;
-            }
-            L = luaL_newstate();
-            if( !L )
-            {
-                msg_Err( probe, "Could not create new Lua State" );
-                free( psz_filename );
-                goto error;
-            }
-            luaL_openlibs( L );
-            if( vlclua_add_modules_path( L, psz_filename ) )
-            {
-                msg_Err( probe, "Error while setting the module search path for %s",
-                          psz_filename );
-                free( psz_filename );
-                goto error;
-            }
-            if( vlclua_dofile( VLC_OBJECT(probe), L, psz_filename ) )
-            {
 
-                msg_Err( probe, "Error loading script %s: %s", psz_filename,
-                          lua_tostring( L, lua_gettop( L ) ) );
-                lua_pop( L, 1 );
-                free( psz_filename );
-                lua_close( L );
-                continue;
-            }
+        for( char **ppsz_file = ppsz_filelist;
+             ppsz_file < ppsz_filelist + i_files; ppsz_file++ )
+        {
             char *temp = strchr( *ppsz_file, '.' );
             if( temp )
                 *temp = '\0';
-            const char *psz_longname = vlclua_sd_description( probe, L, psz_filename );
-            if( psz_longname == NULL )
-                psz_longname = *ppsz_file;
-
-            char *psz_file_esc = config_StringEscape( *ppsz_file );
-            if( asprintf( &psz_name, "lua{sd='%s'}", psz_file_esc ) < 0 )
-            {
-                free( psz_file_esc );
-                free( psz_filename );
-                goto error;
-            }
-            free( psz_file_esc );
-            vlc_sd_probe_Add( probe, psz_name, psz_longname, SD_CAT_INTERNET );
-            free( psz_name );
-            free( psz_filename );
-            lua_close( L );
+            r = vlclua_probe_sd( obj, *ppsz_file );
+            if( r != VLC_PROBE_CONTINUE )
+                break;
         }
-    }
-    if( ppsz_filelist )
-    {
-        for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend;
-             ppsz_file++ )
-            free( *ppsz_file );
-        free( ppsz_filelist );
-    }
-    vlclua_dir_list_free( ppsz_dir_list );
-    return VLC_PROBE_CONTINUE;
-error:
-    if( ppsz_filelist )
-    {
-        for( ppsz_file = ppsz_filelist; ppsz_file < ppsz_fileend;
-             ppsz_file++ )
+        for( char **ppsz_file = ppsz_filelist;
+             ppsz_file < ppsz_filelist + i_files; ppsz_file++ )
             free( *ppsz_file );
         free( ppsz_filelist );
+        if( r != VLC_PROBE_CONTINUE )
+            break;
     }
-    if( L )
-        lua_close( L );
     vlclua_dir_list_free( ppsz_dir_list );
-    return VLC_ENOMEM;
+    return r;
 }
 
 static int vlclua_add_modules_path_inner( lua_State *L, const char *psz_path )
diff --git a/modules/lua/vlc.h b/modules/lua/vlc.h
index 0186bfa..f79d9c6 100644
--- a/modules/lua/vlc.h
+++ b/modules/lua/vlc.h
@@ -91,9 +91,8 @@ void Close_Extension( vlc_object_t * );
 int Open_LuaSD( vlc_object_t * );
 void Close_LuaSD( vlc_object_t * );
 
-// Helper
-const char *vlclua_sd_description( vlc_object_t *, lua_State *, const char * );
-#define vlclua_sd_description(a, b, c) vlclua_sd_description(VLC_OBJECT(a), b, c)
+// Script probe
+int vlclua_probe_sd( vlc_object_t *, const char *name );
 
 /*****************************************************************************
  * Lua debug



More information about the vlc-commits mailing list