param_manager.c 16.2 KB
Newer Older
Z
zhong_ning 已提交
1
/*
M
Mupceet 已提交
2
 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
Z
zhong_ning 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "param_manager.h"
X
xionglei6 已提交
17 18

#include <ctype.h>
M
Mupceet 已提交
19
#include <limits.h>
20

M
Mupceet 已提交
21 22
#include "init_cmds.h"
#include "init_hook.h"
M
Mupceet 已提交
23
#include "param_trie.h"
L
laiguizhong 已提交
24
#include "param_utils.h"
A
an_xinwei 已提交
25
#include "securec.h"
C
cheng_jinsong 已提交
26
static DUMP_PRINTF g_printf = printf;
M
Mupceet 已提交
27 28 29

ParamNode *SystemCheckMatchParamWait(const char *name, const char *value)
{
M
Mupceet 已提交
30 31 32 33
    ParamWorkSpace *paramSpace = GetParamWorkSpace();
    PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
    PARAM_WORKSPACE_CHECK(paramSpace, return NULL, "Invalid space");

A
an_xinwei 已提交
34 35
    WorkSpace *workspace = GetWorkSpace(name);
    PARAM_CHECK(workspace != NULL, return NULL, "Failed to get workspace %s", name);
M
Mupceet 已提交
36 37
    PARAM_LOGV("SystemCheckMatchParamWait name %s", name);
    uint32_t nameLength = strlen(name);
A
an_xinwei 已提交
38
    ParamTrieNode *node = FindTrieNode(workspace, name, nameLength, NULL);
M
Mupceet 已提交
39 40 41
    if (node == NULL || node->dataIndex == 0) {
        return NULL;
    }
A
an_xinwei 已提交
42
    ParamNode *param = (ParamNode *)GetTrieNode(workspace, node->dataIndex);
M
Mupceet 已提交
43 44 45 46 47 48
    if (param == NULL) {
        return NULL;
    }
    if ((param->keyLength != nameLength) || (strncmp(param->data, name, nameLength) != 0)) {  // compare name
        return NULL;
    }
M
Mupceet 已提交
49 50
    ATOMIC_STORE_EXPLICIT(&param->commitId,
        ATOMIC_LOAD_EXPLICIT(&param->commitId, memory_order_relaxed) | PARAM_FLAGS_WAITED, memory_order_release);
M
Mupceet 已提交
51 52 53 54 55 56 57 58 59 60 61
    if ((strncmp(value, "*", 1) == 0) || (strcmp(param->data + nameLength + 1, value) == 0)) { // compare value
        return param;
    }
    char *tmp = strstr(value, "*");
    if (tmp != NULL && (strncmp(param->data + nameLength + 1, value, tmp - value) == 0)) {
        return param;
    }
    return NULL;
}

static int ProcessParamTraversal(const WorkSpace *workSpace, const ParamTrieNode *node, const void *cookie)
Z
zhong_ning 已提交
62
{
S
sun_fan 已提交
63 64 65 66
    ParamTraversalContext *context = (ParamTraversalContext *)cookie;
    ParamTrieNode *current = (ParamTrieNode *)node;
    if (current == NULL) {
        return 0;
Z
zhong_ning 已提交
67
    }
S
sun_fan 已提交
68 69 70
    if (current->dataIndex == 0) {
        return 0;
    }
X
xionglei6 已提交
71 72 73 74
    ParamNode *entry = (ParamNode *)GetTrieNode(workSpace, current->dataIndex);
    if (entry == NULL) {
        return 0;
    }
M
Mupceet 已提交
75
    if ((strcmp("#", context->prefix) != 0) && (strncmp(entry->data, context->prefix, strlen(context->prefix)) != 0)) {
X
xionglei6 已提交
76 77
        return 0;
    }
M
Mupceet 已提交
78 79
    uint32_t index = GetParamHandle(workSpace, current->dataIndex, entry->data);
    context->traversalParamPtr(index, context->context);
Z
zhong_ning 已提交
80 81 82
    return 0;
}

M
Mupceet 已提交
83
int SystemTraversalParameter(const char *prefix, TraversalParamPtr traversalParameter, void *cookie)
Z
zhong_ning 已提交
84
{
M
Mupceet 已提交
85 86 87 88
    ParamWorkSpace *paramSpace = GetParamWorkSpace();
    PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace");
    PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space");
    PARAM_CHECK(traversalParameter != NULL, return -1, "The param is null");
C
cheng_jinsong 已提交
89 90 91 92 93 94 95

#ifdef PARAM_SUPPORT_SELINUX // load security label
    ParamSecurityOps *ops = GetParamSecurityOps(PARAM_SECURITY_SELINUX);
    if (ops != NULL && ops->securityGetLabel != NULL) {
        ops->securityGetLabel(NULL);
    }
#endif
M
Mupceet 已提交
96 97 98 99 100 101 102
    ParamTraversalContext context = {traversalParameter, cookie, "#"};
    if (!(prefix == NULL || strlen(prefix) == 0)) {
        ParamHandle handle = 0;
        // only check for valid parameter
        int ret = ReadParamWithCheck(prefix, DAC_READ, &handle);
        if (ret != PARAM_CODE_NOT_FOUND && ret != 0 && ret != PARAM_CODE_NODE_EXIST) {
            PARAM_CHECK(ret == 0, return ret, "Forbid to traversal parameters");
X
xionglei6 已提交
103
        }
M
Mupceet 已提交
104 105
        context.prefix = (char *)prefix;
    }
M
Mupceet 已提交
106

M
Mupceet 已提交
107
    WorkSpace *workSpace = GetFirstWorkSpace();
M
Mupceet 已提交
108 109 110 111 112 113 114 115 116
    if (workSpace != NULL && strcmp(workSpace->fileName, WORKSPACE_NAME_DAC) == 0) {
        workSpace = GetNextWorkSpace(workSpace);
    }
    while (workSpace != NULL) {
        PARAM_LOGV("SystemTraversalParameter prefix %s in space %s", context.prefix, workSpace->fileName);
        WorkSpace *next = GetNextWorkSpace(workSpace);
        ParamTrieNode *root = NULL;
        if (prefix != NULL && strlen(prefix) != 0) {
            root = FindTrieNode(workSpace, prefix, strlen(prefix), NULL);
X
xionglei6 已提交
117
        }
M
Mupceet 已提交
118 119 120 121
        PARAMSPACE_AREA_RD_LOCK(workSpace);
        TraversalTrieNode(workSpace, root, ProcessParamTraversal, (const void *)&context);
        PARAMSPACE_AREA_RW_UNLOCK(workSpace);
        workSpace = next;
X
xionglei6 已提交
122
    }
M
Mupceet 已提交
123
    return 0;
X
xionglei6 已提交
124 125
}

M
Mupceet 已提交
126
static int DumpTrieDataNodeTraversal(const WorkSpace *workSpace, const ParamTrieNode *node, const void *cookie)
Z
zhong_ning 已提交
127
{
S
sun_fan 已提交
128 129 130 131
    int verbose = *(int *)cookie;
    ParamTrieNode *current = (ParamTrieNode *)node;
    if (current == NULL) {
        return 0;
Z
zhong_ning 已提交
132
    }
S
sun_fan 已提交
133
    if (verbose) {
M
Mupceet 已提交
134
        PARAM_DUMP("\tTrie node info [%u,%u,%u] data: %u label: %u key length:%u \n\t  key: %s \n",
S
sun_fan 已提交
135 136
            current->left, current->right, current->child,
            current->dataIndex, current->labelIndex, current->length, current->key);
Z
zhong_ning 已提交
137
    }
S
sun_fan 已提交
138 139 140
    if (current->dataIndex != 0) {
        ParamNode *entry = (ParamNode *)GetTrieNode(workSpace, current->dataIndex);
        if (entry != NULL) {
M
Mupceet 已提交
141
            PARAM_DUMP("\tparameter length info [%u, %u] \n\t  param: %s \n",
C
codex  
chengjinsong 已提交
142
                entry->keyLength, entry->valueLength, entry->data);
Z
zhong_ning 已提交
143 144
        }
    }
4
411148299@qq.com 已提交
145
    if (current->labelIndex != 0 && verbose) {
M
Mupceet 已提交
146
        ParamSecurityNode *label = (ParamSecurityNode *)GetTrieNode(workSpace, current->labelIndex);
S
sun_fan 已提交
147
        if (label != NULL) {
M
Mupceet 已提交
148
            PARAM_DUMP("\tparameter label dac %u %u %o \n\t  label: %s \n",
S
sun_fan 已提交
149 150
                label->uid, label->gid, label->mode, (label->length > 0) ? label->data : "null");
        }
Z
zhong_ning 已提交
151
    }
S
sun_fan 已提交
152
    return 0;
Z
zhong_ning 已提交
153 154
}

M
Mupceet 已提交
155
static void HashNodeTraverseForDump(WorkSpace *workSpace, int verbose)
Z
zhong_ning 已提交
156
{
M
Mupceet 已提交
157 158
    PARAM_DUMP("    map file: %s \n", workSpace->fileName);
    if (workSpace->area != NULL) {
M
Mupceet 已提交
159 160 161 162 163 164
        PARAM_DUMP("    total size: %u \n", workSpace->area->dataSize);
        PARAM_DUMP("    first offset: %u \n", workSpace->area->firstNode);
        PARAM_DUMP("    current offset: %u \n", workSpace->area->currOffset);
        PARAM_DUMP("    total node: %u \n", workSpace->area->trieNodeCount);
        PARAM_DUMP("    total param node: %u \n", workSpace->area->paramNodeCount);
        PARAM_DUMP("    total security node: %u\n", workSpace->area->securityNodeCount);
165
    }
X
xionglei6 已提交
166
    PARAM_DUMP("    node info: \n");
M
Mupceet 已提交
167 168 169
    PARAMSPACE_AREA_RD_LOCK(workSpace);
    TraversalTrieNode(workSpace, NULL, DumpTrieDataNodeTraversal, (const void *)&verbose);
    PARAMSPACE_AREA_RW_UNLOCK(workSpace);
Z
zhong_ning 已提交
170 171
}

C
cheng_jinsong 已提交
172
void SystemDumpParameters(int verbose, int (*dump)(const char *fmt, ...))
Z
zhong_ning 已提交
173
{
C
cheng_jinsong 已提交
174 175 176 177 178
    if (dump != NULL) {
        g_printf = dump;
    } else {
        g_printf = printf;
    }
M
Mupceet 已提交
179 180 181
    ParamWorkSpace *paramSpace = GetParamWorkSpace();
    PARAM_CHECK(paramSpace != NULL, return, "Invalid paramSpace");
    PARAM_WORKSPACE_CHECK(paramSpace, return, "Invalid space");
M
Mupceet 已提交
182 183 184 185 186 187
    // check default dac
    ParamHandle handle = 0;
    int ret = ReadParamWithCheck("#", DAC_READ, &handle);
    if (ret != PARAM_CODE_NOT_FOUND && ret != 0 && ret != PARAM_CODE_NODE_EXIST) {
        PARAM_CHECK(ret == 0, return, "Forbid to dump parameters");
    }
C
cheng_jinsong 已提交
188 189 190 191 192 193
#ifdef PARAM_SUPPORT_SELINUX // load security label
    ParamSecurityOps *ops = GetParamSecurityOps(PARAM_SECURITY_SELINUX);
    if (ops != NULL && ops->securityGetLabel != NULL) {
        ops->securityGetLabel(NULL);
    }
#endif
W
Wen liumin 已提交
194
    PARAM_DUMP("Dump all parameters begin ...\n");
S
sun_fan 已提交
195
    if (verbose) {
X
xionglei6 已提交
196
        PARAM_DUMP("Local sercurity information\n");
C
cheng_jinsong 已提交
197
        PARAM_DUMP("pid: %d uid: %u gid: %u \n",
M
Mupceet 已提交
198 199 200
            paramSpace->securityLabel.cred.pid,
            paramSpace->securityLabel.cred.uid,
            paramSpace->securityLabel.cred.gid);
M
Mupceet 已提交
201
    }
M
Mupceet 已提交
202
    WorkSpace *workSpace = GetFirstWorkSpace();
M
Mupceet 已提交
203 204 205 206
    while (workSpace != NULL) {
        WorkSpace *next = GetNextWorkSpace(workSpace);
        HashNodeTraverseForDump(workSpace, verbose);
        workSpace = next;
S
sun_fan 已提交
207
    }
W
Wen liumin 已提交
208
    PARAM_DUMP("Dump all parameters finish\n");
Z
zhong_ning 已提交
209
}
M
Mupceet 已提交
210

A
an_xinwei 已提交
211
INIT_LOCAL_API int SysCheckParamExist(const char *name)
M
Mupceet 已提交
212
{
M
Mupceet 已提交
213 214 215
    ParamWorkSpace *paramSpace = GetParamWorkSpace();
    PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace");
    PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space");
M
Mupceet 已提交
216
    PARAM_CHECK(name != NULL, return -1, "The name or handle is null");
M
Mupceet 已提交
217

M
Mupceet 已提交
218
    WorkSpace *workSpace = GetFirstWorkSpace();
M
Mupceet 已提交
219 220 221 222 223 224 225 226 227 228
    while (workSpace != NULL) {
        PARAM_LOGV("SysCheckParamExist name %s in space %s", name, workSpace->fileName);
        WorkSpace *next = GetNextWorkSpace(workSpace);
        ParamTrieNode *node = FindTrieNode(workSpace, name, strlen(name), NULL);
        if (node != NULL && node->dataIndex != 0) {
            return 0;
        } else if (node != NULL) {
            return PARAM_CODE_NODE_EXIST;
        }
        workSpace = next;
M
Mupceet 已提交
229
    }
M
Mupceet 已提交
230
    return PARAM_CODE_NOT_FOUND;
M
Mupceet 已提交
231 232
}

M
Mupceet 已提交
233
INIT_INNER_API int GetParamSecurityAuditData(const char *name, int type, ParamAuditData *auditData)
M
Mupceet 已提交
234
{
M
codex  
Mupceet 已提交
235
    UNUSED(type);
M
Mupceet 已提交
236 237 238
    ParamWorkSpace *paramSpace = GetParamWorkSpace();
    PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace");
    PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space");
M
Mupceet 已提交
239 240 241
    uint32_t labelIndex = 0;
    // get from dac
    WorkSpace *space = GetWorkSpace(WORKSPACE_NAME_DAC);
M
Mupceet 已提交
242
    PARAM_CHECK(space != NULL, return -1, "Invalid workSpace");
M
Mupceet 已提交
243
    FindTrieNode(space, name, strlen(name), &labelIndex);
M
Mupceet 已提交
244
    ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(space, labelIndex);
M
Mupceet 已提交
245 246 247 248 249 250 251
    PARAM_CHECK(node != NULL, return DAC_RESULT_FORBIDED, "Can not get security label %d", labelIndex);

    auditData->name = name;
    auditData->dacData.uid = node->uid;
    auditData->dacData.gid = node->gid;
    auditData->dacData.mode = node->mode;
#ifdef PARAM_SUPPORT_SELINUX
A
an_xinwei 已提交
252 253
    const char *tmpName = (paramSpace->selinuxSpace.getParamLabel != NULL) ?
        paramSpace->selinuxSpace.getParamLabel(name) : NULL;
M
Mupceet 已提交
254 255 256 257
    if (tmpName != NULL) {
        int ret = strcpy_s(auditData->label, sizeof(auditData->label), tmpName);
        PARAM_CHECK(ret == 0, return 0, "Failed to copy label for %s", name);
    }
M
Mupceet 已提交
258 259 260 261
#endif
    return 0;
}

M
Mupceet 已提交
262
static int CreateCtrlInfo(ServiceCtrlInfo **ctrlInfo, const char *cmd, uint32_t offset,
C
codex  
chengjinsong 已提交
263
    uint8_t ctrlParam, const char *format, ...)
M
Mupceet 已提交
264
{
M
Mupceet 已提交
265 266
    *ctrlInfo = calloc(1, sizeof(ServiceCtrlInfo));
    PARAM_CHECK(ctrlInfo != NULL, return -1, "Failed to alloc memory %s", cmd);
M
Mupceet 已提交
267 268
    va_list vargs;
    va_start(vargs, format);
M
Mupceet 已提交
269 270
    int len = vsnprintf_s((*ctrlInfo)->realKey,
        sizeof((*ctrlInfo)->realKey), sizeof((*ctrlInfo)->realKey) - 1, format, vargs);
M
Mupceet 已提交
271
    va_end(vargs);
M
Mupceet 已提交
272 273 274 275 276
    int ret = strcpy_s((*ctrlInfo)->cmdName, sizeof((*ctrlInfo)->cmdName), cmd);
    (*ctrlInfo)->valueOffset = offset;
    if (ret != 0 || len <= 0) {
        free(*ctrlInfo);
        return -1;
M
Mupceet 已提交
277
    }
M
Mupceet 已提交
278 279
    (*ctrlInfo)->ctrlParam = ctrlParam;
    return 0;
M
Mupceet 已提交
280 281
}

C
cheng_jinsong 已提交
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
static int GetServiceCtrlInfoForPowerCtrl(const char *name, const char *value, ServiceCtrlInfo **ctrlInfo)
{
    size_t size = 0;
    const ParamCmdInfo *powerCtrlArg = GetStartupPowerCtl(&size);
    PARAM_CHECK(powerCtrlArg != NULL, return -1, "Invalid ctrlInfo for %s", name);
    uint32_t valueOffset = strlen(OHOS_SERVICE_CTRL_PREFIX) + strlen("reboot") + 1;
    if (strcmp(value, "reboot") == 0) {
        return CreateCtrlInfo(ctrlInfo, "reboot", valueOffset, 1,
            "%s%s.%s", OHOS_SERVICE_CTRL_PREFIX, "reboot", value);
    }
    for (size_t i = 0; i < size; i++) {
        PARAM_LOGV("Get power ctrl %s name %s value %s", powerCtrlArg[i].name, name, value);
        if (strncmp(value, powerCtrlArg[i].name, strlen(powerCtrlArg[i].name)) == 0) {
            valueOffset = strlen(OHOS_SERVICE_CTRL_PREFIX) + strlen(powerCtrlArg[i].replace) + 1;
            return CreateCtrlInfo(ctrlInfo, powerCtrlArg[i].cmd, valueOffset, 1,
                "%s%s.%s", OHOS_SERVICE_CTRL_PREFIX, powerCtrlArg[i].replace, value);
        }
    }
    // not found reboot, so reboot by normal
    valueOffset = strlen(OHOS_SERVICE_CTRL_PREFIX) + strlen("reboot") + 1;
Y
yichengzhao 已提交
302 303
    return CreateCtrlInfo(ctrlInfo, "reboot.other", valueOffset, 1, "%s%s.%s",
        OHOS_SERVICE_CTRL_PREFIX, "reboot", value);
C
cheng_jinsong 已提交
304 305
}

M
Mupceet 已提交
306
INIT_LOCAL_API int GetServiceCtrlInfo(const char *name, const char *value, ServiceCtrlInfo **ctrlInfo)
M
Mupceet 已提交
307
{
M
Mupceet 已提交
308 309 310
    PARAM_CHECK(ctrlInfo != NULL, return -1, "Invalid ctrlInfo %s", name);
    *ctrlInfo = NULL;
    size_t size = 0;
M
Mupceet 已提交
311
    if (strcmp("ohos.startup.powerctrl", name) == 0) {
C
cheng_jinsong 已提交
312
        return GetServiceCtrlInfoForPowerCtrl(name, value, ctrlInfo);
M
Mupceet 已提交
313
    }
M
Mupceet 已提交
314 315
    if (strncmp("ohos.ctl.", name, strlen("ohos.ctl.")) == 0) {
        const ParamCmdInfo *ctrlParam = GetServiceStartCtrl(&size);
C
cheng_jinsong 已提交
316
        PARAM_CHECK(ctrlParam != NULL, return -1, "Invalid ctrlInfo for %s", name);
M
Mupceet 已提交
317 318 319
        for (size_t i = 0; i < size; i++) {
            if (strcmp(name, ctrlParam[i].name) == 0) {
                uint32_t valueOffset = strlen(OHOS_SERVICE_CTRL_PREFIX) + strlen(ctrlParam[i].replace) + 1;
C
cheng_jinsong 已提交
320
                return CreateCtrlInfo(ctrlInfo, ctrlParam[i].cmd, valueOffset, 1,
M
Mupceet 已提交
321 322
                    "%s%s.%s", OHOS_SERVICE_CTRL_PREFIX, ctrlParam[i].replace, value);
            }
M
Mupceet 已提交
323 324
        }
    }
M
Mupceet 已提交
325 326
    if (strncmp("ohos.servicectrl.", name, strlen("ohos.servicectrl.")) == 0) {
        const ParamCmdInfo *installParam = GetServiceCtl(&size);
C
cheng_jinsong 已提交
327
        PARAM_CHECK(installParam != NULL, return -1, "Invalid ctrlInfo for %s", name);
M
Mupceet 已提交
328 329
        for (size_t i = 0; i < size; i++) {
            if (strncmp(name, installParam[i].name, strlen(installParam[i].name)) == 0) {
C
cheng_jinsong 已提交
330
                return CreateCtrlInfo(ctrlInfo, installParam[i].cmd, strlen(name) + 1, 1, "%s.%s", name, value);
M
Mupceet 已提交
331
            }
M
Mupceet 已提交
332 333
        }
    }
M
Mupceet 已提交
334 335 336
    const ParamCmdInfo *other = GetOtherSpecial(&size);
    for (size_t i = 0; i < size; i++) {
        if (strncmp(name, other[i].name, strlen(other[i].name)) == 0) {
C
cheng_jinsong 已提交
337
            return CreateCtrlInfo(ctrlInfo, other[i].cmd, strlen(other[i].name), 0, "%s.%s", name, value);
M
Mupceet 已提交
338 339
        }
    }
M
Mupceet 已提交
340
    return 0;
M
Mupceet 已提交
341 342
}

A
an_xinwei 已提交
343
INIT_LOCAL_API int CheckParameterSet(const char *name,
M
Mupceet 已提交
344 345 346 347 348
    const char *value, const ParamSecurityLabel *srcLabel, int *ctrlService)
{
    ParamWorkSpace *paramSpace = GetParamWorkSpace();
    PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace");
    PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space");
M
Mupceet 已提交
349 350 351 352
    PARAM_LOGV("CheckParameterSet name %s value: %s", name, value);
    PARAM_CHECK(srcLabel != NULL && ctrlService != NULL, return -1, "Invalid param ");
    int ret = CheckParamName(name, 0);
    PARAM_CHECK(ret == 0, return ret, "Illegal param name %s", name);
M
Mupceet 已提交
353
    ret = CheckParamValue(NULL, name, value, GetParamValueType(name));
M
Mupceet 已提交
354 355 356
    PARAM_CHECK(ret == 0, return ret, "Illegal param value %s", value);
    *ctrlService = 0;

M
Mupceet 已提交
357 358 359 360 361
    ServiceCtrlInfo *serviceInfo = NULL;
    GetServiceCtrlInfo(name, value, &serviceInfo);
    ret = CheckParamPermission(srcLabel, (serviceInfo == NULL) ? name : serviceInfo->realKey, DAC_WRITE);
    if (ret == 0) {
        if (serviceInfo == NULL) {
M
Mupceet 已提交
362 363
            return 0;
        }
M
Mupceet 已提交
364 365 366 367 368
        if (serviceInfo->ctrlParam != 0) {  // ctrl param
            *ctrlService |= PARAM_CTRL_SERVICE;
        }
#if !(defined __LITEOS_A__ || defined __LITEOS_M__)
        // do hook cmd
C
fix log  
cheng_jinsong 已提交
369
        PARAM_LOGV("Check parameter settings realKey %s cmd: '%s' value: %s",
M
Mupceet 已提交
370 371
            serviceInfo->realKey, serviceInfo->cmdName, (char *)serviceInfo->realKey + serviceInfo->valueOffset);
        DoCmdByName(serviceInfo->cmdName, (char *)serviceInfo->realKey + serviceInfo->valueOffset);
M
Mupceet 已提交
372 373
#endif
    }
M
Mupceet 已提交
374 375
    if (serviceInfo != NULL) {
        free(serviceInfo);
M
Mupceet 已提交
376 377 378
    }
    return ret;
}
A
an_xinwei 已提交
379 380 381 382 383 384

int SystemGetParameterName(ParamHandle handle, char *name, unsigned int len)
{
    PARAM_CHECK(name != NULL && handle != 0, return -1, "The name is null");
    return ReadParamName(handle, name, len);
}