Commit e5a6cfea authored by Sam Hocevar's avatar Sam Hocevar

* ./src/misc/modules.c: we now recursively parse directories when

    looking for plugins.
parent 981dcc18
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* modules.c : Builtin and plugin modules management functions * modules.c : Builtin and plugin modules management functions
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: modules.c,v 1.75 2002/07/31 20:56:53 sam Exp $ * $Id: modules.c,v 1.76 2002/08/04 12:18:41 sam Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* Ethan C. Baldridge <BaldridgeE@cadmus.com> * Ethan C. Baldridge <BaldridgeE@cadmus.com>
...@@ -83,7 +83,8 @@ ...@@ -83,7 +83,8 @@
*****************************************************************************/ *****************************************************************************/
#ifdef HAVE_DYNAMIC_PLUGINS #ifdef HAVE_DYNAMIC_PLUGINS
static void AllocateAllPlugins ( vlc_object_t * ); static void AllocateAllPlugins ( vlc_object_t * );
static int AllocatePluginModule ( vlc_object_t *, char * ); static void AllocatePluginDir ( vlc_object_t *, const char * );
static int AllocatePluginFile ( vlc_object_t *, char * );
#endif #endif
static int AllocateBuiltinModule( vlc_object_t *, int ( * ) ( module_t * ) ); static int AllocateBuiltinModule( vlc_object_t *, int ( * ) ( module_t * ) );
static int DeleteModule ( module_t * ); static int DeleteModule ( module_t * );
...@@ -572,14 +573,11 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) ...@@ -572,14 +573,11 @@ static void AllocateAllPlugins( vlc_object_t *p_this )
char ** ppsz_path = path; char ** ppsz_path = path;
char * psz_fullpath; char * psz_fullpath;
char * psz_file;
#if defined( SYS_BEOS ) || defined( SYS_DARWIN ) #if defined( SYS_BEOS ) || defined( SYS_DARWIN )
char * psz_vlcpath = system_GetProgramPath(); char * psz_vlcpath = system_GetProgramPath();
int i_vlclen = strlen( psz_vlcpath ); int i_vlclen = strlen( psz_vlcpath );
vlc_bool_t b_notinroot; vlc_bool_t b_notinroot;
#endif #endif
DIR * dir;
struct dirent * file;
/* If the user provided a plugin path, we add it to the list */ /* If the user provided a plugin path, we add it to the list */
path[ sizeof(path)/sizeof(char*) - 2 ] = config_GetPsz( p_this, path[ sizeof(path)/sizeof(char*) - 2 ] = config_GetPsz( p_this,
...@@ -587,10 +585,10 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) ...@@ -587,10 +585,10 @@ static void AllocateAllPlugins( vlc_object_t *p_this )
for( ; *ppsz_path != NULL ; ppsz_path++ ) for( ; *ppsz_path != NULL ; ppsz_path++ )
{ {
#if defined( SYS_BEOS ) || defined( SYS_DARWIN )
/* Store strlen(*ppsz_path) for later use. */ /* Store strlen(*ppsz_path) for later use. */
int i_dirlen = strlen( *ppsz_path ); int i_dirlen = strlen( *ppsz_path );
#if defined( SYS_BEOS ) || defined( SYS_DARWIN )
b_notinroot = VLC_FALSE; b_notinroot = VLC_FALSE;
/* Under BeOS, we need to add beos_GetProgramPath() to access /* Under BeOS, we need to add beos_GetProgramPath() to access
* files under the current directory */ * files under the current directory */
...@@ -612,38 +610,9 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) ...@@ -612,38 +610,9 @@ static void AllocateAllPlugins( vlc_object_t *p_this )
psz_fullpath = *ppsz_path; psz_fullpath = *ppsz_path;
} }
msg_Dbg( p_this, "browsing `%s'", psz_fullpath ); msg_Dbg( p_this, "recursively browsing `%s'", psz_fullpath );
if( (dir = opendir( psz_fullpath )) )
{
/* Parse the directory and try to load all files it contains. */
while( (file = readdir( dir )) )
{
int i_filelen = strlen( file->d_name );
/* We only load files ending with ".so" */
if( i_filelen > 3
&& !strncmp( file->d_name + i_filelen - 3, ".so", 3 ) )
{
psz_file = malloc( i_dirlen + i_filelen + 2 );
if( psz_file == NULL )
{
continue;
}
sprintf( psz_file, "%s/%s", psz_fullpath, file->d_name );
/* We created a nice filename -- now we just try to load
* it as a plugin module. */
AllocatePluginModule( p_this, psz_file );
/* We don't care if the allocation succeeded */
free( psz_file );
}
}
/* Close the directory if successfully opened */ AllocatePluginDir( p_this, psz_fullpath );
closedir( dir );
}
#if defined( SYS_BEOS ) || defined( SYS_DARWIN ) #if defined( SYS_BEOS ) || defined( SYS_DARWIN )
if( b_notinroot ) if( b_notinroot )
...@@ -655,25 +624,73 @@ static void AllocateAllPlugins( vlc_object_t *p_this ) ...@@ -655,25 +624,73 @@ static void AllocateAllPlugins( vlc_object_t *p_this )
} }
/***************************************************************************** /*****************************************************************************
* AllocatePluginModule: load a module into memory and initialize it. * AllocatePluginDir: recursively parse a directory to look for plugins
*****************************************************************************/
static void AllocatePluginDir( vlc_object_t *p_this, const char *psz_dir )
{
#define PLUGIN_EXT ".so"
DIR * dir;
int i_dirlen = strlen( psz_dir );
char * psz_file;
struct dirent * file;
if( (dir = opendir( psz_dir )) )
{
/* Parse the directory and try to load all files it contains. */
while( (file = readdir( dir )) )
{
int i_len = strlen( file->d_name );
/* Skip ".", ".." and anything starting with "." */
if( !*file->d_name || *file->d_name == '.' )
{
continue;
}
if( file->d_type == DT_DIR )
{
psz_file = malloc( i_dirlen + 1 /* / */ + i_len + 1 /* \0 */ );
sprintf( psz_file, "%s/%s", psz_dir, file->d_name );
AllocatePluginDir( p_this, psz_file );
free( psz_file );
}
else if( i_len > strlen( PLUGIN_EXT )
/* We only load files ending with ".so" */
&& !strncmp( file->d_name + i_len - strlen( PLUGIN_EXT ),
PLUGIN_EXT, strlen( PLUGIN_EXT ) ) )
{
psz_file = malloc( i_dirlen + 1 /* / */ + i_len + 1 /* \0 */ );
sprintf( psz_file, "%s/%s", psz_dir, file->d_name );
AllocatePluginFile( p_this, psz_file );
free( psz_file );
}
}
/* Close the directory if successfully opened */
closedir( dir );
}
}
/*****************************************************************************
* AllocatePluginFile: load a module into memory and initialize it.
***************************************************************************** *****************************************************************************
* This function loads a dynamically loadable module and allocates a structure * This function loads a dynamically loadable module and allocates a structure
* for its information data. The module can then be handled by module_Need, * for its information data. The module can then be handled by module_Need,
* module_Unneed and HideModule. It can be removed by DeleteModule. * module_Unneed and HideModule. It can be removed by DeleteModule.
*****************************************************************************/ *****************************************************************************/
static int AllocatePluginModule( vlc_object_t * p_this, char * psz_filename ) static int AllocatePluginFile( vlc_object_t * p_this, char * psz_file )
{ {
module_t * p_module; module_t * p_module;
module_handle_t handle; module_handle_t handle;
/* Try to dynamically load the module. */ /* Try to dynamically load the module. */
if( module_load( psz_filename, &handle ) ) if( module_load( psz_file, &handle ) )
{ {
char psz_buffer[256]; char psz_buffer[256];
/* The plugin module couldn't be opened */ /* The plugin module couldn't be opened */
msg_Warn( p_this, "cannot open `%s' (%s)", msg_Warn( p_this, "cannot open `%s' (%s)",
psz_filename, module_error( psz_buffer ) ); psz_file, module_error( psz_buffer ) );
return -1; return -1;
} }
...@@ -688,7 +705,7 @@ static int AllocatePluginModule( vlc_object_t * p_this, char * psz_filename ) ...@@ -688,7 +705,7 @@ static int AllocatePluginModule( vlc_object_t * p_this, char * psz_filename )
} }
/* We need to fill these since they may be needed by CallEntry() */ /* We need to fill these since they may be needed by CallEntry() */
p_module->psz_filename = psz_filename; p_module->psz_filename = psz_file;
p_module->handle = handle; p_module->handle = handle;
p_module->p_symbols = &p_this->p_vlc->p_module_bank->symbols; p_module->p_symbols = &p_this->p_vlc->p_module_bank->symbols;
......
...@@ -31,7 +31,8 @@ ...@@ -31,7 +31,8 @@
* This function loads a dynamically linked library using a system dependant * This function loads a dynamically linked library using a system dependant
* method, and returns a non-zero value on error, zero otherwise. * method, and returns a non-zero value on error, zero otherwise.
*****************************************************************************/ *****************************************************************************/
static inline int module_load( char * psz_filename, module_handle_t * handle ) static inline int module_load( const char * psz_filename,
module_handle_t * handle )
{ {
#ifdef SYS_BEOS #ifdef SYS_BEOS
*handle = load_add_on( psz_filename ); *handle = load_add_on( psz_filename );
...@@ -92,7 +93,7 @@ static inline void module_unload( module_handle_t handle ) ...@@ -92,7 +93,7 @@ static inline void module_unload( module_handle_t handle )
* similar functions, since we want a non-NULL symbol anyway. * similar functions, since we want a non-NULL symbol anyway.
*****************************************************************************/ *****************************************************************************/
static inline void * _module_getsymbol( module_handle_t handle, static inline void * _module_getsymbol( module_handle_t handle,
char * psz_function ) const char * psz_function )
{ {
#ifdef SYS_BEOS #ifdef SYS_BEOS
void * p_symbol; void * p_symbol;
...@@ -116,7 +117,7 @@ static inline void * _module_getsymbol( module_handle_t handle, ...@@ -116,7 +117,7 @@ static inline void * _module_getsymbol( module_handle_t handle,
} }
static inline void * module_getsymbol( module_handle_t handle, static inline void * module_getsymbol( module_handle_t handle,
char * psz_function ) const char * psz_function )
{ {
void * p_symbol = _module_getsymbol( handle, psz_function ); void * p_symbol = _module_getsymbol( handle, psz_function );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* modules_plugin.h : Plugin management functions used by the core application. * modules_plugin.h : Plugin management functions used by the core application.
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: modules_plugin.h.in,v 1.1 2002/06/01 12:32:01 sam Exp $ * $Id: modules_plugin.h.in,v 1.2 2002/08/04 12:18:41 sam Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -31,7 +31,8 @@ ...@@ -31,7 +31,8 @@
* This function loads a dynamically linked library using a system dependant * This function loads a dynamically linked library using a system dependant
* method, and returns a non-zero value on error, zero otherwise. * method, and returns a non-zero value on error, zero otherwise.
*****************************************************************************/ *****************************************************************************/
static inline int module_load( char * psz_filename, module_handle_t * handle ) static inline int module_load( const char * psz_filename,
module_handle_t * handle )
{ {
#ifdef SYS_BEOS #ifdef SYS_BEOS
*handle = load_add_on( psz_filename ); *handle = load_add_on( psz_filename );
...@@ -92,7 +93,7 @@ static inline void module_unload( module_handle_t handle ) ...@@ -92,7 +93,7 @@ static inline void module_unload( module_handle_t handle )
* similar functions, since we want a non-NULL symbol anyway. * similar functions, since we want a non-NULL symbol anyway.
*****************************************************************************/ *****************************************************************************/
static inline void * _module_getsymbol( module_handle_t handle, static inline void * _module_getsymbol( module_handle_t handle,
char * psz_function ) const char * psz_function )
{ {
#ifdef SYS_BEOS #ifdef SYS_BEOS
void * p_symbol; void * p_symbol;
...@@ -116,7 +117,7 @@ static inline void * _module_getsymbol( module_handle_t handle, ...@@ -116,7 +117,7 @@ static inline void * _module_getsymbol( module_handle_t handle,
} }
static inline void * module_getsymbol( module_handle_t handle, static inline void * module_getsymbol( module_handle_t handle,
char * psz_function ) const char * psz_function )
{ {
void * p_symbol = _module_getsymbol( handle, psz_function ); void * p_symbol = _module_getsymbol( handle, psz_function );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment