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