summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-06-16 10:52:00 +0200
committerThomas Haller <thaller@redhat.com>2016-06-16 10:52:00 +0200
commit6dd2b316b5d03b28d2dd792dc4fa25a695b26d4f (patch)
treee8a904807c5c7be7a2afc2179e99dfd7c6c0ebae
parentb6b84d0442809d1b127c4bb36f09445ece2ac262 (diff)
parent2c02f3a8cfe3616a1469ac9949833deecfea4698 (diff)
downloadNetworkManager-6dd2b316b5d03b28d2dd792dc4fa25a695b26d4f.tar.gz
shared: merge branch 'th/shared-bgo767697'
https://bugzilla.gnome.org/show_bug.cgi?id=767697
-rw-r--r--callouts/tests/test-dispatcher-envp.c2
-rw-r--r--libnm-core/Makefile.libnm-core4
-rw-r--r--libnm-core/tests/test-compare.c2
-rw-r--r--libnm-core/tests/test-crypto.c2
-rw-r--r--libnm-core/tests/test-general.c2
-rw-r--r--libnm-core/tests/test-keyfile.c2
-rw-r--r--libnm-core/tests/test-secrets.c2
-rw-r--r--libnm-core/tests/test-setting-8021x.c2
-rw-r--r--libnm-core/tests/test-setting-bond.c2
-rw-r--r--libnm-core/tests/test-setting-dcb.c2
-rw-r--r--libnm-core/tests/test-settings-defaults.c2
-rw-r--r--libnm-util/Makefile.am4
-rw-r--r--libnm-util/tests/test-crypto.c2
-rw-r--r--libnm-util/tests/test-general.c2
-rw-r--r--libnm-util/tests/test-secrets.c2
-rw-r--r--libnm-util/tests/test-setting-8021x.c2
-rw-r--r--libnm-util/tests/test-setting-dcb.c2
-rw-r--r--libnm-util/tests/test-settings-defaults.c2
-rw-r--r--libnm/nm-vpn-service-plugin.c2
-rw-r--r--libnm/tests/Makefile.am24
-rw-r--r--po/POTFILES.in2
-rw-r--r--po/POTFILES.skip3
-rw-r--r--shared/Makefile.am17
-rw-r--r--shared/nm-default.h6
-rw-r--r--shared/nm-test-libnm-utils.h2
-rw-r--r--shared/nm-utils/gsystem-local-alloc.h (renamed from shared/gsystem-local-alloc.h)0
-rw-r--r--shared/nm-utils/nm-glib.h (renamed from shared/nm-glib.h)2
-rw-r--r--shared/nm-utils/nm-macros-internal.h (renamed from shared/nm-macros-internal.h)2
-rw-r--r--shared/nm-utils/nm-shared-utils.c (renamed from shared/nm-shared-utils.c)0
-rw-r--r--shared/nm-utils/nm-shared-utils.h (renamed from shared/nm-shared-utils.h)0
-rw-r--r--shared/nm-utils/nm-test-utils.h (renamed from shared/nm-test-utils.h)0
-rw-r--r--shared/nm-utils/nm-vpn-editor-plugin-call.h (renamed from shared/nm-vpn-editor-plugin-call.h)1
-rw-r--r--shared/nm-utils/nm-vpn-plugin-utils.c130
-rw-r--r--shared/nm-utils/nm-vpn-plugin-utils.h42
-rw-r--r--src/nm-test-utils-core.h2
35 files changed, 238 insertions, 37 deletions
diff --git a/callouts/tests/test-dispatcher-envp.c b/callouts/tests/test-dispatcher-envp.c
index 9cdaa3b5c6..83e84d7472 100644
--- a/callouts/tests/test-dispatcher-envp.c
+++ b/callouts/tests/test-dispatcher-envp.c
@@ -28,7 +28,7 @@
#include "nm-dispatcher-utils.h"
#include "nm-dispatcher-api.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
/*******************************************/
diff --git a/libnm-core/Makefile.libnm-core b/libnm-core/Makefile.libnm-core
index 0038ce23d6..52c71da5b7 100644
--- a/libnm-core/Makefile.libnm-core
+++ b/libnm-core/Makefile.libnm-core
@@ -52,7 +52,7 @@ libnm_core_headers = \
$(core)/nm-vpn-plugin-info.h
libnm_core_private_headers = \
- $(top_builddir)/shared/nm-shared-utils.h \
+ $(top_builddir)/shared/nm-utils/nm-shared-utils.h \
$(core)/crypto.h \
$(core)/nm-connection-private.h \
$(core)/nm-core-internal.h \
@@ -64,7 +64,7 @@ libnm_core_private_headers = \
$(core)/nm-utils-private.h
libnm_core_sources = \
- $(top_builddir)/shared/nm-shared-utils.c \
+ $(top_builddir)/shared/nm-utils/nm-shared-utils.c \
$(core_build)/nm-core-enum-types.c \
$(core)/crypto.c \
$(core)/nm-connection.c \
diff --git a/libnm-core/tests/test-compare.c b/libnm-core/tests/test-compare.c
index dca5c7d3d1..7f2ba98095 100644
--- a/libnm-core/tests/test-compare.c
+++ b/libnm-core/tests/test-compare.c
@@ -26,7 +26,7 @@
#include "nm-property-compare.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
static void
compare_ints (void)
diff --git a/libnm-core/tests/test-crypto.c b/libnm-core/tests/test-crypto.c
index bd87c710ca..9bab985f72 100644
--- a/libnm-core/tests/test-crypto.c
+++ b/libnm-core/tests/test-crypto.c
@@ -33,7 +33,7 @@
#include "nm-errors.h"
#include "nm-core-internal.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
#if 0
static const char *pem_rsa_key_begin = "-----BEGIN RSA PRIVATE KEY-----";
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c
index 39e9c1aff3..9aaf82977d 100644
--- a/libnm-core/tests/test-general.c
+++ b/libnm-core/tests/test-general.c
@@ -62,7 +62,7 @@
#include "test-general-enums.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
/* When passing a "bool" typed argument to a variadic function that
* expects a gboolean, the compiler will promote the integer type
diff --git a/libnm-core/tests/test-keyfile.c b/libnm-core/tests/test-keyfile.c
index 92b6c1f56c..ecb7cd5a67 100644
--- a/libnm-core/tests/test-keyfile.c
+++ b/libnm-core/tests/test-keyfile.c
@@ -28,7 +28,7 @@
#include "nm-setting-wired.h"
#include "nm-setting-8021x.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
#define TEST_WIRED_TLS_CA_CERT TEST_CERT_DIR"/test-ca-cert.pem"
diff --git a/libnm-core/tests/test-secrets.c b/libnm-core/tests/test-secrets.c
index 7b37d09e92..0149348dbe 100644
--- a/libnm-core/tests/test-secrets.c
+++ b/libnm-core/tests/test-secrets.c
@@ -38,7 +38,7 @@
#include "nm-utils.h"
#include "nm-core-internal.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
#define TEST_NEED_SECRETS_EAP_TLS_CA_CERT TEST_CERT_DIR "/test_ca_cert.pem"
#define TEST_NEED_SECRETS_EAP_TLS_CLIENT_CERT TEST_CERT_DIR "/test_key_and_cert.pem"
diff --git a/libnm-core/tests/test-setting-8021x.c b/libnm-core/tests/test-setting-8021x.c
index 56563a6fb6..268a9f52d9 100644
--- a/libnm-core/tests/test-setting-8021x.c
+++ b/libnm-core/tests/test-setting-8021x.c
@@ -27,7 +27,7 @@
#include "nm-setting-connection.h"
#include "nm-setting-8021x.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
static void
compare_blob_data (const char *test,
diff --git a/libnm-core/tests/test-setting-bond.c b/libnm-core/tests/test-setting-bond.c
index a6afa1c865..91a8199719 100644
--- a/libnm-core/tests/test-setting-bond.c
+++ b/libnm-core/tests/test-setting-bond.c
@@ -26,7 +26,7 @@
#include "nm-setting-connection.h"
#include "nm-errors.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
static void
create_bond_connection (NMConnection **con, NMSettingBond **s_bond)
diff --git a/libnm-core/tests/test-setting-dcb.c b/libnm-core/tests/test-setting-dcb.c
index 09cf8d9837..55c1c5162c 100644
--- a/libnm-core/tests/test-setting-dcb.c
+++ b/libnm-core/tests/test-setting-dcb.c
@@ -28,7 +28,7 @@
#include "nm-connection.h"
#include "nm-errors.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
#define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \
NM_SETTING_DCB_FLAG_ADVERTISE | \
diff --git a/libnm-core/tests/test-settings-defaults.c b/libnm-core/tests/test-settings-defaults.c
index 366910ac2a..95570b0380 100644
--- a/libnm-core/tests/test-settings-defaults.c
+++ b/libnm-core/tests/test-settings-defaults.c
@@ -38,7 +38,7 @@
#include "nm-setting-wireless.h"
#include "nm-setting-wireless-security.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
static void
test_defaults (GType type, const char *name)
diff --git a/libnm-util/Makefile.am b/libnm-util/Makefile.am
index 0d5a0d46c1..466e475f23 100644
--- a/libnm-util/Makefile.am
+++ b/libnm-util/Makefile.am
@@ -62,7 +62,7 @@ nodist_libnm_util_include_HEADERS = \
nm-utils-enum-types.h
libnm_util_la_private_headers = \
- $(top_builddir)/shared/nm-shared-utils.h \
+ $(top_builddir)/shared/nm-utils/nm-shared-utils.h \
crypto.h \
nm-dbus-glib-types.h \
nm-gvaluearray-compat.h \
@@ -71,7 +71,7 @@ libnm_util_la_private_headers = \
nm-utils-private.h
libnm_util_la_csources = \
- $(top_builddir)/shared/nm-shared-utils.c \
+ $(top_builddir)/shared/nm-utils/nm-shared-utils.c \
crypto.c \
nm-connection.c \
nm-param-spec-specialized.c \
diff --git a/libnm-util/tests/test-crypto.c b/libnm-util/tests/test-crypto.c
index a1c7648fce..643418d2fb 100644
--- a/libnm-util/tests/test-crypto.c
+++ b/libnm-util/tests/test-crypto.c
@@ -31,7 +31,7 @@
#include "crypto.h"
#include "nm-utils.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
#if 0
static const char *pem_rsa_key_begin = "-----BEGIN RSA PRIVATE KEY-----";
diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c
index 10fed337f3..8373ae1197 100644
--- a/libnm-util/tests/test-general.c
+++ b/libnm-util/tests/test-general.c
@@ -47,7 +47,7 @@
#include "nm-utils.h"
#include "nm-dbus-glib-types.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
static void
vpn_check_func (const char *key, const char *value, gpointer user_data)
diff --git a/libnm-util/tests/test-secrets.c b/libnm-util/tests/test-secrets.c
index 0d451788e5..2631509cf3 100644
--- a/libnm-util/tests/test-secrets.c
+++ b/libnm-util/tests/test-secrets.c
@@ -37,7 +37,7 @@
#include "nm-setting-pppoe.h"
#include "nm-setting-vpn.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
#define TEST_NEED_SECRETS_EAP_TLS_CA_CERT TEST_CERT_DIR "/test_ca_cert.pem"
#define TEST_NEED_SECRETS_EAP_TLS_CLIENT_CERT TEST_CERT_DIR "/test_key_and_cert.pem"
diff --git a/libnm-util/tests/test-setting-8021x.c b/libnm-util/tests/test-setting-8021x.c
index e5bddf4cd9..a0219639c5 100644
--- a/libnm-util/tests/test-setting-8021x.c
+++ b/libnm-util/tests/test-setting-8021x.c
@@ -27,7 +27,7 @@
#include "nm-setting-connection.h"
#include "nm-setting-8021x.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
static void
compare_blob_data (const char *test,
diff --git a/libnm-util/tests/test-setting-dcb.c b/libnm-util/tests/test-setting-dcb.c
index fb44278b6c..ee0c997fb1 100644
--- a/libnm-util/tests/test-setting-dcb.c
+++ b/libnm-util/tests/test-setting-dcb.c
@@ -27,7 +27,7 @@
#include "nm-default.h"
#include "nm-setting-dcb.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
#define DCB_FLAGS_ALL (NM_SETTING_DCB_FLAG_ENABLE | \
NM_SETTING_DCB_FLAG_ADVERTISE | \
diff --git a/libnm-util/tests/test-settings-defaults.c b/libnm-util/tests/test-settings-defaults.c
index 95ff070955..0bd4feee58 100644
--- a/libnm-util/tests/test-settings-defaults.c
+++ b/libnm-util/tests/test-settings-defaults.c
@@ -38,7 +38,7 @@
#include "nm-setting-wireless.h"
#include "nm-setting-wireless-security.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
static void
test_defaults (GType type, const char *name)
diff --git a/libnm/nm-vpn-service-plugin.c b/libnm/nm-vpn-service-plugin.c
index df99eb28d9..6431629669 100644
--- a/libnm/nm-vpn-service-plugin.c
+++ b/libnm/nm-vpn-service-plugin.c
@@ -1312,5 +1312,5 @@ nm_vpn_service_plugin_initable_iface_init (GInitableIface *iface)
/* this header is intended to be copied to users of nm_vpn_editor_plugin_call(),
* to simplify invocation of generic functions. Include it here, to complile
* the code. */
-#include "nm-vpn-editor-plugin-call.h"
+#include "nm-utils/nm-vpn-editor-plugin-call.h"
diff --git a/libnm/tests/Makefile.am b/libnm/tests/Makefile.am
index d2944c4cad..1c65f72340 100644
--- a/libnm/tests/Makefile.am
+++ b/libnm/tests/Makefile.am
@@ -39,3 +39,27 @@ test_secret_agent_SOURCES = \
$(top_builddir)/shared/nm-test-libnm-utils.h \
test-secret-agent.c
endif
+
+###############################################################################
+
+noinst_LTLIBRARIES = \
+ libnm-vpn-plugin-utils-test.la
+
+libnm_vpn_plugin_utils_test_la_SOURCES = \
+ $(top_srcdir)/shared/nm-utils/nm-vpn-plugin-utils.c \
+ $(top_srcdir)/shared/nm-utils/nm-vpn-plugin-utils.h \
+ $(NULL)
+
+libnm_vpn_plugin_utils_test_la_CFLAGS = \
+ $(GLIB_CFLAGS) \
+ -I$(top_srcdir)/shared \
+ -I$(top_srcdir)/libnm-core \
+ -I$(top_srcdir)/libnm \
+ $(NULL)
+
+libnm_vpn_plugin_utils_test_la_LIBADD = \
+ $(GLIB_LIBS) \
+ $(NULL)
+
+###############################################################################
+
diff --git a/po/POTFILES.in b/po/POTFILES.in
index ded6d5d549..7d1d1ba331 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -140,7 +140,7 @@ libnm/nm-remote-settings.c
libnm/nm-vpn-plugin-old.c
libnm/nm-vpn-service-plugin.c
policy/org.freedesktop.NetworkManager.policy.in.in
-shared/nm-shared-utils.c
+shared/nm-utils/nm-shared-utils.c
src/NetworkManagerUtils.c
src/main.c
src/main-utils.c
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index 842f22a568..1d7880e800 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -6,6 +6,7 @@ vpn-daemons/openvpn
vpn-daemons/pptp
vpn-daemons/vpnc
contrib/fedora/rpm/
-shared/nm-vpn-editor-plugin-call.h
+shared/nm-utils/nm-vpn-editor-plugin-call.h
+shared/nm-utils/nm-vpn-plugin-utils.c
# https://bugs.launchpad.net/intltool/+bug/1117944
sub/policy/org.freedesktop.NetworkManager.policy.in
diff --git a/shared/Makefile.am b/shared/Makefile.am
index 01818d0cd1..be2f777ee6 100644
--- a/shared/Makefile.am
+++ b/shared/Makefile.am
@@ -1,16 +1,19 @@
EXTRA_DIST = \
- gsystem-local-alloc.h \
+ nm-utils/gsystem-local-alloc.h \
+ nm-utils/nm-glib.h \
+ nm-utils/nm-macros-internal.h \
+ nm-utils/nm-shared-utils.c \
+ nm-utils/nm-shared-utils.h \
+ nm-utils/nm-test-utils.h \
+ nm-utils/nm-vpn-editor-plugin-call.h \
+ nm-utils/nm-vpn-plugin-utils.c \
+ nm-utils/nm-vpn-plugin-utils.h \
nm-common-macros.h \
nm-dbus-compat.h \
nm-default.h \
- nm-glib.h \
- nm-macros-internal.h \
- nm-shared-utils.c \
- nm-shared-utils.h \
nm-test-libnm-utils.h \
- nm-test-utils.h \
nm-test-utils-impl.c \
nm-version-macros.h.in \
- nm-vpn-editor-plugin-call.h
+ $(NULL)
CLEANFILES=nm-version.h
diff --git a/shared/nm-default.h b/shared/nm-default.h
index 5d7c8f141c..547ee57c98 100644
--- a/shared/nm-default.h
+++ b/shared/nm-default.h
@@ -98,11 +98,9 @@ _nm_g_return_if_fail_warning (const char *log_domain,
/*****************************************************************************/
-#include "nm-glib.h"
+#include "nm-utils/nm-macros-internal.h"
#include "nm-version.h"
-#include "gsystem-local-alloc.h"
-#include "nm-macros-internal.h"
-#include "nm-shared-utils.h"
+#include "nm-utils/nm-shared-utils.h"
/*****************************************************************************/
diff --git a/shared/nm-test-libnm-utils.h b/shared/nm-test-libnm-utils.h
index 8d111003aa..192c089e10 100644
--- a/shared/nm-test-libnm-utils.h
+++ b/shared/nm-test-libnm-utils.h
@@ -20,7 +20,7 @@
#include "NetworkManager.h"
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
/*****************************************************************************/
diff --git a/shared/gsystem-local-alloc.h b/shared/nm-utils/gsystem-local-alloc.h
index 51b6251974..51b6251974 100644
--- a/shared/gsystem-local-alloc.h
+++ b/shared/nm-utils/gsystem-local-alloc.h
diff --git a/shared/nm-glib.h b/shared/nm-utils/nm-glib.h
index 5f8ebc7fdc..46a8bb2d9a 100644
--- a/shared/nm-glib.h
+++ b/shared/nm-utils/nm-glib.h
@@ -24,6 +24,8 @@
#include <gio/gio.h>
#include <string.h>
+#include "gsystem-local-alloc.h"
+
#ifdef __clang__
#undef G_GNUC_BEGIN_IGNORE_DEPRECATIONS
diff --git a/shared/nm-macros-internal.h b/shared/nm-utils/nm-macros-internal.h
index 4622af9fd8..603689af01 100644
--- a/shared/nm-macros-internal.h
+++ b/shared/nm-utils/nm-macros-internal.h
@@ -24,6 +24,8 @@
#include <stdlib.h>
+#include "nm-glib.h"
+
/********************************************************/
#define _nm_packed __attribute__ ((packed))
diff --git a/shared/nm-shared-utils.c b/shared/nm-utils/nm-shared-utils.c
index 38f6529d2a..38f6529d2a 100644
--- a/shared/nm-shared-utils.c
+++ b/shared/nm-utils/nm-shared-utils.c
diff --git a/shared/nm-shared-utils.h b/shared/nm-utils/nm-shared-utils.h
index cfa8f994f7..cfa8f994f7 100644
--- a/shared/nm-shared-utils.h
+++ b/shared/nm-utils/nm-shared-utils.h
diff --git a/shared/nm-test-utils.h b/shared/nm-utils/nm-test-utils.h
index 83e1f47e47..83e1f47e47 100644
--- a/shared/nm-test-utils.h
+++ b/shared/nm-utils/nm-test-utils.h
diff --git a/shared/nm-vpn-editor-plugin-call.h b/shared/nm-utils/nm-vpn-editor-plugin-call.h
index c6b7ee76ab..78d041dff3 100644
--- a/shared/nm-vpn-editor-plugin-call.h
+++ b/shared/nm-utils/nm-vpn-editor-plugin-call.h
@@ -32,7 +32,6 @@
#include <NetworkManager.h>
/* we make use of other internal header files, you need those too. */
-#include "gsystem-local-alloc.h"
#include "nm-macros-internal.h"
/*****************************************************************************/
diff --git a/shared/nm-utils/nm-vpn-plugin-utils.c b/shared/nm-utils/nm-vpn-plugin-utils.c
new file mode 100644
index 0000000000..772aa39aea
--- /dev/null
+++ b/shared/nm-utils/nm-vpn-plugin-utils.c
@@ -0,0 +1,130 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2016 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include "nm-vpn-plugin-utils.h"
+
+#include <dlfcn.h>
+
+/*****************************************************************************/
+
+NMVpnEditor *
+nm_vpn_plugin_utils_load_editor (const char *module_name,
+ const char *factory_name,
+ NMVpnPluginUtilsEditorFactory editor_factory,
+ NMVpnEditorPlugin *editor_plugin,
+ NMConnection *connection,
+ gpointer user_data,
+ GError **error)
+
+{
+ static struct {
+ gpointer factory;
+ void *dl_module;
+ char *module_name;
+ char *factory_name;
+ } cached = { 0 };
+ NMVpnEditor *editor;
+
+ g_return_val_if_fail (module_name && g_path_is_absolute (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);
+
+ /* 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.
+ *
+ * The reason for only loading once is that due to glib types, we cannot create a
+ * certain type-name more then once, so loading the same module or another version
+ * of the same module will fail horribly as both try to create a GType with the same
+ * name.
+ *
+ * Only support loading once, any future calls will reuse the handle. To simplify
+ * that, we enforce that the @factory_name and @module_name is the same. */
+ if (cached.factory) {
+ g_return_val_if_fail (cached.dl_module, NULL);
+ g_return_val_if_fail (cached.factory_name && nm_streq0 (cached.factory_name, factory_name), NULL);
+ g_return_val_if_fail (cached.module_name && nm_streq0 (cached.module_name, module_name), NULL);
+ } else {
+ gpointer factory;
+ void *dl_module;
+
+ dl_module = dlopen (module_name, RTLD_LAZY | RTLD_LOCAL);
+ if (!dl_module) {
+ if (!g_file_test (module_name, G_FILE_TEST_EXISTS)) {
+ g_set_error (error,
+ G_FILE_ERROR,
+ G_FILE_ERROR_NOENT,
+ _("missing plugin file \"%s\""), module_name);
+ return NULL;
+ }
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_FAILED,
+ _("cannot load editor plugin: %s"), dlerror ());
+ return NULL;
+ }
+
+ factory = dlsym (dl_module, factory_name);
+ if (!factory) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_FAILED,
+ _("cannot load factory %s from plugin: %s"),
+ factory_name, dlerror ());
+ dlclose (dl_module);
+ return NULL;
+ }
+
+ /* we cannot ever unload the module because it creates glib types, which
+ * cannot be unregistered.
+ *
+ * Thus we just leak the dl_module handle indefinitely. */
+ cached.factory = factory;
+ cached.dl_module = dl_module;
+ cached.module_name = g_strdup (module_name);
+ cached.factory_name = g_strdup (factory_name);
+ }
+
+ editor = editor_factory (cached.factory,
+ editor_plugin,
+ connection,
+ user_data,
+ error);
+ if (!editor) {
+ if (error && !*error ) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_FAILED,
+ _("unknown error creating editor instance"));
+ g_return_val_if_reached (NULL);
+ }
+ return NULL;
+ }
+
+ g_return_val_if_fail (NM_IS_VPN_EDITOR (editor), NULL);
+ return editor;
+}
+
diff --git a/shared/nm-utils/nm-vpn-plugin-utils.h b/shared/nm-utils/nm-vpn-plugin-utils.h
new file mode 100644
index 0000000000..f3928d1eb1
--- /dev/null
+++ b/shared/nm-utils/nm-vpn-plugin-utils.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2016 Red Hat, Inc.
+ */
+
+#ifndef __NM_VPN_PLUGIN_UTILS_H__
+#define __NM_VPN_PLUGIN_UTILS_H__
+
+#include <NetworkManager.h>
+
+typedef NMVpnEditor *(NMVpnPluginUtilsEditorFactory) (gpointer factory,
+ NMVpnEditorPlugin *editor_plugin,
+ NMConnection *connection,
+ gpointer user_data,
+ GError **error);
+
+NMVpnEditor *nm_vpn_plugin_utils_load_editor (const char *module_name,
+ const char *factory_name,
+ NMVpnPluginUtilsEditorFactory editor_factory,
+ NMVpnEditorPlugin *editor_plugin,
+ NMConnection *connection,
+ gpointer user_data,
+ GError **error);
+
+#endif /* __NM_VPN_PLUGIN_UTILS_H__ */
+
diff --git a/src/nm-test-utils-core.h b/src/nm-test-utils-core.h
index 8fd3be55ae..f5118398d3 100644
--- a/src/nm-test-utils-core.h
+++ b/src/nm-test-utils-core.h
@@ -26,7 +26,7 @@
#define _NMTST_INSIDE_CORE 1
-#include "nm-test-utils.h"
+#include "nm-utils/nm-test-utils.h"
/*****************************************************************************/