summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2016-05-20 11:39:22 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2016-05-20 13:24:32 +0200
commit779f425daa66d2b0cd431fdc6f7f4ed976cbae15 (patch)
treef610c40818d64aa44a2eaf675c0e60d80484a3f1
parent081733b109daa31ef57e1c3c5a0992ac9c4f9851 (diff)
plugin: improves error detection
Change-Id: Ib6b1f958c347c04a0697c2e1d8116773a5977bd4 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r--src/afb-api-so.c42
-rw-r--r--src/main.c8
2 files changed, 31 insertions, 19 deletions
diff --git a/src/afb-api-so.c b/src/afb-api-so.c
index bcd8dbe0..408c3f5a 100644
--- a/src/afb-api-so.c
+++ b/src/afb-api-so.c
@@ -141,29 +141,35 @@ static void call(struct api_so_desc *desc, struct afb_req req, struct afb_contex
int afb_api_so_add_plugin(const char *path)
{
+ int rc;
+ void *handle;
struct api_so_desc *desc;
struct AFB_plugin *(*pluginAfbV1RegisterFct) (const struct AFB_interface *interface);
- desc = calloc(1, sizeof *desc);
- if (desc == NULL) {
- ERROR("out of memory");
- goto error;
- }
-
// This is a loadable library let's check if it's a plugin
- desc->handle = dlopen(path, RTLD_NOW | RTLD_LOCAL);
- if (desc->handle == NULL) {
+ rc = 0;
+ handle = dlopen(path, RTLD_NOW | RTLD_LOCAL);
+ if (handle == NULL) {
ERROR("plugin [%s] not loadable", path);
- goto error2;
+ goto error;
}
/* retrieves the register function */
- pluginAfbV1RegisterFct = dlsym(desc->handle, plugin_register_function);
+ pluginAfbV1RegisterFct = dlsym(handle, plugin_register_function);
if (!pluginAfbV1RegisterFct) {
ERROR("plugin [%s] is not an AFB plugin", path);
- goto error3;
+ goto error2;
}
INFO("plugin [%s] is a valid AFB plugin", path);
+ rc = -1;
+
+ /* allocates the description */
+ desc = calloc(1, sizeof *desc);
+ if (desc == NULL) {
+ ERROR("out of memory");
+ goto error2;
+ }
+ desc->handle = handle;
/* init the interface */
desc->interface.verbosity = 0;
@@ -212,11 +218,11 @@ int afb_api_so_add_plugin(const char *path)
return 0;
error3:
- dlclose(desc->handle);
-error2:
free(desc);
+error2:
+ dlclose(handle);
error:
- return -1;
+ return rc;
}
static int adddirs(char path[PATH_MAX], size_t end)
@@ -260,7 +266,8 @@ static int adddirs(char path[PATH_MAX], size_t end)
/* case of files */
if (!strstr(ent.d_name, ".so"))
continue;
- afb_api_so_add_plugin(path);
+ if (afb_api_so_add_plugin(path) < 0)
+ return -1;
}
}
closedir(dir);
@@ -309,7 +316,8 @@ int afb_api_so_add_pathset(const char *pathset)
p = strsep(&ps, sep);
if (!p)
return 0;
- afb_api_so_add_path(p);
- };
+ if (afb_api_so_add_path(p) < 0)
+ return -1;
+ }
}
diff --git a/src/main.c b/src/main.c
index dbfbac5d..44580c89 100644
--- a/src/main.c
+++ b/src/main.c
@@ -584,8 +584,12 @@ int main(int argc, char *argv[]) {
exit (1);
}
- if (config->ldpaths)
- afb_api_so_add_pathset(config->ldpaths);
+ if (config->ldpaths) {
+ if (afb_api_so_add_pathset(config->ldpaths) < 0) {
+ ERROR("initialisation of plugins within %s failed", config->ldpaths);
+ exit(1);
+ }
+ }
start_items(config->items);
config->items = NULL;