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