X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fos.c;h=cc33c513287710ab18d09cdfb225ae85f1b32dd7;hb=58275b9dd582d873d42c08a47873ae44b67f1003;hp=429c2940208e4228ac631df789ecaf1872c2cb8e;hpb=e769bca04c56a67ab39ee2d2700508a9c5ad8910;p=vlc diff --git a/src/modules/os.c b/src/modules/os.c index 429c294020..cc33c51328 100644 --- a/src/modules/os.c +++ b/src/modules/os.c @@ -28,7 +28,9 @@ # include "config.h" #endif -#include +#include +#include /* MODULE_SUFFIX */ +#include #include "libvlc.h" #include "modules.h" @@ -36,20 +38,16 @@ #include /* sprintf() */ #include /* strdup() */ -#ifdef HAVE_SYS_TYPES_H -# include -#endif +#include #if !defined(HAVE_DYNAMIC_PLUGINS) /* no support for plugins */ -#elif defined(HAVE_DL_DYLD) -# if defined(HAVE_MACH_O_DYLD_H) -# include -# endif #elif defined(HAVE_DL_BEOS) # if defined(HAVE_IMAGE_H) # include # endif +#elif defined(__APPLE__) +# include #elif defined(HAVE_DL_WINDOWS) # include #elif defined(HAVE_DL_DLOPEN) @@ -64,12 +62,15 @@ # include # endif #endif +#ifdef HAVE_VALGRIND_VALGRIND_H +# include +#endif /***************************************************************************** * Local prototypes *****************************************************************************/ #ifdef HAVE_DYNAMIC_PLUGINS -static void * GetSymbol ( module_handle_t, const char * ); +static void *module_Lookup( module_handle_t, const char * ); #if defined(HAVE_DL_WINDOWS) static char * GetWindowsError ( void ); @@ -83,30 +84,31 @@ static char * GetWindowsError ( void ); * \param p_module the modules * \return 0 if it pass and -1 in case of a failure */ -int module_Call( module_t *p_module ) +int module_Call( vlc_object_t *obj, module_t *p_module ) { static const char psz_name[] = "vlc_entry" MODULE_SUFFIX; int (* pf_symbol) ( module_t * p_module ); /* Try to resolve the symbol */ - pf_symbol = (int (*)(module_t *)) GetSymbol( p_module->handle, psz_name ); + pf_symbol = (int (*)(module_t *)) module_Lookup( p_module->handle, + psz_name ); if( pf_symbol == NULL ) { -#if defined(HAVE_DL_DYLD) || defined(HAVE_DL_BEOS) - msg_Warn( p_module, "cannot find symbol \"%s\" in file `%s'", - psz_name, p_module->psz_filename ); +#if defined(HAVE_DL_BEOS) + msg_Warn( obj, "cannot find symbol \"%s\" in file `%s'", + psz_name, p_module->psz_filename ); #elif defined(HAVE_DL_WINDOWS) char *psz_error = GetWindowsError(); - msg_Warn( p_module, "cannot find symbol \"%s\" in file `%s' (%s)", - psz_name, p_module->psz_filename, psz_error ); + msg_Warn( obj, "cannot find symbol \"%s\" in file `%s' (%s)", + psz_name, p_module->psz_filename, psz_error ); free( psz_error ); #elif defined(HAVE_DL_DLOPEN) - msg_Warn( p_module, "cannot find symbol \"%s\" in file `%s' (%s)", - psz_name, p_module->psz_filename, dlerror() ); + msg_Warn( obj, "cannot find symbol \"%s\" in file `%s' (%s)", + psz_name, p_module->psz_filename, dlerror() ); #elif defined(HAVE_DL_SHL_LOAD) - msg_Warn( p_module, "cannot find symbol \"%s\" in file `%s' (%m)", - psz_name, p_module->psz_filename ); + msg_Warn( obj, "cannot find symbol \"%s\" in file `%s' (%m)", + psz_name, p_module->psz_filename ); #else # error "Something is wrong in modules.c" #endif @@ -118,8 +120,8 @@ int module_Call( module_t *p_module ) { /* With a well-written module we shouldn't have to print an * additional error message here, but just make sure. */ - msg_Err( p_module, "Failed to call symbol \"%s\" in file `%s'", - psz_name, p_module->psz_filename ); + msg_Err( obj, "Failed to call symbol \"%s\" in file `%s'", + psz_name, p_module->psz_filename ); return -1; } @@ -128,7 +130,7 @@ int module_Call( module_t *p_module ) } /** - * Load a dynamically linked library using a system dependant method. + * Load a dynamically linked library using a system dependent method. * * \param p_this vlc object * \param psz_file library file @@ -140,37 +142,7 @@ int module_Load( vlc_object_t *p_this, const char *psz_file, { module_handle_t handle; -#if defined(HAVE_DL_DYLD) - NSObjectFileImage image; - NSObjectFileImageReturnCode ret; - - ret = NSCreateObjectFileImageFromFile( psz_file, &image ); - - if( ret != NSObjectFileImageSuccess ) - { - msg_Warn( p_this, "cannot create image from `%s'", psz_file ); - return -1; - } - - /* Open the dynamic module */ - handle = NSLinkModule( image, psz_file, - NSLINKMODULE_OPTION_RETURN_ON_ERROR ); - - if( !handle ) - { - NSLinkEditErrors errors; - const char *psz_file, *psz_err; - int i_errnum; - NSLinkEditError( &errors, &i_errnum, &psz_file, &psz_err ); - msg_Warn( p_this, "cannot link module `%s' (%s)", psz_file, psz_err ); - NSDestroyObjectFileImage( image ); - return -1; - } - - /* Destroy our image, we won't need it */ - NSDestroyObjectFileImage( image ); - -#elif defined(HAVE_DL_BEOS) +#if defined(HAVE_DL_BEOS) handle = load_add_on( psz_file ); if( handle < 0 ) { @@ -179,15 +151,21 @@ int module_Load( vlc_object_t *p_this, const char *psz_file, } #elif defined(HAVE_DL_WINDOWS) -#ifdef UNDER_CE - { - wchar_t psz_wfile[MAX_PATH]; - MultiByteToWideChar( CP_ACP, 0, psz_file, -1, psz_wfile, MAX_PATH ); - handle = LoadLibrary( psz_wfile ); - } -#else - handle = LoadLibrary( psz_file ); + wchar_t psz_wfile[MAX_PATH]; + MultiByteToWideChar( CP_UTF8, 0, psz_file, -1, psz_wfile, MAX_PATH ); + +#ifndef UNDER_CE + /* FIXME: this is not thread-safe -- Courmisch */ + UINT mode = SetErrorMode (SEM_FAILCRITICALERRORS); + SetErrorMode (mode|SEM_FAILCRITICALERRORS); +#endif + + handle = LoadLibraryW( psz_wfile ); + +#ifndef UNDER_CE + SetErrorMode (mode); #endif + if( handle == NULL ) { char *psz_err = GetWindowsError(); @@ -196,28 +174,25 @@ int module_Load( vlc_object_t *p_this, const char *psz_file, return -1; } -#elif defined(HAVE_DL_DLOPEN) && defined(RTLD_NOW) - /* static is OK, we are called atomically */ - handle = dlopen( psz_file, RTLD_NOW ); - if( handle == NULL ) - { - msg_Warn( p_this, "cannot load module `%s' (%s)", - psz_file, dlerror() ); - return -1; - } - #elif defined(HAVE_DL_DLOPEN) -# if defined(DL_LAZY) - handle = dlopen( psz_file, DL_LAZY ); -# else - handle = dlopen( psz_file, 0 ); -# endif + +# if defined (RTLD_NOW) + const int flags = RTLD_NOW; +# elif defined (DL_LAZY) + const int flags = DL_LAZY; +# else + const int flags = 0; +# endif + char *path = ToLocale( psz_file ); + + handle = dlopen( path, flags ); if( handle == NULL ) { - msg_Warn( p_this, "cannot load module `%s' (%s)", - psz_file, dlerror() ); + msg_Warn( p_this, "cannot load module `%s' (%s)", path, dlerror() ); + LocaleFree( path ); return -1; } + LocaleFree( path ); #elif defined(HAVE_DL_SHL_LOAD) handle = shl_load( psz_file, BIND_IMMEDIATE | BIND_NONFATAL, NULL ); @@ -240,26 +215,25 @@ int module_Load( vlc_object_t *p_this, const char *psz_file, * CloseModule: unload a dynamic library * * This function unloads a previously opened dynamically linked library - * using a system dependant method. No return value is taken in consideration, + * using a system dependent method. No return value is taken in consideration, * since some libraries sometimes refuse to close properly. * \param handle handle of the library * \return nothing */ void module_Unload( module_handle_t handle ) { -#if defined(HAVE_DL_DYLD) - NSUnLinkModule( handle, FALSE ); - -#elif defined(HAVE_DL_BEOS) +#if defined(HAVE_DL_BEOS) unload_add_on( handle ); #elif defined(HAVE_DL_WINDOWS) FreeLibrary( handle ); #elif defined(HAVE_DL_DLOPEN) -# ifdef NDEBUG - dlclose( handle ); +# ifdef HAVE_VALGRIND_VALGRIND_H + if( RUNNING_ON_VALGRIND > 0 ) + return; /* do not dlclose() so that we get proper stack traces */ # endif + dlclose( handle ); #elif defined(HAVE_DL_SHL_LOAD) shl_unload( handle ); @@ -269,44 +243,19 @@ void module_Unload( module_handle_t handle ) } /** - * GetSymbol: get a symbol from a dynamic library + * Looks up a symbol from a dynamically loaded library * * This function queries a loaded library for a symbol specified in a * string, and returns a pointer to it. We don't check for dlerror() or * similar functions, since we want a non-NULL symbol anyway. - * \param handle handle to the module - * \param psz_function function name - * \return nothing + * + * @param handle handle to the module + * @param psz_function function name + * @return NULL on error, or the address of the symbol */ -static void * _module_getsymbol( module_handle_t, const char * ); - -static void * GetSymbol( module_handle_t handle, const char * psz_function ) -{ - void * p_symbol = _module_getsymbol( handle, psz_function ); - - /* MacOS X dl library expects symbols to begin with "_". So do - * some other operating systems. That's really lame, but hey, what - * can we do ? */ - if( p_symbol == NULL ) - { - char psz_call[strlen( psz_function ) + 2]; - - psz_call[ 0 ] = '_'; - memcpy( psz_call + 1, psz_function, sizeof (psz_call) - 1 ); - p_symbol = _module_getsymbol( handle, psz_call ); - } - - return p_symbol; -} - -static void * _module_getsymbol( module_handle_t handle, - const char * psz_function ) +static void *module_Lookup( module_handle_t handle, const char *psz_function ) { -#if defined(HAVE_DL_DYLD) - NSSymbol sym = NSLookupSymbolInModule( handle, psz_function ); - return NSAddressOfSymbol( sym ); - -#elif defined(HAVE_DL_BEOS) +#if defined(HAVE_DL_BEOS) void * p_symbol; if( B_OK == get_image_symbol( handle, psz_function, B_SYMBOL_TYPE_TEXT, &p_symbol ) ) @@ -319,10 +268,13 @@ static void * _module_getsymbol( module_handle_t handle, } #elif defined(HAVE_DL_WINDOWS) && defined(UNDER_CE) - wchar_t psz_real[256]; - MultiByteToWideChar( CP_ACP, 0, psz_function, -1, psz_real, 256 ); + wchar_t wide[strlen( psz_function ) + 1]; + size_t i = 0; + do + wide[i] = psz_function[i]; /* UTF-16 <- ASCII */ + while( psz_function[i++] ); - return (void *)GetProcAddress( handle, psz_real ); + return (void *)GetProcAddress( handle, wide ); #elif defined(HAVE_DL_WINDOWS) && defined(WIN32) return (void *)GetProcAddress( handle, (char *)psz_function );