1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "param_comm.h"
17 
18 #include <stdlib.h>
19 #include <string.h>
20 
21 #include "init_param.h"
22 #include "parameter.h"
23 #include "sysparam_errno.h"
24 #include "securec.h"
25 #include "beget_ext.h"
26 
GetSystemError(int err)27 INIT_LOCAL_API int GetSystemError(int err)
28 {
29     switch (err) {
30         case 0:
31             return 0;
32         case PARAM_CODE_INVALID_PARAM:
33         case PARAM_CODE_INVALID_NAME:
34         case PARAM_CODE_READ_ONLY:
35         case PARAM_WORKSPACE_NOT_INIT:
36         case PARAM_WATCHER_CALLBACK_EXIST:
37         case PARAM_WATCHER_GET_SERVICE_FAILED:
38             return EC_INVALID;
39         case PARAM_CODE_INVALID_VALUE:
40             return SYSPARAM_INVALID_VALUE;
41         case PARAM_CODE_NOT_FOUND:
42         case PARAM_CODE_NODE_EXIST:
43             return SYSPARAM_NOT_FOUND;
44         case DAC_RESULT_FORBIDED:
45         case SELINUX_RESULT_FORBIDED:
46             return SYSPARAM_PERMISSION_DENIED;
47         case PARAM_CODE_REACHED_MAX:
48         case PARAM_CODE_FAIL_CONNECT:
49         case PARAM_CODE_NOT_SUPPORT:
50         case PARAM_CODE_IPC_ERROR:
51         case PARAM_CODE_MEMORY_MAP_FAILED:
52         case PARAM_CODE_MEMORY_NOT_ENOUGH:
53             return SYSPARAM_SYSTEM_ERROR;
54         case PARAM_CODE_TIMEOUT:
55             return SYSPARAM_WAIT_TIMEOUT;
56         default:
57             return SYSPARAM_SYSTEM_ERROR;
58     }
59 }
60 
IsValidParamValue(const char * value,uint32_t len)61 INIT_LOCAL_API int IsValidParamValue(const char *value, uint32_t len)
62 {
63     if ((value == NULL) || (strlen(value) + 1 > len)) {
64         return 0;
65     }
66     return 1;
67 }
68 
GetParameter_(const char * key,const char * def,char * value,uint32_t len)69 INIT_LOCAL_API int GetParameter_(const char *key, const char *def, char *value, uint32_t len)
70 {
71     if ((key == NULL) || (value == NULL) || (len > (uint32_t)PARAM_BUFFER_MAX)) {
72         return EC_INVALID;
73     }
74     uint32_t size = len;
75     int ret = SystemGetParameter(key, NULL, &size);
76     if (ret != 0) {
77         if (def == NULL) {
78             return GetSystemError(ret);
79         }
80         if (strlen(def) > len) {
81             return EC_INVALID;
82         }
83         ret = strcpy_s(value, len, def);
84         return (ret == 0) ? 0 : EC_FAILURE;
85     } else if (size > len) {
86         return EC_INVALID;
87     }
88 
89     size = len;
90     ret = SystemGetParameter(key, value, &size);
91     BEGET_CHECK_ONLY_ELOG(ret == 0, "GetParameter_ failed! the errNum is: %d", ret);
92     return GetSystemError(ret);
93 }
94 
95 static PropertyValueProcessor g_propertyGetProcessor = NULL;
96 
GetProperty(const char * key,const char ** paramHolder)97 INIT_LOCAL_API const char *GetProperty(const char *key, const char **paramHolder)
98 {
99     BEGET_CHECK(paramHolder != NULL, return NULL);
100     if (*paramHolder != NULL) {
101         return *paramHolder;
102     }
103     uint32_t len = 0;
104     int ret = SystemGetParameter(key, NULL, &len);
105     if (ret == 0 && len > 0) {
106         char *res = (char *)calloc(1, len + 1);
107         BEGET_CHECK(res != NULL, return NULL);
108         ret = SystemGetParameter(key, res, &len);
109         if (ret != 0) {
110             free(res);
111             return NULL;
112         }
113         if (g_propertyGetProcessor != NULL) {
114             res = g_propertyGetProcessor(key, res);
115         }
116         *paramHolder = res;
117     }
118     return *paramHolder;
119 }
120 
SetPropertyGetProcessor(PropertyValueProcessor processor)121 INIT_LOCAL_API PropertyValueProcessor SetPropertyGetProcessor(PropertyValueProcessor processor)
122 {
123     PropertyValueProcessor prev = g_propertyGetProcessor;
124     g_propertyGetProcessor = processor;
125     return prev;
126 }
127 
GetProductModel_(void)128 INIT_LOCAL_API const char *GetProductModel_(void)
129 {
130     static const char *productModel = NULL;
131     return GetProperty("const.product.model", &productModel);
132 }
133 
GetProductModelAlias_(void)134 INIT_LOCAL_API const char *GetProductModelAlias_(void)
135 {
136     static const char *productModelAlias = NULL;
137     const char *result = GetProperty("const.product.model_alias", &productModelAlias);
138     if (result == NULL) {
139         return GetProperty("const.product.model", &productModelAlias);
140     }
141     return result;
142 }
143 
GetManufacture_(void)144 INIT_LOCAL_API const char *GetManufacture_(void)
145 {
146     static const char *productManufacture = NULL;
147     return GetProperty("const.product.manufacturer", &productManufacture);
148 }
149 
GetFullName_(void)150 INIT_LOCAL_API const char *GetFullName_(void)
151 {
152     static const char *fillname = NULL;
153     return GetProperty("const.ohos.fullname", &fillname);
154 }
155