summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--decoder.c39
-rw-r--r--srd.c6
2 files changed, 33 insertions, 12 deletions
diff --git a/decoder.c b/decoder.c
index 71f4799..1b0ed2a 100644
--- a/decoder.c
+++ b/decoder.c
@@ -42,6 +42,10 @@
/* The list of protocol decoders. */
SRD_PRIV GSList *pd_list = NULL;
+/* srd.c */
+extern GSList *searchpaths;
+
+/* session.c */
extern GSList *sessions;
/* module_sigrokdecode.c */
@@ -556,6 +560,26 @@ SRD_API int srd_decoder_unload(struct srd_decoder *dec)
return SRD_OK;
}
+static void srd_decoder_load_all_path(char *path)
+{
+ GDir *dir;
+ const gchar *direntry;
+
+ if (!(dir = g_dir_open(path, 0, NULL)))
+ /* Not really fatal */
+ return;
+
+ /* This ignores errors returned by srd_decoder_load(). That
+ * function will have logged the cause, but in any case we
+ * want to continue anyway. */
+ while ((direntry = g_dir_read_name(dir)) != NULL) {
+ /* The directory name is the module name (e.g. "i2c"). */
+ srd_decoder_load(direntry);
+ }
+ g_dir_close(dir);
+
+}
+
/**
* Load all installed protocol decoders.
*
@@ -565,22 +589,13 @@ SRD_API int srd_decoder_unload(struct srd_decoder *dec)
*/
SRD_API int srd_decoder_load_all(void)
{
- GDir *dir;
- const gchar *direntry;
+ GSList *l;
if (!srd_check_init())
return SRD_ERR;
- if (!(dir = g_dir_open(DECODERS_DIR, 0, NULL))) {
- srd_err("Unable to open %s for reading.", DECODERS_DIR);
- return SRD_ERR_DECODERS_DIR;
- }
-
- while ((direntry = g_dir_read_name(dir)) != NULL) {
- /* The directory name is the module name (e.g. "i2c"). */
- srd_decoder_load(direntry);
- }
- g_dir_close(dir);
+ for (l = searchpaths; l; l = l->next)
+ srd_decoder_load_all_path(l->data);
return SRD_OK;
}
diff --git a/srd.c b/srd.c
index 76e1b34..a6c16f6 100644
--- a/srd.c
+++ b/srd.c
@@ -25,6 +25,9 @@
/** @cond PRIVATE */
+/* Python module search paths */
+SRD_PRIV GSList *searchpaths = NULL;
+
/* session.c */
extern GSList *sessions;
extern int max_session_id;
@@ -194,6 +197,8 @@ SRD_API int srd_exit(void)
srd_session_destroy((struct srd_session *)l->data);
srd_decoder_unload_all();
+ g_slist_free_full(searchpaths, g_free);
+ searchpaths = NULL;
/* Py_Finalize() returns void, any finalization errors are ignored. */
Py_Finalize();
@@ -257,6 +262,7 @@ SRD_PRIV int srd_decoder_searchpath_add(const char *path)
PySys_SetPath(wc_new_path);
g_string_free(new_path, TRUE);
g_free(wc_new_path);
+ searchpaths = g_slist_append(searchpaths, g_strdup(path));
return SRD_OK;
}