X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fmodules.c;h=7a50dc1bd60acc50e59eede5dd0c423ec85c122f;hb=149e4ec26dc77992ea70cd2f9a1e0de3d0c6dd95;hp=baeb1a92f95c08c1bd32f6416c0a6f9645f3de98;hpb=130e15bea1c95a7f34fc375e2dbbd4ba9542a23e;p=vlc diff --git a/src/misc/modules.c b/src/misc/modules.c index baeb1a92f9..7a50dc1bd6 100644 --- a/src/misc/modules.c +++ b/src/misc/modules.c @@ -99,6 +99,8 @@ #include "stream_output.h" #include "osd.h" #include "vlc_httpd.h" +#include "vlc_tls.h" +#include "vlc_xml.h" #include "iso_lang.h" #include "charset.h" @@ -107,6 +109,8 @@ #include "vlc_vlm.h" +#include "vlc_image.h" + #ifdef HAVE_DYNAMIC_PLUGINS # include "modules_plugin.h" #endif @@ -282,6 +286,7 @@ void __module_EndBank( vlc_object_t *p_this ) } vlc_object_destroy( p_this->p_libvlc->p_module_bank ); + p_this->p_libvlc->p_module_bank = NULL; return; } @@ -296,6 +301,21 @@ void __module_EndBank( vlc_object_t *p_this ) *****************************************************************************/ void __module_LoadMain( vlc_object_t *p_this ) { + vlc_value_t lockval; + + var_Create( p_this->p_libvlc, "libvlc", VLC_VAR_MUTEX ); + var_Get( p_this->p_libvlc, "libvlc", &lockval ); + vlc_mutex_lock( lockval.p_address ); + if( p_this->p_libvlc->p_module_bank->b_main ) + { + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "libvlc" ); + return; + } + p_this->p_libvlc->p_module_bank->b_main = VLC_TRUE; + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "libvlc" ); + AllocateBuiltinModule( p_this, vlc_entry__main ); } @@ -306,6 +326,21 @@ void __module_LoadMain( vlc_object_t *p_this ) *****************************************************************************/ void __module_LoadBuiltins( vlc_object_t * p_this ) { + vlc_value_t lockval; + + var_Create( p_this->p_libvlc, "libvlc", VLC_VAR_MUTEX ); + var_Get( p_this->p_libvlc, "libvlc", &lockval ); + vlc_mutex_lock( lockval.p_address ); + if( p_this->p_libvlc->p_module_bank->b_builtins ) + { + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "libvlc" ); + return; + } + p_this->p_libvlc->p_module_bank->b_builtins = VLC_TRUE; + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "libvlc" ); + msg_Dbg( p_this, "checking builtin modules" ); ALLOCATE_ALL_BUILTINS(); } @@ -318,6 +353,21 @@ void __module_LoadBuiltins( vlc_object_t * p_this ) void __module_LoadPlugins( vlc_object_t * p_this ) { #ifdef HAVE_DYNAMIC_PLUGINS + vlc_value_t lockval; + + var_Create( p_this->p_libvlc, "libvlc", VLC_VAR_MUTEX ); + var_Get( p_this->p_libvlc, "libvlc", &lockval ); + vlc_mutex_lock( lockval.p_address ); + if( p_this->p_libvlc->p_module_bank->b_plugins ) + { + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "libvlc" ); + return; + } + p_this->p_libvlc->p_module_bank->b_plugins = VLC_TRUE; + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "libvlc" ); + msg_Dbg( p_this, "checking plugin modules" ); if( config_GetInt( p_this, "plugins-cache" ) ) @@ -358,6 +408,7 @@ module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability, int i_shortcuts = 0; char *psz_shortcuts = NULL, *psz_var = NULL; + vlc_bool_t b_force_backup = p_this->b_force; msg_Dbg( p_this, "looking for %s module", psz_capability ); @@ -499,6 +550,7 @@ module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability, /* Special case: test if we requested a particular intf plugin */ if( !i_shortcuts && p_module->psz_program + && !strcmp( psz_capability, "interface" ) && !strcmp( p_module->psz_program, p_this->p_vlc->psz_object_name ) ) { @@ -619,7 +671,7 @@ module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability, } free( p_list ); - p_this->b_force = VLC_FALSE; + p_this->b_force = b_force_backup; if( p_module != NULL ) { @@ -1076,7 +1128,8 @@ static void DupModule( module_t *p_module ) * module is unloaded. */ p_module->psz_object_name = strdup( p_module->psz_object_name ); p_module->psz_capability = strdup( p_module->psz_capability ); - p_module->psz_shortname = strdup( p_module->psz_shortname ); + p_module->psz_shortname = p_module->psz_shortname ? + strdup( p_module->psz_shortname ) : NULL; p_module->psz_longname = strdup( p_module->psz_longname ); if( p_module->psz_program != NULL ) @@ -1112,7 +1165,7 @@ static void UndupModule( module_t *p_module ) free( p_module->psz_object_name ); free( p_module->psz_capability ); - free( p_module->psz_shortname ); + if( p_module->psz_shortname ) free( p_module->psz_shortname ); free( p_module->psz_longname ); if( p_module->psz_program != NULL ) @@ -1547,9 +1600,10 @@ static void CacheLoad( vlc_object_t *p_this ) FILE *file; int i, j, i_size, i_read; char p_cachestring[sizeof(PLUGINSCACHE_DIR COPYRIGHT_MESSAGE)]; + char p_cachelang[6], p_lang[6]; int i_cache; module_cache_t **pp_cache = 0; - int32_t i_file_size; + int32_t i_file_size, i_marker; psz_homedir = p_this->p_vlc->psz_homedir; if( !psz_homedir ) @@ -1557,19 +1611,15 @@ static void CacheLoad( vlc_object_t *p_this ) msg_Err( p_this, "psz_homedir is null" ); return; } - psz_filename = - (char *)malloc( sizeof("/" CONFIG_DIR "/" PLUGINSCACHE_DIR "/" ) + - strlen(psz_homedir) + strlen(CacheName()) ); - if( !psz_filename ) + i_size = asprintf( &psz_filename, "%s/%s/%s/%s", psz_homedir, CONFIG_DIR, + PLUGINSCACHE_DIR, CacheName() ); + if( i_size <= 0 ) { msg_Err( p_this, "out of memory" ); return; } - sprintf( psz_filename, "%s/%s/%s/%s", psz_homedir, CONFIG_DIR, - PLUGINSCACHE_DIR, CacheName() ); - if( p_this->p_libvlc->p_module_bank->b_cache_delete ) { #if !defined( UNDER_CE ) @@ -1626,6 +1676,28 @@ static void CacheLoad( vlc_object_t *p_this ) return; } + /* Check the language hasn't changed */ + sprintf( p_lang, "%5.5s", _("C") ); i_size = 5; + i_read = fread( p_cachelang, sizeof(char), i_size, file ); + if( i_read != i_size || memcmp( p_cachelang, p_lang, i_size ) ) + { + msg_Warn( p_this, "This doesn't look like a valid plugins cache " + "(language changed)" ); + fclose( file ); + return; + } + + /* Check header marker */ + i_read = fread( &i_marker, sizeof(char), sizeof(i_marker), file ); + if( i_read != sizeof(i_marker) || + i_marker != ftell( file ) - (int)sizeof(i_marker) ) + { + msg_Warn( p_this, "This doesn't look like a valid plugins cache " + "(corrupted header)" ); + fclose( file ); + return; + } + p_this->p_libvlc->p_module_bank->i_loaded_cache = 0; fread( &i_cache, sizeof(char), sizeof(i_cache), file ); pp_cache = p_this->p_libvlc->p_module_bank->pp_loaded_cache = @@ -1652,7 +1724,7 @@ static void CacheLoad( vlc_object_t *p_this ) pp_cache[i] = malloc( sizeof(module_cache_t) ); p_this->p_libvlc->p_module_bank->i_loaded_cache++; - /* Save common info */ + /* Load common info */ LOAD_STRING( pp_cache[i]->psz_file ); LOAD_IMMEDIATE( pp_cache[i]->i_time ); LOAD_IMMEDIATE( pp_cache[i]->i_size ); @@ -1662,7 +1734,7 @@ static void CacheLoad( vlc_object_t *p_this ) pp_cache[i]->p_module = vlc_object_create( p_this, VLC_OBJECT_MODULE ); - /* Save additional infos */ + /* Load additional infos */ LOAD_STRING( pp_cache[i]->p_module->psz_object_name ); LOAD_STRING( pp_cache[i]->p_module->psz_shortname ); LOAD_STRING( pp_cache[i]->p_module->psz_longname ); @@ -1828,6 +1900,12 @@ int CacheLoadConfig( module_t *p_module, FILE *file ) *****************************************************************************/ static void CacheSave( vlc_object_t *p_this ) { + static char const psz_tag[] = + "Signature: 8a477f597d28d172789f06886806bc55\r\n" + "# This file is a cache directory tag created by VLC.\r\n" + "# For information about cache directory tags, see:\r\n" + "# http://www.brynosaurus.com/cachedir/\r\n"; + char *psz_filename, *psz_homedir; FILE *file; int i, j, i_cache; @@ -1850,7 +1928,7 @@ static void CacheSave( vlc_object_t *p_this ) return; } - sprintf( psz_filename, "%s/" CONFIG_DIR, psz_homedir ); + sprintf( psz_filename, "%s/%s", psz_homedir, CONFIG_DIR ); config_CreateDir( p_this, psz_filename ); @@ -1858,8 +1936,17 @@ static void CacheSave( vlc_object_t *p_this ) config_CreateDir( p_this, psz_filename ); - strcat( psz_filename, "/" ); - strcat( psz_filename, CacheName() ); + strcat( psz_filename, "/CACHEDIR.TAG" ); + + file = fopen( psz_filename, "wb" ); + if( file ) + { + fwrite( psz_tag, 1, strlen(psz_tag), file ); + fclose( file ); + } + + sprintf( psz_filename, "%s/%s/%s/%s", psz_homedir, CONFIG_DIR, + PLUGINSCACHE_DIR, CacheName() ); msg_Dbg( p_this, "saving plugins cache file %s", psz_filename ); @@ -1879,6 +1966,13 @@ static void CacheSave( vlc_object_t *p_this ) /* Contains version number */ fprintf( file, "%s", PLUGINSCACHE_DIR COPYRIGHT_MESSAGE ); + /* Language */ + fprintf( file, "%5.5s", _("C") ); + + /* Header marker */ + i_file_size = ftell( file ); + fwrite( &i_file_size, sizeof(char), sizeof(i_file_size), file ); + i_cache = p_this->p_libvlc->p_module_bank->i_cache; pp_cache = p_this->p_libvlc->p_module_bank->pp_cache; @@ -2014,7 +2108,7 @@ void CacheSaveConfig( module_t *p_module, FILE *file ) /***************************************************************************** * CacheName: Return the cache file name for this platform. *****************************************************************************/ -static char * CacheName( void ) +static char *CacheName( void ) { static char psz_cachename[32]; static vlc_bool_t b_initialised = VLC_FALSE;