Mercurial > irccd
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