diff options
Diffstat (limited to 'afb-source')
-rw-r--r-- | afb-source/ctl-binding.h | 8 | ||||
-rw-r--r-- | afb-source/ctl-dispatch.c | 54 | ||||
-rw-r--r-- | afb-source/ctl-policy.c | 96 | ||||
-rw-r--r-- | afb-source/ctl-timer.c | 18 |
4 files changed, 88 insertions, 88 deletions
diff --git a/afb-source/ctl-binding.h b/afb-source/ctl-binding.h index 0d16e56..f159440 100644 --- a/afb-source/ctl-binding.h +++ b/afb-source/ctl-binding.h @@ -70,7 +70,7 @@ typedef enum { CTL_MODE_NONE=0, CTL_MODE_API, CTL_MODE_CB, - CTL_MODE_LUA, + CTL_MODE_LUA, } CtlRequestModeT; @@ -130,14 +130,14 @@ PUBLIC void ctlapi_lua_doscript (afb_req request); // sharelib ctl-plugin* typedef struct { - long magic; - char *label; + long magic; + char *label; } CtlPluginMagicT; #define MACRO_STR_VALUE(arg) #arg #define CTLP_REGISTER(pluglabel) CtlPluginMagicT CtlPluginMagic={.magic=CTL_PLUGIN_MAGIC,.label=pluglabel}; struct afb_binding_data_v2; Lua2cWrapperT Lua2cWrap; -#define CTLP_ONLOAD(label,version,info) void* CtlPluginOnload(char* label, char* version, char* info) +#define CTLP_ONLOAD(label,version,info) void* CtlPluginOnload(char* label, char* version, char* info) #define CTLP_CAPI(funcname,source, label,argsJ, queryJ, context) int funcname(DispatchSourceT source, char* label, json_object* argsJ, json_object* queryJ, void* context) diff --git a/afb-source/ctl-dispatch.c b/afb-source/ctl-dispatch.c index 95d1315..bbc15ad 100644 --- a/afb-source/ctl-dispatch.c +++ b/afb-source/ctl-dispatch.c @@ -13,7 +13,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, something express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * * Reference: * Json load using json_unpack https://jansson.readthedocs.io/en/2.9/apiref.html#parsing-and-validating-values */ @@ -58,7 +58,7 @@ typedef struct { DispatchHandleT **controls; } DispatchConfigT; -// global config handle +// global config handle STATIC DispatchConfigT *configHandle = NULL; STATIC int DispatchControlToIndex(DispatchHandleT **controls, const char* controlLabel) { @@ -71,7 +71,7 @@ STATIC int DispatchControlToIndex(DispatchHandleT **controls, const char* contro STATIC int DispatchOneControl(DispatchSourceT source, DispatchHandleT **controls, const char* controlLabel, json_object *queryJ, afb_req request) { int err; - + if (!configHandle) { AFB_ERROR("DISPATCH-CTL-API: (Hoops/Bug!!!) No Config Loaded"); goto OnErrorExit; @@ -87,12 +87,12 @@ STATIC int DispatchOneControl(DispatchSourceT source, DispatchHandleT **controls AFB_ERROR("DISPATCH-CTL-API:NotFound/Error label=%s in Json Control Config File", controlLabel); goto OnErrorExit; } - + // Fulup (Bug/Feature) in current version is unique to every onload profile if (configHandle->plugin && configHandle->plugin->l2cCount) { - LuaL2cNewLib (configHandle->plugin->label, configHandle->plugin->l2cFunc, configHandle->plugin->l2cCount); + LuaL2cNewLib (configHandle->plugin->label, configHandle->plugin->l2cFunc, configHandle->plugin->l2cCount); } - + // loop on action for this control DispatchActionT *actions = controls[index]->actions; for (int idx = 0; actions[idx].label; idx++) { @@ -104,10 +104,10 @@ STATIC int DispatchOneControl(DispatchSourceT source, DispatchHandleT **controls // if query is empty increment usage count and pass args if (!queryJ || json_object_get_type(queryJ) != json_type_object) { - json_object_get(actions[idx].argsJ); + json_object_get(actions[idx].argsJ); queryJ= actions[idx].argsJ; } else if (actions[idx].argsJ) { - + // Merge queryJ and argsJ before sending request if (json_object_get_type(actions[idx].argsJ) == json_type_object) { json_object_object_foreach(actions[idx].argsJ, key, val) { @@ -117,7 +117,7 @@ STATIC int DispatchOneControl(DispatchSourceT source, DispatchHandleT **controls json_object_object_add(queryJ, "args", actions[idx].argsJ); } } - + int err = afb_service_call_sync(actions[idx].api, actions[idx].call, queryJ, &returnJ); if (err) { static const char*format = "DispatchOneControl(Api) api=%s verb=%s args=%s"; @@ -180,7 +180,7 @@ PUBLIC void DispatchOneEvent(const char *evtLabel, json_object *eventJ) { PUBLIC int DispatchOnLoad(const char *onLoadLabel) { if (!configHandle) return 1; - + DispatchHandleT **onloads = configHandle->onloads; int err = DispatchOneControl(CTL_SOURCE_ONLOAD, onloads, onLoadLabel, NULL, NULL_AFBREQ); @@ -192,14 +192,14 @@ PUBLIC void ctlapi_dispatch(afb_req request) { json_object *queryJ, *argsJ=NULL; const char *target; DispatchSourceT source= CTL_SOURCE_UNKNOWN; - + queryJ = afb_req_json(request); int err = wrap_json_unpack(queryJ, "{s:s, s?i s?o !}", "target", &target, "source", &source, "args", &argsJ); if (err) { afb_req_fail_f(request, "CTL-DISPTACH-INVALID", "missing target or args not a valid json object query=%s", json_object_get_string(queryJ)); goto OnErrorExit; } - + (void) DispatchOneControl(source, controls, target, argsJ, request); OnErrorExit: @@ -211,7 +211,7 @@ PUBLIC int DispatchOneL2c(lua_State* luaState, char *funcname, Lua2cFunctionT ca #ifndef CONTROL_SUPPORT_LUA AFB_ERROR("DISPATCH-ONE-L2C: LUA support not selected (cf:CONTROL_SUPPORT_LUA) in config.cmake"); return 1; -#else +#else int err=Lua2cWrapper(luaState, funcname, callback, configHandle->plugin->context); return err; #endif @@ -223,13 +223,13 @@ PUBLIC int DispatchOneL2c(lua_State* luaState, char *funcname, Lua2cFunctionT ca PUBLIC void ctlapi_config(struct afb_req request) { json_object*tmpJ; char *dirList; - + json_object* queryJ = afb_req_json(request); if (queryJ && json_object_object_get_ex(queryJ, "cfgpath", &tmpJ)) { dirList = strdup(json_object_get_string(tmpJ)); } else { - + dirList = getenv("CONTROL_CONFIG_PATH"); if (!dirList) dirList = strdup(CONTROL_CONFIG_PATH); AFB_NOTICE("CONFIG-MISSING: use default CONTROL_CONFIG_PATH=%s", CONTROL_CONFIG_PATH); @@ -399,7 +399,7 @@ STATIC DispatchHandleT *DispatchLoadOnload(DispatchConfigT *controlConfig, json_ // if search path not in Json config file, then try default if (!ldSearchPath) ldSearchPath=CONTROL_PLUGIN_PATH; - + // search for default policy config file json_object *pluginPathJ = ScanForConfig(ldSearchPath, CTL_SCAN_RECURSIVE, dPlugin->sharelib, NULL); if (!pluginPathJ || json_object_array_length(pluginPathJ) == 0) { @@ -441,20 +441,20 @@ STATIC DispatchHandleT *DispatchLoadOnload(DispatchConfigT *controlConfig, json_ struct afb_binding_data_v2 *afbHidenData = dlsym(dPlugin->dlHandle, "afbBindingV2data"); if (afbHidenData) *afbHidenData = afbBindingV2data; - // Push lua2cWrapper @ into plugin + // Push lua2cWrapper @ into plugin Lua2cWrapperT *lua2cInPlug = dlsym(dPlugin->dlHandle, "Lua2cWrap"); -#ifndef CONTROL_SUPPORT_LUA +#ifndef CONTROL_SUPPORT_LUA if (lua2cInPlug) *lua2cInPlug = NULL; #else // Lua2cWrapper is part of binder and not expose to dynamic link if (lua2cInPlug) *lua2cInPlug = DispatchOneL2c; - + { int Lua2cAddOne(luaL_Reg *l2cFunc, const char* l2cName, int index) { char funcName[CONTROL_MAXPATH_LEN]; strncpy(funcName, "lua2c_", sizeof(funcName)); strncat(funcName, l2cName, sizeof(funcName)); - + Lua2cFunctionT l2cFunction= (Lua2cFunctionT)dlsym(dPlugin->dlHandle, funcName); if (!l2cFunction) { AFB_ERROR("DISPATCH-LOAD-CONFIG:Plugin symbol'%s' missing err=%s", funcName, dlerror()); @@ -462,14 +462,14 @@ STATIC DispatchHandleT *DispatchLoadOnload(DispatchConfigT *controlConfig, json_ } l2cFunc[index].func=(void*)l2cFunction; l2cFunc[index].name=strdup(l2cName); - + return 0; } int errCount = 0; luaL_Reg *l2cFunc=NULL; int count=0; - + // look on l2c command and push them to LUA if (json_object_get_type(lua2csJ) == json_type_array) { int length = json_object_array_length(lua2csJ); @@ -531,8 +531,8 @@ STATIC DispatchConfigT *DispatchLoadConfig(const char* filepath) { AFB_ERROR("DISPATCH-LOAD-CONFIG Missing something metadata|[onload]|[controls]|[events] in %s", json_object_get_string(controlConfigJ)); goto OnErrorExit; } - - + + DispatchConfigT *controlConfig = calloc(1, sizeof (DispatchConfigT)); if (metadataJ) { @@ -542,7 +542,7 @@ STATIC DispatchConfigT *DispatchLoadConfig(const char* filepath) { AFB_ERROR("DISPATCH-LOAD-CONFIG:METADATA Missing something label|version|[label] in %s", json_object_get_string(metadataJ)); goto OnErrorExit; } - + // if ctlname is provided change process name now if (ctlname) { err= prctl(PR_SET_NAME, ctlname,NULL,NULL,NULL); @@ -620,7 +620,7 @@ OnErrorExit: PUBLIC int DispatchInit() { int index, err, luaLoaded = 0; char controlFile [CONTROL_MAXPATH_LEN]; - + const char *dirList= getenv("CONTROL_CONFIG_PATH"); if (!dirList) dirList=CONTROL_CONFIG_PATH; @@ -630,7 +630,7 @@ PUBLIC int DispatchInit() { // search for default dispatch config file json_object* responseJ = ScanForConfig(dirList, CTL_SCAN_RECURSIVE, controlFile, "json"); - // We load 1st file others are just warnings + // We load 1st file others are just warnings for (index = 0; index < json_object_array_length(responseJ); index++) { json_object *entryJ = json_object_array_get_idx(responseJ, index); diff --git a/afb-source/ctl-policy.c b/afb-source/ctl-policy.c index e9798b3..9fe220c 100644 --- a/afb-source/ctl-policy.c +++ b/afb-source/ctl-policy.c @@ -19,7 +19,7 @@ #include <stdio.h> #include <string.h> #include <dirent.h> -#include <json-c/json_object.h> +#include <json-c/json_object.h> #include "wrap-json.h" #include "ctl-binding.h" @@ -32,17 +32,17 @@ STATIC json_object* ScanForConfig (char* searchPath) { DIR *dirHandle; char *dirPath; char* dirList= strdup(searchPath); - + responseJ = json_object_new_array(); for (dirPath= strtok(dirList, ":"); dirPath && *dirPath; dirPath=strtok(NULL,":")) { struct dirent *dirEnt; - + dirHandle = opendir (dirPath); if (!dirHandle) { AFB_NOTICE ("CONFIG-SCANNING dir=%s not readable", dirPath); continue; - } - + } + AFB_NOTICE ("CONFIG-SCANNING:ctl_listconfig scanning: %s", dirPath); while ((dirEnt = readdir(dirHandle)) != NULL) { // Unknown type is accepted to support dump filesystems @@ -54,18 +54,18 @@ STATIC json_object* ScanForConfig (char* searchPath) { } } } - - free (dirList); + + free (dirList); return (responseJ); } PUBLIC void ctlapi_authorize (PolicyCtlEnumT control, afb_req request) { json_object*tmpJ; - + json_object* queryJ= afb_req_json(request); int done=json_object_object_get_ex(queryJ, "closing", &tmpJ); if (done) return; - + } @@ -73,34 +73,34 @@ PUBLIC void ctlapi_authorize (PolicyCtlEnumT control, afb_req request) { PUBLIC void ctlapi_config (struct afb_req request) { json_object*tmpJ; char *dirList; - + json_object* queryJ = afb_req_json(request); if (queryJ && json_object_object_get_ex (queryJ, "cfgpath" , &tmpJ)) { dirList = strdup (json_object_get_string(tmpJ)); - } else { - dirList = strdup (CONTROL_CONFIG_PATH); + } else { + dirList = strdup (CONTROL_CONFIG_PATH); AFB_NOTICE ("CONFIG-MISSING: use default CONTROL_CONFIG_PATH=%s", CONTROL_CONFIG_PATH); } - + // get list of config file struct json_object *responseJ = ScanForConfig(dirList); - + if (json_object_array_length(responseJ) == 0) { - afb_req_fail(request, "CONFIGPATH:EMPTY", "No Config Found in CONTROL_CONFIG_PATH"); + afb_req_fail(request, "CONFIGPATH:EMPTY", "No Config Found in CONTROL_CONFIG_PATH"); } else { afb_req_success(request, responseJ, NULL); } - + return; } STATIC PolicyActionT **PolicyLoadActions (json_object *actionsJ) { int err; PolicyActionT ** actions; - + // unpack individual action object int actionUnpack (json_object *actionJ, PolicyActionT *action) { - + err= wrap_json_unpack(actionJ, "{ss,s?s,s?s,s?s,s?s,s?s !}" , "label",&action->label, "info",&action->info, "callback",&action->callback, "query",&queryJ, "api",&action->api, "verb", &action->verb); if (err) { @@ -108,34 +108,34 @@ STATIC PolicyActionT **PolicyLoadActions (json_object *actionsJ) { return -1; } if (!action->callback || !(action->api && action->verb)) { - AFB_ERROR ("POLICY-LOAD-ACTION Missing something callback|(api+verb) in %s", json_object_get_string(actionJ)); - return -1; - } + AFB_ERROR ("POLICY-LOAD-ACTION Missing something callback|(api+verb) in %s", json_object_get_string(actionJ)); + return -1; + } return 0; }; - + // action array is close with a nullvalue; if (json_object_get_type(actionsJ) == json_type_array) { int count = json_object_array_length(actionsJ); actions = calloc (count+1, sizeof(PolicyActionT)); - + for (int idx=0; idx < count; idx++) { json_object *actionJ = json_object_array_get_idx(actionsJ, idx); err = actionUnpack (actionJ, &actions[idx]); if (err) goto OnErrorExit; } - + } else { - actions = calloc (2, sizeof(PolicyActionT)); + actions = calloc (2, sizeof(PolicyActionT)); err = actionUnpack (actionsJ, &actions[0]); if (err) goto OnErrorExit; } - + return actions; - + OnErrorExit: return NULL; - + } // load control policy from file using json_unpack https://jansson.readthedocs.io/en/2.9/apiref.html#parsing-and-validating-values @@ -143,25 +143,25 @@ STATIC PolicyCtlConfigT *PolicyLoadConfig (const char* filepath) { json_object *policyConfigJ, *ignoreJ, *actionsJ; PolicyCtlConfigT *policyConfig = calloc (1, sizeof(PolicyCtlConfigT)); int err; - + // Load JSON file policyConfigJ= json_object_from_file(filepath); if (!policyConfigJ) goto OnErrorExit; - + json_object *metadataJ, *onloadJ, *controlsJ, *eventsJ; err= wrap_json_unpack(policyConfigJ, "{s?o,so,s?o,so,so !}", "$schema", &ignoreJ, "metadata",&metadataJ, "onload",&onloadJ, "controls",&controlsJ, "events",&eventsJ); if (err) { AFB_ERROR ("POLICY-LOAD-ERRROR Missing something metadata|onload|controls|events in %s", json_object_get_string(policyConfigJ)); goto OnErrorExit; } - + PolicyHandleT *policyHandle = calloc (1, sizeof(PolicyHandleT)); err= wrap_json_unpack(metadataJ, "{so,s?s,s?s !}", "label", &policyHandle->label, "info",&policyHandle->info, "version",&policyHandle->version); if (err) { AFB_ERROR ("POLICY-LOAD-CONFIG Missing something label|info|version in %s", json_object_get_string(metadataJ)); goto OnErrorExit; } - + if (onloadJ) { err= wrap_json_unpack(onloadJ, "{s?o,s?s,s?s !}", "info",&ignoreJ, "label",&ignoreJ, "actions",&actionsJ); if (err) { @@ -170,9 +170,9 @@ STATIC PolicyCtlConfigT *PolicyLoadConfig (const char* filepath) { } policyConfig->onload = PolicyLoadActions (actionsJ); } - + return policyControl; - + OnErrorExit: return NULL; } @@ -180,42 +180,42 @@ OnErrorExit: // Load default config file at init PUBLIC int PolicyInit () { int index, err; - - + + // search for default policy config file json_object* responseJ = ScanForConfig(CONTROL_CONFIG_PATH); - + for (index=0; index < json_object_array_length(responseJ); index++) { json_object *entryJ=json_object_array_get_idx(responseJ, index); - + char *filename; char*dirpath; err= wrap_json_unpack (entryJ, "{s:s, s:s !}", "dirpath", &dirpath,"filename", &filename); if (err) { AFB_ERROR ("POLICY-INIT HOOPs invalid config file path = %s", json_object_get_string(entryJ)); goto OnErrorExit; } - + if (strcasestr(filename, CONTROL_CONFIG_FILE)) { char filepath[255]; - strncpy(filepath, dirpath, sizeof(filepath)); - strncat(filepath, "/", sizeof(filepath)); - strncat(filepath, filename, sizeof(filepath)); + strncpy(filepath, dirpath, sizeof(filepath)); + strncat(filepath, "/", sizeof(filepath)); + strncat(filepath, filename, sizeof(filepath)); ctlHandle = PolicyLoadConfig (filepath); if (!ctlHandle) goto OnErrorExit; break; } } - + // no policy config found remove control API from binder if (index == 0) goto OnErrorExit; - + AFB_NOTICE ("SUCCES: Audio Control Policy Init"); return 0; - + OnErrorExit: AFB_NOTICE ("ERROR: Audio Control Policy Init"); - return 1; + return 1; } - - + + diff --git a/afb-source/ctl-timer.c b/afb-source/ctl-timer.c index a826f9f..50e181b 100644 --- a/afb-source/ctl-timer.c +++ b/afb-source/ctl-timer.c @@ -45,7 +45,7 @@ STATIC int TimerNext (sd_event_source* source, uint64_t timer, void* handle) { return 0; } else { - // otherwise validate timer for a new run + // otherwise validate timer for a new run sd_event_now(afb_daemon_get_event_loop(), CLOCK_MONOTONIC, &usec); sd_event_source_set_enabled(source, SD_EVENT_ONESHOT); sd_event_source_set_time(source, usec + timerHandle->delay*1000); @@ -53,12 +53,12 @@ STATIC int TimerNext (sd_event_source* source, uint64_t timer, void* handle) { done= timerHandle->callback(timerHandle->context); if (!done) goto OnErrorExit; - + return 0; OnErrorExit: AFB_WARNING("TimerNext Callback Fail Tag=%s", timerHandle->label); - return -1; + return -1; } PUBLIC void TimerEvtStop(TimerHandleT *timerHandle) { @@ -70,12 +70,12 @@ PUBLIC void TimerEvtStop(TimerHandleT *timerHandle) { PUBLIC void TimerEvtStart(TimerHandleT *timerHandle, timerCallbackT callback, void *context) { uint64_t usec; - + // populate CB handle timerHandle->callback=callback; timerHandle->context=context; - - // set a timer with ~250us accuracy + + // set a timer with ~250us accuracy sd_event_now(afb_daemon_get_event_loop(), CLOCK_MONOTONIC, &usec); sd_event_add_time(afb_daemon_get_event_loop(), &timerHandle->evtSource, CLOCK_MONOTONIC, usec+timerHandle->delay*1000, 250, TimerNext, timerHandle); } @@ -87,15 +87,15 @@ PUBLIC afb_event TimerEvtGet(void) { // Create Binding Event at Init PUBLIC int TimerEvtInit () { - + // create binder event to send test pause/resume afbevt = afb_daemon_make_event("control"); if (!afb_event_is_valid(afbevt)) { AFB_ERROR ("POLCTL_INIT: Cannot register ctl-events"); return 1; } - + AFB_DEBUG ("Audio Control-Events Init Done"); return 0; } - + |