summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/resource_reg.c
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/resource_reg.c')
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/resource_reg.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/resource_reg.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/resource_reg.c
new file mode 100644
index 000000000..4e930890e
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/app-mgr/app-manager/resource_reg.c
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include "native_interface.h"
+#include "app_manager.h"
+#include "app_manager_export.h"
+#include "bi-inc/shared_utils.h"
+#include "bi-inc/attr_container.h"
+#include "coap_ext.h"
+
+typedef struct _app_res_register {
+ struct _app_res_register *next;
+ char *url;
+ void (*request_handler)(request_t *, void *);
+ uint32 register_id;
+} app_res_register_t;
+
+static app_res_register_t *g_resources = NULL;
+
+void
+module_request_handler(request_t *request, void *user_data)
+{
+ unsigned int mod_id = (unsigned int)(uintptr_t)user_data;
+ bh_message_t msg;
+ module_data *m_data;
+ request_t *req;
+
+ /* Check module name */
+ m_data = module_data_list_lookup_id(mod_id);
+ if (!m_data) {
+ return;
+ }
+
+ if (m_data->wd_timer.is_interrupting) {
+ return;
+ }
+
+ req = clone_request(request);
+ if (!req) {
+ return;
+ }
+
+ /* Set queue message and send to applet's queue */
+ msg = bh_new_msg(RESTFUL_REQUEST, req, sizeof(*req), request_cleaner);
+ if (!msg) {
+ request_cleaner(req);
+ return;
+ }
+
+ if (!bh_post_msg2(m_data->queue, msg)) {
+ return;
+ }
+
+ app_manager_printf("Send request to app %s success.\n",
+ m_data->module_name);
+}
+
+void
+targeted_app_request_handler(request_t *request, void *unused)
+{
+ char applet_name[128] = { 0 };
+ int offset;
+ char *url = request->url;
+ module_data *m_data;
+
+ offset = check_url_start(request->url, strlen(request->url), "/app/");
+
+ if (offset <= 0) {
+ return;
+ }
+
+ strncpy(applet_name, request->url + offset, sizeof(applet_name) - 1);
+ char *p = strchr(applet_name, '/');
+ if (p) {
+ *p = 0;
+ }
+ else
+ return;
+ app_manager_printf("Send request to applet: %s\n", applet_name);
+
+ request->url = p + 1;
+
+ /* Check module name */
+ m_data = module_data_list_lookup(applet_name);
+ if (!m_data) {
+ SEND_ERR_RESPONSE(request->mid,
+ "Send request to applet failed: invalid applet name");
+ goto end;
+ }
+
+ module_request_handler(request, (void *)(uintptr_t)m_data->id);
+end:
+ request->url = url;
+}
+
+void
+am_send_response(response_t *response)
+{
+ module_data *m_data;
+
+ // if the receiver is not any of modules, just forward it to the host
+ m_data = module_data_list_lookup_id(response->reciever);
+ if (!m_data) {
+ send_response_to_host(response);
+ }
+ else {
+ response_t *resp_for_send = clone_response(response);
+ if (!resp_for_send) {
+ return;
+ }
+
+ bh_message_t msg = bh_new_msg(RESTFUL_RESPONSE, resp_for_send,
+ sizeof(*resp_for_send), response_cleaner);
+ if (!msg) {
+ response_cleaner(resp_for_send);
+ return;
+ }
+
+ if (!bh_post_msg2(m_data->queue, msg)) {
+ return;
+ }
+ }
+}
+
+void *
+am_dispatch_request(request_t *request)
+{
+ app_res_register_t *r = g_resources;
+
+ while (r) {
+ if (check_url_start(request->url, strlen(request->url), r->url) > 0) {
+ r->request_handler(request, (void *)(uintptr_t)r->register_id);
+ return r;
+ }
+ r = r->next;
+ }
+ return NULL;
+}
+
+bool
+am_register_resource(const char *url,
+ void (*request_handler)(request_t *, void *),
+ uint32 register_id)
+{
+ app_res_register_t *r = g_resources;
+ int register_num = 0;
+
+ while (r) {
+ if (strcmp(r->url, url) == 0) {
+ return false;
+ }
+
+ if (r->register_id == register_id)
+ register_num++;
+
+ r = r->next;
+ }
+
+ if (strlen(url) > RESOUCE_EVENT_URL_LEN_MAX)
+ return false;
+
+ if (register_num >= RESOURCE_REGISTRATION_NUM_MAX)
+ return false;
+
+ r = (app_res_register_t *)APP_MGR_MALLOC(sizeof(app_res_register_t));
+ if (r == NULL)
+ return false;
+
+ memset(r, 0, sizeof(*r));
+ r->url = bh_strdup(url);
+ if (r->url == NULL) {
+ APP_MGR_FREE(r);
+ return false;
+ }
+
+ r->request_handler = request_handler;
+ r->next = g_resources;
+ r->register_id = register_id;
+ g_resources = r;
+
+ return true;
+}
+
+void
+am_cleanup_registeration(uint32 register_id)
+{
+ app_res_register_t *r = g_resources;
+ app_res_register_t *prev = NULL;
+
+ while (r) {
+ app_res_register_t *next = r->next;
+
+ if (register_id == r->register_id) {
+ if (prev)
+ prev->next = next;
+ else
+ g_resources = next;
+
+ APP_MGR_FREE(r->url);
+ APP_MGR_FREE(r);
+ }
+ else
+ /* if r is freed, should not change prev. Only set prev to r
+ when r isn't freed. */
+ prev = r;
+
+ r = next;
+ }
+}