#include #include #include #include #include "mlp_priv.h" mlp_language *mlp_language_init(mlp_context *ctx, const char *name){ mlp_debug(2, "-> Language init: %s", name) ; mlp_context_clear_error(ctx) ; dlerror() ; char *buf = (char *)malloc((strlen(name) + 32) * sizeof(char)) ; sprintf(buf, "libmlp_%s.so", name) ; void *handle = dlopen(buf, RTLD_LAZY) ; if (handle == NULL){ mlp_context_set_error(ctx, MLP_INTERNAL_ERROR, "Can't open shared object %s: %s\n", buf, dlerror()) ; free(buf) ; return NULL ; } free(buf) ; /* Now that the plugin is loaded, we must initialize it */ buf = (char *)malloc((strlen(name) + 32) * sizeof(char)) ; sprintf(buf, "_mlp_%s_language_init", name) ; dlerror() ; mlp_interface *(*init)(mlp_context *ctx, const char *name) = NULL ; init = dlsym(handle, buf) ; const char *error ; if ((error = dlerror()) != NULL){ mlp_context_set_error(ctx, MLP_INTERNAL_ERROR, "Can't find symbol %s: %s\n", buf, error) ; free(buf) ; return NULL ; } free(buf) ; /* Build the dir name where the plugin helper files can be. */ char *dir = (char *)malloc((strlen(MLP_LANGUAGE_DIR) + strlen(name) + 32) * sizeof(char)) ; sprintf(dir, "%s/%s/", MLP_LANGUAGE_DIR, name) ; mlp_interface *iface = (*init)(ctx, name) ; if (mlp_context_has_error(ctx)){ free(dir) ; return NULL ; } mlp_language *lang = MLP_MALLOC(mlp_language) ; lang->name = strdup(name) ; lang->dir = dir ; lang->handle = handle ; lang->iface = iface ; mlp_debug(2, "<- Language init: %s", name) ; return lang ; } void mlp_language_delete(mlp_context *ctx, mlp_language *lang){ mlp_context_clear_error(ctx) ; if (lang != NULL){ mlp_debug(2, "-> Language delete: %s", lang->name) ; int rc = dlclose(lang->handle) ; if (rc != 0){ mlp_context_set_error(ctx, MLP_INTERNAL_ERROR, "Can't close shared object %s: %s\n", lang->name, dlerror()) ; } free(lang->iface) ; free(lang->name) ; free(lang) ; mlp_debug(2, "-> Language delete") ; } } const char *mlp_language_get_name(const mlp_language *lang){ return lang->name ; } const char *mlp_language_get_dir(const mlp_language *lang){ return lang->dir ; } const mlp_interface *mlp_language_get_iface(const mlp_language *lang){ return lang->iface ; }