]> git.sesse.net Git - vlc/blob - include/modules_core.h
* Header cleaning: filled all empty authors fields, added CVS $Id stuff.
[vlc] / include / modules_core.h
1 /*****************************************************************************
2  * modules_core.h : Module management functions used by the core application.
3  *****************************************************************************
4  * Copyright (C) 2001 VideoLAN
5  * $Id: modules_core.h,v 1.5 2001/03/21 13:42:33 sam Exp $
6  *
7  * Authors: Samuel Hocevar <sam@zoy.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  * 
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Inline functions for handling dynamic modules
26  *****************************************************************************/
27
28 /*****************************************************************************
29  * module_load: load a dynamic library
30  *****************************************************************************
31  * This function loads a dynamically linked library using a system dependant
32  * method, and returns a non-zero value on error, zero otherwise.
33  *****************************************************************************/
34 static __inline__ int
35 module_load( char * psz_filename, module_handle_t * handle )
36 {
37 #ifdef SYS_BEOS
38     *handle = load_add_on( psz_filename );
39     return( *handle < 0 );
40 #else
41     /* Do not open modules with RTLD_GLOBAL, or we are going to get namespace
42      * collisions when two modules have common public symbols */
43     *handle = dlopen( psz_filename, RTLD_NOW );
44
45     return( *handle == NULL );
46 #endif
47 }
48
49 /*****************************************************************************
50  * module_unload: unload a dynamic library
51  *****************************************************************************
52  * This function unloads a previously opened dynamically linked library
53  * using a system dependant method. No return value is taken in consideration,
54  * since some libraries sometimes refuse to close properly.
55  *****************************************************************************/
56 static __inline__ void
57 module_unload( module_handle_t handle )
58 {
59 #ifdef SYS_BEOS
60     unload_add_on( handle );
61 #else
62     dlclose( handle );
63 #endif
64     return;
65 }
66
67 /*****************************************************************************
68  * module_getsymbol: get a symbol from a dynamic library
69  *****************************************************************************
70  * This function queries a loaded library for a symbol specified in a
71  * string, and returns a pointer to it.
72  * FIXME: under Unix we should maybe check for dlerror() instead of the
73  * return value of dlsym, since we could have loaded a symbol really set
74  * to NULL (quite unlikely, though).
75  *****************************************************************************/
76 static __inline__ void *
77 module_getsymbol( module_handle_t handle, char * psz_function )
78 {
79 #ifdef SYS_BEOS
80     void * p_symbol;
81     if( B_OK == get_image_symbol( handle, psz_function,
82                                   B_SYMBOL_TYPE_TEXT, &p_symbol ) )
83     {
84         return( p_symbol );
85     }
86     else
87     {
88         return( NULL );
89     }
90
91 #elif defined(SYS_DARWIN1_3)
92     /* MacOS X dl library expects symbols to begin with "_". That's
93      * really lame, but hey, what can we do ? */
94     char *  psz_call = malloc( strlen( psz_function ) + 2 );
95     void *  p_return;
96     strcpy( psz_call + 1, psz_function );
97     psz_call[ 0 ] = '_';
98
99     p_return = dlsym( handle, psz_call );
100
101     free( psz_call );
102     return( p_return );
103
104 #else
105     return( dlsym( handle, psz_function ) );
106 #endif
107 }
108
109 /*****************************************************************************
110  * module_error: wrapper for dlerror()
111  *****************************************************************************
112  * This function returns the error message of the last module operation. It
113  * returns the string "failed" on systems which do not have the dlerror()
114  * function.
115  *****************************************************************************/
116 static __inline__ const char *
117 module_error( void )
118 {
119 #ifdef SYS_BEOS
120     return( "failed" );
121 #else
122     return( dlerror() );
123 #endif
124 }
125