1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci#include "init_param.h"
16d9f0492fSopenharmony_ci
17d9f0492fSopenharmony_ci#include <errno.h>
18d9f0492fSopenharmony_ci#include <stddef.h>
19d9f0492fSopenharmony_ci#include <string.h>
20d9f0492fSopenharmony_ci#include <sys/socket.h>
21d9f0492fSopenharmony_ci#include <unistd.h>
22d9f0492fSopenharmony_ci
23d9f0492fSopenharmony_ci#include "init_log.h"
24d9f0492fSopenharmony_ci#include "init_utils.h"
25d9f0492fSopenharmony_ci#include "param_atomic.h"
26d9f0492fSopenharmony_ci#include "param_manager.h"
27d9f0492fSopenharmony_ci#include "param_message.h"
28d9f0492fSopenharmony_ci#include "param_security.h"
29d9f0492fSopenharmony_ci
30d9f0492fSopenharmony_ci#define INVALID_SOCKET (-1)
31d9f0492fSopenharmony_cistatic const uint32_t RECV_BUFFER_MAX = 5 * 1024;
32d9f0492fSopenharmony_cistatic ATOMIC_UINT32 g_requestId;
33d9f0492fSopenharmony_cistatic int g_clientFd = INVALID_SOCKET;
34d9f0492fSopenharmony_cistatic pthread_mutex_t g_clientMutex = PTHREAD_MUTEX_INITIALIZER;
35d9f0492fSopenharmony_ci
36d9f0492fSopenharmony_ci__attribute__((constructor)) static void ParameterInit(void)
37d9f0492fSopenharmony_ci{
38d9f0492fSopenharmony_ci    ATOMIC_INIT(&g_requestId, 1);
39d9f0492fSopenharmony_ci    EnableInitLog(INIT_INFO);
40d9f0492fSopenharmony_ci
41d9f0492fSopenharmony_ci    PARAM_WORKSPACE_OPS ops = {0};
42d9f0492fSopenharmony_ci    ops.updaterMode = 0;
43d9f0492fSopenharmony_ci    ops.logFunc = InitLog;
44d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
45d9f0492fSopenharmony_ci    ops.setfilecon = NULL;
46d9f0492fSopenharmony_ci#endif
47d9f0492fSopenharmony_ci    InitParamWorkSpace(1, &ops);
48d9f0492fSopenharmony_ci
49d9f0492fSopenharmony_ci    // modify log level
50d9f0492fSopenharmony_ci    char logLevel[2] = {0}; // 2 is set param "persist.init.debug.loglevel" value length.
51d9f0492fSopenharmony_ci    uint32_t len = sizeof(logLevel);
52d9f0492fSopenharmony_ci    int ret = SystemReadParam(INIT_DEBUG_LEVEL, logLevel, &len);
53d9f0492fSopenharmony_ci    if (ret == 0) {
54d9f0492fSopenharmony_ci        errno = 0;
55d9f0492fSopenharmony_ci        int level = atoi(logLevel);
56d9f0492fSopenharmony_ci        if (errno != 0) {
57d9f0492fSopenharmony_ci            return;
58d9f0492fSopenharmony_ci        }
59d9f0492fSopenharmony_ci        SetInitLogLevel((InitLogLevel)level);
60d9f0492fSopenharmony_ci    }
61d9f0492fSopenharmony_ci}
62d9f0492fSopenharmony_ci
63d9f0492fSopenharmony_ci__attribute__((destructor)) static void ParameterDeinit(void)
64d9f0492fSopenharmony_ci{
65d9f0492fSopenharmony_ci    if (g_clientFd != INVALID_SOCKET) {
66d9f0492fSopenharmony_ci        close(g_clientFd);
67d9f0492fSopenharmony_ci        g_clientFd = INVALID_SOCKET;
68d9f0492fSopenharmony_ci    }
69d9f0492fSopenharmony_ci    pthread_mutex_destroy(&g_clientMutex);
70d9f0492fSopenharmony_ci}
71d9f0492fSopenharmony_ci
72d9f0492fSopenharmony_cistatic int ProcessRecvMsg(const ParamMessage *recvMsg)
73d9f0492fSopenharmony_ci{
74d9f0492fSopenharmony_ci    PARAM_LOGV("ProcessRecvMsg type: %u msgId: %u name %s", recvMsg->type, recvMsg->id.msgId, recvMsg->key);
75d9f0492fSopenharmony_ci    int result = PARAM_CODE_INVALID_PARAM;
76d9f0492fSopenharmony_ci    switch (recvMsg->type) {
77d9f0492fSopenharmony_ci        case MSG_SET_PARAM:
78d9f0492fSopenharmony_ci        case MSG_SAVE_PARAM:
79d9f0492fSopenharmony_ci            result = ((ParamResponseMessage *)recvMsg)->result;
80d9f0492fSopenharmony_ci            break;
81d9f0492fSopenharmony_ci        case MSG_NOTIFY_PARAM: {
82d9f0492fSopenharmony_ci            uint32_t offset = 0;
83d9f0492fSopenharmony_ci            ParamMsgContent *valueContent = GetNextContent(recvMsg, &offset);
84d9f0492fSopenharmony_ci            PARAM_CHECK(valueContent != NULL, return PARAM_CODE_TIMEOUT, "Invalid msg");
85d9f0492fSopenharmony_ci            result = 0;
86d9f0492fSopenharmony_ci            break;
87d9f0492fSopenharmony_ci        }
88d9f0492fSopenharmony_ci        default:
89d9f0492fSopenharmony_ci            break;
90d9f0492fSopenharmony_ci    }
91d9f0492fSopenharmony_ci    return result;
92d9f0492fSopenharmony_ci}
93d9f0492fSopenharmony_ci
94d9f0492fSopenharmony_cistatic int ReadMessage(int fd, char *buffer, uint32_t timeout)
95d9f0492fSopenharmony_ci{
96d9f0492fSopenharmony_ci    int ret = 0;
97d9f0492fSopenharmony_ci    uint32_t diff = 0;
98d9f0492fSopenharmony_ci    struct timespec startTime = {0};
99d9f0492fSopenharmony_ci    (void)clock_gettime(CLOCK_MONOTONIC, &startTime);
100d9f0492fSopenharmony_ci    do {
101d9f0492fSopenharmony_ci        ssize_t recvLen = recv(fd, (char *)buffer, RECV_BUFFER_MAX, 0);
102d9f0492fSopenharmony_ci        if (recvLen <= 0) {
103d9f0492fSopenharmony_ci            PARAM_LOGE("ReadMessage failed! errno %d", errno);
104d9f0492fSopenharmony_ci            struct timespec finishTime = {0};
105d9f0492fSopenharmony_ci            (void)clock_gettime(CLOCK_MONOTONIC, &finishTime);
106d9f0492fSopenharmony_ci            diff = IntervalTime(&finishTime, &startTime);
107d9f0492fSopenharmony_ci            if (diff >= timeout) {
108d9f0492fSopenharmony_ci                ret = PARAM_CODE_TIMEOUT;
109d9f0492fSopenharmony_ci                break;
110d9f0492fSopenharmony_ci            }
111d9f0492fSopenharmony_ci            if (errno == EAGAIN || errno == EINTR) {
112d9f0492fSopenharmony_ci                usleep(10*1000); // 10*1000 wait 10ms
113d9f0492fSopenharmony_ci                continue;
114d9f0492fSopenharmony_ci            }
115d9f0492fSopenharmony_ci        }
116d9f0492fSopenharmony_ci
117d9f0492fSopenharmony_ci        if ((size_t)recvLen > sizeof(ParamMessage)) {
118d9f0492fSopenharmony_ci            PARAM_LOGV("recv message len is %d", recvLen);
119d9f0492fSopenharmony_ci            break;
120d9f0492fSopenharmony_ci        }
121d9f0492fSopenharmony_ci    } while (1);
122d9f0492fSopenharmony_ci
123d9f0492fSopenharmony_ci    if (ret != 0) {
124d9f0492fSopenharmony_ci        PARAM_LOGE("ReadMessage errno %d diff %u timeout %d ret %d", errno, diff, timeout, ret);
125d9f0492fSopenharmony_ci    }
126d9f0492fSopenharmony_ci    return ret;
127d9f0492fSopenharmony_ci}
128d9f0492fSopenharmony_ci
129d9f0492fSopenharmony_cistatic int GetClientSocket(int timeout)
130d9f0492fSopenharmony_ci{
131d9f0492fSopenharmony_ci    struct timeval time = {0};
132d9f0492fSopenharmony_ci    time.tv_sec = timeout;
133d9f0492fSopenharmony_ci    time.tv_usec = 0;
134d9f0492fSopenharmony_ci    int clientFd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
135d9f0492fSopenharmony_ci    PARAM_CHECK(clientFd >= 0, return INVALID_SOCKET, "Failed to create socket");
136d9f0492fSopenharmony_ci    int ret = ConnectServer(clientFd, CLIENT_PIPE_NAME);
137d9f0492fSopenharmony_ci    if (ret == 0) {
138d9f0492fSopenharmony_ci        setsockopt(clientFd, SOL_SOCKET, SO_SNDTIMEO, (char *)&time, sizeof(struct timeval));
139d9f0492fSopenharmony_ci        setsockopt(clientFd, SOL_SOCKET, SO_RCVTIMEO, (char *)&time, sizeof(struct timeval));
140d9f0492fSopenharmony_ci    } else {
141d9f0492fSopenharmony_ci        close(clientFd);
142d9f0492fSopenharmony_ci        clientFd = INVALID_SOCKET;
143d9f0492fSopenharmony_ci    }
144d9f0492fSopenharmony_ci    return clientFd;
145d9f0492fSopenharmony_ci}
146d9f0492fSopenharmony_ci
147d9f0492fSopenharmony_cistatic int StartRequest(int clientFd, ParamMessage *request, int timeout)
148d9f0492fSopenharmony_ci{
149d9f0492fSopenharmony_ci    errno = 0;
150d9f0492fSopenharmony_ci    ssize_t sendLen = send(clientFd, (char *)request, request->msgSize, 0);
151d9f0492fSopenharmony_ci    if (errno == EINVAL || errno == EACCES) {
152d9f0492fSopenharmony_ci        PARAM_LOGE("send Message failed!");
153d9f0492fSopenharmony_ci        return PARAM_CODE_IPC_ERROR;
154d9f0492fSopenharmony_ci    }
155d9f0492fSopenharmony_ci    PARAM_CHECK(sendLen >= 0, return PARAM_CODE_IPC_ERROR, "Failed to send message err: %d", errno);
156d9f0492fSopenharmony_ci    PARAM_LOGV("sendMessage sendLen fd %d %zd", clientFd, sendLen);
157d9f0492fSopenharmony_ci    if (timeout <= 0) {
158d9f0492fSopenharmony_ci        return 0;
159d9f0492fSopenharmony_ci    }
160d9f0492fSopenharmony_ci    int ret = ReadMessage(clientFd, (char *)request, timeout);
161d9f0492fSopenharmony_ci    if (ret == 0) {
162d9f0492fSopenharmony_ci        ret = ProcessRecvMsg(request);
163d9f0492fSopenharmony_ci    }
164d9f0492fSopenharmony_ci    return ret;
165d9f0492fSopenharmony_ci}
166d9f0492fSopenharmony_ci
167d9f0492fSopenharmony_cistatic int SystemSetParameter_(const char *name, const char *value, int timeout)
168d9f0492fSopenharmony_ci{
169d9f0492fSopenharmony_ci    PARAM_CHECK(name != NULL && value != NULL, return -1, "Invalid name or value");
170d9f0492fSopenharmony_ci    int ret = CheckParamName(name, 0);
171d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return ret, "Illegal param name %s", name);
172d9f0492fSopenharmony_ci    ret = CheckParamValue(NULL, name, value, GetParamValueType(name));
173d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return ret, "Illegal param value %s", value);
174d9f0492fSopenharmony_ci
175d9f0492fSopenharmony_ci    size_t msgSize = sizeof(ParamMsgContent);
176d9f0492fSopenharmony_ci    msgSize = (msgSize < RECV_BUFFER_MAX) ? RECV_BUFFER_MAX : msgSize;
177d9f0492fSopenharmony_ci
178d9f0492fSopenharmony_ci    ParamMessage *request = (ParamMessage *)CreateParamMessage(MSG_SET_PARAM, name, msgSize);
179d9f0492fSopenharmony_ci    PARAM_CHECK(request != NULL, return PARAM_CODE_ERROR, "Failed to create Param Message");
180d9f0492fSopenharmony_ci    uint32_t offset = 0;
181d9f0492fSopenharmony_ci    ret = FillParamMsgContent(request, &offset, PARAM_VALUE, value, strlen(value));
182d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, free(request);
183d9f0492fSopenharmony_ci        return PARAM_CODE_ERROR, "Failed to fill value");
184d9f0492fSopenharmony_ci    request->msgSize = offset + sizeof(ParamMessage);
185d9f0492fSopenharmony_ci    request->id.msgId = ATOMIC_SYNC_ADD_AND_FETCH(&g_requestId, 1, MEMORY_ORDER_RELAXED);
186d9f0492fSopenharmony_ci
187d9f0492fSopenharmony_ci    pthread_mutex_lock(&g_clientMutex);
188d9f0492fSopenharmony_ci    int retryCount = 0;
189d9f0492fSopenharmony_ci    while (retryCount < 2) { // max retry 2
190d9f0492fSopenharmony_ci        if (g_clientFd == INVALID_SOCKET) {
191d9f0492fSopenharmony_ci            g_clientFd = GetClientSocket(DEFAULT_PARAM_SET_TIMEOUT);
192d9f0492fSopenharmony_ci        }
193d9f0492fSopenharmony_ci
194d9f0492fSopenharmony_ci        if (g_clientFd < 0) {
195d9f0492fSopenharmony_ci            ret = PARAM_CODE_FAIL_CONNECT;
196d9f0492fSopenharmony_ci            PARAM_LOGE("connect param server failed!");
197d9f0492fSopenharmony_ci            break;
198d9f0492fSopenharmony_ci        }
199d9f0492fSopenharmony_ci        ret = StartRequest(g_clientFd, request, timeout);
200d9f0492fSopenharmony_ci        if (ret == PARAM_CODE_IPC_ERROR) {
201d9f0492fSopenharmony_ci            close(g_clientFd);
202d9f0492fSopenharmony_ci            g_clientFd = INVALID_SOCKET;
203d9f0492fSopenharmony_ci            retryCount++;
204d9f0492fSopenharmony_ci        } else {
205d9f0492fSopenharmony_ci            break;
206d9f0492fSopenharmony_ci        }
207d9f0492fSopenharmony_ci    }
208d9f0492fSopenharmony_ci    PARAM_LOGI("SystemSetParameter name %s msgid:%d  ret: %d ", name, request->id.msgId, ret);
209d9f0492fSopenharmony_ci    pthread_mutex_unlock(&g_clientMutex);
210d9f0492fSopenharmony_ci    free(request);
211d9f0492fSopenharmony_ci    return ret;
212d9f0492fSopenharmony_ci}
213d9f0492fSopenharmony_ci
214d9f0492fSopenharmony_ciint SystemSetParameter(const char *name, const char *value)
215d9f0492fSopenharmony_ci{
216d9f0492fSopenharmony_ci    int ret = SystemSetParameter_(name, value, DEFAULT_PARAM_SET_TIMEOUT);
217d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "SystemSetParameter failed! name is :%s, the errNum is:%d", name, ret);
218d9f0492fSopenharmony_ci    return ret;
219d9f0492fSopenharmony_ci}
220d9f0492fSopenharmony_ci
221d9f0492fSopenharmony_ciint SystemSetParameterNoWait(const char *name, const char *value)
222d9f0492fSopenharmony_ci{
223d9f0492fSopenharmony_ci    int ret = SystemSetParameter_(name, value, 0);
224d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "SystemSetParameterNoWait failed! name is:%s, the errNum is:%d", name, ret);
225d9f0492fSopenharmony_ci    return ret;
226d9f0492fSopenharmony_ci}
227d9f0492fSopenharmony_ci
228d9f0492fSopenharmony_ciint SystemSaveParameters(void)
229d9f0492fSopenharmony_ci{
230d9f0492fSopenharmony_ci    const char *name = "persist.all";
231d9f0492fSopenharmony_ci    size_t msgSize = RECV_BUFFER_MAX;
232d9f0492fSopenharmony_ci    uint32_t offset = 0;
233d9f0492fSopenharmony_ci    ParamMessage *request = (ParamMessage *)CreateParamMessage(MSG_SAVE_PARAM, name, msgSize);
234d9f0492fSopenharmony_ci    PARAM_CHECK(request != NULL, return -1, "SystemSaveParameters failed! name is:%s, the errNum is:-1", name);
235d9f0492fSopenharmony_ci    int ret = FillParamMsgContent(request, &offset, PARAM_VALUE, "*", 1);
236d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, free(request);
237d9f0492fSopenharmony_ci        return -1, "SystemSaveParameters failed! the errNum is:-1");
238d9f0492fSopenharmony_ci    int fd = GetClientSocket(DEFAULT_PARAM_WAIT_TIMEOUT);
239d9f0492fSopenharmony_ci    PARAM_CHECK(fd >= 0, free(request);
240d9f0492fSopenharmony_ci        return fd, "SystemSaveParameters failed! the errNum is:%d", ret);
241d9f0492fSopenharmony_ci    request->msgSize = offset + sizeof(ParamMessage);
242d9f0492fSopenharmony_ci    request->id.msgId = ATOMIC_SYNC_ADD_AND_FETCH(&g_requestId, 1, MEMORY_ORDER_RELAXED);
243d9f0492fSopenharmony_ci    ret = StartRequest(fd, request, DEFAULT_PARAM_WAIT_TIMEOUT);
244d9f0492fSopenharmony_ci    close(fd);
245d9f0492fSopenharmony_ci    free(request);
246d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "SystemSaveParameters failed! the errNum is:%d", ret);
247d9f0492fSopenharmony_ci    return ret;
248d9f0492fSopenharmony_ci}
249d9f0492fSopenharmony_ci
250d9f0492fSopenharmony_ciint SystemWaitParameter(const char *name, const char *value, int32_t timeout)
251d9f0492fSopenharmony_ci{
252d9f0492fSopenharmony_ci    PARAM_CHECK(name != NULL, return -1, "SystemWaitParameter failed! name is:%s, the errNum is:-1", name);
253d9f0492fSopenharmony_ci    int ret = CheckParamName(name, 0);
254d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return ret, "SystemWaitParameter failed! name is:%s, the errNum is:%d", name, ret);
255d9f0492fSopenharmony_ci    ret = CheckParamPermission(GetParamSecurityLabel(), name, DAC_READ);
256d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return ret, "SystemWaitParameter failed! name is:%s, the errNum is:%d", name, ret);
257d9f0492fSopenharmony_ci    if (timeout <= 0) {
258d9f0492fSopenharmony_ci        timeout = DEFAULT_PARAM_WAIT_TIMEOUT;
259d9f0492fSopenharmony_ci    }
260d9f0492fSopenharmony_ci    uint32_t msgSize = sizeof(ParamMessage) + sizeof(ParamMsgContent) + sizeof(ParamMsgContent) + sizeof(uint32_t);
261d9f0492fSopenharmony_ci    msgSize = (msgSize < RECV_BUFFER_MAX) ? RECV_BUFFER_MAX : msgSize;
262d9f0492fSopenharmony_ci    uint32_t offset = 0;
263d9f0492fSopenharmony_ci    ParamMessage *request = NULL;
264d9f0492fSopenharmony_ci    if (value != NULL && strlen(value) > 0) {
265d9f0492fSopenharmony_ci        msgSize += PARAM_ALIGN(strlen(value) + 1);
266d9f0492fSopenharmony_ci        request = (ParamMessage *)CreateParamMessage(MSG_WAIT_PARAM, name, msgSize);
267d9f0492fSopenharmony_ci        PARAM_CHECK(request != NULL, return -1, "SystemWaitParameter failed! name is:%s, the errNum is:-1", name);
268d9f0492fSopenharmony_ci        ret = FillParamMsgContent(request, &offset, PARAM_VALUE, value, strlen(value));
269d9f0492fSopenharmony_ci    } else {
270d9f0492fSopenharmony_ci        msgSize += PARAM_ALIGN(1);
271d9f0492fSopenharmony_ci        request = (ParamMessage *)CreateParamMessage(MSG_WAIT_PARAM, name, msgSize);
272d9f0492fSopenharmony_ci        PARAM_CHECK(request != NULL, return -1, "SystemWaitParameter failed! name is:%s, the errNum is:-1", name);
273d9f0492fSopenharmony_ci        ret = FillParamMsgContent(request, &offset, PARAM_VALUE, "*", 1);
274d9f0492fSopenharmony_ci    }
275d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, free(request);
276d9f0492fSopenharmony_ci        return -1, "SystemWaitParameter failed! name is:%s, the errNum is:-1", name);
277d9f0492fSopenharmony_ci    ParamMsgContent *content = (ParamMsgContent *)(request->data + offset);
278d9f0492fSopenharmony_ci    content->type = PARAM_WAIT_TIMEOUT;
279d9f0492fSopenharmony_ci    content->contentSize = sizeof(uint32_t);
280d9f0492fSopenharmony_ci    *((uint32_t *)(content->content)) = timeout;
281d9f0492fSopenharmony_ci    offset += sizeof(ParamMsgContent) + sizeof(uint32_t);
282d9f0492fSopenharmony_ci
283d9f0492fSopenharmony_ci    request->msgSize = offset + sizeof(ParamMessage);
284d9f0492fSopenharmony_ci    request->id.waitId = ATOMIC_SYNC_ADD_AND_FETCH(&g_requestId, 1, MEMORY_ORDER_RELAXED);
285d9f0492fSopenharmony_ci#ifdef STARTUP_INIT_TEST
286d9f0492fSopenharmony_ci    timeout = 1;
287d9f0492fSopenharmony_ci#endif
288d9f0492fSopenharmony_ci    int fd = GetClientSocket(timeout);
289d9f0492fSopenharmony_ci    PARAM_CHECK(fd >= 0, free(request);
290d9f0492fSopenharmony_ci        return fd, "SystemWaitParameter failed! name is:%s, the errNum is:%d", name, ret);
291d9f0492fSopenharmony_ci    ret = StartRequest(fd, request, timeout);
292d9f0492fSopenharmony_ci    close(fd);
293d9f0492fSopenharmony_ci    free(request);
294d9f0492fSopenharmony_ci    PARAM_LOGI("SystemWaitParameter %s value %s result %d ", name, value, ret);
295d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "SystemWaitParameter failed! name is:%s, the errNum is:%d", name, ret);
296d9f0492fSopenharmony_ci    return ret;
297d9f0492fSopenharmony_ci}
298d9f0492fSopenharmony_ci
299d9f0492fSopenharmony_ciint SystemCheckParamExist(const char *name)
300d9f0492fSopenharmony_ci{
301d9f0492fSopenharmony_ci    return SysCheckParamExist(name);
302d9f0492fSopenharmony_ci}
303d9f0492fSopenharmony_ci
304d9f0492fSopenharmony_ciint WatchParamCheck(const char *keyprefix)
305d9f0492fSopenharmony_ci{
306d9f0492fSopenharmony_ci    PARAM_CHECK(keyprefix != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid keyprefix");
307d9f0492fSopenharmony_ci    int ret = CheckParamName(keyprefix, 0);
308d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return ret, "Illegal param name %s", keyprefix);
309d9f0492fSopenharmony_ci    ret = CheckParamPermission(GetParamSecurityLabel(), keyprefix, DAC_WATCH);
310d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return ret, "Forbid to watcher parameter %s", keyprefix);
311d9f0492fSopenharmony_ci    return 0;
312d9f0492fSopenharmony_ci}
313d9f0492fSopenharmony_ci
314d9f0492fSopenharmony_civoid ResetParamSecurityLabel(void)
315d9f0492fSopenharmony_ci{
316d9f0492fSopenharmony_ci#ifdef RESET_CHILD_FOR_VERIFY
317d9f0492fSopenharmony_ci    ParamWorkSpace *paramSpace = GetParamWorkSpace();
318d9f0492fSopenharmony_ci    PARAM_CHECK(paramSpace != NULL, return, "Invalid paramSpace");
319d9f0492fSopenharmony_ci#if !(defined __LITEOS_A__ || defined __LITEOS_M__)
320d9f0492fSopenharmony_ci    paramSpace->securityLabel.cred.pid = getpid();
321d9f0492fSopenharmony_ci    paramSpace->securityLabel.cred.uid = geteuid();
322d9f0492fSopenharmony_ci    paramSpace->securityLabel.cred.gid = getegid();
323d9f0492fSopenharmony_ci    paramSpace->flags |= WORKSPACE_FLAGS_NEED_ACCESS;
324d9f0492fSopenharmony_ci#endif
325d9f0492fSopenharmony_ci#endif
326d9f0492fSopenharmony_ci    PARAM_LOGI("ResetParamSecurityLabel g_clientFd: %d ", g_clientFd);
327d9f0492fSopenharmony_ci    pthread_mutex_lock(&g_clientMutex);
328d9f0492fSopenharmony_ci    if (g_clientFd != INVALID_SOCKET) {
329d9f0492fSopenharmony_ci        close(g_clientFd);
330d9f0492fSopenharmony_ci        g_clientFd = INVALID_SOCKET;
331d9f0492fSopenharmony_ci    }
332d9f0492fSopenharmony_ci    pthread_mutex_unlock(&g_clientMutex);
333d9f0492fSopenharmony_ci}
334