From 3357425919a2b6f0045ff8f189b722a2790bbe40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=81=A5?= Date: Tue, 3 Jun 2025 11:43:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9const=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孙健 --- .../innerkits/include/param/init_param.h | 8 +++ .../innerkits/libbegetutil.versionscript | 1 + services/param/linux/param_message.h | 1 + services/param/linux/param_request.c | 57 +++++++++++++++++++ services/param/linux/param_service.c | 44 ++++++++++++++ services/param/manager/param_manager.c | 9 ++- test/unittest/syspara/syspara_unittest.cpp | 15 +++++ 7 files changed, 133 insertions(+), 2 deletions(-) diff --git a/interfaces/innerkits/include/param/init_param.h b/interfaces/innerkits/include/param/init_param.h index de5fe5abf..c60b6bb67 100644 --- a/interfaces/innerkits/include/param/init_param.h +++ b/interfaces/innerkits/include/param/init_param.h @@ -72,6 +72,7 @@ typedef enum { #define LOAD_PARAM_NORMAL 0x00 #define LOAD_PARAM_ONLY_ADD 0x01 #define LOAD_PARAM_PERSIST 0x02 +#define LOAD_PARAM_UPDATE_CONST 0x04 typedef uint32_t ParamHandle; @@ -172,6 +173,13 @@ void SystemDumpTriggers(int verbose, int (*dump)(const char *fmt, ...)); */ int SystemSetParameter(const char *name, const char *value); +/** + * 对外接口 + * 更新只读参数,主要用于其他进程使用,通过管道更新只读参数。 + * + */ +int SystemUpdateConstParameter(const char *name, const char *value); + /** * 对外接口 * 保存共享内存中的所有持久化参数 diff --git a/interfaces/innerkits/libbegetutil.versionscript b/interfaces/innerkits/libbegetutil.versionscript index 2654833e4..3b24f5814 100644 --- a/interfaces/innerkits/libbegetutil.versionscript +++ b/interfaces/innerkits/libbegetutil.versionscript @@ -132,6 +132,7 @@ *GetIntParameter*; *GetDeviceType*; *GetParameter*; + *UpdateConstParameter*; *GetUintParameter*; *SetParameter*; *GetBoolParameter*; diff --git a/services/param/linux/param_message.h b/services/param/linux/param_message.h index 706129bb2..0da672f98 100755 --- a/services/param/linux/param_message.h +++ b/services/param/linux/param_message.h @@ -36,6 +36,7 @@ typedef enum { MSG_ADD_WATCHER, MSG_DEL_WATCHER, MSG_NOTIFY_PARAM, + MSG_UPDATE_CONST_PARAM, MSG_SAVE_PARAM } ParamMsgType; diff --git a/services/param/linux/param_request.c b/services/param/linux/param_request.c index 97f834a89..c6fd4bf9e 100644 --- a/services/param/linux/param_request.c +++ b/services/param/linux/param_request.c @@ -75,6 +75,7 @@ static int ProcessRecvMsg(const ParamMessage *recvMsg) int result = PARAM_CODE_INVALID_PARAM; switch (recvMsg->type) { case MSG_SET_PARAM: + case MSG_UPDATE_CONST_PARAM: case MSG_SAVE_PARAM: result = ((ParamResponseMessage *)recvMsg)->result; break; @@ -218,6 +219,62 @@ int SystemSetParameter(const char *name, const char *value) return ret; } +static int SystemUpdateConstParameter_(const char *name, const char *value, int timeout) +{ + PARAM_LOGV("SystemUpdateConstParameter_ start"); + PARAM_CHECK(name != NULL && value != NULL, return -1, "Invalid name or value"); + int ret = CheckParamName(name, 0); + PARAM_CHECK(ret == 0, return ret, "Illegal param name %s", name); + PARAM_CHECK(IS_READY_ONLY(name), return PARAM_CODE_INVALID_NAME, "only update read only param: %s", name); + ret = CheckParamValue(NULL, name, value, GetParamValueType(name)); + PARAM_CHECK(ret == 0, return ret, "Illegal param value %s", value); + + size_t msgSize = sizeof(ParamMsgContent); + msgSize = (msgSize < RECV_BUFFER_MAX) ? RECV_BUFFER_MAX : msgSize; + + ParamMessage *request = (ParamMessage *)CreateParamMessage(MSG_UPDATE_CONST_PARAM, name, msgSize); + PARAM_CHECK(request != NULL, return PARAM_CODE_ERROR, "Failed to create Param Message"); + uint32_t offset = 0; + ret = FillParamMsgContent(request, &offset, PARAM_VALUE, value, strlen(value)); + PARAM_CHECK(ret == 0, free(request); + return PARAM_CODE_ERROR, "Failed to fill value"); + request->msgSize = offset + sizeof(ParamMessage); + request->id.msgId = ATOMIC_SYNC_ADD_AND_FETCH(&g_requestId, 1, MEMORY_ORDER_RELAXED); + + pthread_mutex_lock(&g_clientMutex); + int retryCount = 0; + while (retryCount < 2) { // max retry 2 + if (g_clientFd == INVALID_SOCKET) { + g_clientFd = GetClientSocket(DEFAULT_PARAM_SET_TIMEOUT); + } + + if (g_clientFd < 0) { + ret = PARAM_CODE_FAIL_CONNECT; + PARAM_LOGE("connect param server failed!"); + break; + } + ret = StartRequest(g_clientFd, request, timeout); + if (ret == PARAM_CODE_IPC_ERROR) { + close(g_clientFd); + g_clientFd = INVALID_SOCKET; + retryCount++; + } else { + break; + } + } + PARAM_LOGI("SystemUpdateConstParameter name %s id:%d ret:%d ", name, request->id.msgId, ret); + pthread_mutex_unlock(&g_clientMutex); + free(request); + return ret; +} + +int SystemUpdateConstParameter(const char *name, const char *value) +{ + int ret = SystemUpdateConstParameter_(name, value, DEFAULT_PARAM_SET_TIMEOUT); + BEGET_CHECK_ONLY_ELOG(ret == 0, "SystemUpdateConstParameter failed! name is :%s, the errNum is:%d", name, ret); + return ret; +} + int SystemSetParameterNoWait(const char *name, const char *value) { int ret = SystemSetParameter_(name, value, 0); diff --git a/services/param/linux/param_service.c b/services/param/linux/param_service.c index 624c35827..e4769432f 100755 --- a/services/param/linux/param_service.c +++ b/services/param/linux/param_service.c @@ -158,6 +158,47 @@ static int SystemSetParam(const char *name, const char *value, const ParamSecuri return ret; } +static int SystemUpdateConstParam(const char *name, const char *value, const ParamSecurityLabel *srcLabel) +{ + PARAM_LOGV("SystemUpdateConstParam name %s value: %s", name, value); + int ctrlService = 0; + int ret = CheckParameterSet(name, value, srcLabel, &ctrlService); + PARAM_CHECK(ret == 0, return ret, "Forbid to set parameter %s", name); + PARAM_CHECK(IS_READY_ONLY(name), return PARAM_CODE_INVALID_NAME, "only update read only param: %s", name); + if ((ctrlService & PARAM_CTRL_SERVICE) != PARAM_CTRL_SERVICE) { // ctrl param + uint32_t dataIndex = 0; + ret = WriteParam(name, value, &dataIndex, LOAD_PARAM_UPDATE_CONST); + PARAM_CHECK(ret == 0, return ret, "Failed to set param %d name %s %s", ret, name, value); + CheckAndSendTrigger(dataIndex, name, value); + } + return ret; +} + +static int HandleConstParamUpdate(const ParamTaskPtr worker, const ParamMessage *msg) +{ + PARAM_LOGV("HandleConstParanmUpdate start"); + uint32_t offset = 0; + ParamMsgContent *valueContent = GetNextContent(msg, &offset); + PARAM_CHECK(valueContent != NULL, return -1, "Invalid msg for %s", msg->key); + ParamSecurityLabel srcLabel = {0}; + struct ucred cr = {-1, -1, -1}; + socklen_t crSize = sizeof(cr); + if (getsockopt(LE_GetSocketFd(worker), SOL_SOCKET, SO_PEERCRED, &cr, &crSize) < 0) { + PARAM_LOGE("Failed to get opt %d", errno); +#ifndef STARTUP_INIT_TEST + return SendResponseMsg(worker, msg, -1); +#endif + } + srcLabel.sockFd = LE_GetSocketFd(worker); + srcLabel.cred.uid = cr.uid; + srcLabel.cred.pid = cr.pid; + srcLabel.cred.gid = cr.gid; + PARAM_LOGI("Handle set param msgId %d pid %d key: %s", msg->id.msgId, cr.pid, msg->key); + int ret = SystemUpdateConstParam(msg->key, valueContent->content, &srcLabel); + return SendResponseMsg(worker, msg, ret); +} + + static int HandleParamSet(const ParamTaskPtr worker, const ParamMessage *msg) { uint32_t offset = 0; @@ -351,6 +392,9 @@ PARAM_STATIC int ProcessMessage(const ParamTaskPtr worker, const ParamMessage *m case MSG_SAVE_PARAM: ret = HandleParamSave(worker, msg); break; + case MSG_UPDATE_CONST_PARAM: + ret = HandleConstParamUpdate(worker, msg); + break; default: break; } diff --git a/services/param/manager/param_manager.c b/services/param/manager/param_manager.c index 31c3377de..b0abe4cd5 100644 --- a/services/param/manager/param_manager.c +++ b/services/param/manager/param_manager.c @@ -456,7 +456,8 @@ static int UpdateParam(const WorkSpace *workSpace, uint32_t *dataIndex, const ch uint32_t valueLen = strlen(value); uint32_t commitId = ATOMIC_LOAD_EXPLICIT(&entry->commitId, MEMORY_ORDER_RELAXED); ATOMIC_STORE_EXPLICIT(&entry->commitId, commitId | PARAM_FLAGS_MODIFY, MEMORY_ORDER_RELAXED); - if (entry->valueLength < PARAM_VALUE_LEN_MAX && valueLen < PARAM_VALUE_LEN_MAX) { + if ((entry->valueLength < PARAM_VALUE_LEN_MAX && valueLen < PARAM_VALUE_LEN_MAX) || + ((mode & LOAD_PARAM_UPDATE_CONST) == LOAD_PARAM_UPDATE_CONST)) { int ret = PARAM_MEMCPY(entry->data + entry->keyLength + 1, PARAM_VALUE_LEN_MAX, value, valueLen + 1); PARAM_CHECK(ret == 0, return PARAM_CODE_INVALID_VALUE, "Failed to copy value"); entry->valueLength = valueLen; @@ -509,7 +510,11 @@ INIT_LOCAL_API int WriteParam(const char *name, const char *value, uint32_t *dat PARAM_CHECK(entry != NULL, return PARAM_CODE_REACHED_MAX, "Failed to update param value %s %u", name, node->dataIndex); // use save type to check value - ret = CheckParamValue(node, name, value, entry->type); + if ((mode & LOAD_PARAM_UPDATE_CONST) == LOAD_PARAM_UPDATE_CONST) { + ret = CheckParamValue(NULL, name, value, entry->type); + } else { + ret = CheckParamValue(node, name, value, entry->type); + } PARAM_CHECK(ret == 0, return ret, "Invalid param value param: %s=%s", name, value); PARAMSPACE_AREA_RW_LOCK(workSpace); ret = UpdateParam(workSpace, &node->dataIndex, name, value, mode); diff --git a/test/unittest/syspara/syspara_unittest.cpp b/test/unittest/syspara/syspara_unittest.cpp index feb20ce33..9e2cba00a 100644 --- a/test/unittest/syspara/syspara_unittest.cpp +++ b/test/unittest/syspara/syspara_unittest.cpp @@ -468,4 +468,19 @@ HWTEST_F(SysparaUnitTest, parameterTest0018, TestSize.Level0) ret = SaveParameters(); EXPECT_EQ(ret, 0); } + +HWTEST_F(SysparaUnitTest, parameterTest0019, TestSize.Level0) +{ + char key1[] = "const.test.for_update_test1"; + char value1[] = "initSet"; + char value2[] = "initUpdate"; + int ret = SystemUpdateConstParameter(key1, value1); + EXPECT_EQ(ret, 0); + ret = SystemUpdateConstParameter(key1, value2); + EXPECT_EQ(ret, 0); + + char key2[] = "persist.cota.update.opkey.version.enable"; + ret = SystemUpdateConstParameter(key2, value1); + EXPECT_EQ(ret, PARAM_CODE_INVALID_NAME); +} } // namespace OHOS -- Gitee