1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef BASE_STARTUP_INIT_PARAM_H
17#define BASE_STARTUP_INIT_PARAM_H
18#include <stdint.h>
19#include <stdio.h>
20#ifdef PARAM_SUPPORT_TRIGGER
21#include "cJSON.h"
22#endif
23#ifdef __cplusplus
24#if __cplusplus
25extern "C" {
26#endif
27#endif
28
29#define DEFAULT_PARAM_WAIT_TIMEOUT 30 // 30s
30#define DEFAULT_PARAM_SET_TIMEOUT 10 // 10s
31
32#ifndef PARAM_NAME_LEN_MAX
33#define PARAM_CONST_VALUE_LEN_MAX 4096
34#define PARAM_VALUE_LEN_MAX  96
35#define PARAM_NAME_LEN_MAX  96
36#endif
37
38typedef enum {
39    PARAM_CODE_ERROR = -1,
40    PARAM_CODE_SUCCESS = 0,
41    PARAM_CODE_INVALID_PARAM = 100,
42    PARAM_CODE_INVALID_NAME,
43    PARAM_CODE_INVALID_VALUE,
44    PARAM_CODE_REACHED_MAX,
45    PARAM_CODE_NOT_SUPPORT,
46    PARAM_CODE_TIMEOUT,
47    PARAM_CODE_NOT_FOUND,
48    PARAM_CODE_READ_ONLY,
49    PARAM_CODE_IPC_ERROR,
50    PARAM_CODE_NODE_EXIST,
51    PARAM_WATCHER_CALLBACK_EXIST,
52    PARAM_WATCHER_GET_SERVICE_FAILED,
53    PARAM_CODE_MEMORY_MAP_FAILED,
54    PARAM_WORKSPACE_NOT_INIT,
55    PARAM_CODE_FAIL_CONNECT,
56    PARAM_CODE_MEMORY_NOT_ENOUGH,
57    PARAM_CODE_PERMISSION_DENIED,
58    PARAM_DEFAULT_PARAM_MEMORY_NOT_ENOUGH,
59    DAC_RESULT_INVALID_PARAM = 1000,
60    DAC_RESULT_FORBIDED,
61    SELINUX_RESULT_FORBIDED,
62    PARAM_CODE_MAX
63} PARAM_CODE;
64
65typedef enum {
66    EVENT_TRIGGER_PARAM,
67    EVENT_TRIGGER_BOOT,
68    EVENT_TRIGGER_PARAM_WAIT,
69    EVENT_TRIGGER_PARAM_WATCH
70} EventType;
71
72#define LOAD_PARAM_NORMAL 0x00
73#define LOAD_PARAM_ONLY_ADD 0x01
74#define LOAD_PARAM_PERSIST 0x02
75
76typedef uint32_t ParamHandle;
77
78/**
79 * Init 接口
80 * 初始化参数服务
81 *
82 */
83int InitParamService(void);
84void LoadSpecialParam(void);
85
86/**
87 * Init 接口
88 * 启动参数服务,在main启动的最后调用,阻赛当前线程
89 *
90 */
91int StartParamService(void);
92
93/**
94 * Init 接口
95 * 停止参数服务
96 *
97 */
98void StopParamService(void);
99
100/**
101 * Init 接口
102 * 加载默认的参数值
103 *
104 */
105int LoadDefaultParams(const char *fileName, uint32_t mode);
106
107/**
108 * Init 接口
109 * 加载持久化参数。
110 *
111 */
112int LoadPersistParams(void);
113
114/**
115 * Init 接口
116 * 加载加密目录下持久化参数。
117 *
118 */
119int LoadPrivatePersistParams(void);
120
121/**
122 * Init 接口
123 * 设置参数,主要用于其他进程使用,通过管道修改参数
124 *
125 */
126int SystemWriteParam(const char *name, const char *value);
127
128#ifdef PARAM_SUPPORT_TRIGGER
129/**
130 * 对外接口
131 * 触发一个trigger操作。
132 *
133 */
134void PostTrigger(EventType type, const char *content, uint32_t contentLen);
135
136/**
137 * 对外接口
138 * 解析trigger文件。
139 *
140 */
141int ParseTriggerConfig(const cJSON *fileRoot, int (*checkJobValid)(const char *jobName), void *context);
142
143/**
144 * 对外接口
145 * 按名字执行对应的trigger。
146 *
147 */
148void DoTriggerExec(const char *triggerName);
149void DoJobExecNow(const char *triggerName);
150
151/**
152 * 对外接口
153 * 按名字添加一个job,用于group支持。
154 *
155 */
156int AddCompleteJob(const char *name, const char *condition, const char *cmdContent);
157
158void RegisterBootStateChange(void (*bootStateChange)(int start, const char *));
159
160/**
161 * 对外接口
162 * dump 参数和trigger信息
163 *
164 */
165void SystemDumpTriggers(int verbose, int (*dump)(const char *fmt, ...));
166#endif
167
168/**
169 * 对外接口
170 * 设置参数,主要用于其他进程使用,通过管道修改参数。
171 *
172 */
173int SystemSetParameter(const char *name, const char *value);
174
175/**
176 * 对外接口
177 * 保存共享内存中的所有持久化参数
178 *
179*/
180int SystemSaveParameters(void);
181
182/**
183 * Init 接口
184 * 查询参数。
185 *
186 */
187int SystemReadParam(const char *name, char *value, uint32_t *len);
188
189/**
190 * 对外接口
191 * 查询参数,主要用于其他进程使用,需要给定足够的内存保存参数。
192 * 如果 value == null,获取value的长度
193 * 否则value的大小认为是len
194 *
195 */
196#define SystemGetParameter SystemReadParam
197
198
199/**
200 * 外部接口
201 * 等待某个参数值被修改,阻塞直到参数值被修改或超时
202 *
203 */
204int SystemWaitParameter(const char *name, const char *value, int32_t timeout);
205
206typedef void (*ParameterChangePtr)(const char *key, const char *value, void *context);
207int SystemWatchParameter(const char *keyprefix, ParameterChangePtr change, void *context);
208
209int SystemCheckParamExist(const char *name);
210
211void SystemDumpParameters(int verbose, int index, int (*dump)(const char *fmt, ...));
212
213int WatchParamCheck(const char *keyprefix);
214
215void ResetParamSecurityLabel(void);
216
217#ifdef __cplusplus
218#if __cplusplus
219}
220#endif
221#endif
222#endif