diff options
| -rw-r--r-- | eglib/gmain.c | 69 | ||||
| -rw-r--r-- | eglib/gmain.h | 16 | 
2 files changed, 85 insertions, 0 deletions
| diff --git a/eglib/gmain.c b/eglib/gmain.c index b341d516..ce35b816 100644 --- a/eglib/gmain.c +++ b/eglib/gmain.c @@ -16,6 +16,7 @@  #include <sys/mman.h>  #include <sys/file.h>  #include <ctype.h> +#include <dlfcn.h>  #include <gmain.h> @@ -1577,3 +1578,71 @@ gchar *g_string_free(GString *string, gboolean free_segment)  	return segment;  } + +/* GModule */ + +struct _GModule { +	void *handle; +}; + +static const char *dl_error_string = NULL; + +GModule *g_module_open(const gchar *file_name, GModuleFlags flags) +{ +	GModule *module; + +	module = g_try_new0(GModule, 1); +	if (module == NULL) { +		dl_error_string = strerror(ENOMEM); +		return NULL; +	} + +	module->handle = dlopen(file_name, flags); + +	if (module->handle == NULL) { +		dl_error_string = dlerror(); +		g_free(module); +		return NULL; +	} + +	return module; +} + +gboolean g_module_symbol(GModule *module, const gchar *symbol_name, +				gpointer *symbol) +{ +	void *sym; + +	dlerror(); +	sym = dlsym(module->handle, symbol_name); +	dl_error_string = dlerror(); + +	if (dl_error_string != NULL) +		return FALSE; + +	*symbol = sym; + +	return TRUE; +} + +gboolean g_module_close(GModule *module) +{ +	if (dlclose(module->handle) != 0) { +		dl_error_string = dlerror(); +		return FALSE; +	} + +	g_free(module); + +	return TRUE; +} + +const gchar *g_module_error(void) +{ +	const char *str; + +	str = dl_error_string; +	dl_error_string = NULL; + +	return str; +} diff --git a/eglib/gmain.h b/eglib/gmain.h index 2ed00fb3..cfc53378 100644 --- a/eglib/gmain.h +++ b/eglib/gmain.h @@ -279,4 +279,20 @@ void g_string_append_printf(GString *string, const gchar *format, ...);  gchar *g_string_free(GString *string, gboolean free_segment); +/* GModule */ + +typedef struct _GModule GModule; + +typedef enum { +	G_MODULE_BIND_LAZY	= 1 << 0, +	G_MODULE_BIND_LOCAL	= 1 << 1, +	G_MODULE_BIND_MASK	= 0x03 +} GModuleFlags; + +GModule *g_module_open(const gchar *file_name, GModuleFlags flags); +gboolean g_module_symbol(GModule *module, const gchar *symbol_name, +				gpointer *symbol); +gboolean g_module_close(GModule *module); +const gchar *g_module_error(void); +  #endif /* __GMAIN_H */ | 
