X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fmodules.c;h=9ff601b3a6aa5916a564b14758292fdc99d412df;hb=688f0a8d8913f20ac5d3e27bf4f2bbe35c9f5de7;hp=4062ef205189650d23524ecf84f17d4f0beae109;hpb=a8c44b836bd56fa4676f4fe18a73ee166aa0516a;p=vlc diff --git a/src/modules/modules.c b/src/modules/modules.c index 4062ef2051..9ff601b3a6 100644 --- a/src/modules/modules.c +++ b/src/modules/modules.c @@ -28,7 +28,7 @@ # include "config.h" #endif -#include +#include #include #include "libvlc.h" @@ -100,7 +100,7 @@ static int AllocatePluginFile ( vlc_object_t *, char *, int64_t, int64_t ); static module_t * AllocatePlugin( vlc_object_t *, char * ); #endif static int AllocateBuiltinModule( vlc_object_t *, int ( * ) ( module_t * ) ); -static int DeleteModule ( module_t *, bool ); +static void DeleteModule ( module_t *, bool ); #ifdef HAVE_DYNAMIC_PLUGINS static void DupModule ( module_t * ); static void UndupModule ( module_t * ); @@ -214,20 +214,10 @@ void __module_EndBank( vlc_object_t *p_this ) vlc_object_detach( p_libvlc_global->p_module_bank ); - while( p_libvlc_global->p_module_bank->i_children ) + while( vlc_internals( p_libvlc_global->p_module_bank )->i_children ) { - p_next = (module_t *)p_libvlc_global->p_module_bank->pp_children[0]; - - if( DeleteModule( p_next, true ) ) - { - /* Module deletion failed */ - msg_Err( p_this, "module \"%s\" can't be removed, trying harder", - p_next->psz_object_name ); - - /* We just free the module by hand. Niahahahahaha. */ - vlc_object_detach( p_next ); - vlc_object_release( p_next ); - } + p_next = (module_t *)vlc_internals( p_libvlc_global->p_module_bank )->pp_children[0]; + DeleteModule( p_next, true ); } vlc_object_release( p_libvlc_global->p_module_bank ); @@ -381,11 +371,7 @@ module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability, /* Deal with variables */ if( psz_name && psz_name[0] == '$' ) { - vlc_value_t val; - var_Create( p_this, psz_name + 1, VLC_VAR_MODULE | VLC_VAR_DOINHERIT ); - var_Get( p_this, psz_name + 1, &val ); - psz_var = val.psz_string; - psz_name = psz_var; + psz_name = psz_var = var_CreateGetString( p_this, psz_name + 1 ); } /* Count how many different shortcuts were asked for */ @@ -884,14 +870,21 @@ static char * copy_next_paths_token( char * paths, char ** remaining_paths ) if( !path ) return NULL; /* Look for PATH_SEP_CHAR (a ':' or a ';') */ - for( i = 0, done = 0 ; paths[i]; i++ ) { + for( i = 0, done = 0 ; paths[i]; i++ ) + { /* Take care of \\ and \: or \; escapement */ - if( escaped ) { + if( escaped ) + { escaped = false; path[done++] = paths[i]; } +#ifdef WIN32 + else if( paths[i] == '/' ) + escaped = true; +#else else if( paths[i] == '\\' ) escaped = true; +#endif else if( paths[i] == PATH_SEP_CHAR ) break; else @@ -913,48 +906,31 @@ static char * copy_next_paths_token( char * paths, char ** remaining_paths ) #ifdef HAVE_DYNAMIC_PLUGINS static void AllocateAllPlugins( vlc_object_t *p_this ) { + const char *vlcpath = vlc_global()->psz_vlcpath; int count,i; char * path; vlc_array_t *arraypaths = vlc_array_new(); /* Contruct the special search path for system that have a relocatable * executable. Set it to /modules and /plugins. */ -#define RETURN_ENOMEM \ - { \ - msg_Err( p_this, "Not enough memory" ); \ - return; \ - } - vlc_array_append( arraypaths, strdup( "modules" ) ); -#if defined( WIN32 ) || defined( UNDER_CE ) || defined( __APPLE__ ) || defined( SYS_BEOS ) - if( asprintf( &path, "%s" DIR_SEP "modules", - vlc_global()->psz_vlcpath ) < 0 ) - RETURN_ENOMEM - vlc_array_append( arraypaths, path ); - if( asprintf( &path, "%s" DIR_SEP "plugins", - vlc_global()->psz_vlcpath ) < 0 ) - RETURN_ENOMEM - vlc_array_append( arraypaths, path ); -#if ! defined( WIN32 ) && ! defined( UNDER_CE ) - if( asprintf( &path, "%s", PLUGIN_PATH ) < 0 ) - RETURN_ENOMEM - vlc_array_append( arraypaths, path ); -#endif -#else + if( vlcpath && asprintf( &path, "%s" DIR_SEP "modules", vlcpath ) != -1 ) + vlc_array_append( arraypaths, path ); + if( vlcpath && asprintf( &path, "%s" DIR_SEP "plugins", vlcpath ) != -1 ) + vlc_array_append( arraypaths, path ); +#ifndef WIN32 vlc_array_append( arraypaths, strdup( PLUGIN_PATH ) ); #endif - vlc_array_append( arraypaths, strdup( "plugins" ) ); /* If the user provided a plugin path, we add it to the list */ - char * userpaths = config_GetPsz( p_this, "plugin-path" ); + char *userpaths = config_GetPsz( p_this, "plugin-path" ); char *paths_iter; for( paths_iter = userpaths; paths_iter; ) { path = copy_next_paths_token( paths_iter, &paths_iter ); - if( !path ) - RETURN_ENOMEM - vlc_array_append( arraypaths, strdup( path ) ); + if( path ) + vlc_array_append( arraypaths, path ); } count = vlc_array_count( arraypaths ); @@ -962,9 +938,7 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) { path = vlc_array_item_at_index( arraypaths, i ); if( !path ) - { continue; - } msg_Dbg( p_this, "recursively browsing `%s'", path ); @@ -975,7 +949,7 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) } vlc_array_destroy( arraypaths ); -#undef RETURN_ENOMEM + free( userpaths ); } /***************************************************************************** @@ -1242,6 +1216,7 @@ static int AllocatePluginFile( vlc_object_t * p_this, char * psz_file, p_bank->pp_cache[p_bank->i_cache]->b_used = true; p_bank->pp_cache[p_bank->i_cache]->p_module = p_module; p_bank->i_cache++; +#undef p_bank } return p_module ? 0 : -1; @@ -1267,7 +1242,6 @@ static module_t * AllocatePlugin( vlc_object_t * p_this, char * psz_file ) p_module = vlc_module_create( p_this ); if( p_module == NULL ) { - msg_Err( p_this, "out of memory" ); module_Unload( handle ); return NULL; } @@ -1320,9 +1294,9 @@ static void DupModule( module_t *p_module ) p_module->psz_help = p_module->psz_help ? strdup( p_module->psz_help ) : NULL; - for( i_submodule = 0; i_submodule < p_module->i_children; i_submodule++ ) + for( i_submodule = 0; i_submodule < vlc_internals( p_module )->i_children; i_submodule++ ) { - DupModule( (module_t*)p_module->pp_children[ i_submodule ] ); + DupModule( (module_t*)vlc_internals( p_module )->pp_children[ i_submodule ] ); } } @@ -1336,9 +1310,9 @@ static void UndupModule( module_t *p_module ) char **pp_shortcut; int i_submodule; - for( i_submodule = 0; i_submodule < p_module->i_children; i_submodule++ ) + for( i_submodule = 0; i_submodule < vlc_internals( p_module )->i_children; i_submodule++ ) { - UndupModule( (module_t*)p_module->pp_children[ i_submodule ] ); + UndupModule( (module_t*)vlc_internals( p_module )->pp_children[ i_submodule ] ); } for( pp_shortcut = p_module->pp_shortcuts ; *pp_shortcut ; pp_shortcut++ ) @@ -1371,10 +1345,7 @@ static int AllocateBuiltinModule( vlc_object_t * p_this, * allocate a structure for it */ p_module = vlc_module_create( p_this ); if( p_module == NULL ) - { - msg_Err( p_this, "out of memory" ); return -1; - } /* Initialize the module : fill p_module->psz_object_name, etc. */ if( pf_entry( p_module ) != 0 ) @@ -1402,9 +1373,10 @@ static int AllocateBuiltinModule( vlc_object_t * p_this, ***************************************************************************** * This function can only be called if the module isn't being used. *****************************************************************************/ -static int DeleteModule( module_t * p_module, bool b_detach ) +static void DeleteModule( module_t * p_module, bool b_detach ) { - if( !p_module ) return VLC_EGENERIC; + assert( p_module ); + if( b_detach ) vlc_object_detach( p_module ); @@ -1422,15 +1394,13 @@ static int DeleteModule( module_t * p_module, bool b_detach ) #endif /* Free and detach the object's children */ - while( p_module->i_children ) + while( vlc_internals( p_module )->i_children ) { - vlc_object_t *p_this = p_module->pp_children[0]; + vlc_object_t *p_this = vlc_internals( p_module )->pp_children[0]; vlc_object_detach( p_this ); vlc_object_release( p_this ); } config_Free( p_module ); vlc_object_release( p_module ); - p_module = NULL; - return 0; }