summaryrefslogtreecommitdiffstats
path: root/ctl-lib
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2018-05-07 17:05:00 +0200
committerRomain Forlot <romain.forlot@iot.bzh>2018-05-11 11:33:25 +0200
commit492c6dc1ecba7b8dfd3353a52352645d9f6984e8 (patch)
tree02dcb2b41742d4b00961d64a4552926bb51e2735 /ctl-lib
parentc5250690f38e4995a9b32d81e406894f92584a38 (diff)
Loads l2c functions per plugin.
L2C functions are prefixed with either the chosen prefix or plugin uid by default. Change-Id: Id296ec629c803ab06cd05f5278fed3c48cbcf10e Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'ctl-lib')
-rw-r--r--ctl-lib/ctl-config.h17
-rw-r--r--ctl-lib/ctl-lua.h2
-rw-r--r--ctl-lib/ctl-plugin.c72
-rw-r--r--ctl-lib/ctl-plugin.h18
4 files changed, 59 insertions, 50 deletions
diff --git a/ctl-lib/ctl-config.h b/ctl-lib/ctl-config.h
index d36b5f5..8a7f2a3 100644
--- a/ctl-lib/ctl-config.h
+++ b/ctl-lib/ctl-config.h
@@ -33,6 +33,10 @@ extern "C" {
#include <filescan-utils.h>
#include <wrap-json.h>
+#ifdef CONTROL_SUPPORT_LUA
+ #include "ctl-lua.h"
+#endif
+
#ifndef CONTROL_MAXPATH_LEN
#define CONTROL_MAXPATH_LEN 255
#endif
@@ -43,6 +47,7 @@ extern "C" {
#ifndef CTL_PLUGIN_EXT
#define CTL_PLUGIN_EXT ".ctlso"
+ #define CTL_SCRIPT_EXT ".lua"
#endif
#define LUA_ACTION_PREFIX "lua://"
@@ -68,16 +73,6 @@ typedef struct {
CtlSectionT *sections;
} CtlConfigT;
-
-#ifdef CONTROL_SUPPORT_LUA
- #include "ctl-lua.h"
-
- typedef struct CtlLua2cFuncT {
- luaL_Reg *l2cFunc;
- int l2cCount;
-} CtlLua2cFuncT;
-#endif
-
// This should not be global as application may want to define their own sections
typedef enum {
CTL_SECTION_PLUGIN,
@@ -89,7 +84,6 @@ typedef enum {
CTL_SECTION_ENDTAG,
} SectionEnumT;
-
// ctl-action.c
PUBLIC CtlActionT *ActionConfig(AFB_ApiT apiHandle, json_object *actionsJ, int exportApi);
PUBLIC void ActionExecUID(AFB_ReqT request, CtlConfigT *ctlConfig, const char *uid, json_object *queryJ);
@@ -97,7 +91,6 @@ PUBLIC void ActionExecOne( CtlSourceT *source, CtlActionT* action, json_object *
PUBLIC int ActionLoadOne(AFB_ApiT apiHandle, CtlActionT *action, json_object *, int exportApi);
PUBLIC int ActionLabelToIndex(CtlActionT* actions, const char* actionLabel);
-
// ctl-config.c
PUBLIC int CtlConfigMagicNew();
PUBLIC json_object* CtlConfigScan(const char *dirList, const char *prefix) ;
diff --git a/ctl-lib/ctl-lua.h b/ctl-lib/ctl-lua.h
index cf28dcb..deff9ee 100644
--- a/ctl-lib/ctl-lua.h
+++ b/ctl-lib/ctl-lua.h
@@ -61,7 +61,7 @@ extern const char *lua_utils;
PUBLIC int luaLoadScript(const char *luaScriptPath);
PUBLIC int LuaConfigLoad (AFB_ApiT apiHandle);
PUBLIC int LuaConfigExec(AFB_ApiT apiHandle, const char * prefix);
-PUBLIC void LuaL2cNewLib(luaL_Reg *l2cFunc, int count);
+PUBLIC void LuaL2cNewLib(luaL_Reg *l2cFunc, int count, const char *prefix);
PUBLIC int Lua2cWrapper(void* luaHandle, char *funcname, Lua2cFunctionT callback);
PUBLIC int LuaCallFunc (CtlSourceT *source, CtlActionT *action, json_object *queryJ) ;
PUBLIC void ctlapi_lua_docall (afb_req request);
diff --git a/ctl-lib/ctl-plugin.c b/ctl-lib/ctl-plugin.c
index 3e3e16e..ab9e171 100644
--- a/ctl-lib/ctl-plugin.c
+++ b/ctl-lib/ctl-plugin.c
@@ -24,12 +24,6 @@
#include "ctl-config.h"
-#ifdef CONTROL_SUPPORT_LUA
-CtlLua2cFuncT *ctlLua2cFunc = NULL;
-#endif
-
-static CtlPluginT *ctlPlugins = NULL;
-
PUBLIC int PluginGetCB (AFB_ApiT apiHandle, CtlActionT *action , json_object *callbackJ) {
const char *plugin=NULL, *function=NULL;
json_object *argsJ;
@@ -120,8 +114,8 @@ STATIC int PluginLoadCOne(AFB_ApiT apiHandle, const char *pluginpath, json_objec
*lua2cInPlug = (Lua2cWrapperT)DispatchOneL2c;
int Lua2cAddOne(luaL_Reg *l2cFunc, const char* l2cName, int index) {
- if(ctlLua2cFunc->l2cCount)
- {index += ctlLua2cFunc->l2cCount+1;}
+ if(ctlPlugin->ctlL2cFunc->l2cCount)
+ {index += ctlPlugin->ctlL2cFunc->l2cCount+1;}
char funcName[CONTROL_MAXPATH_LEN];
strncpy(funcName, "lua2c_", strlen ("lua2c_")+1);
strncat(funcName, l2cName, strlen (l2cName));
@@ -139,14 +133,18 @@ STATIC int PluginLoadCOne(AFB_ApiT apiHandle, const char *pluginpath, json_objec
int count = 0, errCount = 0;
luaL_Reg *l2cFunc = NULL;
- if(!ctlLua2cFunc) {
- ctlLua2cFunc = calloc(1, sizeof(CtlLua2cFuncT));
+ if(!ctlPlugin->ctlL2cFunc) {
+ ctlPlugin->ctlL2cFunc = calloc(1, sizeof(CtlLua2cFuncT));
}
+ ctlPlugin->ctlL2cFunc->prefix = (lua2c_prefix) ?
+ lua2c_prefix :
+ ctlPlugin->uid;
+
// look on l2c command and push them to LUA
if (json_object_get_type(lua2csJ) == json_type_array) {
size_t length = json_object_array_length(lua2csJ);
- l2cFunc = calloc(length + ctlLua2cFunc->l2cCount + 1, sizeof (luaL_Reg));
+ l2cFunc = calloc(length + ctlPlugin->ctlL2cFunc->l2cCount + 1, sizeof (luaL_Reg));
for (count = 0; count < length; count++) {
int err;
const char *l2cName = json_object_get_string(json_object_array_get_idx(lua2csJ, count));
@@ -154,7 +152,7 @@ STATIC int PluginLoadCOne(AFB_ApiT apiHandle, const char *pluginpath, json_objec
if (err) errCount++;
}
} else {
- l2cFunc = calloc(2 + ctlLua2cFunc->l2cCount, sizeof (luaL_Reg));
+ l2cFunc = calloc(2 + ctlPlugin->ctlL2cFunc->l2cCount, sizeof (luaL_Reg));
const char *l2cName = json_object_get_string(lua2csJ);
errCount = Lua2cAddOne(l2cFunc, l2cName, count);
count++;
@@ -163,23 +161,28 @@ STATIC int PluginLoadCOne(AFB_ApiT apiHandle, const char *pluginpath, json_objec
AFB_ApiError(apiHandle, "CTL-PLUGIN-LOADONE %d symbols not found in plugin='%s'", errCount, pluginpath);
return -1;
}
- int total = ctlLua2cFunc->l2cCount + count;
- if(ctlLua2cFunc->l2cCount) {
- for (int offset = ctlLua2cFunc->l2cCount; offset < total; offset++)
+ int total = ctlPlugin->ctlL2cFunc->l2cCount + count;
+ if(ctlPlugin->ctlL2cFunc->l2cCount) {
+ for (int offset = ctlPlugin->ctlL2cFunc->l2cCount; offset < total; offset++)
{
- int index = offset - ctlLua2cFunc->l2cCount;
- l2cFunc[index] = ctlLua2cFunc->l2cFunc[index];
+ int index = offset - ctlPlugin->ctlL2cFunc->l2cCount;
+ l2cFunc[index] = ctlPlugin->ctlL2cFunc->l2cFunc[index];
}
- free(ctlLua2cFunc->l2cFunc);
+ free(ctlPlugin->ctlL2cFunc->l2cFunc);
}
- ctlLua2cFunc->l2cFunc = l2cFunc;
- ctlLua2cFunc->l2cCount = total;
+ ctlPlugin->ctlL2cFunc->l2cFunc = l2cFunc;
+ ctlPlugin->ctlL2cFunc->l2cCount = total;
+
+ LuaL2cNewLib(ctlPlugin->ctlL2cFunc->l2cFunc, ctlPlugin->ctlL2cFunc->l2cCount, ctlPlugin->ctlL2cFunc->prefix);
}
#endif
DispatchPluginInstallCbT ctlPluginOnload = dlsym(dlHandle, "CtlPluginOnload");
if (ctlPluginOnload) {
ctlPlugin->api = apiHandle;
- ctlPlugin->context = (*ctlPluginOnload) (ctlPlugin, handle);
+ if((*ctlPluginOnload) (ctlPlugin, handle)) {
+ AFB_ApiError(apiHandle, "Plugin Onload function hasn't finish well. Abort initialization");
+ return -1;
+ }
}
return 0;
@@ -217,17 +220,17 @@ STATIC int LoadFoundPlugins(AFB_ApiT apiHandle, json_object *scanResult, json_ob
strncat(pluginpath, "/", strlen ("/"));
strncat(pluginpath, filename, strlen (filename));
- if(!strcasecmp(ext, CONTROL_PLUGIN_EXT)) {
- if(ext && !strcasecmp(ext, CONTROL_PLUGIN_EXT) && i > 0) {
+ if(!strcasecmp(ext, CTL_PLUGIN_EXT)) {
+ if(ext && !strcasecmp(ext, CTL_PLUGIN_EXT) && i > 0) {
AFB_ApiWarning(apiHandle, "Plugin multiple instances in searchpath will use %s/%s", fullpath, filename);
return 0;
}
- PluginLoadCOne(apiHandle, pluginpath, lua2csJ, handle, ctlPlugin);
+ PluginLoadCOne(apiHandle, pluginpath, lua2csJ, lua2c_prefix, handle, ctlPlugin);
}
- else if(!strcasecmp(ext, CONTROL_SCRIPT_EXT)) {
+ else if(!strcasecmp(ext, CTL_SCRIPT_EXT)) {
ctlPlugin->api = apiHandle;
ctlPlugin->context = handle;
- luaLoadScript(pluginpath);
+ LuaLoadScript(pluginpath);
}
}
@@ -281,28 +284,28 @@ STATIC int PluginLoad (AFB_ApiT apiHandle, CtlPluginT *ctlPlugin, json_object *p
{
int err = 0, i = 0;
char *searchPath;
- const char *sPath = NULL, *file = NULL;
+ const char *sPath = NULL, *file = NULL, *lua2c_prefix = NULL;
json_object *lua2csJ = NULL, *fileJ = NULL, *pluginPathJ = NULL;
// plugin initialises at 1st load further init actions should be place into onload section
if (!pluginJ) return 0;
- err = wrap_json_unpack(pluginJ, "{ss,s?s,s?s,s?o,s?o !}",
+ err = wrap_json_unpack(pluginJ, "{ss,s?s,s?s,s?o,s?o,s?s !}",
"uid", &ctlPlugin->uid,
"info", &ctlPlugin->info,
"spath", &sPath,
"file", &fileJ,
- "lua2c", &lua2csJ);
+ "lua2c", &lua2csJ,
+ "lua2c_prefix", &lua2c_prefix);
if (err) {
AFB_ApiError(apiHandle, "CTL-PLUGIN-LOADONE Plugin missing uid|[info]|file|[ldpath]|[lua2c] in:\n-- %s", json_object_get_string(pluginJ));
goto OnErrorExit;
}
// if search path not in Json config file, then try default
- if(sPath)
- searchPath = strdup(sPath);
- else
- searchPath = GetDefaultSearchPath();
+ searchPath = (sPath) ?
+ strdup(sPath) :
+ GetDefaultSearchPath();
// default file equal uid
if (!fileJ) {
@@ -310,12 +313,14 @@ STATIC int PluginLoad (AFB_ApiT apiHandle, CtlPluginT *ctlPlugin, json_object *p
if(FindPlugins(apiHandle, searchPath, file, &pluginPathJ))
goto OnErrorExit;
LoadFoundPlugins(apiHandle, pluginPathJ, lua2csJ, handle, ctlPlugin);
+ LoadFoundPlugins(apiHandle, pluginPathJ, lua2csJ, lua2c_prefix, handle, ctlPlugin);
}
else if(json_object_is_type(fileJ, json_type_string)) {
file = json_object_get_string(fileJ);
if(FindPlugins(apiHandle, searchPath, file, &pluginPathJ))
goto OnErrorExit;
LoadFoundPlugins(apiHandle, pluginPathJ, lua2csJ, handle, ctlPlugin);
+ LoadFoundPlugins(apiHandle, pluginPathJ, lua2csJ, lua2c_prefix, handle, ctlPlugin);
}
else if(json_object_is_type(fileJ, json_type_array)) {
for(i = 0; i < json_object_array_length(fileJ);++i) {
@@ -323,6 +328,7 @@ STATIC int PluginLoad (AFB_ApiT apiHandle, CtlPluginT *ctlPlugin, json_object *p
if(FindPlugins(apiHandle, searchPath, file, &pluginPathJ))
goto OnErrorExit;
LoadFoundPlugins(apiHandle, pluginPathJ, lua2csJ, handle, ctlPlugin);
+ LoadFoundPlugins(apiHandle, pluginPathJ, lua2c_prefix, lua2csJ, handle, ctlPlugin);
}
}
diff --git a/ctl-lib/ctl-plugin.h b/ctl-lib/ctl-plugin.h
index 5d505ac..85d9788 100644
--- a/ctl-lib/ctl-plugin.h
+++ b/ctl-lib/ctl-plugin.h
@@ -30,9 +30,6 @@ extern "C" {
#include <json-c/json.h>
-#define CONTROL_PLUGIN_EXT ".ctlso"
-#define CONTROL_SCRIPT_EXT ".lua"
-
// Waiting for a clean AppFW-V3 API
#ifdef USE_API_DYN
#define AFB_BINDING_VERSION dyn
@@ -165,6 +162,15 @@ extern "C" {
#define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#endif
+#ifdef CONTROL_SUPPORT_LUA
+ typedef struct luaL_Reg luaL_Reg;
+
+ typedef struct CtlLua2cFuncT {
+ luaL_Reg *l2cFunc;
+ const char *prefix;
+ int l2cCount;
+} CtlLua2cFuncT;
+#endif
typedef struct {
const char *uid;
@@ -177,6 +183,9 @@ typedef struct {
AFB_ApiT api;
void *dlHandle;
void *context;
+#ifdef CONTROL_SUPPORT_LUA
+ CtlLua2cFuncT *ctlL2cFunc;
+#endif
} CtlPluginT;
typedef enum {
@@ -227,8 +236,9 @@ typedef struct {
} exec;
} CtlActionT;
+extern CtlPluginT *ctlPlugins;
-typedef void*(*DispatchPluginInstallCbT)(CtlPluginT *plugin, void* handle);
+typedef int(*DispatchPluginInstallCbT)(CtlPluginT *plugin, void* handle);
#define MACRO_STR_VALUE(arg) #arg
#define CTLP_CAPI_REGISTER(pluglabel) CtlPluginMagicT CtlPluginMagic={.uid=pluglabel,.magic=CTL_PLUGIN_MAGIC}; struct afb_binding_data_v2;