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_PARAM_UTILS_H
17#define BASE_STARTUP_PARAM_UTILS_H
18#include <stddef.h>
19#include <stdint.h>
20
21#include "beget_ext.h"
22#include "init_param.h"
23#include "init_utils.h"
24
25#ifdef __cplusplus
26#if __cplusplus
27extern "C" {
28#endif
29#endif
30
31typedef enum {
32    PARAM_CODE_NOT_INIT = PARAM_CODE_MAX + 1,
33    PARAM_CODE_ERROR_MAP_FILE,
34} PARAM_INNER_CODE;
35
36#ifndef PARAM_BUFFER_MAX
37#define PARAM_BUFFER_MAX (0x01 << 16)
38#endif
39
40#define FILENAME_LEN_MAX 255
41#define MS_UNIT 1000
42#ifndef UNUSED
43#define UNUSED(x) (void)(x)
44#endif
45#define PARAM_ALIGN(len) (((len) + 0x03) & (~0x03))
46#define PARAM_IS_ALIGNED(x) (((x) & 0x03) == 0)
47#define PARAM_ENTRY(ptr, type, member) (type *)((char *)(ptr)-offsetof(type, member))
48
49#define IS_READY_ONLY(name) \
50    ((strncmp((name), "const.", strlen("const.")) == 0) ||  \
51    (strncmp((name), "ro.", strlen("ro.")) == 0) || \
52    (strncmp((name), "ohos.boot.", strlen("ohos.boot.")) == 0))
53
54#define PARAM_PERSIST_PREFIX "persist."
55
56#define SYS_POWER_CTRL "ohos.startup.powerctrl="
57#define OHOS_CTRL_START "ohos.ctl.start="
58#define OHOS_CTRL_STOP "ohos.ctl.stop="
59#define OHOS_SERVICE_CTRL_PREFIX "ohos.servicectrl."
60
61#ifdef STARTUP_INIT_TEST
62#define PARAM_STATIC
63#else
64#define PARAM_STATIC static
65#endif
66
67#ifdef __LITEOS_M__
68#ifndef DATA_PATH
69#define DATA_PATH          "/"
70#endif
71#elif defined __LITEOS_A__
72#define DATA_PATH          STARTUP_INIT_UT_PATH"/storage/data/system/param/"
73#elif defined __LINUX__
74#define DATA_PATH          STARTUP_INIT_UT_PATH"/storage/data/system/param/"
75#else
76#define DATA_PATH          STARTUP_INIT_UT_PATH"/data/service/el1/startup/parameters/"
77#endif
78#define PARAM_AREA_SIZE_CFG STARTUP_INIT_UT_PATH"/etc/param/ohos.para.size"
79#define CLIENT_PIPE_NAME "/dev/unix/socket/paramservice"
80#define PIPE_NAME STARTUP_INIT_UT_PATH "/dev/unix/socket/paramservice"
81#define PARAM_STORAGE_PATH STARTUP_INIT_UT_PATH "/dev/__parameters__"
82#define PARAM_PERSIST_SAVE_PATH DATA_PATH "persist_parameters"
83#define PARAM_PERSIST_SAVE_TMP_PATH DATA_PATH "tmp_persist_parameters"
84#define PRIVATE_DATA_PATH STARTUP_INIT_UT_PATH "/data/service/el1/public/startup/parameters/"
85#define PARAM_OLD_PERSIST_SAVE_PATH PRIVATE_DATA_PATH "persist_parameters"
86#define PARAM_PUBLIC_PERSIST_SAVE_PATH DATA_PATH "public_persist_parameters"
87#define PARAM_PUBLIC_PERSIST_SAVE_TMP_PATH DATA_PATH "tmp_public_persist_parameters"
88#define PARAM_PRIVATE_PERSIST_SAVE_PATH PRIVATE_DATA_PATH "private_persist_parameters"
89#define PARAM_PRIVATE_PERSIST_SAVE_TMP_PATH PRIVATE_DATA_PATH "tmp_private_persist_parameters"
90#define PERSIST_HANDLE_MAX 2
91
92#define WORKSPACE_FLAGS_INIT 0x01
93#define WORKSPACE_FLAGS_LOADED 0x02
94#define WORKSPACE_FLAGS_UPDATE 0x04
95#define WORKSPACE_FLAGS_LABEL_LOADED 0x08
96#define WORKSPACE_FLAGS_NEED_ACCESS 0x10
97#define WORKSPACE_FLAGS_FOR_INIT 0x20
98
99#define PARAM_SET_FLAG(node, flag) ((node) |= (flag))
100#define PARAM_CLEAR_FLAG(node, flag) ((node) &= ~(flag))
101#define PARAM_TEST_FLAG(node, flag) (((node) & (flag)) == (flag))
102
103#ifndef PARAN_DOMAIN
104#define PARAN_DOMAIN (BASE_DOMAIN + 2)
105#endif
106#define PARAN_LABEL "PARAM"
107#ifdef PARAM_BASE
108INIT_LOCAL_API void ParamWorBaseLog(InitLogLevel logLevel, uint32_t domain, const char *tag, const char *fmt, ...);
109#define PARAM_LOGV(fmt, ...) \
110    ParamWorBaseLog(INIT_DEBUG, PARAN_DOMAIN, PARAN_LABEL, "[%s:%d]" fmt, \
111        (STARTUP_FILE_NAME), (__LINE__), ##__VA_ARGS__)
112#define PARAM_LOGI(fmt, ...) \
113    ParamWorBaseLog(INIT_INFO, PARAN_DOMAIN, PARAN_LABEL, "[%s:%d]" fmt, \
114        (STARTUP_FILE_NAME), (__LINE__), ##__VA_ARGS__)
115#define PARAM_LOGW(fmt, ...) \
116    ParamWorBaseLog(INIT_WARN, PARAN_DOMAIN, PARAN_LABEL, "[%s:%d]" fmt, \
117        (STARTUP_FILE_NAME), (__LINE__), ##__VA_ARGS__)
118#define PARAM_LOGE(fmt, ...) \
119    ParamWorBaseLog(INIT_ERROR, PARAN_DOMAIN, PARAN_LABEL, "[%s:%d]" fmt, \
120        (STARTUP_FILE_NAME), (__LINE__), ##__VA_ARGS__)
121#else
122#define PARAM_LOGI(fmt, ...) STARTUP_LOGI(PARAN_DOMAIN, PARAN_LABEL, fmt, ##__VA_ARGS__)
123#define PARAM_LOGE(fmt, ...) STARTUP_LOGE(PARAN_DOMAIN, PARAN_LABEL, fmt, ##__VA_ARGS__)
124#define PARAM_LOGV(fmt, ...) STARTUP_LOGV(PARAN_DOMAIN, PARAN_LABEL, fmt, ##__VA_ARGS__)
125#define PARAM_LOGW(fmt, ...) STARTUP_LOGW(PARAN_DOMAIN, PARAN_LABEL, fmt, ##__VA_ARGS__)
126#endif
127
128#define PARAM_CHECK(retCode, exper, ...) \
129    if (!(retCode)) {                \
130        PARAM_LOGE(__VA_ARGS__);     \
131        exper;                       \
132    }
133
134#define PARAM_INFO_CHECK(retCode, exper, ...) \
135    if (!(retCode)) {                \
136        PARAM_LOGI(__VA_ARGS__);     \
137        exper;                       \
138    }
139
140#define PARAM_WARNING_CHECK(retCode, exper, ...) \
141    if (!(retCode)) {                \
142        PARAM_LOGW(__VA_ARGS__);     \
143        exper;                       \
144    }
145
146#define PARAM_ONLY_CHECK(retCode, exper) \
147    if (!(retCode)) {                \
148        exper;                       \
149    }
150
151typedef int (*DUMP_PRINTF)(const char *fmt, ...);
152#define PARAM_DUMP g_printf
153#define MAX_LABEL_LEN 256
154#define PARAM_BUFFER_SIZE 256
155
156#define SUBSTR_INFO_NAME 0
157#define SUBSTR_INFO_VALUE 1
158#ifdef PARAM_SUPPORT_SELINUX
159#define SUBSTR_INFO_LABEL 1
160#define SUBSTR_INFO_DAC 2
161#else
162#define SUBSTR_INFO_LABEL 1
163#define SUBSTR_INFO_DAC 1
164#endif
165
166INIT_LOCAL_API int SplitParamString(char *line, const char *exclude[], uint32_t count,
167    int (*result)(const uint32_t *context, const char *name, const char *value), const uint32_t *context);
168
169#ifdef __cplusplus
170#if __cplusplus
171}
172#endif
173#endif
174#endif