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 "parameter.h"
17d9f0492fSopenharmony_ci
18d9f0492fSopenharmony_ci#include <stdint.h>
19d9f0492fSopenharmony_ci#include <stdlib.h>
20d9f0492fSopenharmony_ci
21d9f0492fSopenharmony_ci#include "param_comm.h"
22d9f0492fSopenharmony_ci#include "init_param.h"
23d9f0492fSopenharmony_ci#include "param_init.h"
24d9f0492fSopenharmony_ci#include "init_utils.h"
25d9f0492fSopenharmony_ci#include "sysparam_errno.h"
26d9f0492fSopenharmony_ci#include "securec.h"
27d9f0492fSopenharmony_ci#include "beget_ext.h"
28d9f0492fSopenharmony_ci
29d9f0492fSopenharmony_ciint WaitParameter(const char *key, const char *value, int timeout)
30d9f0492fSopenharmony_ci{
31d9f0492fSopenharmony_ci    BEGET_CHECK(!(key == NULL || value == NULL), return EC_INVALID);
32d9f0492fSopenharmony_ci    int ret = SystemWaitParameter(key, value, timeout);
33d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "WaitParameter failed! the errNum is: %d", ret);
34d9f0492fSopenharmony_ci    return GetSystemError(ret);
35d9f0492fSopenharmony_ci}
36d9f0492fSopenharmony_ci
37d9f0492fSopenharmony_ciuint32_t FindParameter(const char *key)
38d9f0492fSopenharmony_ci{
39d9f0492fSopenharmony_ci    BEGET_CHECK(key != NULL, return (uint32_t)(-1));
40d9f0492fSopenharmony_ci    uint32_t handle = 0;
41d9f0492fSopenharmony_ci    int ret = SystemFindParameter(key, &handle);
42d9f0492fSopenharmony_ci    if (ret != 0) {
43d9f0492fSopenharmony_ci        return (uint32_t)(-1);
44d9f0492fSopenharmony_ci    }
45d9f0492fSopenharmony_ci    return handle;
46d9f0492fSopenharmony_ci}
47d9f0492fSopenharmony_ci
48d9f0492fSopenharmony_ciuint32_t GetParameterCommitId(uint32_t handle)
49d9f0492fSopenharmony_ci{
50d9f0492fSopenharmony_ci    uint32_t commitId = 0;
51d9f0492fSopenharmony_ci    int ret = SystemGetParameterCommitId(handle, &commitId);
52d9f0492fSopenharmony_ci    BEGET_CHECK(ret == 0, return (uint32_t)(-1));
53d9f0492fSopenharmony_ci    return commitId;
54d9f0492fSopenharmony_ci}
55d9f0492fSopenharmony_ci
56d9f0492fSopenharmony_ciint GetParameterName(uint32_t handle, char *name, uint32_t len)
57d9f0492fSopenharmony_ci{
58d9f0492fSopenharmony_ci    if (name == NULL) {
59d9f0492fSopenharmony_ci        return EC_INVALID;
60d9f0492fSopenharmony_ci    }
61d9f0492fSopenharmony_ci    int ret = SystemGetParameterName(handle, name, len);
62d9f0492fSopenharmony_ci    if (ret == 0) {
63d9f0492fSopenharmony_ci        return strlen(name);
64d9f0492fSopenharmony_ci    }
65d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "GetParameterName failed! the errNum is: %d", ret);
66d9f0492fSopenharmony_ci    return GetSystemError(ret);
67d9f0492fSopenharmony_ci}
68d9f0492fSopenharmony_ci
69d9f0492fSopenharmony_ciint GetParameterValue(uint32_t handle, char *value, uint32_t len)
70d9f0492fSopenharmony_ci{
71d9f0492fSopenharmony_ci    if (value == NULL) {
72d9f0492fSopenharmony_ci        return EC_INVALID;
73d9f0492fSopenharmony_ci    }
74d9f0492fSopenharmony_ci    uint32_t size = len;
75d9f0492fSopenharmony_ci    int ret = SystemGetParameterValue(handle, value, &size);
76d9f0492fSopenharmony_ci    if (ret == 0) {
77d9f0492fSopenharmony_ci        return strlen(value);
78d9f0492fSopenharmony_ci    }
79d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "GetParameterValue failed! the errNum is: %d", ret);
80d9f0492fSopenharmony_ci    return GetSystemError(ret);
81d9f0492fSopenharmony_ci}
82d9f0492fSopenharmony_ci
83d9f0492fSopenharmony_ciint GetParameter(const char *key, const char *def, char *value, uint32_t len)
84d9f0492fSopenharmony_ci{
85d9f0492fSopenharmony_ci    if ((key == NULL) || (value == NULL)) {
86d9f0492fSopenharmony_ci        return EC_INVALID;
87d9f0492fSopenharmony_ci    }
88d9f0492fSopenharmony_ci    int ret = GetParameter_(key, def, value, len);
89d9f0492fSopenharmony_ci    return (ret != 0) ? ret : strlen(value);
90d9f0492fSopenharmony_ci}
91d9f0492fSopenharmony_ci
92d9f0492fSopenharmony_ciint SetParameter(const char *key, const char *value)
93d9f0492fSopenharmony_ci{
94d9f0492fSopenharmony_ci    if ((key == NULL) || (value == NULL)) {
95d9f0492fSopenharmony_ci        return EC_INVALID;
96d9f0492fSopenharmony_ci    }
97d9f0492fSopenharmony_ci    int ret = SystemSetParameter(key, value);
98d9f0492fSopenharmony_ci    BEGET_CHECK_ONLY_ELOG(ret == 0, "SetParameter failed! the errNum is:%d", ret);
99d9f0492fSopenharmony_ci    return GetSystemError(ret);
100d9f0492fSopenharmony_ci}
101d9f0492fSopenharmony_ci
102d9f0492fSopenharmony_ciint SaveParameters(void)
103d9f0492fSopenharmony_ci{
104d9f0492fSopenharmony_ci    int ret = SystemSaveParameters();
105d9f0492fSopenharmony_ci    return GetSystemError(ret);
106d9f0492fSopenharmony_ci}
107d9f0492fSopenharmony_ci
108d9f0492fSopenharmony_ciconst char *GetDeviceType(void)
109d9f0492fSopenharmony_ci{
110d9f0492fSopenharmony_ci    static const char *productType = NULL;
111d9f0492fSopenharmony_ci    const char *deviceType = GetProperty("const.product.devicetype", &productType);
112d9f0492fSopenharmony_ci    if (deviceType != NULL) {
113d9f0492fSopenharmony_ci        return deviceType;
114d9f0492fSopenharmony_ci    }
115d9f0492fSopenharmony_ci    return GetProperty("const.build.characteristics", &productType);
116d9f0492fSopenharmony_ci}
117d9f0492fSopenharmony_ci
118d9f0492fSopenharmony_ciconst char *GetProductModel(void)
119d9f0492fSopenharmony_ci{
120d9f0492fSopenharmony_ci    return GetProductModel_();
121d9f0492fSopenharmony_ci}
122d9f0492fSopenharmony_ci
123d9f0492fSopenharmony_ciconst char *GetManufacture(void)
124d9f0492fSopenharmony_ci{
125d9f0492fSopenharmony_ci    return GetManufacture_();
126d9f0492fSopenharmony_ci}
127d9f0492fSopenharmony_ci
128d9f0492fSopenharmony_ciconst char *GetBrand(void)
129d9f0492fSopenharmony_ci{
130d9f0492fSopenharmony_ci    static const char *productBrand = NULL;
131d9f0492fSopenharmony_ci    return GetProperty("const.product.brand", &productBrand);
132d9f0492fSopenharmony_ci}
133d9f0492fSopenharmony_ci
134d9f0492fSopenharmony_ciconst char *GetMarketName(void)
135d9f0492fSopenharmony_ci{
136d9f0492fSopenharmony_ci    static const char *marketName = NULL;
137d9f0492fSopenharmony_ci    return GetProperty("const.product.name", &marketName);
138d9f0492fSopenharmony_ci}
139d9f0492fSopenharmony_ci
140d9f0492fSopenharmony_ciconst char *GetProductSeries(void)
141d9f0492fSopenharmony_ci{
142d9f0492fSopenharmony_ci    static const char *productSeries = NULL;
143d9f0492fSopenharmony_ci    return GetProperty("const.build.product", &productSeries);
144d9f0492fSopenharmony_ci}
145d9f0492fSopenharmony_ci
146d9f0492fSopenharmony_ciconst char *GetSoftwareModel(void)
147d9f0492fSopenharmony_ci{
148d9f0492fSopenharmony_ci    static const char *softwareModel = NULL;
149d9f0492fSopenharmony_ci    return GetProperty("const.software.model", &softwareModel);
150d9f0492fSopenharmony_ci}
151d9f0492fSopenharmony_ci
152d9f0492fSopenharmony_ciconst char *GetHardwareModel(void)
153d9f0492fSopenharmony_ci{
154d9f0492fSopenharmony_ci    static const char *hardwareModel = NULL;
155d9f0492fSopenharmony_ci    return GetProperty("const.product.hardwareversion", &hardwareModel);
156d9f0492fSopenharmony_ci}
157d9f0492fSopenharmony_ci
158d9f0492fSopenharmony_ciconst char *GetHardwareProfile(void)
159d9f0492fSopenharmony_ci{
160d9f0492fSopenharmony_ci    static const char *hardwareProfile = NULL;
161d9f0492fSopenharmony_ci    return GetProperty("const.product.hardwareprofile", &hardwareProfile);
162d9f0492fSopenharmony_ci}
163d9f0492fSopenharmony_ci
164d9f0492fSopenharmony_ciconst char *GetAbiList(void)
165d9f0492fSopenharmony_ci{
166d9f0492fSopenharmony_ci    static const char *productAbiList = NULL;
167d9f0492fSopenharmony_ci    return GetProperty("const.product.cpu.abilist", &productAbiList);
168d9f0492fSopenharmony_ci}
169d9f0492fSopenharmony_ci
170d9f0492fSopenharmony_ciconst char *GetBootloaderVersion(void)
171d9f0492fSopenharmony_ci{
172d9f0492fSopenharmony_ci    static const char *productBootloader = NULL;
173d9f0492fSopenharmony_ci    return GetProperty("const.product.bootloader.version", &productBootloader);
174d9f0492fSopenharmony_ci}
175d9f0492fSopenharmony_ci
176d9f0492fSopenharmony_ciint GetFirstApiVersion(void)
177d9f0492fSopenharmony_ci{
178d9f0492fSopenharmony_ci    static const char *firstApiVersion = NULL;
179d9f0492fSopenharmony_ci    GetProperty("const.product.firstapiversion", &firstApiVersion);
180d9f0492fSopenharmony_ci    if (firstApiVersion == NULL) {
181d9f0492fSopenharmony_ci        return 0;
182d9f0492fSopenharmony_ci    }
183d9f0492fSopenharmony_ci    return atoi(firstApiVersion);
184d9f0492fSopenharmony_ci}
185d9f0492fSopenharmony_ci
186d9f0492fSopenharmony_ciconst char *GetDisplayVersion(void)
187d9f0492fSopenharmony_ci{
188d9f0492fSopenharmony_ci    static const char *displayVersion = NULL;
189d9f0492fSopenharmony_ci    return GetProperty("const.product.software.version", &displayVersion);
190d9f0492fSopenharmony_ci}
191d9f0492fSopenharmony_ci
192d9f0492fSopenharmony_ciconst char *GetIncrementalVersion(void)
193d9f0492fSopenharmony_ci{
194d9f0492fSopenharmony_ci    static const char *incrementalVersion = NULL;
195d9f0492fSopenharmony_ci    return GetProperty("const.product.incremental.version", &incrementalVersion);
196d9f0492fSopenharmony_ci}
197d9f0492fSopenharmony_ci
198d9f0492fSopenharmony_ciconst char *GetOsReleaseType(void)
199d9f0492fSopenharmony_ci{
200d9f0492fSopenharmony_ci    static const char *osReleaseType = NULL;
201d9f0492fSopenharmony_ci    return GetProperty("const.ohos.releasetype", &osReleaseType);
202d9f0492fSopenharmony_ci}
203d9f0492fSopenharmony_ci
204d9f0492fSopenharmony_cistatic const char *GetSdkApiVersion_(void)
205d9f0492fSopenharmony_ci{
206d9f0492fSopenharmony_ci    static const char *sdkApiVersion = NULL;
207d9f0492fSopenharmony_ci    return GetProperty("const.ohos.apiversion", &sdkApiVersion);
208d9f0492fSopenharmony_ci}
209d9f0492fSopenharmony_ci
210d9f0492fSopenharmony_ciconst char *GetBuildType(void)
211d9f0492fSopenharmony_ci{
212d9f0492fSopenharmony_ci    static const char *buildType = NULL;
213d9f0492fSopenharmony_ci    return GetProperty("const.product.build.type", &buildType);
214d9f0492fSopenharmony_ci}
215d9f0492fSopenharmony_ci
216d9f0492fSopenharmony_ciconst char *GetBuildUser(void)
217d9f0492fSopenharmony_ci{
218d9f0492fSopenharmony_ci    static const char *buildUser = NULL;
219d9f0492fSopenharmony_ci    return GetProperty("const.product.build.user", &buildUser);
220d9f0492fSopenharmony_ci}
221d9f0492fSopenharmony_ci
222d9f0492fSopenharmony_ciconst char *GetBuildHost(void)
223d9f0492fSopenharmony_ci{
224d9f0492fSopenharmony_ci    static const char *buildHost = NULL;
225d9f0492fSopenharmony_ci    return GetProperty("const.product.build.host", &buildHost);
226d9f0492fSopenharmony_ci}
227d9f0492fSopenharmony_ci
228d9f0492fSopenharmony_ciconst char *GetBuildTime(void)
229d9f0492fSopenharmony_ci{
230d9f0492fSopenharmony_ci    static const char *buildTime = NULL;
231d9f0492fSopenharmony_ci    return GetProperty("const.product.build.date", &buildTime);
232d9f0492fSopenharmony_ci}
233d9f0492fSopenharmony_ci
234d9f0492fSopenharmony_ciconst char *GetSerial(void)
235d9f0492fSopenharmony_ci{
236d9f0492fSopenharmony_ci    return GetSerial_();
237d9f0492fSopenharmony_ci}
238d9f0492fSopenharmony_ci
239d9f0492fSopenharmony_ciint GetDevUdid(char *udid, int size)
240d9f0492fSopenharmony_ci{
241d9f0492fSopenharmony_ci    return GetDevUdid_(udid, size);
242d9f0492fSopenharmony_ci}
243d9f0492fSopenharmony_ci
244d9f0492fSopenharmony_cistatic const char *BuildOSFullName(void)
245d9f0492fSopenharmony_ci{
246d9f0492fSopenharmony_ci    const char release[] = "Release";
247d9f0492fSopenharmony_ci    const char *releaseType = GetOsReleaseType();
248d9f0492fSopenharmony_ci    const char *fullName = GetFullName_();
249d9f0492fSopenharmony_ci    if (fullName == NULL || releaseType == NULL) {
250d9f0492fSopenharmony_ci        return NULL;
251d9f0492fSopenharmony_ci    }
252d9f0492fSopenharmony_ci    if (strncmp(releaseType, release, sizeof(release) - 1) != 0) {
253d9f0492fSopenharmony_ci        char *value = calloc(1, OS_FULL_NAME_LEN);
254d9f0492fSopenharmony_ci        if (value == NULL) {
255d9f0492fSopenharmony_ci            return NULL;
256d9f0492fSopenharmony_ci        }
257d9f0492fSopenharmony_ci        int length = sprintf_s(value, OS_FULL_NAME_LEN, "%s(%s)", fullName, releaseType);
258d9f0492fSopenharmony_ci        if (length < 0) {
259d9f0492fSopenharmony_ci            free(value);
260d9f0492fSopenharmony_ci            return NULL;
261d9f0492fSopenharmony_ci        }
262d9f0492fSopenharmony_ci        return value;
263d9f0492fSopenharmony_ci    }
264d9f0492fSopenharmony_ci    return strdup(fullName);
265d9f0492fSopenharmony_ci}
266d9f0492fSopenharmony_ci
267d9f0492fSopenharmony_ciconst char *GetOSFullName(void)
268d9f0492fSopenharmony_ci{
269d9f0492fSopenharmony_ci    static const char *osFullName = NULL;
270d9f0492fSopenharmony_ci    if (osFullName != NULL) {
271d9f0492fSopenharmony_ci        return osFullName;
272d9f0492fSopenharmony_ci    }
273d9f0492fSopenharmony_ci    osFullName = BuildOSFullName();
274d9f0492fSopenharmony_ci    if (osFullName == NULL) {
275d9f0492fSopenharmony_ci        return EMPTY_STR;
276d9f0492fSopenharmony_ci    }
277d9f0492fSopenharmony_ci    return osFullName;
278d9f0492fSopenharmony_ci}
279d9f0492fSopenharmony_ci
280d9f0492fSopenharmony_cistatic const char *BuildVersionId(void)
281d9f0492fSopenharmony_ci{
282d9f0492fSopenharmony_ci    char value[VERSION_ID_MAX_LEN] = {0};
283d9f0492fSopenharmony_ci    if (GetDeviceType() == NULL) {
284d9f0492fSopenharmony_ci        return NULL;
285d9f0492fSopenharmony_ci    }
286d9f0492fSopenharmony_ci
287d9f0492fSopenharmony_ci    int len = sprintf_s(value, VERSION_ID_MAX_LEN, "%s/%s/%s/%s/%s/%s/%s/%s/%s/%s",
288d9f0492fSopenharmony_ci        GetDeviceType(), GetManufacture(), GetBrand(), GetProductSeries(),
289d9f0492fSopenharmony_ci        GetOSFullName(), GetProductModel(), GetSoftwareModel(),
290d9f0492fSopenharmony_ci        GetSdkApiVersion_(), GetIncrementalVersion(), GetBuildType());
291d9f0492fSopenharmony_ci    if (len <= 0) {
292d9f0492fSopenharmony_ci        return NULL;
293d9f0492fSopenharmony_ci    }
294d9f0492fSopenharmony_ci    const char *versionId = strdup(value);
295d9f0492fSopenharmony_ci    return versionId;
296d9f0492fSopenharmony_ci}
297d9f0492fSopenharmony_ci
298d9f0492fSopenharmony_ciconst char *GetVersionId(void)
299d9f0492fSopenharmony_ci{
300d9f0492fSopenharmony_ci    static const char *ohosVersionId = NULL;
301d9f0492fSopenharmony_ci    if (ohosVersionId != NULL) {
302d9f0492fSopenharmony_ci        return ohosVersionId;
303d9f0492fSopenharmony_ci    }
304d9f0492fSopenharmony_ci    ohosVersionId = BuildVersionId();
305d9f0492fSopenharmony_ci    if (ohosVersionId == NULL) {
306d9f0492fSopenharmony_ci        return EMPTY_STR;
307d9f0492fSopenharmony_ci    }
308d9f0492fSopenharmony_ci    return ohosVersionId;
309d9f0492fSopenharmony_ci}
310d9f0492fSopenharmony_ci
311d9f0492fSopenharmony_ciint GetSdkApiVersion(void)
312d9f0492fSopenharmony_ci{
313d9f0492fSopenharmony_ci    static const char *sdkApiVersion = NULL;
314d9f0492fSopenharmony_ci    GetProperty("const.ohos.apiversion", &sdkApiVersion);
315d9f0492fSopenharmony_ci    if (sdkApiVersion == NULL) {
316d9f0492fSopenharmony_ci        return 0;
317d9f0492fSopenharmony_ci    }
318d9f0492fSopenharmony_ci    return atoi(sdkApiVersion);
319d9f0492fSopenharmony_ci}
320d9f0492fSopenharmony_ci
321d9f0492fSopenharmony_ciconst char *GetSecurityPatchTag(void)
322d9f0492fSopenharmony_ci{
323d9f0492fSopenharmony_ci    static const char *securityPatchTag = NULL;
324d9f0492fSopenharmony_ci    return GetProperty("const.ohos.version.security_patch", &securityPatchTag);
325d9f0492fSopenharmony_ci}
326d9f0492fSopenharmony_ci
327d9f0492fSopenharmony_ciconst char *GetBuildRootHash(void)
328d9f0492fSopenharmony_ci{
329d9f0492fSopenharmony_ci    static const char *buildRootHash = NULL;
330d9f0492fSopenharmony_ci    return GetProperty("const.ohos.buildroothash", &buildRootHash);
331d9f0492fSopenharmony_ci}
332d9f0492fSopenharmony_ci
333d9f0492fSopenharmony_ciint32_t GetIntParameter(const char *key, int32_t def)
334d9f0492fSopenharmony_ci{
335d9f0492fSopenharmony_ci    char value[MAX_INT_LEN] = {0};
336d9f0492fSopenharmony_ci    uint32_t size = sizeof(value);
337d9f0492fSopenharmony_ci    int ret = SystemGetParameter(key, value, &size);
338d9f0492fSopenharmony_ci    if (ret != 0) {
339d9f0492fSopenharmony_ci        return def;
340d9f0492fSopenharmony_ci    }
341d9f0492fSopenharmony_ci
342d9f0492fSopenharmony_ci    long long int result = 0;
343d9f0492fSopenharmony_ci    if (StringToLL(value, &result) != 0) {
344d9f0492fSopenharmony_ci        return def;
345d9f0492fSopenharmony_ci    }
346d9f0492fSopenharmony_ci    if (result <= INT32_MIN || result >= INT32_MAX) {
347d9f0492fSopenharmony_ci        return def;
348d9f0492fSopenharmony_ci    }
349d9f0492fSopenharmony_ci    return (int32_t)result;
350d9f0492fSopenharmony_ci}
351d9f0492fSopenharmony_ci
352d9f0492fSopenharmony_ciuint32_t GetUintParameter(const char *key, uint32_t def)
353d9f0492fSopenharmony_ci{
354d9f0492fSopenharmony_ci    char value[MAX_INT_LEN] = {0};
355d9f0492fSopenharmony_ci    uint32_t size = sizeof(value);
356d9f0492fSopenharmony_ci    int ret = SystemGetParameter(key, value, &size);
357d9f0492fSopenharmony_ci    if (ret != 0) {
358d9f0492fSopenharmony_ci        return def;
359d9f0492fSopenharmony_ci    }
360d9f0492fSopenharmony_ci
361d9f0492fSopenharmony_ci    unsigned long long int result = 0;
362d9f0492fSopenharmony_ci    if (StringToULL(value, &result) != 0) {
363d9f0492fSopenharmony_ci        return def;
364d9f0492fSopenharmony_ci    }
365d9f0492fSopenharmony_ci    if (result >= UINT32_MAX) {
366d9f0492fSopenharmony_ci        return def;
367d9f0492fSopenharmony_ci    }
368d9f0492fSopenharmony_ci    return (uint32_t)result;
369d9f0492fSopenharmony_ci}
370d9f0492fSopenharmony_ci
371d9f0492fSopenharmony_ciconst char *GetDistributionOSName(void)
372d9f0492fSopenharmony_ci{
373d9f0492fSopenharmony_ci    static const char *distributionOsName = NULL;
374d9f0492fSopenharmony_ci    GetProperty("const.product.os.dist.name", &distributionOsName);
375d9f0492fSopenharmony_ci    if (distributionOsName == NULL) {
376d9f0492fSopenharmony_ci        distributionOsName = EMPTY_STR;
377d9f0492fSopenharmony_ci    }
378d9f0492fSopenharmony_ci    return distributionOsName;
379d9f0492fSopenharmony_ci}
380d9f0492fSopenharmony_ci
381d9f0492fSopenharmony_ciconst char *GetDistributionOSVersion(void)
382d9f0492fSopenharmony_ci{
383d9f0492fSopenharmony_ci    static const char *distributionOsVersion = NULL;
384d9f0492fSopenharmony_ci    GetProperty("const.product.os.dist.version", &distributionOsVersion);
385d9f0492fSopenharmony_ci    if (distributionOsVersion == NULL) {
386d9f0492fSopenharmony_ci        distributionOsVersion = GetOSFullName();
387d9f0492fSopenharmony_ci    }
388d9f0492fSopenharmony_ci    return distributionOsVersion;
389d9f0492fSopenharmony_ci}
390d9f0492fSopenharmony_ci
391d9f0492fSopenharmony_ciint GetDistributionOSApiVersion(void)
392d9f0492fSopenharmony_ci{
393d9f0492fSopenharmony_ci    static const char *distributionOsApiVersion = NULL;
394d9f0492fSopenharmony_ci    GetProperty("const.product.os.dist.apiversion", &distributionOsApiVersion);
395d9f0492fSopenharmony_ci    if (distributionOsApiVersion == NULL) {
396d9f0492fSopenharmony_ci        distributionOsApiVersion = GetSdkApiVersion_();
397d9f0492fSopenharmony_ci    }
398d9f0492fSopenharmony_ci    return atoi(distributionOsApiVersion);
399d9f0492fSopenharmony_ci}
400d9f0492fSopenharmony_ciconst char *GetDistributionOSApiName(void)
401d9f0492fSopenharmony_ci{
402d9f0492fSopenharmony_ci    static const char *distributionOsApiName = NULL;
403d9f0492fSopenharmony_ci    GetProperty("const.product.os.dist.apiname", &distributionOsApiName);
404d9f0492fSopenharmony_ci    if (distributionOsApiName == NULL) {
405d9f0492fSopenharmony_ci        distributionOsApiName = EMPTY_STR;
406d9f0492fSopenharmony_ci    }
407d9f0492fSopenharmony_ci    return distributionOsApiName;
408d9f0492fSopenharmony_ci}
409d9f0492fSopenharmony_ci
410d9f0492fSopenharmony_ciconst char *GetDistributionOSReleaseType(void)
411d9f0492fSopenharmony_ci{
412d9f0492fSopenharmony_ci    static const char *distributionOsReleaseType = NULL;
413d9f0492fSopenharmony_ci    GetProperty("const.product.os.dist.releasetype", &distributionOsReleaseType);
414d9f0492fSopenharmony_ci    if (distributionOsReleaseType == NULL) {
415d9f0492fSopenharmony_ci        distributionOsReleaseType = GetOsReleaseType();
416d9f0492fSopenharmony_ci    }
417d9f0492fSopenharmony_ci    return distributionOsReleaseType;
418d9f0492fSopenharmony_ci}
419