2008-11-04 08:05:53 +01:00
/*
2014-10-15 23:08:53 +02:00
PluginDynlib - Lumiera Plugin loader for dynamic libraries
2008-11-04 08:05:53 +01:00
Copyright ( C ) Lumiera . org
2008 , Christian Thaeter < ct @ pipapo . org >
This program is free software ; you can redistribute it and / or
modify it under the terms of the GNU General Public License as
2010-12-17 23:28:49 +01:00
published by the Free Software Foundation ; either version 2 of
the License , or ( at your option ) any later version .
2008-11-04 08:05:53 +01:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
2014-10-15 23:08:53 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/** @file plugin-dynlib.c
* * Implementation of plugin loader for dynamic libraries .
*/
2009-01-24 03:13:08 +01:00
2009-01-25 00:24:42 +01:00
# include "include/logging.h"
2010-07-21 04:19:17 +02:00
# include "lib/tmpbuf.h"
2008-12-18 08:54:33 +01:00
# include "common/plugin.h"
2008-11-04 08:05:53 +01:00
# include <dlfcn.h>
# include <nobug.h>
LumieraPlugin
lumiera_plugin_load_DYNLIB ( const char * name )
{
2011-12-02 21:34:29 +01:00
TRACE ( pluginloader_dbg , " load DYNLIB: %s " , name ) ;
2008-12-08 05:55:12 +01:00
REQUIRE ( name ) ;
2008-11-04 08:05:53 +01:00
LumieraPlugin self = lumiera_plugin_new ( name ) ;
LumieraInterface plugin = NULL ;
void * handle = dlopen ( name , RTLD_LAZY | RTLD_LOCAL ) ;
if ( handle )
{
plugin = ( LumieraInterface ) dlsym ( handle , LUMIERA_INTERFACE_DSTRING ( lumieraorg__plugin , 0 , lumieraorg_plugin ) ) ;
if ( ! plugin )
2009-01-24 03:13:08 +01:00
LUMIERA_ERROR_SET ( pluginloader , PLUGIN_WTF , name ) ;
2008-11-04 08:05:53 +01:00
}
else
2009-01-24 03:13:08 +01:00
LUMIERA_ERROR_SET ( pluginloader_dbg , PLUGIN_OPEN , lumiera_tmpbuf_snprintf ( 4096 , " %s: %s " , name , dlerror ( ) ) ) ;
2008-12-08 05:55:12 +01:00
2008-11-04 08:05:53 +01:00
return lumiera_plugin_init ( self , handle , plugin ) ;
}
void
lumiera_plugin_unload_DYNLIB ( LumieraPlugin self )
{
2009-01-24 03:13:08 +01:00
TRACE ( pluginloader_dbg ) ;
2008-11-05 09:47:52 +01:00
void * handle = lumiera_plugin_handle ( self ) ;
if ( handle )
dlclose ( handle ) ;
2016-10-28 15:57:37 +02:00
///////////////////////////////////////////////////////////////////TICKET #1034 : on Debian the process dies when unloading gtk_gui.lum (_dl_close: Assertion `map->l_init_called' failed!)
2008-11-04 08:05:53 +01:00
}