plugins: remove hardcoded plugin loader name from GSignondRemotePlugin
authorAlexander Kanavin <alexander.kanavin@intel.com>
Thu, 6 Feb 2014 19:08:17 +0000 (21:08 +0200)
committerAlexander Kanavin <alexander.kanavin@intel.com>
Thu, 6 Feb 2014 19:08:17 +0000 (21:08 +0200)
src/daemon/plugins/gsignond-plugin-proxy-factory.c
src/daemon/plugins/gsignond-plugin-proxy.c
src/daemon/plugins/gsignond-plugin-proxy.h
src/daemon/plugins/gsignond-plugin-remote.c
src/daemon/plugins/gsignond-plugin-remote.h
test/plugins/pluginproxytest.c
test/plugins/pluginremotetest.c

index 32dced8..8235da3 100644 (file)
@@ -46,6 +46,18 @@ enum
 
 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;
@@ -55,12 +67,13 @@ static void _enumerate_plugins(GSignondPluginProxyFactory* self)
     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++;
@@ -68,6 +81,8 @@ static void _enumerate_plugins(GSignondPluginProxyFactory* self)
     
     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) {
@@ -79,7 +94,7 @@ static void _enumerate_plugins(GSignondPluginProxyFactory* self)
             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;
@@ -101,6 +116,7 @@ static void _enumerate_plugins(GSignondPluginProxyFactory* self)
             g_free(plugin_name);
         }
     }
+    g_free(loader_path);
     g_dir_close(plugin_dir);
 }
 
@@ -301,7 +317,10 @@ gsignond_plugin_proxy_factory_get_plugin(GSignondPluginProxyFactory* factory,
         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;
     }
index a269fcd..ffe08e7 100644 (file)
@@ -41,14 +41,14 @@ enum
     
     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;
@@ -288,7 +288,7 @@ gsignond_plugin_proxy_constructor (
     /* 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) {
@@ -342,9 +342,9 @@ gsignond_plugin_proxy_set_property (
             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);
@@ -371,8 +371,8 @@ gsignond_plugin_proxy_get_property (
             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);
@@ -396,10 +396,6 @@ gsignond_plugin_proxy_dispose (
         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);
@@ -415,6 +411,10 @@ gsignond_plugin_proxy_finalize (GObject *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,
@@ -455,14 +455,13 @@ gsignond_plugin_proxy_class_init (
                             "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);
@@ -476,7 +475,7 @@ gsignond_plugin_proxy_init (
     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 ();
@@ -496,14 +495,14 @@ gsignond_plugin_proxy_get_plugin_type (
 
 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,
index d5b5bc1..688d826 100644 (file)
@@ -71,8 +71,9 @@ gsignond_plugin_proxy_get_type (void);
 
 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 (
index bee3abb..f2ddcfc 100644 (file)
@@ -53,8 +53,6 @@ G_DEFINE_TYPE_WITH_CODE (GSignondPluginRemote, gsignond_plugin_remote,
         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,
@@ -552,7 +550,7 @@ _status_changed_cb (
 
 GSignondPluginRemote *
 gsignond_plugin_remote_new (
-        GSignondConfig *config,
+        const gchar *loader_path,
         const gchar *plugin_type)
 {
     GError *error = NULL;
@@ -562,13 +560,6 @@ gsignond_plugin_remote_new (
     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
@@ -577,7 +568,7 @@ gsignond_plugin_remote_new (
 
     /* 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,
index 59807d8..4f206dc 100644 (file)
@@ -69,7 +69,7 @@ gsignond_plugin_remote_get_type (void) G_GNUC_CONST;
 
 GSignondPluginRemote *
 gsignond_plugin_remote_new (
-        GSignondConfig *config,
+        const gchar *loader_path,
         const gchar *plugin_type);
 
 G_END_DECLS
index 5c2486a..410d2bb 100644 (file)
@@ -260,6 +260,16 @@ check_plugin_proxy(
     }
 }
 
+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");
@@ -269,11 +279,11 @@ START_TEST (test_pluginproxy_create)
     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);
 
@@ -289,7 +299,7 @@ START_TEST (test_pluginproxy_process)
     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();
@@ -323,7 +333,7 @@ START_TEST (test_pluginproxy_process_cancel)
     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();
@@ -355,7 +365,7 @@ START_TEST (test_pluginproxy_process_queue)
     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();
@@ -387,7 +397,7 @@ START_TEST (test_pluginproxy_process_queue_cancel)
     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();
@@ -491,7 +501,7 @@ START_TEST (test_pluginproxyfactory_add)
             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);
index c861f12..2cb5a97 100644 (file)
@@ -223,7 +223,9 @@ START_TEST (test_pluginremote_create)
     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);
@@ -241,7 +243,9 @@ START_TEST (test_pluginremote_plugind_create)
     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);
@@ -267,7 +271,9 @@ START_TEST (test_pluginremote_plugind_unref)
     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;
 
@@ -293,7 +299,9 @@ START_TEST (test_pluginremote_plugind_kill)
     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;
 
@@ -322,7 +330,9 @@ START_TEST (test_pluginremote_request)
     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;
@@ -418,7 +428,9 @@ START_TEST (test_pluginremote_user_action_finished)
     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;
@@ -501,7 +513,9 @@ START_TEST (test_pluginremote_refresh)
     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;