diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 33 | ||||
-rw-r--r-- | src/platform-info-apidef.h | 64 | ||||
-rw-r--r-- | src/platform-info-apidef.json | 50 | ||||
-rw-r--r-- | src/platform-info-binding.c | 125 | ||||
-rw-r--r-- | src/platform-info-binding.h | 27 |
5 files changed, 299 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..afa714f --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,33 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +########################################################################### + +# Add target to project dependency list +PROJECT_TARGET_ADD(platform-info) + + # Define project Targets + ADD_LIBRARY(${TARGET_NAME} MODULE platform-info-binding.c) + + # Binder exposes a unique public entry point + SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + PREFIX "afb-" + LABELS "BINDING" + OUTPUT_NAME ${TARGET_NAME} + ) + + TARGET_LINK_LIBRARIES(${TARGET_NAME} + afb-helpers + ${link_libraries} + ) diff --git a/src/platform-info-apidef.h b/src/platform-info-apidef.h new file mode 100644 index 0000000..c09da63 --- /dev/null +++ b/src/platform-info-apidef.h @@ -0,0 +1,64 @@ +static const struct afb_auth _afb_auths_platform_info[] = { + { .type = afb_auth_Permission, .text = "urn:AGL:permission::platform:info:get " }, + { .type = afb_auth_Permission, .text = "urn:AGL:permission::platform:info:set " } +}; + + void afv_get(afb_req_t req); + void afv_set(afb_req_t req); + void afv_subscribe(afb_req_t req); + void afv_unsubscribe(afb_req_t req); + +static const struct afb_verb_v3 _afb_verbs_platform_info[] = { + { + .verb = "get", + .callback = afv_get, + .auth = &_afb_auths_platform_info[0], + .info = "Get a platform data.", + .session = AFB_SESSION_NONE + }, + { + .verb = "set", + .callback = afv_set, + .auth = &_afb_auths_platform_info[1], + .info = "Set a platform data.", + .session = AFB_SESSION_NONE + }, + { + .verb = "unsubscribe", + .callback = afv_unsubscribe, + .auth = NULL, + .info = "Unsubscribe to changes (hotplug event, failures, ...)", + .session = AFB_SESSION_NONE + }, + { + .verb = "subscribe", + .callback = afv_subscribe, + .auth = NULL, + .info = "Subscribe to changes (hotplug event, failures, ...)", + .session = AFB_SESSION_NONE + }, + { + .verb = NULL, + .callback = NULL, + .auth = NULL, + .info = NULL, + .session = 0 + } +}; + +int init(afb_api_t api); + +const struct afb_binding_v3 afbBindingV3 = { + .api = "platform-info", + .specification = NULL, + .info = "", + .verbs = _afb_verbs_platform_info, + .preinit = NULL, + .init = init, + .onevent = NULL, + .userdata = NULL, + .provide_class = NULL, + .require_class = NULL, + .require_api = NULL, + .noconcurrency = 0 +}; diff --git a/src/platform-info-apidef.json b/src/platform-info-apidef.json new file mode 100644 index 0000000..fb4b863 --- /dev/null +++ b/src/platform-info-apidef.json @@ -0,0 +1,50 @@ +{ + "afbidl": "0.0", + "info": { + "description": "Provide platform information to other bindings", + "title": "agl-service-platform-info", + "version": "1.0" + }, + "c-generator": { + "version": 3, + "prefix": "afv_", + "postfix": "", + "preinit": null, + "init": "init", + "onevent": null, + "scope": "static", + "private": true + }, + "api": { + "name": "platform-info", + "verbs": { + "get": { + "description": "Get a platform data.", + "permissions": { "session": "check" }, + "request": { "$ref": "#/schemas/get-request" }, + "reply": { "$ref": "#/schemas/any" } + }, + "subscribe": { + "description": "Subscribe to changes (hotplug event, failures, ...)" + }, + "unsubscribe": { + "description": "Unsubscribe to changes (hotplug event, failures, ...)" + } + } + }, + "schemas": { + "any": { + "title": "Any value", + "type": [ "null", "boolean", "object", "array", "number", "string" ] + }, + "get-request": { + "type": "object", + "properties": { + "oneOf": [ + { "type": "string"}, + { "type": "array", "items": { "type": "string"} } + ] + } + } + } +} diff --git a/src/platform-info-binding.c b/src/platform-info-binding.c new file mode 100644 index 0000000..c6bc9fd --- /dev/null +++ b/src/platform-info-binding.c @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2016, 2018 "IoT.bzh" + * + * Author "Romain Forlot" <romain.forlot@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <string.h> +#include <dirent.h> + +#include <afb/afb-binding.h> +#include "platform-info-binding.h" + +#ifndef PLATFORM_INFO_DIR +#define PLATFORM_INFO_DIR "/etc/platform-info" +#endif + +#ifndef HOTPLUG_NS +#define HOTPLUG_NS "hotplug" +#endif + +void afv_get(afb_req_t req) { + char *json_path = NULL, *full_json_path = NULL; + json_object *platform_info = (json_object*) afb_api_get_userdata(req->api); + json_object *args = afb_req_json(req), *result = NULL; + + switch (json_object_get_type(args)) { + case json_type_null: + result = platform_info; + break; + case json_type_string: + full_json_path = strdupa(json_object_get_string(args)); + result = platform_info; + for(json_path = strtok(full_json_path, "."); json_path && *json_path; json_path = strtok(NULL, ".")) { + if(! json_object_object_get_ex(result, json_path, &result)) { + afb_req_fail(req, "A key hasn't been found in JSON path.", json_path); + return; + } + } + break; + default: + afb_req_fail(req, "Type error", "Argument type is unknown, you must provide a string only"); + return; + } + + afb_req_success(req, result, NULL); +} + +void afv_set(afb_req_t req) { + json_object *platform_info = (json_object*) afb_api_get_userdata(req->api); + json_object *args = afb_req_json(req); + +#if (JSON_C_VERSION_MAJOR_VERSION == 0 && JSON_C_VERSION_MINOR_VERSION >= 13) + if(json_object_object_add(platform_info, HOTPLUG_NS, args)) { + afb_req_fail(req, "Addition fails", NULL); + return; + } +#else + json_object_object_add(platform_info, HOTPLUG_NS, args); +#endif + + afb_req_success(req, NULL, NULL); +} + +// TODO RFOR: interface with inotify and udev +void afv_unsubscribe(afb_req_t req) { + afb_req_success(req, NULL, NULL); +} + +void afv_subscribe(afb_req_t req) { + afb_req_success(req, NULL, NULL); +} + +int init(afb_api_t api) { + struct dirent* dir_ent = NULL; + DIR* dir_handle = opendir(PLATFORM_INFO_DIR); + json_object *json_file = json_object_new_object(), *current_file = NULL; + + while( (dir_ent = readdir(dir_handle)) != NULL) { + if(dir_ent->d_type == DT_REG && dir_ent->d_name[0] != '.') { + size_t filepath_len = strlen(PLATFORM_INFO_DIR) + strlen(dir_ent->d_name) + 2; + char *filepath = alloca(filepath_len); + + filepath = strncpy(filepath, PLATFORM_INFO_DIR, filepath_len); + filepath = strncat(filepath, "/", filepath_len - strlen(filepath) - 1); + filepath = strncat(filepath, dir_ent->d_name, filepath_len - strlen(filepath) - 1); + + AFB_DEBUG("File in processing: %s", filepath); + current_file = json_object_from_file(filepath); +#if (JSON_C_VERSION_MAJOR_VERSION == 0 && JSON_C_VERSION_MINOR_VERSION >= 13) + const char *error = NULL; + if( (error = json_util_get_last_err()) ) { + AFB_NOTICE("This file '%s' isn't a JSON file or have error: %s. len: %ld", filepath, error, filepath_len); + continue; + } +#else + if( current_file == NULL ) { + AFB_NOTICE("This file '%s' isn't a JSON file or have error.", filepath); + continue; + } +#endif + wrap_json_object_add(json_file, current_file); + AFB_DEBUG("JSON loaded: %s", json_object_get_string(json_file)); + } + } + + // Initializing the platform_info binding object and associated it to + // the api + afb_api_set_userdata(api, (void*)json_file); + + return 0; +} diff --git a/src/platform-info-binding.h b/src/platform-info-binding.h new file mode 100644 index 0000000..183fa86 --- /dev/null +++ b/src/platform-info-binding.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2016, 2018 "IoT.bzh" + * + * Author "Romain Forlot" <romain.forlot@iot.bzh> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <wrap-json.h> +#include "platform-info-apidef.h" + +struct key_search_t { + afb_api_t api; + json_object **result; +}; + +json_object *platform_info; |