summary refs log tree commit diff
path: root/pkgs/development/libraries/dleyna-core/0001-Search-connectors-in-DLEYNA_CONNECTOR_PATH.patch
blob: cc50c159800561b2c5f28d86eae60897421be83e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
From bf549a028a5da122b7a4206529711b969c2ecd48 Mon Sep 17 00:00:00 2001
From: Jan Tojnar <jtojnar@gmail.com>
Date: Fri, 1 Sep 2017 13:49:06 +0200
Subject: [PATCH] Search connectors in DLEYNA_CONNECTOR_PATH

Previously, the connectors would only be looked for in a single
directory, specified during compilation. This patch allows to
traverse a list of directories provided by an environment variable.
---
 libdleyna/core/connector-mgr.c | 63 ++++++++++++++++++++++++++++--------------
 1 file changed, 42 insertions(+), 21 deletions(-)

diff --git a/libdleyna/core/connector-mgr.c b/libdleyna/core/connector-mgr.c
index eafb16c..8041c67 100644
--- a/libdleyna/core/connector-mgr.c
+++ b/libdleyna/core/connector-mgr.c
@@ -34,33 +34,54 @@ const dleyna_connector_t *dleyna_connector_mgr_load(const gchar *name)
 	const dleyna_connector_t *connector;
 	dleyna_connector_get_interface_t get_interface;
 	gchar *path;
+	const gchar *connector_path;
+	gchar **connector_path_list;
+	gsize i;
 
 	DLEYNA_LOG_DEBUG("Enter");
 
-	path = g_strdup_printf("%s/%s%s.so", CONNECTOR_DIR,
-			       DLEYNA_CONNECTOR_LIB_PATTERN, name);
-	module = g_module_open(path, G_MODULE_BIND_LAZY);
-	g_free(path);
+	connector_path = g_getenv ("DLEYNA_CONNECTOR_PATH");
+	if (!connector_path) {
+		DLEYNA_LOG_DEBUG ("DLEYNA_CONNECTOR_PATH not set");
+		connector_path = CONNECTOR_DIR;
+	} else {
+		DLEYNA_LOG_DEBUG ("DLEYNA_CONNECTOR_PATH set to %s", connector_path);
+	}
+
+	connector_path_list = g_strsplit (connector_path, G_SEARCHPATH_SEPARATOR_S, 0);
+
+	for (i = 0; connector_path_list[i]; i++) {
+		path = g_strdup_printf("%s/%s%s.so", connector_path_list[i],
+				       DLEYNA_CONNECTOR_LIB_PATTERN, name);
+		module = g_module_open(path, G_MODULE_BIND_LAZY);
+		g_free(path);
+
+		if (module) {
+			if (!g_connectors)
+				g_connectors = g_hash_table_new(g_direct_hash,
+								g_direct_equal);
+
+			if (g_module_symbol(module, "dleyna_connector_get_interface",
+					    (gpointer *)&get_interface)) {
+				connector = get_interface();
+				g_hash_table_insert(g_connectors, (gpointer)connector,
+						    module);
+
+				break;
+			} else {
+				connector = NULL;
+				g_module_close(module);
+				DLEYNA_LOG_CRITICAL(
+						"Connector '%s' entry point not found",
+						name);
+			}
 
-	if (module) {
-		if (!g_connectors)
-			g_connectors = g_hash_table_new(g_direct_hash,
-							g_direct_equal);
-
-		if (g_module_symbol(module, "dleyna_connector_get_interface",
-				    (gpointer *)&get_interface)) {
-			connector = get_interface();
-			g_hash_table_insert(g_connectors, (gpointer)connector,
-					    module);
-		} else {
-			connector = NULL;
-			g_module_close(module);
-			DLEYNA_LOG_CRITICAL(
-					"Connector '%s' entry point not found",
-					name);
 		}
+	}
 
-	} else {
+	g_strfreev (connector_path_list);
+
+	if (!module) {
 		connector = NULL;
 		DLEYNA_LOG_CRITICAL("Connector '%s' not found", name);
 	}
-- 
2.14.1