X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fos.c;h=9110c79e0bbffd889810eaf935e1157325fb6667;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=baaa24fdc5d8d4542f6bb1b4939718688b7cdfad;hpb=e03e85ca01adc1639db0f9bf90aadf8d20c2cbeb;p=vlc diff --git a/src/modules/os.c b/src/modules/os.c index baaa24fdc5..9110c79e0b 100644 --- a/src/modules/os.c +++ b/src/modules/os.c @@ -24,7 +24,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include /* MODULE_SUFFIX */ +#include #include "libvlc.h" #include "modules.h" @@ -32,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) @@ -60,52 +62,53 @@ # include # endif #endif - -//#include "config/config.h" - -//#include "vlc_charset.h" +#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 ); #endif -/***************************************************************************** - * module_Call: call an entry point. - ***************************************************************************** - * This function calls a symbol given its name and a module structure. The - * symbol MUST refer to a function returning int and taking a module_t* as - * an argument. - *****************************************************************************/ -int module_Call( module_t * p_module ) +/** + * module Call + * + * Call a symbol given its name and a module structure. The symbol MUST + * refer to a function returning int and taking a module_t* as an argument. + * \param p_module the modules + * \return 0 if it pass and -1 in case of a failure + */ +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 @@ -117,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; } @@ -126,48 +129,20 @@ int module_Call( module_t * p_module ) return 0; } -/***************************************************************************** - * module_Load: loads a dynamic library - ***************************************************************************** - * This function loads a dynamically linked library using a system dependant - * method. Will return 0 on success as well as the module handle. - *****************************************************************************/ +/** + * Load a dynamically linked library using a system dependent method. + * + * \param p_this vlc object + * \param psz_file library file + * \param p_handle the module handle returned + * \return 0 on success as well as the module handle. + */ int module_Load( vlc_object_t *p_this, const char *psz_file, module_handle_t *p_handle ) { 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 ) { @@ -176,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(); @@ -193,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 ); @@ -233,28 +211,29 @@ int module_Load( vlc_object_t *p_this, const char *psz_file, return 0; } -/***************************************************************************** +/** * 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 ); @@ -263,42 +242,20 @@ void module_Unload( module_handle_t handle ) return; } -/***************************************************************************** - * 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. - *****************************************************************************/ -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 ) + * + * @param handle handle to the module + * @param psz_function function name + * @return NULL on error, or the address of the symbol + */ +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 ) ) @@ -311,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 ); @@ -331,43 +291,23 @@ static void * _module_getsymbol( module_handle_t handle, } #if defined(HAVE_DL_WINDOWS) +# include + static char * GetWindowsError( void ) { -#if defined(UNDER_CE) - wchar_t psz_tmp[MAX_PATH]; - char * psz_buffer = malloc( MAX_PATH ); -#else - char * psz_tmp = malloc( MAX_PATH ); -#endif + wchar_t wmsg[256]; int i = 0, i_error = GetLastError(); - FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, i_error, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)psz_tmp, MAX_PATH, NULL ); + FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, i_error, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + wmsg, 256, NULL ); /* Go to the end of the string */ - while( psz_tmp[i] && psz_tmp[i] != _T('\r') && psz_tmp[i] != _T('\n') ) - { + while( !wmemchr( L"\r\n\0", wmsg[i], 3 ) ) i++; - } - - if( psz_tmp[i] ) - { -#if defined(UNDER_CE) - swprintf( psz_tmp + i, L" (error %i)", i_error ); - psz_tmp[ 255 ] = L'\0'; -#else - snprintf( psz_tmp + i, 256 - i, " (error %i)", i_error ); - psz_tmp[ 255 ] = '\0'; -#endif - } -#if defined(UNDER_CE) - wcstombs( psz_buffer, psz_tmp, MAX_PATH ); - return psz_buffer; -#else - return psz_tmp; -#endif + snwprintf( wmsg + i, 256 - i, L" (error %i)", i_error ); + return FromWide( wmsg ); } #endif /* HAVE_DL_WINDOWS */ #endif /* HAVE_DYNAMIC_PLUGINS */