1 /*
2 * Copyright (C) 2015-2019 Alibaba Group Holding Limited
3 */
4
5 #include <string.h>
6 #include "uagent.h"
7 #include "uagent_inner_api.h"
8 #include "aos/kernel.h"
9 #include "aos/errno.h"
10 #include "k_config.h"
11 #include "cJSON.h"
12
13 static aos_mutex_t uagent_mutex;
14
uagent_init_mutex(void)15 void uagent_init_mutex(void)
16 {
17 aos_mutex_new(&uagent_mutex);
18 }
19
uagent_get_mutex(void)20 bool uagent_get_mutex(void)
21 {
22 return 0 == aos_mutex_lock(&uagent_mutex, AOS_WAIT_FOREVER);
23 }
24
uagent_release_mutex(void)25 void uagent_release_mutex(void)
26 {
27 aos_mutex_unlock(&uagent_mutex);
28 }
29
add_list(mod_func_t * mod_func_tree,const ua_func_t func,char * func_name)30 int add_list(mod_func_t *mod_func_tree, const ua_func_t func, char *func_name)
31 {
32 int rc = -1;
33 if (NULL != mod_func_tree && NULL != func_name) {
34 UAGENT_DEBUG("will add list mod %s func %d func name %s\n", mod_func_tree->mod_info.name, func, func_name);
35 uagent_func_node_t *header = mod_func_tree->header;
36 if (NULL == mod_func_tree->header) {
37 mod_func_tree->header = (uagent_func_node_t*)aos_malloc(sizeof(uagent_func_node_t));
38 if (NULL != mod_func_tree->header) {
39 mod_func_tree->header->next = NULL;
40 mod_func_tree->header->func = func;
41 memset(mod_func_tree->header->func_name, 0, sizeof(mod_func_tree->header->func_name));
42 strncpy(mod_func_tree->header->func_name, func_name, sizeof(mod_func_tree->header->func_name) - 1);
43 mod_func_tree->mod_info.func_count = 1;
44 rc = 0;
45 } else {
46 UAGENT_ERR("[uA]alloc memory of func %s for mod %s fail\n", func_name, mod_func_tree->mod_info.name);
47 }
48 } else {
49 uagent_func_node_t *p = header;
50 while (p != NULL) {
51 if (p->func == func) { /* found it alredy in list, just update */
52 memset(header->func_name, 0, sizeof(header->func_name));
53 strncpy(header->func_name, func_name, sizeof(header->func_name) - 1);
54 /* keep the count */
55 rc = 0;
56 break;
57 }
58 if (p->next == NULL) {
59 p->next = (uagent_func_node_t*)aos_malloc(sizeof(uagent_func_node_t));
60 if (NULL != p->next) {
61 p->next->next = NULL;
62 p->next->func = func;
63 memset(p->next->func_name, 0, sizeof(p->next->func_name));
64 strncpy(p->next->func_name, func_name, sizeof(p->next->func_name) - 1);
65 mod_func_tree->mod_info.func_count++;
66 rc = 0;
67 } else {
68 UAGENT_ERR("[uA]alloc memory of func %s for mod %s fail\n", func_name, mod_func_tree->mod_info.name);
69 }
70 break;
71 } else {
72 p = p->next;
73 }
74 }
75 }
76 }
77 return rc;
78 }
79
del_list(mod_func_t * mod_func_tree,const ua_func_t func)80 int del_list(mod_func_t *mod_func_tree, const ua_func_t func)
81 {
82 int rc = -1;
83 if (NULL != mod_func_tree) {
84 uagent_func_node_t *header = mod_func_tree->header;
85 if (NULL != header) {
86 uagent_func_node_t *p = header;
87 if (p->func == func) {/* header matches, remove it */
88 mod_func_tree->header = p->next;
89 aos_free(p);
90 p = NULL;
91 rc = 0;
92 } else {
93 uagent_func_node_t *before = header;
94 p = before->next;
95 while (p != NULL) {
96 if (p->func == func) {
97 before->next = p->next;/* rear of list, just remove this node */
98 aos_free(p);
99 p = NULL;
100 rc = 0;
101 break;
102 } else {
103 before = p;
104 p = before->next;
105 }
106 }
107 }
108 if (0 == rc) {
109 if (mod_func_tree->mod_info.func_count > 0) {
110 mod_func_tree->mod_info.func_count--;
111 }
112 }
113 }
114 }
115 return rc;
116 }
117