static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+static gchar* _get_loader_path()
+{
+ const gchar *loader_dir = GSIGNOND_PLUGINLOADERS_DIR;
+# ifdef ENABLE_DEBUG
+ const gchar* env_val = g_getenv("SSO_BIN_DIR");
+ if (env_val)
+ loader_dir = env_val;
+# endif
+ gchar* loader_path = g_build_filename (loader_dir, "gsignond-plugind", NULL);
+ return loader_path;
+}
+
static void _enumerate_plugins(GSignondPluginProxyFactory* self)
{
const gchar *plugin_path = GSIGNOND_GPLUGINS_DIR;
if (env_val)
plugin_path = env_val;
# endif
+
GDir* plugin_dir = g_dir_open(plugin_path, 0, NULL);
if (plugin_dir == NULL) {
WARN ("plugin directory empty");
return;
}
-
+
int n_plugins = 0;
while (g_dir_read_name(plugin_dir) != NULL)
n_plugins++;
self->methods = g_malloc0(sizeof(gchar*) * (n_plugins + 1));
+ gchar* loader_path = _get_loader_path();
+
DBG ("enumerate plugins in %s (factory=%p)", plugin_path, self);
gchar **method_iter = self->methods;
while (1) {
gchar* plugin_name = g_strndup(plugin_soname+3,
strlen(plugin_soname) - 6);
GSignondPlugin* plugin = GSIGNOND_PLUGIN (
- gsignond_plugin_remote_new (self->config, plugin_name));
+ gsignond_plugin_remote_new (loader_path, plugin_name));
if (plugin != NULL) {
gchar* plugin_type;
gchar** mechanisms;
g_free(plugin_name);
}
}
+ g_free(loader_path);
g_dir_close(plugin_dir);
}
return proxy;
}
- proxy = gsignond_plugin_proxy_new(factory->config, plugin_type);
+ gchar* loader_path = _get_loader_path();
+ proxy = gsignond_plugin_proxy_new(loader_path, plugin_type,
+ gsignond_config_get_integer (factory->config, GSIGNOND_CONFIG_PLUGIN_TIMEOUT));
+ g_free(loader_path);
if (proxy == NULL) {
return NULL;
}
PROP_TYPE,
PROP_MECHANISMS,
- PROP_CONFIG,
+ PROP_LOADERPATH,
N_PROPERTIES
};
struct _GSignondPluginProxyPrivate
{
- GSignondConfig *config;
+ gchar* loader_path;
gchar* plugin_type;
GSignondPlugin* plugin;
GQueue* session_queue;
/* update the object state depending on constructor properties */
GSignondPluginProxy* self = GSIGNOND_PLUGIN_PROXY (obj);
GSignondPluginProxyPrivate *priv = self->priv;
- priv->plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new (priv->config,
+ priv->plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new (priv->loader_path,
priv->plugin_type));
if (priv->plugin == NULL) {
g_free (self->priv->plugin_type);
priv->plugin_type = g_value_dup_string (value);
break;
- case PROP_CONFIG:
- g_assert (self->priv->config == NULL);
- priv->config = g_value_dup_object (value);
+ case PROP_LOADERPATH:
+ g_assert (self->priv->loader_path == NULL);
+ priv->loader_path = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
g_object_get_property (G_OBJECT(priv->plugin),
"mechanisms", value);
break;
- case PROP_CONFIG:
- g_value_set_object (value, priv->config);
+ case PROP_LOADERPATH:
+ g_value_set_object (value, priv->loader_path);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
g_object_unref (priv->plugin);
priv->plugin = NULL;
}
- if (priv->config) {
- g_object_unref (priv->config);
- priv->config = NULL;
- }
/* Chain up to the parent class */
G_OBJECT_CLASS (gsignond_plugin_proxy_parent_class)->dispose (gobject);
g_free (priv->plugin_type);
priv->plugin_type = NULL;
}
+ if (priv->loader_path) {
+ g_free (priv->loader_path);
+ priv->loader_path = NULL;
+ }
if (priv->session_queue)
{
g_queue_free_full (priv->session_queue,
"List of plugin mechanisms",
G_TYPE_STRV, G_PARAM_READABLE);
- obj_properties[PROP_CONFIG] = g_param_spec_object ("config",
- "config",
- "Configuration object",
- GSIGNOND_TYPE_CONFIG,
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_READWRITE |
+ obj_properties[PROP_LOADERPATH] = g_param_spec_string ("loaderpath",
+ "Path to loader",
+ "Path to plugin loader for this plugin",
+ "" /* default value */,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
-
+
g_object_class_install_properties (gobject_class,
N_PROPERTIES,
obj_properties);
GSignondPluginProxyPrivate *priv = GSIGNOND_PLUGIN_PROXY_PRIV (self);
self->priv = priv;
- priv->config = NULL;
+ priv->loader_path = NULL;
priv->plugin_type = NULL;
priv->plugin = NULL;
priv->session_queue = g_queue_new ();
GSignondPluginProxy*
gsignond_plugin_proxy_new (
- GSignondConfig *config,
- const gchar *plugin_type)
+ const gchar *loader_path,
+ const gchar *plugin_type,
+ gint timeout)
{
- g_return_val_if_fail (config && plugin_type, NULL);
+ g_return_val_if_fail (loader_path && plugin_type, NULL);
- gint timeout = gsignond_config_get_integer (config, GSIGNOND_CONFIG_PLUGIN_TIMEOUT);
GSignondPluginProxy* proxy = g_object_new (GSIGNOND_TYPE_PLUGIN_PROXY,
- "config", config,
+ "loaderpath", loader_path,
"type", plugin_type,
"auto-dispose", FALSE,
"timeout", timeout,
GSignondPluginProxy*
gsignond_plugin_proxy_new(
- GSignondConfig *config,
- const gchar* plugin_type);
+ const gchar* loader_path,
+ const gchar* plugin_type,
+ gint timeout);
void
gsignond_plugin_proxy_cancel (
G_TYPE_INSTANCE_GET_PRIVATE ((obj), GSIGNOND_TYPE_PLUGIN_REMOTE, \
GSignondPluginRemotePrivate)
-#define GSIGNOND_PLUGIND_NAME "gsignond-plugind"
-
static void
_on_child_down_cb (
GPid pid,
GSignondPluginRemote *
gsignond_plugin_remote_new (
- GSignondConfig *config,
+ const gchar *loader_path,
const gchar *plugin_type)
{
GError *error = NULL;
GSignondPluginRemote *plugin = NULL;
GSignondPipeStream *stream = NULL;
gboolean ret = FALSE;
- const gchar *bin_path = GSIGNOND_PLUGINLOADERS_DIR;
-
-# ifdef ENABLE_DEBUG
- const gchar *env_val = g_getenv("SSO_BIN_DIR");
- if (env_val)
- bin_path = env_val;
-# endif
/* This guarantees that writes to a pipe will never cause
* a process terminanation via SIGPIPE, and instead a proper
/* Spawn child process */
argv = g_malloc0 ((2 + 1) * sizeof (gchar *));
- argv[0] = g_build_filename (bin_path, GSIGNOND_PLUGIND_NAME, NULL);
+ argv[0] = g_strdup(loader_path);
argv[1] = g_strdup_printf("--load-plugin=%s",plugin_type);
ret = g_spawn_async_with_pipes (NULL, argv, NULL,
G_SPAWN_DO_NOT_REAP_CHILD, NULL,
GSignondPluginRemote *
gsignond_plugin_remote_new (
- GSignondConfig *config,
+ const gchar *loader_path,
const gchar *plugin_type);
G_END_DECLS
}
}
+static GSignondPluginProxy* _make_plugin_proxy(GSignondConfig* config, const gchar* plugin_type)
+{
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+
+ GSignondPluginProxy* proxy = gsignond_plugin_proxy_new(loader_path, plugin_type,
+ gsignond_config_get_integer (config, GSIGNOND_CONFIG_PLUGIN_TIMEOUT));
+ g_free(loader_path);
+ return proxy;
+}
+
START_TEST (test_pluginproxy_create)
{
DBG("test_pluginproxy_create\n");
GSignondConfig* config = gsignond_config_new();
fail_if(config == NULL);
- GSignondPluginProxy* proxy2 = gsignond_plugin_proxy_new(config,
+ GSignondPluginProxy* proxy2 = _make_plugin_proxy(config,
"absentplugin");
fail_if (proxy2 != NULL);
- GSignondPluginProxy* proxy = gsignond_plugin_proxy_new(config, "password");
+ GSignondPluginProxy* proxy = _make_plugin_proxy(config, "password");
fail_if (proxy == NULL);
check_plugin_proxy(proxy, "password", pass_mechs);
GSignondConfig* config = gsignond_config_new();
fail_if(config == NULL);
- GSignondPluginProxy* proxy = gsignond_plugin_proxy_new(config, "password");
+ GSignondPluginProxy* proxy = _make_plugin_proxy(config, "password");
fail_if (proxy == NULL);
GSignondSessionData* data = gsignond_dictionary_new();
GSignondConfig* config = gsignond_config_new();
fail_if(config == NULL);
- GSignondPluginProxy* proxy = gsignond_plugin_proxy_new(config, "ssotest");
+ GSignondPluginProxy* proxy = _make_plugin_proxy(config, "ssotest");
fail_if (proxy == NULL);
GSignondSessionData* data = gsignond_dictionary_new();
GSignondConfig* config = gsignond_config_new();
fail_if(config == NULL);
- GSignondPluginProxy* proxy = gsignond_plugin_proxy_new(config, "password");
+ GSignondPluginProxy* proxy = _make_plugin_proxy(config, "password");
fail_if (proxy == NULL);
GSignondSessionData* data = gsignond_dictionary_new();
GSignondConfig* config = gsignond_config_new();
fail_if(config == NULL);
- GSignondPluginProxy* proxy = gsignond_plugin_proxy_new(config, "ssotest");
+ GSignondPluginProxy* proxy = _make_plugin_proxy(config, "ssotest");
fail_if (proxy == NULL);
GSignondSessionData* data = gsignond_dictionary_new();
config);
fail_if(factory == NULL);
- GSignondPluginProxy* proxy = gsignond_plugin_proxy_new(config, "password");
+ GSignondPluginProxy* proxy = _make_plugin_proxy(config, "password");
fail_if (proxy == NULL);
fail_if(gsignond_plugin_proxy_factory_add_plugin(factory, proxy) == FALSE);
fail_if(gsignond_plugin_proxy_factory_add_plugin(factory, proxy) == TRUE);
GSignondConfig* config = gsignond_config_new ();
fail_if (config == NULL);
- plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(config, plugin_type));
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+ plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(loader_path, plugin_type));
+ g_free(loader_path);
g_object_unref (config);
check_plugin (plugin);
GSignondConfig* config = gsignond_config_new ();
fail_if (config == NULL);
- plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(config, plugin_type));
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+ plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(loader_path, plugin_type));
+ g_free(loader_path);
g_object_unref (config);
fail_if (plugin == NULL);
GSignondConfig* config = gsignond_config_new ();
fail_if (config == NULL);
- plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(config, plugin_type));
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+ plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(loader_path, plugin_type));
+ g_free(loader_path);
fail_if (plugin == NULL);
priv = (GSignondPluginRemotePrivate *)GSIGNOND_PLUGIN_REMOTE (plugin)->priv;
GSignondConfig* config = gsignond_config_new ();
fail_if (config == NULL);
- plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(config, plugin_type));
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+ plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(loader_path, plugin_type));
+ g_free(loader_path);
fail_if (plugin == NULL);
priv = (GSignondPluginRemotePrivate *)GSIGNOND_PLUGIN_REMOTE (plugin)->priv;
GSignondConfig* config = gsignond_config_new ();
fail_if(config == NULL);
- plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(config, plugin_type));
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+ plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(loader_path, plugin_type));
+ g_free(loader_path);
fail_if(plugin == NULL);
GSignondSessionData* result = NULL;
GSignondConfig* config = gsignond_config_new ();
fail_if(config == NULL);
- plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(config, plugin_type));
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+ plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(loader_path, plugin_type));
+ g_free(loader_path);
fail_if(plugin == NULL);
GSignondSessionData* result = NULL;
GSignondConfig* config = gsignond_config_new ();
fail_if(config == NULL);
- plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(config, plugin_type));
+ gchar* loader_path = g_build_filename (g_getenv("SSO_BIN_DIR"), "gsignond-plugind", NULL);
+ plugin = GSIGNOND_PLUGIN (gsignond_plugin_remote_new(loader_path, plugin_type));
+ g_free(loader_path);
fail_if(plugin == NULL);
GSignondSessionData* result = NULL;