[NetworkManager-libreswan] shared/vpn-plugin-utils: load the editor from the same place as plugin



commit dd2f39bcb809061e48c468394ef8d7144c556861
Author: Lubomir Rintel <lkundrak v3 sk>
Date:   Mon Oct 22 11:27:44 2018 +0200

    shared/vpn-plugin-utils: load the editor from the same place as plugin
    
    If passed a relative path, load the editor .so from the same directory
    as the plugin .so. This is useful for development, as it allows running
    the editor plugin from the build tree conveniently.
    
    https://github.com/NetworkManager/NetworkManager/pull/242
    
    (imported from NetworkManager commit 25f625b4fc58f56b7ab84dbcfc155bc210f3ee66)

 shared/nm-utils/nm-vpn-plugin-utils.c | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)
---
diff --git a/shared/nm-utils/nm-vpn-plugin-utils.c b/shared/nm-utils/nm-vpn-plugin-utils.c
index 39c5627..353a281 100644
--- a/shared/nm-utils/nm-vpn-plugin-utils.c
+++ b/shared/nm-utils/nm-vpn-plugin-utils.c
@@ -16,7 +16,7 @@
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301 USA.
  *
- * Copyright 2016 Red Hat, Inc.
+ * Copyright 2016,2018 Red Hat, Inc.
  */
 
 #include "nm-default.h"
@@ -44,14 +44,37 @@ nm_vpn_plugin_utils_load_editor (const char *module_name,
                char *factory_name;
        } cached = { 0 };
        NMVpnEditor *editor;
+       gs_free char *module_path = NULL;
+       gs_free char *dirname = NULL;
+       Dl_info plugin_info;
 
-       g_return_val_if_fail (module_name && g_path_is_absolute (module_name), NULL);
+       g_return_val_if_fail (module_name, NULL);
        g_return_val_if_fail (factory_name && factory_name[0], NULL);
        g_return_val_if_fail (editor_factory, NULL);
        g_return_val_if_fail (NM_IS_VPN_EDITOR_PLUGIN (editor_plugin), NULL);
        g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
        g_return_val_if_fail (!error || !*error, NULL);
 
+       if (!g_path_is_absolute (module_name)) {
+               /*
+                * Load an editor from the same directory this plugin is in.
+                * Ideally, we'd get our .so name from the NMVpnEditorPlugin if it
+                * would just have a property with it...
+                */
+               if (!dladdr(nm_vpn_plugin_utils_load_editor, &plugin_info)) {
+                       /* Really a "can not happen" scenario. */
+                       g_set_error (error,
+                                    NM_VPN_PLUGIN_ERROR,
+                                    NM_VPN_PLUGIN_ERROR_FAILED,
+                                    _("unable to get editor plugin name: %s"), dlerror ());
+               }
+
+               dirname = g_path_get_dirname (plugin_info.dli_fname);
+               module_path = g_build_filename (dirname, module_name, NULL);
+       } else {
+               module_path = g_strdup (module_name);
+       }
+
        /* we really expect this function to be called with unchanging @module_name
         * and @factory_name. And we only want to load the module once, hence it would
         * be more complicated to accept changing @module_name/@factory_name arguments.
@@ -71,13 +94,13 @@ nm_vpn_plugin_utils_load_editor (const char *module_name,
                gpointer factory;
                void *dl_module;
 
-               dl_module = dlopen (module_name, RTLD_LAZY | RTLD_LOCAL);
+               dl_module = dlopen (module_path, RTLD_LAZY | RTLD_LOCAL);
                if (!dl_module) {
-                       if (!g_file_test (module_name, G_FILE_TEST_EXISTS)) {
+                       if (!g_file_test (module_path, G_FILE_TEST_EXISTS)) {
                                g_set_error (error,
                                             G_FILE_ERROR,
                                             G_FILE_ERROR_NOENT,
-                                            _("missing plugin file \"%s\""), module_name);
+                                            _("missing plugin file \"%s\""), module_path);
                                return NULL;
                        }
                        g_set_error (error,
@@ -127,4 +150,3 @@ nm_vpn_plugin_utils_load_editor (const char *module_name,
        g_return_val_if_fail (NM_IS_VPN_EDITOR (editor), NULL);
        return editor;
 }
-


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]