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
16d9f0492fSopenharmony_ci#include "param_comm.h"
17d9f0492fSopenharmony_ci
18d9f0492fSopenharmony_ci#include <stdlib.h>
19d9f0492fSopenharmony_ci#include <string.h>
20d9f0492fSopenharmony_ci
21d9f0492fSopenharmony_ci#include "init_param.h"
22d9f0492fSopenharmony_ci#include "parameter.h"
23d9f0492fSopenharmony_ci#include "sysparam_errno.h"
24d9f0492fSopenharmony_ci#include "securec.h"
25d9f0492fSopenharmony_ci#include "beget_ext.h"
26d9f0492fSopenharmony_ci
27d9f0492fSopenharmony_ciINIT_LOCAL_API int GetSystemError(int err)
28d9f0492fSopenharmony_ci{
29d9f0492fSopenharmony_ci    switch (err) {
30d9f0492fSopenharmony_ci        case 0:
31d9f0492fSopenharmony_ci            return 0;
32d9f0492fSopenharmony_ci        case PARAM_CODE_INVALID_PARAM:
33d9f0492fSopenharmony_ci        case PARAM_CODE_INVALID_NAME:
34d9f0492fSopenharmony_ci        case PARAM_CODE_READ_ONLY:
35d9f0492fSopenharmony_ci        case PARAM_WORKSPACE_NOT_INIT:
36d9f0492fSopenharmony_ci        case PARAM_WATCHER_CALLBACK_EXIST:
37d9f0492fSopenharmony_ci        case PARAM_WATCHER_GET_SERVICE_FAILED:
38d9f0492fSopenharmony_ci            return EC_INVALID;
39d9f0492fSopenharmony_ci        case PARAM_CODE_INVALID_VALUE:
40d9f0492fSopenharmony_ci            return SYSPARAM_INVALID_VALUE;
41d9f0492fSopenharmony_ci        case PARAM_CODE_NOT_FOUND:
42d9f0492fSopenharmony_ci        case PARAM_CODE_NODE_EXIST:
43d9f0492fSopenharmony_ci            return SYSPARAM_NOT_FOUND;
44d9f0492fSopenharmony_ci        case DAC_RESULT_FORBIDED:
45d9f0492fSopenharmony_ci        case SELINUX_RESULT_FORBIDED:
46d9f0492fSopenharmony_ci            return SYSPARAM_PERMISSION_DENIED;
47d9f0492fSopenharmony_ci        case PARAM_CODE_REACHED_MAX:
48d9f0492fSopenharmony_ci        case PARAM_CODE_FAIL_CONNECT:
49d9f0492fSopenharmony_ci        case PARAM_CODE_NOT_SUPPORT:
50d9f0492fSopenharmony_ci        case PARAM_CODE_IPC_ERROR:
51d9f0492fSopenharmony_ci        case PARAM_CODE_MEMORY_MAP_FAILED:
52d9f0492fSopenharmony_ci        case PARAM_CODE_MEMORY_NOT_ENOUGH:
53d9f0492fSopenharmony_ci            return SYSPARAM_SYSTEM_ERROR;
54d9f0492fSopenharmony_ci        case PARAM_CODE_TIMEOUT:
55d9f0492fSopenharmony_ci            return SYSPARAM_WAIT_TIMEOUT;
56d9f0492fSopenharmony_ci        default:
57d9f0492fSopenharmony_ci            return SYSPARAM_SYSTEM_ERROR;
58d9f0492fSopenharmony_ci    }
59d9f0492fSopenharmony_ci}
60d9f0492fSopenharmony_ci
61d9f0492fSopenharmony_ciINIT_LOCAL_API int IsValidParamValue(const char *value, uint32_t len)
62d9f0492fSopenharmony_ci{
63d9f0492fSopenharmony_ci    if ((value == NULL) || (strlen(value) + 1 > len)) {
64d9f0492fSopenharmony_ci        return 0;
65d9f0492fSopenharmony_ci    }
66d9f0492fSopenharmony_ci    return 1;
67d9f0492fSopenharmony_ci}
68d9f0492fSopenharmony_ci
69d9f0492fSopenharmony_ciINIT_LOCAL_API int GetParameter_(const char *key, const char *def, char *value, uint32_t len)
70d9f0492fSopenharmony_ci{
71d9f0492fSopenharmony_ci    if ((key == NULL) || (value == NULL) || (len > (uint32_t)PARAM_BUFFER_MAX)) {
72d9f0492fSopenharmony_ci        return EC_INVALID;
73d9f0492fSopenharmony_ci    }
74d9f0492fSopenharmony_ci    uint32_t size = len;
75d9f0492fSopenharmony_ci    int ret = SystemGetParameter(key, NULL, &size);
76d9f0492fSopenharmony_ci    if (ret != 0) {
77d9f0492fSopenharmony_ci        if (def == NULL) {
78d9f0492fSopenharmony_ci            return GetSystemError(ret);
79d9f0492fSopenharmony_ci        }
80d9f0492fSopenharmony_ci        if (strlen(def) > len) {
81d9f0492fSopenharmony_ci            return EC_INVALID;
82d9f0492fSopenharmony_ci        }
83d9f0492fSopenharmony_ci        ret = strcpy_s(value, len, def);
84d9f0492fSopenharmony_ci        return (ret == 0) ? 0 : EC_FAILURE;
85d9f0492fSopenharmony_ci    } else if (size > len) {
86d9f0492fSopenharmony_ci        return EC_INVALID;
87d9f0492fSopenharmony_ci    }
88d9f0492fSopenharmony_ci
89d9f0492fSopenharmony_ci    size = len;
90d9f0492fSopenharmony_ci    ret = SystemGetParameter(key, value, &size);
91d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "GetParameter_ failed! the errNum is: %d", ret);
92d9f0492fSopenharmony_ci    return GetSystemError(ret);
93d9f0492fSopenharmony_ci}
94d9f0492fSopenharmony_ci
95d9f0492fSopenharmony_cistatic PropertyValueProcessor g_propertyGetProcessor = NULL;
96d9f0492fSopenharmony_ci
97d9f0492fSopenharmony_ciINIT_LOCAL_API const char *GetProperty(const char *key, const char **paramHolder)
98d9f0492fSopenharmony_ci{
99d9f0492fSopenharmony_ci    BEGET_CHECK(paramHolder != NULL, return NULL);
100d9f0492fSopenharmony_ci    if (*paramHolder != NULL) {
101d9f0492fSopenharmony_ci        return *paramHolder;
102d9f0492fSopenharmony_ci    }
103d9f0492fSopenharmony_ci    uint32_t len = 0;
104d9f0492fSopenharmony_ci    int ret = SystemGetParameter(key, NULL, &len);
105d9f0492fSopenharmony_ci    if (ret == 0 && len > 0) {
106d9f0492fSopenharmony_ci        char *res = (char *)calloc(1, len + 1);
107d9f0492fSopenharmony_ci        BEGET_CHECK(res != NULL, return NULL);
108d9f0492fSopenharmony_ci        ret = SystemGetParameter(key, res, &len);
109d9f0492fSopenharmony_ci        if (ret != 0) {
110d9f0492fSopenharmony_ci            free(res);
111d9f0492fSopenharmony_ci            return NULL;
112d9f0492fSopenharmony_ci        }
113d9f0492fSopenharmony_ci        if (g_propertyGetProcessor != NULL) {
114d9f0492fSopenharmony_ci            res = g_propertyGetProcessor(key, res);
115d9f0492fSopenharmony_ci        }
116d9f0492fSopenharmony_ci        *paramHolder = res;
117d9f0492fSopenharmony_ci    }
118d9f0492fSopenharmony_ci    return *paramHolder;
119d9f0492fSopenharmony_ci}
120d9f0492fSopenharmony_ci
121d9f0492fSopenharmony_ciINIT_LOCAL_API PropertyValueProcessor SetPropertyGetProcessor(PropertyValueProcessor processor)
122d9f0492fSopenharmony_ci{
123d9f0492fSopenharmony_ci    PropertyValueProcessor prev = g_propertyGetProcessor;
124d9f0492fSopenharmony_ci    g_propertyGetProcessor = processor;
125d9f0492fSopenharmony_ci    return prev;
126d9f0492fSopenharmony_ci}
127d9f0492fSopenharmony_ci
128d9f0492fSopenharmony_ciINIT_LOCAL_API const char *GetProductModel_(void)
129d9f0492fSopenharmony_ci{
130d9f0492fSopenharmony_ci    static const char *productModel = NULL;
131d9f0492fSopenharmony_ci    return GetProperty("const.product.model", &productModel);
132d9f0492fSopenharmony_ci}
133d9f0492fSopenharmony_ci
134d9f0492fSopenharmony_ciINIT_LOCAL_API const char *GetManufacture_(void)
135d9f0492fSopenharmony_ci{
136d9f0492fSopenharmony_ci    static const char *productManufacture = NULL;
137d9f0492fSopenharmony_ci    return GetProperty("const.product.manufacturer", &productManufacture);
138d9f0492fSopenharmony_ci}
139d9f0492fSopenharmony_ci
140d9f0492fSopenharmony_ciINIT_LOCAL_API const char *GetFullName_(void)
141d9f0492fSopenharmony_ci{
142d9f0492fSopenharmony_ci    static const char *fillname = NULL;
143d9f0492fSopenharmony_ci    return GetProperty("const.ohos.fullname", &fillname);
144d9f0492fSopenharmony_ci}
145