diff --git a/interfaces/innerkits/syspara/param_comm.c b/interfaces/innerkits/syspara/param_comm.c index 017708a69bba7492d52b44972d01951db85ae896..8591bc8d5d7cfffac4c761fee3ad45ba5ed94537 100644 --- a/interfaces/innerkits/syspara/param_comm.c +++ b/interfaces/innerkits/syspara/param_comm.c @@ -77,7 +77,7 @@ INIT_LOCAL_API int GetParameter_(const char *key, const char *def, char *value, if (def == NULL) { return GetSystemError(ret); } - if (strlen(def) >= len) { + if (strlen(def) > len) { return EC_INVALID; } ret = strcpy_s(value, len, def); @@ -118,6 +118,41 @@ INIT_LOCAL_API const char *GetProperty(const char *key, const char **paramHolder return *paramHolder; } +#ifndef OHOS_LITE +INIT_LOCAL_API const char *GetPropertyAtomic(const char *key, const char **paramHolder) +{ + BEGET_CHECK(paramHolder != NULL, return NULL); + const char *_Atomic *atomicParam = (const char *_Atomic *)paramHolder; + const char *cached = atomic_load(atomicParam); + if (cached != NULL) { + return cached; + } + + uint32_t len = 0; + int ret = SystemGetParameter(key, NULL, &len); + if (ret == 0 && len > 0) { + char *res = (char *)calloc(1, len + 1); + BEGET_CHECK(res != NULL, return NULL); + + ret = SystemGetParameter(key, res, &len); + if (ret != 0) { + free(res); + return NULL; + } + + if (g_propertyGetProcessor != NULL) { + res = g_propertyGetProcessor(key, res); + } + + const char *expected = NULL; + if (!atomic_compare_exchange_strong(atomicParam, &expected, res)) { + free(res); + } + } + return atomic_load(atomicParam); +} +#endif + INIT_LOCAL_API PropertyValueProcessor SetPropertyGetProcessor(PropertyValueProcessor processor) { PropertyValueProcessor prev = g_propertyGetProcessor; diff --git a/interfaces/innerkits/syspara/param_comm.h b/interfaces/innerkits/syspara/param_comm.h index 2a7b033bf5385cfcc4e22226fe45f08ba3899bbe..305bf78dc8c3c64002c39eaa974c2d3ba9a732e9 100755 --- a/interfaces/innerkits/syspara/param_comm.h +++ b/interfaces/innerkits/syspara/param_comm.h @@ -16,6 +16,7 @@ #ifndef INIT_PARAM_COMM_H #define INIT_PARAM_COMM_H #include +#include #include "beget_ext.h" #ifdef __cplusplus @@ -35,6 +36,9 @@ extern "C" { typedef char *(*PropertyValueProcessor)(const char *key, char *value); INIT_LOCAL_API const char *GetProperty(const char *key, const char **paramHolder); +#ifndef OHOS_LITE +INIT_LOCAL_API const char *GetPropertyAtomic(const char *key, const char **paramHolder); +#endif INIT_LOCAL_API PropertyValueProcessor SetPropertyGetProcessor(PropertyValueProcessor processor); INIT_LOCAL_API int GetParameter_(const char *key, const char *def, char *value, uint32_t len); diff --git a/interfaces/innerkits/syspara/parameter.c b/interfaces/innerkits/syspara/parameter.c index d4d8da6f1b7fe6bf0d8a5c22f887590f9f33dbbb..e6108cf4a4d26dce240a320ccb5fbf53f4184c2f 100644 --- a/interfaces/innerkits/syspara/parameter.c +++ b/interfaces/innerkits/syspara/parameter.c @@ -17,6 +17,7 @@ #include #include +#include #include "param_comm.h" #include "init_param.h" @@ -108,7 +109,15 @@ int SaveParameters(void) const char *GetDeviceType(void) { static const char *productType = NULL; - const char *deviceType = GetProperty("const.product.devicetype", &productType); + const char *deviceType = NULL; +#ifndef OHOS_LITE + deviceType = GetPropertyAtomic("const.product.devicetype", &productType); + if (deviceType != NULL) { + return deviceType; + } + return GetPropertyAtomic("const.build.characteristics", &productType); +#endif + deviceType = GetProperty("const.product.devicetype", &productType); if (deviceType != NULL) { return deviceType; }