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