changeset 1064:f7f73da81a5f

irccd: don't added plugins that fails to load
author David Demelier <markand@malikania.fr>
date Mon, 05 Jul 2021 21:50:14 +0200
parents 65cd693f20ca
children d8db515adbd4
files irccd/dl-plugin.c irccd/js-plugin.c lib/irccd/irccd.c lib/irccd/plugin.c lib/irccd/plugin.h man/libirccd.3
diffstat 6 files changed, 36 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/irccd/dl-plugin.c	Fri Jul 02 10:02:50 2021 +0200
+++ b/irccd/dl-plugin.c	Mon Jul 05 21:50:14 2021 +0200
@@ -54,7 +54,7 @@
 typedef const char **   (*get_paths_fn)(void);
 typedef const char **   (*get_templates_fn)(void);
 typedef void            (*event_fn)(const struct irc_event *);
-typedef void            (*load_fn)(void);
+typedef int             (*load_fn)(void);
 typedef void            (*reload_fn)(void);
 typedef void            (*unload_fn)(void);
 typedef void            (*set_option_fn)(const char *, const char *);
@@ -148,10 +148,12 @@
 	return NULL;
 }
 
-static void
+static int
 load(struct irc_plugin *plg)
 {
 	INVOKE(plg, "load", load_fn);
+
+	return 0;
 }
 
 static void
--- a/irccd/js-plugin.c	Fri Jul 02 10:02:50 2021 +0200
+++ b/irccd/js-plugin.c	Mon Jul 05 21:50:14 2021 +0200
@@ -291,17 +291,17 @@
 	return get_table(js->ctx, JSAPI_PLUGIN_PROP_OPTIONS, &js->options);
 }
 
-static void
+static int
 vcall(struct irc_plugin *plg, const char *function, const char *fmt, va_list ap)
 {
 	struct self *self = plg->data;
-	int nargs = 0;
+	int nargs = 0, ret = 0;
 
 	duk_get_global_string(self->ctx, function);
 
 	if (!duk_is_function(self->ctx, -1)) {
 		duk_pop(self->ctx);
-		return;
+		return ret;
 	}
 
 	for (const char *f = fmt; *f; ++f) {
@@ -325,20 +325,27 @@
 		++nargs;
 	}
 
-	if (duk_pcall(self->ctx, nargs) != 0)
+	if (duk_pcall(self->ctx, nargs) != 0) {
 		log_trace(plg->data);
+		ret = -1;
+	}
 
 	duk_pop(self->ctx);
+
+	return ret;
 }
 
-static void
+static int
 call(struct irc_plugin *plg, const char *function, const char *fmt, ...)
 {
 	va_list ap;
+	int ret;
 
 	va_start(ap, fmt);
-	vcall(plg, function, fmt, ap);
+	ret = vcall(plg, function, fmt, ap);
 	va_end(ap);
+
+	return ret;
 }
 
 static void
@@ -514,10 +521,10 @@
 	return js;
 }
 
-static void
+static int
 load(struct irc_plugin *plg)
 {
-	call(plg, "onLoad", "");
+	return call(plg, "onLoad", "");
 }
 
 static void
--- a/lib/irccd/irccd.c	Fri Jul 02 10:02:50 2021 +0200
+++ b/lib/irccd/irccd.c	Mon Jul 05 21:50:14 2021 +0200
@@ -334,13 +334,13 @@
 	assert(p);
 	assert(!irc_bot_plugin_get(p->name));
 
-	LIST_INSERT_HEAD(&irc.plugins, p, link);
-
-	irc_log_info("irccd: add new plugin: %s", p->name, p->description);
-	irc_log_info("irccd: %s: version %s, from %s (%s license)", p->name,
-	    p->version, p->author, p->license);
-
-	irc_plugin_load(p);
+	if (irc_plugin_load(p) == 0) {
+		LIST_INSERT_HEAD(&irc.plugins, p, link);
+		irc_log_info("irccd: add new plugin: %s", p->name, p->description);
+		irc_log_info("irccd: %s: version %s, from %s (%s license)", p->name,
+		    p->version, p->author, p->license);
+	} else
+		irc_log_warn("irccd: plugin %s failed to load", p->name);
 }
 
 struct irc_plugin *
--- a/lib/irccd/plugin.c	Fri Jul 02 10:02:50 2021 +0200
+++ b/lib/irccd/plugin.c	Mon Jul 05 21:50:14 2021 +0200
@@ -123,13 +123,15 @@
 	return NULL;
 }
 
-void
+int
 irc_plugin_load(struct irc_plugin *plg)
 {
 	assert(plg);
 
 	if (plg->load)
-		plg->load(plg);
+		return plg->load(plg);
+
+	return 0;
 }
 
 void
--- a/lib/irccd/plugin.h	Fri Jul 02 10:02:50 2021 +0200
+++ b/lib/irccd/plugin.h	Mon Jul 05 21:50:14 2021 +0200
@@ -49,7 +49,7 @@
 	const char *(*get_option)(struct irc_plugin *, const char *);
 	const char **(*get_options)(struct irc_plugin *);
 
-	void (*load)(struct irc_plugin *);
+	int (*load)(struct irc_plugin *);
 	void (*reload)(struct irc_plugin *);
 	void (*unload)(struct irc_plugin *);
 	void (*handle)(struct irc_plugin *, const struct irc_event *);
@@ -99,7 +99,7 @@
 const char **
 irc_plugin_get_options(struct irc_plugin *);
 
-void
+int
 irc_plugin_load(struct irc_plugin *);
 
 void
--- a/man/libirccd.3	Fri Jul 02 10:02:50 2021 +0200
+++ b/man/libirccd.3	Mon Jul 05 21:50:14 2021 +0200
@@ -44,7 +44,7 @@
 .Fn <prefix>_get_templates "void"
 .Ft const char **
 .Fn <prefix>_get_paths "void"
-.Ft void
+.Ft int
 .Fn <prefix>_load "void"
 .Ft void
 .Fn <prefix>_reload "void"
@@ -154,7 +154,9 @@
 .Pp
 The
 .Fn <prefix>_load
-function is called when the plugin is being loaded and add to the daemon.
+function is called when the plugin is being loaded before being added to the
+daemon. If the function returns non-zero it is treated as an error an not
+loaded.
 .Pp
 The
 .Fn <prefix>_reload