未验证 提交 004e68b5 编写于 作者: O openharmony_ci 提交者: Gitee

!778 拆分param

Merge pull request !778 from Mupceet/initbase
......@@ -40,17 +40,16 @@
"//base/startup/init_lite/ueventd:startup_ueventd",
"//base/startup/init_lite/watchdog:watchdog",
"//base/startup/init_lite/services/begetctl:begetctl_cmd",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/modules:modules",
"//base/startup/init_lite/services/param:parameter",
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//base/startup/init_lite/interfaces/innerkits:libbeget_proxy",
"//base/startup/init_lite/interfaces/innerkits/file:libfile",
"//base/startup/init_lite/interfaces/innerkits/socket:libsocket",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/interfaces/innerkits/init_module_engine:init_module_engine",
"//base/startup/init_lite/device_info:device_info_group",
"//base/startup/init_lite/interfaces/innerkits/sandbox:libsandbox",
"//base/startup/init_lite/test/exec_test:exectest",
"//base/startup/init_lite/interfaces/innerkits/control_fd:libcontrolfd",
"//base/startup/init_lite/interfaces/kits:kitsgroup"
],
"inner_kits": [
......
......@@ -25,7 +25,9 @@ config("exported_header_files") {
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/interfaces/innerkits/include/syspara",
"//base/startup/init_lite/interfaces/innerkits/include/fs_manager",
"//base/startup/init_lite/interfaces/innerkits/include/token",
"//base/startup/init_lite/interfaces/innerkits/include/sandbox/include",
]
}
......@@ -49,14 +51,25 @@ if (defined(ohos_lite)) {
if (ohos_kernel_type == "liteos_a" || ohos_kernel_type == "linux") {
shared_library("libbegetutil") {
sources = [ "//base/startup/init_lite/services/log/init_log.c" ]
cflags = [ "-fPIC" ]
defines = [
"_GNU_SOURCE",
"INIT_LOG_INIT=3",
"OHOS_LITE",
"USE_MBEDTLS",
]
deps = []
sources = []
include_dirs = include_common
public_configs = [ ":exported_header_files" ]
deps = [
"//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
"//third_party/bounds_checking_function:libsec_shared",
"//third_party/mbedtls:mbedtls_shared",
]
deps += [
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/services/param/base:parameterbase",
"//base/startup/init_lite/services/utils:libinit_utils",
]
if (enable_ohos_startup_init_feature_begetctl_liteos) {
sources += syspara_sources
defines += [ "LITEOS_SUPPORT" ]
......@@ -64,35 +77,26 @@ if (defined(ohos_lite)) {
} else {
sources += [ "syscap/init_syscap.c" ]
}
public_configs = [ ":exported_header_files" ]
cflags = [ "-fPIC" ]
deps += [
"//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
"//base/startup/init_lite/services/utils:libinit_tools",
"//third_party/bounds_checking_function:libsec_shared",
"//third_party/mbedtls:mbedtls",
]
defines += [ "USE_MBEDTLS" ]
deps += [ "//base/startup/init_lite/services/param:param_client" ]
if (ohos_kernel_type == "liteos_a") {
defines += [ "__LITEOS_A__" ]
deps += [
"//base/startup/init_lite/services/param/liteos:param_client_lite",
]
} else if (ohos_kernel_type == "linux") {
sources += [ "socket/init_socket.c" ]
defines += [ "__LINUX__" ]
deps += [ "//base/startup/init_lite/services/loopevent:loopevent" ]
deps += [
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param/linux:param_client",
]
}
}
}
if (ohos_kernel_type == "liteos_m") {
static_library("libbegetutil") {
sources = [ "//base/startup/init_lite/services/log/init_log.c" ]
public_configs = [ ":exported_header_files" ]
defines = [
"_GNU_SOURCE",
"INIT_LOG_INIT=3",
"OHOS_LITE",
"__LITEOS_M__",
]
......@@ -100,7 +104,6 @@ if (defined(ohos_lite)) {
include_dirs = include_common
deps = [
"//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_static",
"//base/startup/init_lite/services/utils:libinit_tools",
"//third_party/bounds_checking_function:libsec_static",
]
......@@ -116,7 +119,11 @@ if (defined(ohos_lite)) {
deps += [ "//third_party/mbedtls:mbedtls" ]
defines += [ "USE_MBEDTLS" ]
}
deps += [ "//base/startup/init_lite/services/param:param_client" ]
deps += [
"//base/startup/init_lite/services/param/base:parameterbase",
"//base/startup/init_lite/services/param/liteos:param_client_lite",
"//base/startup/init_lite/services/utils:libinit_utils",
]
}
}
......@@ -134,12 +141,6 @@ if (defined(ohos_lite)) {
}
} else {
import("//build/ohos.gni")
fs_manager_sources = [
"fs_manager/fstab.c",
"fs_manager/fstab_mount.c",
]
modulemgr_sources = [
"hookmgr/hookmgr.c",
"modulemgr/modulemgr.c",
......@@ -147,15 +148,9 @@ if (defined(ohos_lite)) {
ohos_shared_library("libbegetutil") {
sources = [
"//base/startup/init_lite/services/log/init_log.c",
"fd_holder/fd_holder.c",
"fd_holder/fd_holder_internal.c",
"file/init_file.c",
"reboot/init_reboot_innerkits.c",
"service_control/service_control.c",
"socket/init_socket.c",
]
sources += fs_manager_sources
sources += syspara_sources
sources += [ "syspara/param_wrapper.cpp" ]
sources += modulemgr_sources
......@@ -164,6 +159,7 @@ if (defined(ohos_lite)) {
"INIT_AGENT",
"INIT_FILE",
"_GNU_SOURCE",
"USE_MBEDTLS",
]
if (target_cpu == "arm64") {
defines += [ "SUPPORT_64BIT" ]
......@@ -171,13 +167,20 @@ if (defined(ohos_lite)) {
include_dirs = include_common
deps = [
"//base/startup/init_lite/interfaces/innerkits/sandbox:libsandbox",
"//base/startup/init_lite/interfaces/innerkits/control_fd:libcontrolfd",
"//base/startup/init_lite/interfaces/innerkits/fd_holder:fdholder",
"//base/startup/init_lite/interfaces/innerkits/file:libfile",
"//base/startup/init_lite/interfaces/innerkits/fs_manager:libfsmanager_static",
"//base/startup/init_lite/interfaces/innerkits/sandbox:sandbox",
"//base/startup/init_lite/interfaces/innerkits/socket:libsocket",
"//base/startup/init_lite/services/log:agent_log",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param:param_client",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/param/base:parameterbase",
"//base/startup/init_lite/services/param/linux:param_client",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_shared",
"//third_party/openssl:libcrypto_shared",
"//third_party/cJSON:cjson_static",
"//third_party/mbedtls:mbedtls_shared",
]
external_deps = [
"hilog_native:libhilog_base",
......@@ -196,19 +199,17 @@ if (defined(ohos_lite)) {
defines = [
"INIT_AGENT",
"_GNU_SOURCE",
"USE_MBEDTLS",
]
sources = [
"//base/startup/init_lite/device_info/device_info.cpp",
"//base/startup/init_lite/services/log/init_log.c",
"service_watcher/service_watcher.c",
]
include_dirs = include_common
deps = [
":libbegetutil",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_shared",
"//third_party/openssl:libcrypto_shared",
]
if (enable_ohos_startup_init_feature_watcher) {
......@@ -250,29 +251,15 @@ if (defined(ohos_lite)) {
install_images = [ "system" ]
}
# For init only
ohos_static_library("libfsmanager_static") {
sources = fs_manager_sources
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/param/include",
]
part_name = "init"
}
ohos_static_library("libbegetutil_static") {
sources = [ "//base/startup/init_lite/services/log/init_log.c" ]
sources += syspara_sources
sources = syspara_sources
sources += [ "syspara/param_wrapper.cpp" ]
defines = [
"INIT_AGENT",
"INIT_FILE",
"_GNU_SOURCE",
"USE_MBEDTLS",
]
if (target_cpu == "arm64") {
defines += [ "SUPPORT_64BIT" ]
......@@ -280,12 +267,13 @@ if (defined(ohos_lite)) {
include_dirs = include_common
deps = [
"//base/startup/init_lite/services/log:agent_log",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param:param_client",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/param/base:parameterbase",
"//base/startup/init_lite/services/param/linux:param_client",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_shared",
"//third_party/openssl:libcrypto_shared",
"//third_party/mbedtls:mbedtls_shared",
]
external_deps = [
"hilog_native:libhilog_base",
......
......@@ -14,46 +14,25 @@
import("//base/startup/init_lite/begetd.gni")
import("//build/ohos.gni")
ohos_shared_library("libcontrolfd") {
sources = [
"control_fd_client.c",
"control_fd_service.c",
]
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [
".",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/loopevent/include",
]
deps = [
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_shared",
"//base/startup/init_lite/interfaces/innerkits/control_fd",
]
deps += [ "//base/startup/init_lite/services/log:agent_log" ]
part_name = "init"
install_images = [ "system" ]
}
# For init only
ohos_static_library("libcontrolfd_static") {
ohos_static_library("libcontrolfd") {
sources = [
"control_fd_client.c",
"control_fd_service.c",
]
public_configs = [ ":exported_header_files" ]
include_dirs = [
".",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/loopevent/include",
]
deps = [
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/utils:libinit_utils",
]
part_name = "init"
}
......@@ -13,13 +13,21 @@
import("//build/ohos.gni")
ohos_static_library("libfdholder_internal_static") {
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/interfaces/innerkits/fd_holder",
]
}
ohos_static_library("fdholder") {
sources = [ "fd_holder_internal.c" ]
include_dirs = [
".",
"//base/startup/init_lite/services/loopevent/include",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
]
public_configs = [ ":exported_header_files" ]
part_name = "init"
}
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -11,34 +11,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build/ohos.gni")
service_file_sources =
[ "//base/startup/init_lite/interfaces/innerkits/file/init_file.c" ]
service_file_include = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/include",
"//third_party/bounds_checking_function/include",
]
ohos_static_library("libfile_static") {
sources = service_file_sources
include_dirs = service_file_include
deps = [
"//base/startup/init_lite/services/log:agent_log",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_static",
]
part_name = "init"
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [ "//base/startup/init_lite/interfaces/innerkits/include" ]
}
ohos_shared_library("libfile") {
sources = service_file_sources
include_dirs = service_file_include
deps = [
"//base/startup/init_lite/services/log:agent_log",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_shared",
ohos_static_library("libfile") {
sources = [ "init_file.c" ]
include_dirs = [
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/include",
"//third_party/bounds_checking_function/include",
]
public_configs = [ ":exported_header_files" ]
part_name = "init"
install_images = [ "system" ]
}
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build/ohos.gni")
# For init only
config("libfsmanager_exported_configs") {
visibility = [ ":*" ]
include_dirs =
[ "//base/startup/init_lite/interfaces/innerkits/include/fs_manager" ]
}
ohos_static_library("libfsmanager_static") {
sources = [
"fstab.c",
"fstab_mount.c",
]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/param/include",
]
public_configs = [ ":libfsmanager_exported_configs" ]
part_name = "init"
}
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -16,6 +16,7 @@
#ifndef BEGET_EXT_API_H
#define BEGET_EXT_API_H
#include <stdint.h>
#include <stdarg.h>
#ifdef __cplusplus
#if __cplusplus
......@@ -29,9 +30,11 @@ extern "C" {
#if defined(__GNUC__) && (__GNUC__ >= 4)
#define INIT_PUBLIC_API __attribute__((visibility ("default")))
#define INIT_INNER_API __attribute__((visibility ("default")))
#define INIT_LOCAL_API __attribute__((visibility("hidden")))
#else
#define INIT_PUBLIC_API
#define INIT_INNER_API
#define INIT_LOCAL_API
#endif
......@@ -43,20 +46,23 @@ typedef enum InitLogLevel {
INIT_FATAL
} InitLogLevel;
typedef void (*InitCommLog)(InitLogLevel logLevel, uint32_t domain, const char *tag, const char *fmt, va_list vargs);
#define FILE_NAME (strrchr((__FILE__), '/') ? strrchr((__FILE__), '/') + 1 : (__FILE__))
void SetInitLogLevel(InitLogLevel logLevel);
void InitLog(InitLogLevel logLevel, unsigned int domain, const char *tag, const char *fmt, ...);
INIT_PUBLIC_API void StartupLog(InitLogLevel logLevel, uint32_t domain, const char *tag, const char *fmt, ...);
INIT_PUBLIC_API void EnableInitLog(InitLogLevel level);
INIT_PUBLIC_API void SetInitCommLog(InitCommLog logFunc);
#define STARTUP_LOGV(domain, tag, fmt, ...) \
InitLog(INIT_DEBUG, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_DEBUG, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define STARTUP_LOGI(domain, tag, fmt, ...) \
InitLog(INIT_INFO, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_INFO, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define STARTUP_LOGW(domain, tag, fmt, ...) \
InitLog(INIT_WARN, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_WARN, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define STARTUP_LOGE(domain, tag, fmt, ...) \
InitLog(INIT_ERROR, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_ERROR, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define STARTUP_LOGF(domain, tag, fmt, ...) \
InitLog(INIT_FATAL, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_FATAL, domain, tag, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define BASE_DOMAIN 0xA000
#ifndef BEGET_DOMAIN
......@@ -69,7 +75,7 @@ void InitLog(InitLogLevel logLevel, unsigned int domain, const char *tag, const
#define BEGET_LOGW(fmt, ...) STARTUP_LOGW(BEGET_DOMAIN, BEGET_LABEL, fmt, ##__VA_ARGS__)
#define InitLogPrint(outFileName, logLevel, kLevel, fmt, ...) \
InitLog(logLevel, BEGET_DOMAIN, kLevel, fmt, ##__VA_ARGS__)
StartupLog(logLevel, BEGET_DOMAIN, kLevel, fmt, ##__VA_ARGS__)
#define BEGET_ERROR_CHECK(ret, statement, format, ...) \
if (!(ret)) { \
......
......@@ -9,5 +9,6 @@
{ "name": "InitAddPreCfgLoadHook" },
{ "name": "InitAddPostCfgLoadHook" },
{ "name": "InitModuleMgrInstall" },
{ "name": "InitModuleMgrUnInstall" }
{ "name": "InitModuleMgrUnInstall" },
{ "name": "StartupLog" }
]
......@@ -16,13 +16,11 @@ import("//build/ohos.gni")
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [ "include/" ]
include_dirs =
[ "//base/startup/init_lite/interfaces/innerkits/sandbox/include" ]
}
ohos_shared_library("libsandbox") {
if (target_cpu == "arm64") {
defines = [ "SUPPORT_64BIT" ]
}
ohos_static_library("sandbox") {
sources = [
"sandbox.c",
"sandbox_namespace.c",
......@@ -34,35 +32,6 @@ ohos_shared_library("libsandbox") {
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/cJSON",
]
deps = [
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_shared",
"//third_party/cJSON:cjson_static",
]
deps += [ "//base/startup/init_lite/services/log:agent_log" ]
part_name = "init"
install_images = [ "system" ]
}
# For init only
ohos_static_library("libsandbox_static") {
sources = [
"sandbox.c",
"sandbox_namespace.c",
]
public_configs = [ ":exported_header_files" ]
include_dirs = [
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include",
"//third_party/cJSON",
]
deps = [
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/cJSON:cjson_static",
]
if (target_cpu == "arm64") {
defines = [ "SUPPORT_64BIT" ]
}
......
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -18,37 +18,20 @@ service_socket_include = [
"//base/startup/init_lite/services/log",
"//third_party/bounds_checking_function/include",
]
service_socket_deps = [
"//base/startup/init_lite/services/log:init_log",
"//third_party/bounds_checking_function:libsec_static",
]
if (defined(ohos_lite)) {
if (ohos_kernel_type == "linux") {
static_library("libsocket_static") {
static_library("libsocket") {
sources = service_socket_sources
include_dirs = service_socket_include
deps = service_socket_deps
}
}
} else {
import("//build/ohos.gni")
ohos_static_library("libsocket_static") {
sources = service_socket_sources
include_dirs = service_socket_include
deps = service_socket_deps
part_name = "init"
}
ohos_shared_library("libsocket") {
ohos_static_library("libsocket") {
sources = service_socket_sources
include_dirs = service_socket_include
deps = service_socket_deps
part_name = "init"
install_images = [
"system",
"updater",
]
}
}
# Copyright (c) 2020-2021 Huawei Device Co., Ltd.
# Copyright (c) 2020-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -11,242 +11,27 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
group("startup_init") {
deps = []
init_common_sources = [
"init/init_capability.c",
"init/init_common_cmds.c",
"init/init_common_service.c",
"init/init_config.c",
"init/init_group_manager.c",
"init/init_service_file.c",
"init/init_service_manager.c",
"init/init_service_socket.c",
"init/main.c",
]
if (defined(ohos_lite)) {
# feature: init
executable("lite_init") {
output_name = "init"
defines = [
"_GNU_SOURCE",
"OHOS_LITE",
"__MUSL__",
]
if (enable_ohos_startup_init_feature_begetctl_liteos) {
defines += [ "LITEOS_SUPPORT" ]
}
sources = [
"init/adapter/init_adapter.c",
"init/lite/init.c",
"init/lite/init_cmds.c",
"init/lite/init_jobs.c",
"init/lite/init_reboot.c",
"init/lite/init_service.c",
"init/lite/init_signal_handler.c",
]
sources += init_common_sources
include_dirs = [
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/include/param",
"//base/startup/init_lite/services/init/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/loopevent/include",
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/cJSON",
"//third_party/bounds_checking_function/include",
"//base/hiviewdfx/hilog_lite/interfaces/native/kits",
"//base/startup/init_lite/interfaces/innerkits/fd_holder",
]
cflags = [ "-Wall" ]
ldflags = []
# for liteos
if (defined(ohos_lite) && ohos_kernel_type != "liteos_m") {
deps = [
"//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param:param_init",
"//base/startup/init_lite/services/utils:libinit_tools",
"//build/lite/config/component/cJSON:cjson_static",
"//third_party/bounds_checking_function:libsec_static",
]
if (ohos_kernel_type == "liteos_a") {
defines += [ "__LITEOS_A__" ]
include_dirs += [
"//kernel/liteos_a/syscall",
"//kernel/liteos_a/kernel/include",
"//base/startup/init_lite/interfaces/kits/syscap",
"//base/startup/init_lite/initsync/include",
]
deps += [ "//base/startup/init_lite/initsync:initsync" ]
}
if (ohos_kernel_type == "linux") {
defines += [
"NEED_EXEC_RCS_LINUX",
"__LINUX__",
]
ldflags += [
"-lm",
"-lpthread",
]
deps += [
"//third_party/mksh",
"//third_party/toybox",
]
}
}
group("init_lite") {
if (ohos_kernel_type != "liteos_m") {
deps = [
":lite_init",
"etc:etc_files",
]
}
}
group("unittest") {
if (ohos_build_type == "debug" && ohos_kernel_type != "liteos_m") {
deps = [ "//base/startup/init_lite/test/unittest/lite:init_test" ]
}
}
} else {
import("//build/ohos.gni")
import("//build/ohos/native_stub/native_stub.gni")
ohos_executable("init") {
sources = [
"//base/startup/init_lite/interfaces/innerkits/fd_holder/fd_holder_internal.c",
"init/adapter/init_adapter.c",
"init/standard/device.c",
"init/standard/fd_holder_service.c",
"init/standard/init.c",
"init/standard/init_cmdexecutor.c",
"init/standard/init_cmds.c",
"init/standard/init_control_fd_service.c",
"init/standard/init_jobs.c",
"init/standard/init_mount.c",
"init/standard/init_reboot.c",
"init/standard/init_service.c",
"init/standard/init_signal_handler.c",
"init/standard/switch_root.c",
]
modulemgr_sources = [
"//base/startup/init_lite/interfaces/innerkits/hookmgr/hookmgr.c",
"//base/startup/init_lite/interfaces/innerkits/modulemgr/modulemgr.c",
]
sources += modulemgr_sources
sources += init_common_sources
include_dirs = [
"//base/customization/config_policy/interfaces/innerkits/include",
"//base/security/access_token/interfaces/innerkits/token_setproc/include",
"//base/security/access_token/interfaces/innerkits/nativetoken/include",
"//base/startup/init_lite/interfaces/innerkits/sandbox/include",
"//base/startup/init_lite/services/include/param",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/init/include",
"//base/startup/init_lite/interfaces/innerkits/init_module_engine/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/loopevent/include",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/interfaces/innerkits/fd_holder",
"//base/startup/init_lite/ueventd/include",
"//third_party/cJSON",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/interfaces/innerkits/control_fd",
]
deps = [
"//base/customization/config_policy/frameworks/config_policy:configpolicy_util_for_init_static",
"//base/security/access_token/interfaces/innerkits/nativetoken:libnativetoken",
"//base/security/access_token/interfaces/innerkits/token_setproc:libtoken_setproc",
"//base/startup/init_lite/interfaces/innerkits:libfsmanager_static",
"//base/startup/init_lite/interfaces/innerkits/control_fd:libcontrolfd_static",
"//base/startup/init_lite/interfaces/innerkits/sandbox:libsandbox_static",
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param:param_init",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/utils:libinit_utils",
"//base/startup/init_lite/ueventd:libueventd_ramdisk_static",
"//third_party/bounds_checking_function:libsec_static",
"//third_party/cJSON:cjson_static",
"etc:etc_files",
"init/lite:init",
]
deps += [ "//base/startup/init_lite/interfaces/innerkits/init_module_engine:libinit_stub_versionscript" ]
deps += [ "//base/startup/init_lite/interfaces/innerkits/init_module_engine:init_module_engine_sources" ]
deps += [ "//base/startup/init_lite/services/modules:static_modules" ]
cflags = []
if (use_musl) {
deps += [
"//third_party/mksh:sh",
"//third_party/toybox:toybox",
]
}
if (build_selinux) {
include_dirs += [
"//third_party/selinux/libselinux/include/",
"//base/security/selinux/interfaces/policycoreutils/include/",
]
deps += [
"//base/security/selinux:libload_policy",
"//base/security/selinux:librestorecon",
"//third_party/selinux:libselinux",
]
cflags += [ "-DWITH_SELINUX" ]
}
defines = [ "PARAM_SUPPORT_TRIGGER" ]
if (param_test) {
defines += [
"OHOS_SERVICE_DUMP",
"INIT_TEST",
]
}
if (target_cpu == "arm64") {
defines += [ "SUPPORT_64BIT" ]
# for unittest
if (ohos_build_type == "debug") {
deps += [ "//base/startup/init_lite/test/unittest/lite:init_test" ]
}
if (!enable_ramdisk) {
defines += [ "DISABLE_INIT_TWO_STAGES" ]
}
if (support_jsapi) {
defines += [ "SUPPORT_PROFILER_HIDEBUG" ]
}
if (defined(product_name) && product_name == "rk3568") {
defines += [ "PRODUCT_RK" ]
}
version_script = get_label_info(
"//base/startup/init_lite/interfaces/innerkits/init_module_engine:libinit_stub_versionscript",
"target_gen_dir") + "/" + get_label_info(
"//base/startup/init_lite/interfaces/innerkits/init_module_engine:libinit_stub_versionscript",
"name") + stub_version_script_suffix
defines += [ "_GNU_SOURCE" ]
install_images = [
"system",
"updater",
"ramdisk",
]
install_enable = true
part_name = "init"
}
group("startup_init") {
# for standard
if (!defined(ohos_lite)) {
deps = [
":init",
"etc:etc_files",
"//base/startup/init_lite/services/param:param_client",
"//base/startup/init_lite/services/param:param_init",
"init/standard:init",
]
if (enable_ohos_startup_init_feature_watcher) {
deps += [
......
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -12,6 +12,22 @@
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
common_include_dirs = [
"//base/startup/init_lite/services/begetctl",
"//base/startup/init_lite/services/begetctl/shell",
"//base/startup/init_lite/services/param/include",
"//base/startup/init_lite/services/param/adapter",
"//base/startup/init_lite/services/param/linux",
"//base/startup/init_lite/services/param/base",
"//base/startup/init_lite/services/include/param",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/loopevent/include",
"//base/startup/init_lite/services/init/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/bounds_checking_function/include",
]
if (defined(ohos_lite)) {
executable("begetctl") {
output_name = "begetctl"
......@@ -28,23 +44,12 @@ if (defined(ohos_lite)) {
if (param_test) {
sources += [ "//base/startup/init_lite/test/moduletest/syspara.cpp" ]
}
include_dirs = [
".",
"shell",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include/param/",
"//base/startup/init_lite/services/param/include",
"//base/startup/init_lite/services/loopevent/include",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/interfaces/innerkits/sandbox/include",
"//third_party/cJSON",
]
include_dirs = common_include_dirs
deps = [
"//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/utils:libinit_utils",
"//build/lite/config/component/cJSON:cjson_static",
"//third_party/bounds_checking_function:libsec_static",
]
......@@ -78,22 +83,14 @@ if (defined(ohos_lite)) {
}
include_dirs = [
".",
"shell",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include/param/",
"//base/startup/init_lite/services/param/include",
"//base/startup/init_lite/services/loopevent/include",
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/interfaces/innerkits/sandbox/include",
"//base/startup/init_lite/interfaces/innerkits/control_fd",
]
include_dirs += common_include_dirs
deps = [
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//base/startup/init_lite/interfaces/innerkits/control_fd:libcontrolfd",
"//base/startup/init_lite/interfaces/innerkits/sandbox:libsandbox",
"//third_party/bounds_checking_function:libsec_shared",
]
external_deps = [ "utils_base:utils" ]
......@@ -132,10 +129,8 @@ if (defined(ohos_lite)) {
"sandbox",
"dump_service",
]
install_images = [ "system" ]
install_enable = true
part_name = "init"
}
......@@ -147,18 +142,7 @@ if (defined(ohos_lite)) {
]
defines = [ "_GNU_SOURCE" ]
include_dirs = [
".",
"shell",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include/param/",
"//base/startup/init_lite/services/loopevent/include",
"//base/startup/init_lite/services/param/include",
"//third_party/bounds_checking_function/include",
]
include_dirs = common_include_dirs
deps = [
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//third_party/bounds_checking_function:libsec_static",
......@@ -175,12 +159,7 @@ if (defined(ohos_lite)) {
"//base/startup/init_lite/test/moduletest/param_test_cmds.c",
"//base/startup/init_lite/test/moduletest/syspara.cpp",
]
deps += [
"//base/startup/init_lite/interfaces/innerkits:libbeget_proxy",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/utils:libinit_utils",
]
deps += [ "//base/startup/init_lite/interfaces/innerkits:libbeget_proxy" ]
defines += [
"OHOS_SERVICE_DUMP",
"INIT_TEST",
......@@ -206,22 +185,11 @@ if (defined(ohos_lite)) {
"_GNU_SOURCE",
]
include_dirs = [
".",
"shell",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include/param/",
"//base/startup/init_lite/services/loopevent/include",
"//base/startup/init_lite/services/param/include",
"//third_party/bounds_checking_function/include",
]
include_dirs = common_include_dirs
deps = [
"//base/startup/init_lite/services/log:agent_log",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param:param_client",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/param:parameter",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_static",
]
......
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -24,6 +24,7 @@
#include "begetctl.h"
#include "init_utils.h"
#include "param_manager.h"
#include "param_security.h"
#include "param_utils.h"
#include "shell_utils.h"
......
......@@ -17,7 +17,6 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "init_log.h"
#ifdef __cplusplus
#if __cplusplus
......
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
init_common_sources = [
"../init_capability.c",
"../init_common_cmds.c",
"../init_common_service.c",
"../init_config.c",
"../init_group_manager.c",
"../init_service_file.c",
"../init_service_manager.c",
"../init_service_socket.c",
"../main.c",
]
# feature: init
executable("init") {
output_name = "init"
defines = [
"_GNU_SOURCE",
"OHOS_LITE",
"__MUSL__",
]
if (enable_ohos_startup_init_feature_begetctl_liteos) {
defines += [ "LITEOS_SUPPORT" ]
}
sources = [
"../adapter/init_adapter.c",
"../lite/init.c",
"../lite/init_cmds.c",
"../lite/init_jobs.c",
"../lite/init_reboot.c",
"../lite/init_service.c",
"../lite/init_signal_handler.c",
]
sources += init_common_sources
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/interfaces/innerkits/fd_holder",
"//base/startup/init_lite/services/init/include",
"//third_party/cJSON",
"//third_party/bounds_checking_function/include",
"//base/hiviewdfx/hilog_lite/interfaces/native/kits",
]
cflags = [ "-Wall" ]
ldflags = []
deps = [
"//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param/base:parameterbase",
"//base/startup/init_lite/services/utils:libinit_utils",
"//build/lite/config/component/cJSON:cjson_static",
"//third_party/bounds_checking_function:libsec_static",
]
if (ohos_kernel_type == "liteos_a") {
defines += [ "__LITEOS_A__" ]
include_dirs += [
"//kernel/liteos_a/syscall",
"//kernel/liteos_a/kernel/include",
"//base/startup/init_lite/interfaces/kits/syscap",
"//base/startup/init_lite/initsync/include",
]
deps += [
"//base/startup/init_lite/initsync:initsync",
"//base/startup/init_lite/services/param/liteos:param_init_lite",
]
}
if (ohos_kernel_type == "linux") {
defines += [
"NEED_EXEC_RCS_LINUX",
"__LINUX__",
]
ldflags += [
"-lm",
"-lpthread",
]
deps += [
"//base/startup/init_lite/services/param/linux:param_init",
"//third_party/mksh",
"//third_party/toybox",
]
}
}
......@@ -30,7 +30,7 @@
"build": {
"sub_component": [
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//base/startup/init_lite/services:init_lite",
"//base/startup/init_lite/services:startup_init",
"//base/startup/init_lite/services/begetctl:begetctl_cmd",
"//base/startup/init_lite/watchdog:init_watchdog",
"//base/startup/init_lite/ueventd:ueventd"
......@@ -52,7 +52,7 @@
}
],
"test": [
"//base/startup/init_lite/services:unittest"
"//base/startup/init_lite/services:startup_init"
]
}
}
......
......@@ -30,7 +30,7 @@ int main(int argc, char * const argv[])
INIT_LOGE("Process id error %d!", getpid());
return 0;
}
EnableInitLog(INIT_DEBUG);
if (isSecondStage == 0) {
SystemPrepare();
} else {
......
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
init_common_sources = [
"../init_capability.c",
"../init_common_cmds.c",
"../init_common_service.c",
"../init_config.c",
"../init_group_manager.c",
"../init_service_file.c",
"../init_service_manager.c",
"../init_service_socket.c",
"../main.c",
]
import("//build/ohos.gni")
import("//build/ohos/native_stub/native_stub.gni")
ohos_executable("init") {
sources = [
"../adapter/init_adapter.c",
"../standard/device.c",
"../standard/fd_holder_service.c",
"../standard/init.c",
"../standard/init_cmdexecutor.c",
"../standard/init_cmds.c",
"../standard/init_control_fd_service.c",
"../standard/init_jobs.c",
"../standard/init_mount.c",
"../standard/init_reboot.c",
"../standard/init_service.c",
"../standard/init_signal_handler.c",
"../standard/switch_root.c",
]
modulemgr_sources = [
"//base/startup/init_lite/interfaces/innerkits/hookmgr/hookmgr.c",
"//base/startup/init_lite/interfaces/innerkits/modulemgr/modulemgr.c",
]
sources += modulemgr_sources
sources += init_common_sources
include_dirs = [ "//base/startup/init_lite/services/init/include" ]
deps = [
"//base/startup/init_lite/interfaces/innerkits/control_fd:libcontrolfd",
"//base/startup/init_lite/interfaces/innerkits/fd_holder:fdholder",
"//base/startup/init_lite/interfaces/innerkits/fs_manager:libfsmanager_static",
"//base/startup/init_lite/interfaces/innerkits/sandbox:sandbox",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/param/base:parameterbase",
"//base/startup/init_lite/services/param/linux:param_init",
"//base/startup/init_lite/services/utils:libinit_utils",
]
deps += [
"//base/customization/config_policy/frameworks/config_policy:configpolicy_util_for_init_static",
"//base/security/access_token/interfaces/innerkits/nativetoken:libnativetoken",
"//base/security/access_token/interfaces/innerkits/token_setproc:libtoken_setproc",
"//base/startup/init_lite/ueventd:libueventd_ramdisk_static",
"//third_party/bounds_checking_function:libsec_static",
"//third_party/cJSON:cjson_static",
]
deps += [ "//base/startup/init_lite/interfaces/innerkits/init_module_engine:libinit_stub_versionscript" ]
deps += [ "//base/startup/init_lite/interfaces/innerkits/init_module_engine:init_module_engine_sources" ]
deps += [ "//base/startup/init_lite/services/modules:static_modules" ]
cflags = []
if (use_musl) {
deps += [
"//third_party/mksh:sh",
"//third_party/toybox:toybox",
]
}
if (build_selinux) {
include_dirs += [
"//third_party/selinux/libselinux/include/",
"//base/security/selinux/interfaces/policycoreutils/include/",
]
deps += [
"//base/security/selinux:libload_policy",
"//base/security/selinux:librestorecon",
"//third_party/selinux:libselinux",
]
cflags += [ "-DWITH_SELINUX" ]
}
defines = [ "PARAM_SUPPORT_TRIGGER" ]
if (param_test) {
defines += [
"OHOS_SERVICE_DUMP",
"INIT_TEST",
]
}
if (target_cpu == "arm64") {
defines += [ "SUPPORT_64BIT" ]
}
if (!enable_ramdisk) {
defines += [ "DISABLE_INIT_TWO_STAGES" ]
}
if (support_jsapi) {
defines += [ "SUPPORT_PROFILER_HIDEBUG" ]
}
if (defined(product_name) && product_name == "rk3568") {
defines += [ "PRODUCT_RK" ]
}
version_script = get_label_info(
"//base/startup/init_lite/interfaces/innerkits/init_module_engine:libinit_stub_versionscript",
"target_gen_dir") + "/" + get_label_info(
"//base/startup/init_lite/interfaces/innerkits/init_module_engine:libinit_stub_versionscript",
"name") + stub_version_script_suffix
defines += [ "_GNU_SOURCE" ]
install_images = [
"system",
"updater",
"ramdisk",
]
install_enable = true
part_name = "init"
}
......@@ -131,7 +131,9 @@ Fstab* LoadRequiredFstab(void)
INIT_LOGI("Cannot load fstab from command line, try read from fstab.required");
const char *fstabFile = "/etc/fstab.required";
INIT_CHECK(access(fstabFile, F_OK) == 0, fstabFile = "/system/etc/fstab.required");
#ifndef STARTUP_INIT_TEST
INIT_ERROR_CHECK(access(fstabFile, F_OK) == 0, abort(), "Failed get fstab.required");
#endif
fstab = ReadFstabFromFile(fstabFile, false);
}
return fstab;
......
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -10,57 +10,55 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
base_sources = [ "init_log.c" ]
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/log",
]
}
if (defined(ohos_lite)) {
static_library("init_log") {
sources = [ "init_log.c" ]
sources = base_sources
defines = [
"_GNU_SOURCE",
"INIT_LOG_INIT=1",
"OHOS_LITE",
]
cflags = [ "-fPIC" ]
public_configs = [ ":exported_header_files" ]
if (ohos_kernel_type == "linux") {
defines += [ "INIT_DMESG" ]
}
include_dirs = [
"//base/hiviewdfx/hilog_lite/interfaces/native/kits",
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/bounds_checking_function/include",
]
deps = [ "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_static" ]
}
} else {
import("//build/ohos.gni")
ohos_static_library("init_log") {
sources = [ "init_log.c" ]
sources = base_sources
defines = [ "INIT_DMESG" ]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/bounds_checking_function/include",
]
public_configs = [ ":exported_header_files" ]
include_dirs = [ "//third_party/bounds_checking_function/include" ]
part_name = "startup"
subsystem_name = "startup"
}
ohos_shared_library("agent_log") {
sources = [ "init_log.c" ]
ohos_static_library("agent_log") {
sources = base_sources
defines = [
"INIT_AGENT",
"INIT_FILE",
]
deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//third_party/bounds_checking_function/include",
]
part_name = "startup"
install_images = [
"system",
"updater",
]
public_configs = [ ":exported_header_files" ]
include_dirs = [ "//third_party/bounds_checking_function/include" ]
external_deps = [ "hilog_native:libhilog_base" ]
install_enable = true
part_name = "init"
subsystem_name = "startup"
}
}
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "init_log.h"
static InitCommLog g_initCommLog = NULL;
INIT_PUBLIC_API void SetInitCommLog(InitCommLog logFunc)
{
g_initCommLog = logFunc;
}
INIT_PUBLIC_API void StartupLog(InitLogLevel logLevel, uint32_t domain, const char *tag, const char *fmt, ...)
{
if (g_initCommLog != NULL) {
va_list vargs;
va_start(vargs, fmt);
g_initCommLog(logLevel, domain, tag, fmt, vargs);
va_end(vargs);
}
}
\ No newline at end of file
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -38,11 +38,6 @@
#define BASE_YEAR 1900
static InitLogLevel g_logLevel = INIT_INFO;
void SetInitLogLevel(InitLogLevel logLevel)
{
g_logLevel = logLevel;
}
#ifdef INIT_FILE
static void LogToFile(const char *logFile, const char *tag, const char *info)
{
......@@ -66,7 +61,7 @@ static void LogToFile(const char *logFile, const char *tag, const char *info)
#ifdef INIT_DMESG
static int g_fd = -1;
void OpenLogDevice(void)
INIT_LOCAL_API void OpenLogDevice(void)
{
int fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (fd >= 0) {
......@@ -101,23 +96,19 @@ void LogToDmesg(InitLogLevel logLevel, const char *tag, const char *info)
}
#endif
void InitLog(InitLogLevel logLevel, unsigned int domain, const char *tag, const char *fmt, ...)
static void InitLog(InitLogLevel logLevel, unsigned int domain, const char *tag, const char *fmt, va_list vargs)
{
if (g_logLevel > logLevel) {
return;
}
va_list vargs;
va_start(vargs, fmt);
char tmpFmt[DEF_LOG_SIZE] = {0};
if (vsnprintf_s(tmpFmt, sizeof(tmpFmt), sizeof(tmpFmt) - 1, fmt, vargs) == -1) {
va_end(vargs);
#ifdef OHOS_LITE
static LogLevel LOG_LEVEL[] = { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR, LOG_FATAL };
(void)HiLogPrint(INIT_LOG_INIT, LOG_LEVEL[logLevel], domain, tag, "%{public}s", fmt);
#endif
return;
}
va_end(vargs);
#ifdef OHOS_LITE
static LogLevel LOG_LEVEL[] = { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR, LOG_FATAL };
......@@ -134,3 +125,9 @@ void InitLog(InitLogLevel logLevel, unsigned int domain, const char *tag, const
#endif
#endif
}
INIT_PUBLIC_API void EnableInitLog(InitLogLevel level)
{
g_logLevel = level;
SetInitCommLog(InitLog);
}
......@@ -36,18 +36,18 @@ extern "C" {
#define INIT_LOG_DOMAIN (BASE_DOMAIN + 1)
#endif
void OpenLogDevice(void);
INIT_LOCAL_API void OpenLogDevice(void);
#define INIT_LOGV(fmt, ...) \
InitLog(INIT_DEBUG, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_DEBUG, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define INIT_LOGI(fmt, ...) \
InitLog(INIT_INFO, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_INFO, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define INIT_LOGW(fmt, ...) \
InitLog(INIT_WARN, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_WARN, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define INIT_LOGE(fmt, ...) \
InitLog(INIT_ERROR, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_ERROR, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#define INIT_LOGF(fmt, ...) \
InitLog(INIT_FATAL, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
StartupLog(INIT_FATAL, INIT_LOG_DOMAIN, INIT_LOG_TAG, "[%s:%d]" fmt, (FILE_NAME), (__LINE__), ##__VA_ARGS__)
#ifndef UNLIKELY
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
......
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -38,19 +38,25 @@ common_include = [
"signal",
]
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [ "//base/startup/init_lite/services/loopevent/include" ]
}
if (defined(ohos_lite)) {
static_library("loopevent") {
sources = common_sources
cflags = [ "-fPIC" ]
include_dirs = common_include
defines = [ "_GNU_SOURCE" ]
public_configs = [ ":exported_header_files" ]
}
} else {
import("//build/ohos.gni")
ohos_static_library("loopevent") {
sources = common_sources
public_configs = [ ":exported_header_files" ]
include_dirs = common_include
defines = [ "_GNU_SOURCE" ]
part_name = "init"
......
......@@ -23,7 +23,7 @@ ohos_shared_library("bootchart") {
]
deps = [
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/services/param/base:parameterbase",
"//base/startup/init_lite/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_static",
"//third_party/cJSON:cjson_static",
......
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -11,241 +11,30 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
import("//build/ohos.gni")
param_comm_sources = [
"manager/param_manager.c",
"manager/param_trie.c",
"manager/param_utils.c",
]
group("parameter") {
deps = []
if (!defined(ohos_lite) || ohos_kernel_type == "linux") {
param_service_sources = [
"adapter/param_persistadp.c",
"linux/param_message.c",
"linux/param_msgadp.c",
"linux/param_osadp.c",
"linux/param_service.c",
"manager/param_persist.c",
]
param_trigger_sources = [
"trigger/trigger_checker.c",
"trigger/trigger_manager.c",
"trigger/trigger_processor.c",
]
}
param_include_dirs = [
"include",
"adapter",
"linux",
"//base/startup/init_lite/services/include/param",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/init/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/loopevent/include",
"//base/security/selinux/interfaces/policycoreutils/include",
"//third_party/libuv/include",
"//third_party/bounds_checking_function/include",
"//third_party/cJSON",
"//utils/native/lite/include",
]
if (defined(ohos_lite)) {
param_build_defines = [
"_GNU_SOURCE",
"INCREMENTAL_VERSION=\"${ohos_version}\"",
"BUILD_TYPE=\"${ohos_build_type}\"",
"BUILD_USER=\"${ohos_build_user}\"",
"BUILD_TIME=\"${ohos_build_time}\"",
"BUILD_HOST=\"${ohos_build_host}\"",
"BUILD_ROOTHASH=\"${ohos_build_roothash}\"",
]
if (enable_ohos_startup_init_feature_begetctl_liteos) {
action("lite_const_param_to") {
script = "//base/startup/init_lite/scripts/param_cfg_to_code.py"
args = [
"--source",
rebase_path(
"//base/startup/init_lite/services/etc_lite/param/ohos_const/ohos.para"),
"--dest_dir",
rebase_path("$root_out_dir/gen/init_lite/"),
"--priority",
"0",
]
outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
}
action("lite_ohos_param_to") {
script = "//base/startup/init_lite/scripts/param_cfg_to_code.py"
args = [
"--source",
rebase_path("//base/startup/init_lite/services/etc/param/ohos.para"),
"--dest_dir",
rebase_path("$root_out_dir/gen/init_lite/"),
"--priority",
"0",
]
outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
}
action("vendor_param_to") {
script = "//base/startup/init_lite/scripts/param_cfg_to_code.py"
args = [
"--source",
rebase_path("$ohos_product_adapter_dir/utils/sys_param/vendor.para"),
"--dest_dir",
rebase_path("$root_out_dir/gen/init_lite/"),
"--priority",
"1",
]
outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
}
}
static_library("param_init") {
defines = []
deps = []
sources = param_comm_sources
include_dirs = param_include_dirs
if (defined(boot_kernel_extended_cmdline)) {
defines += [ "BOOT_EXTENDED_CMDLINE=\"${boot_kernel_extended_cmdline}\"" ]
}
defines += param_build_defines
# parameter only support linux for l2 and l1
if (defined(ohos_lite)) {
if (ohos_kernel_type == "linux") {
sources += param_service_sources
sources += param_trigger_sources
sources += [ "adapter/param_dac.c" ]
defines += [ "__LINUX__" ]
} else if (ohos_kernel_type == "liteos_a") {
sources += [
"adapter/param_persistadp.c",
"liteos/param_osadp.c",
"liteos/param_service.c",
"manager/param_persist.c",
deps += [
"base:parameterbase",
"linux:param_client",
"linux:param_init",
]
defines += [
"WORKSPACE_AREA_NEED_MUTEX",
"PARAM_PERSIST_SAVE_MUTEX",
"PARAMWORKSPACE_NEED_MUTEX",
"__LITEOS_A__",
"PARAM_SUPPORT_CYCLE_CHECK",
]
}
}
static_library("param_client") {
sources = param_comm_sources
include_dirs = param_include_dirs
defines = param_build_defines
if (ohos_kernel_type == "linux") {
sources += [
"linux/param_message.c",
"linux/param_osadp.c",
"linux/param_request.c",
]
sources += [ "adapter/param_dac.c" ]
defines += [ "__LINUX__" ]
} else if (ohos_kernel_type == "liteos_a") {
sources += [
"adapter/param_persistadp.c",
"liteos/param_client.c",
"liteos/param_osadp.c",
"manager/param_persist.c",
]
defines += [
"__LITEOS_A__",
"WORKSPACE_AREA_NEED_MUTEX",
"PARAM_PERSIST_SAVE_MUTEX",
"PARAMWORKSPACE_NEED_MUTEX",
deps += [
"liteos:param_client_lite",
"liteos:param_init_lite",
]
} else if (ohos_kernel_type == "liteos_m") {
sources += [
"liteos/param_client.c",
"liteos/param_osadp.c",
"manager/param_persist.c",
]
if (enable_ohos_startup_init_lite_use_posix_file_api) {
sources += [ "adapter/param_persistadp.c" ]
} else {
sources += [ "liteos/param_hal.c" ]
}
defines += [
"__LITEOS_M__",
"WORKSPACE_AREA_NEED_MUTEX",
"PARAM_PERSIST_SAVE_MUTEX",
"PARAMWORKSPACE_NEED_MUTEX",
"DATA_PATH=\"${config_ohos_startup_init_lite_data_path}\"",
]
if (enable_ohos_startup_init_feature_begetctl_liteos) {
deps = [
":lite_const_param_to",
":lite_ohos_param_to",
":vendor_param_to",
]
include_dirs += [ "$root_out_dir/gen/init_lite" ]
defines += [ "PARAM_LOAD_CFG_FROM_CODE" ]
}
}
}
} else {
import("//build/ohos.gni")
ohos_static_library("param_init") {
sources = param_comm_sources
sources += param_service_sources
sources += param_trigger_sources
sources += [ "adapter/param_dac.c" ]
include_dirs = param_include_dirs
defines = [ "_GNU_SOURCE" ]
if (defined(boot_kernel_extended_cmdline)) {
defines += [ "BOOT_EXTENDED_CMDLINE=\"${boot_kernel_extended_cmdline}\"" ]
}
if ("${product_name}" == "m40") {
defines += [ "USE_MTK_EMMC" ]
}
if (build_selinux) {
sources += [ "adapter/param_selinux.c" ]
defines += [ "PARAM_SUPPORT_SELINUX" ]
}
deps = [
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/services/loopevent:loopevent",
"//base/startup/init_lite/services/utils:libinit_tools",
"//base/startup/init_lite/services/utils:libinit_utils",
]
part_name = "init"
subsystem_name = "startup"
}
ohos_static_library("param_client") {
sources = param_comm_sources
sources += [ "adapter/param_dac.c" ]
sources += [
"linux/param_message.c",
"linux/param_osadp.c",
"linux/param_request.c",
]
include_dirs = param_include_dirs
defines = [
"_GNU_SOURCE",
"INIT_AGENT",
} else {
deps += [
"base:parameterbase",
"linux:param_client",
"linux:param_init",
]
if (build_selinux) {
sources += [ "adapter/param_selinux.c" ]
defines += [
"PARAM_SUPPORT_SELINUX",
"PARAMWORKSPACE_NEED_MUTEX",
]
}
part_name = "init"
}
}
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -12,19 +12,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <dirent.h>
#include <fcntl.h>
#include "init_utils.h"
#include "param_manager.h"
#include "param_security.h"
#include "param_trie.h"
#include "param_utils.h"
#include "param_base.h"
#define USER_BUFFER_LEN 64
#define MAX_BUF_SIZE 1024
#define GROUP_FORMAT "const.group"
#define OCT_BASE 8
......@@ -141,8 +146,41 @@ static int DacGetParamSecurityLabel(const char *path)
if ((stat(path, &st) == 0) && !S_ISDIR(st.st_mode)) {
return ProcessParamFile(path, NULL);
}
PARAM_LOGV("DacGetParamSecurityLabel %s ", path);
return ReadFileInDir(path, ".para.dac", ProcessParamFile, NULL);
DIR *pDir = opendir(path);
PARAM_CHECK(pDir != NULL, return -1, "Read dir :%s failed.%d", path, errno);
char *fileName = malloc(MAX_BUF_SIZE);
PARAM_CHECK(fileName != NULL, closedir(pDir);
return -1, "Failed to malloc for %s", path);
struct dirent *dp;
uint32_t count = 0;
while ((dp = readdir(pDir)) != NULL) {
if (dp->d_type == DT_DIR) {
continue;
}
char *tmp = strstr(dp->d_name, ".para.dac");
if (tmp == NULL) {
continue;
}
if (strcmp(tmp, ".para.dac") != 0) {
continue;
}
int ret = ParamSprintf(fileName, MAX_BUF_SIZE, "%s/%s", path, dp->d_name);
if (ret <= 0) {
PARAM_LOGE("Failed to get file name for %s", dp->d_name);
continue;
}
if ((stat(fileName, &st) == 0) && !S_ISDIR(st.st_mode)) {
count++;
ProcessParamFile(fileName, NULL);
}
}
PARAM_LOGI("DacGetParamSecurityLabel path %s %d", path, count);
free(fileName);
closedir(pDir);
return 0;
}
static int CheckFilePermission(const ParamSecurityLabel *localLabel, const char *fileName, int flags)
......@@ -157,7 +195,7 @@ static int CheckUserInGroup(WorkSpace *space, gid_t groupId, uid_t uid)
#ifdef __MUSL__
static char buffer[USER_BUFFER_LEN] = {0};
uint32_t labelIndex = 0;
int ret = sprintf_s(buffer, sizeof(buffer) - 1, "%s.%d.%d", GROUP_FORMAT, groupId, uid);
int ret = ParamSprintf(buffer, sizeof(buffer), "%s.%d.%d", GROUP_FORMAT, groupId, uid);
PARAM_CHECK(ret >= 0, return -1, "Failed to format name for %s.%d.%d", GROUP_FORMAT, groupId, uid);
(void)FindTrieNode(space, buffer, strlen(buffer), &labelIndex);
ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(space, labelIndex);
......@@ -204,12 +242,11 @@ static int DacCheckParamPermission(const ParamSecurityLabel *srcLabel, const cha
return ret;
}
int RegisterSecurityDacOps(ParamSecurityOps *ops, int isInit)
INIT_LOCAL_API int RegisterSecurityDacOps(ParamSecurityOps *ops, int isInit)
{
PARAM_CHECK(ops != NULL, return -1, "Invalid param");
PARAM_LOGV("RegisterSecurityDacOps %d", isInit);
int ret = strcpy_s(ops->name, sizeof(ops->name), "dac");
ops->securityGetLabel = NULL;
int ret = ParamStrCpy(ops->name, sizeof(ops->name), "dac");
ops->securityInitLabel = InitLocalSecurityLabel;
ops->securityCheckFilePermission = CheckFilePermission;
ops->securityCheckParamPermission = DacCheckParamPermission;
......@@ -224,7 +261,7 @@ static void AddGroupUser(unsigned int uid, unsigned int gid, int mode, const cha
{
ParamAuditData auditData = {0};
char buffer[USER_BUFFER_LEN] = {0};
int ret = sprintf_s(buffer, sizeof(buffer) - 1, "%s.%u.%u", format, gid, uid);
int ret = ParamSprintf(buffer, sizeof(buffer), "%s.%u.%u", format, gid, uid);
PARAM_CHECK(ret >= 0, return, "Failed to format name for %s.%d.%d", format, gid, uid);
auditData.name = buffer;
auditData.dacData.uid = uid;
......@@ -233,7 +270,7 @@ static void AddGroupUser(unsigned int uid, unsigned int gid, int mode, const cha
AddSecurityLabel(&auditData);
}
void LoadGroupUser(void)
INIT_LOCAL_API void LoadGroupUser(void)
{
#ifndef __MUSL__
return;
......
......@@ -20,6 +20,7 @@
#include "param_manager.h"
#include "param_security.h"
#include "param_utils.h"
#include "param_base.h"
#ifdef PARAM_SUPPORT_SELINUX
#include "selinux_parameter.h"
#endif
......@@ -41,6 +42,7 @@ static int InitLocalSecurityLabel(ParamSecurityLabel *security, int isInit)
security->cred.uid = geteuid();
security->cred.gid = getegid();
security->flags[PARAM_SECURITY_SELINUX] = 0;
PARAM_LOGV("InitLocalSecurityLabel");
#if !(defined STARTUP_INIT_TEST || defined LOCAL_TEST)
if (g_selinuxSpace.selinuxHandle == NULL) {
const char *libname = (InUpdaterMode() == 1) ? CHECKER_UPDATER_LIB_NAME : CHECKER_LIB_NAME;
......@@ -111,6 +113,7 @@ static int SelinuxGetAllLabel(int readOnly)
int ret = AddWorkSpace(WORKSPACE_NAME_DEF_SELINUX, readOnly, PARAM_WORKSPACE_MAX);
PARAM_CHECK(ret == 0, return -1,
"Failed to add selinux workspace %s", WORKSPACE_NAME_DEF_SELINUX);
PARAM_LOGI("SelinuxGetAllLabel count %d", count);
return 0;
}
......@@ -171,10 +174,10 @@ static int UpdaterCheckParamPermission(const ParamSecurityLabel *srcLabel, const
return DAC_RESULT_PERMISSION;
}
int RegisterSecuritySelinuxOps(ParamSecurityOps *ops, int isInit)
INIT_LOCAL_API int RegisterSecuritySelinuxOps(ParamSecurityOps *ops, int isInit)
{
PARAM_CHECK(ops != NULL, return -1, "Invalid param");
int ret = strcpy_s(ops->name, sizeof(ops->name), "selinux");
int ret = ParamStrCpy(ops->name, sizeof(ops->name), "selinux");
ops->securityGetLabel = NULL;
ops->securityInitLabel = InitLocalSecurityLabel;
ops->securityCheckFilePermission = CheckFilePermission;
......@@ -190,7 +193,7 @@ int RegisterSecuritySelinuxOps(ParamSecurityOps *ops, int isInit)
return ret;
}
const char *GetSelinuxContent(const char *name)
INIT_INNER_API const char *GetSelinuxContent(const char *name)
{
if (g_selinuxSpace.getParamLabel != NULL) {
return g_selinuxSpace.getParamLabel(name);
......@@ -200,7 +203,7 @@ const char *GetSelinuxContent(const char *name)
}
}
void OpenPermissionWorkSpace(void)
INIT_LOCAL_API void OpenPermissionWorkSpace(void)
{
// open workspace by readonly
SelinuxGetAllLabel(1);
......
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
import("//build/ohos.gni")
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include/param",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/loopevent/include",
"//base/startup/init_lite/services/log",
]
}
base_sources = [
"//base/startup/init_lite/services/log/init_commlog.c",
"//base/startup/init_lite/services/param/base/param_base.c",
"//base/startup/init_lite/services/param/base/param_comm.c",
"//base/startup/init_lite/services/param/base/param_trie.c",
"//base/startup/init_lite/services/utils/init_hashmap.c",
"//base/startup/init_lite/services/utils/list.c",
]
base_include_dirs = [
"//base/startup/init_lite/services/param/include",
"//base/startup/init_lite/services/param/adapter",
"//base/startup/init_lite/services/param/linux",
"//base/startup/init_lite/services/param/base",
"//base/security/selinux/interfaces/policycoreutils/include",
]
if (defined(ohos_lite)) {
static_library("parameterbase") {
sources = base_sources
include_dirs = base_include_dirs
cflags = [ "-fPIC" ]
defines = [ "_GNU_SOURCE" ]
public_configs = [ ":exported_header_files" ]
if (ohos_kernel_type == "linux") {
sources += [
"//base/startup/init_lite/services/param/adapter/param_dac.c",
"//base/startup/init_lite/services/param/linux/param_osadp.c",
]
defines += [
"__LINUX__",
"PARAM_BASE",
]
} else if (ohos_kernel_type == "liteos_a") {
sources += [
"//base/startup/init_lite/services/param/liteos/param_litedac.c",
"//base/startup/init_lite/services/param/liteos/param_osadp.c",
]
include_dirs += [ "//third_party/bounds_checking_function/include" ]
defines += [
"__LITEOS_A__",
"WORKSPACE_AREA_NEED_MUTEX",
"PARAM_PERSIST_SAVE_MUTEX",
"PARAMWORKSPACE_NEED_MUTEX",
]
}
}
} else {
ohos_static_library("parameterbase") {
sources = base_sources
sources += [
"//base/startup/init_lite/services/param/adapter/param_dac.c",
"//base/startup/init_lite/services/param/linux/param_osadp.c",
]
cflags = [ "-fPIC" ]
include_dirs = base_include_dirs
public_configs = [ ":exported_header_files" ]
defines = [ "_GNU_SOURCE" ]
if (use_musl) {
defines += [ "PARAM_BASE" ]
}
if (build_selinux) {
include_dirs += [
"//third_party/selinux/libselinux/include/",
"//base/security/selinux/interfaces/policycoreutils/include/",
]
sources +=
[ "//base/startup/init_lite/services/param/adapter/param_selinux.c" ]
defines += [
"PARAM_SUPPORT_SELINUX",
"PARAMWORKSPACE_NEED_MUTEX",
]
}
part_name = "init"
}
}
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "param_base.h"
#include <ctype.h>
#include <limits.h>
#include "param_manager.h"
#include "param_trie.h"
static ParamWorkSpace g_paramWorkSpace = {};
PARAM_STATIC int WorkSpaceNodeCompare(const HashNode *node1, const HashNode *node2)
{
WorkSpace *workSpace1 = HASHMAP_ENTRY(node1, WorkSpace, hashNode);
WorkSpace *workSpace2 = HASHMAP_ENTRY(node2, WorkSpace, hashNode);
return strcmp(workSpace1->fileName, workSpace2->fileName);
}
static int WorkSpaceKeyCompare(const HashNode *node1, const void *key)
{
WorkSpace *workSpace1 = HASHMAP_ENTRY(node1, WorkSpace, hashNode);
return strcmp(workSpace1->fileName, (char *)key);
}
static int GenerateKeyHasCode(const char *buff, uint32_t len)
{
int code = 0;
for (size_t i = 0; i < len; i++) {
code += buff[i] - 'A';
}
return code;
}
static int WorkSpaceGetNodeHasCode(const HashNode *node)
{
WorkSpace *workSpace = HASHMAP_ENTRY(node, WorkSpace, hashNode);
size_t nameLen = strlen(workSpace->fileName);
return GenerateKeyHasCode(workSpace->fileName, nameLen);
}
static int WorkSpaceGetKeyHasCode(const void *key)
{
const char *buff = (char *)key;
return GenerateKeyHasCode(buff, strlen(buff));
}
static void WorkSpaceFree(const HashNode *node)
{
WorkSpace *workSpace = HASHMAP_ENTRY(node, WorkSpace, hashNode);
CloseWorkSpace(workSpace);
}
INIT_INNER_API ParamHandle GetParamHandle(const WorkSpace *workSpace, uint32_t index, const char *name)
{
PARAM_CHECK(workSpace != NULL && workSpace->area != NULL, return -1, "Invalid param");
uint32_t hashCode = (uint32_t)GenerateKeyHasCode(workSpace->fileName, strlen(workSpace->fileName));
uint32_t handle = (hashCode % HASH_BUTT) << 24; // 24 left shift
handle = handle | (index + workSpace->area->startIndex);
return handle;
}
static int InitParamSecurity(ParamWorkSpace *workSpace,
RegisterSecurityOpsPtr registerOps, ParamSecurityType type, int isInit, int op)
{
PARAM_CHECK(workSpace != NULL && type < PARAM_SECURITY_MAX, return -1, "Invalid param");
int ret = 0;
if (registerOps != NULL) {
ret = registerOps(&workSpace->paramSecurityOps[type], isInit);
PARAM_CHECK(workSpace->paramSecurityOps[type].securityInitLabel != NULL,
return -1, "Invalid securityInitLabel");
ret = workSpace->paramSecurityOps[type].securityInitLabel(&workSpace->securityLabel, isInit);
PARAM_CHECK(ret == 0, return PARAM_CODE_INVALID_NAME, "Failed to init security");
}
ParamSecurityOps *paramSecurityOps = GetParamSecurityOps(type);
PARAM_CHECK(paramSecurityOps != NULL, return -1, "Invalid paramSecurityOps");
PARAM_CHECK(paramSecurityOps->securityFreeLabel != NULL, return -1, "Invalid securityFreeLabel");
PARAM_CHECK(paramSecurityOps->securityCheckFilePermission != NULL, return -1, "Invalid securityCheck");
PARAM_CHECK(paramSecurityOps->securityCheckParamPermission != NULL, return -1, "Invalid securityCheck");
if (isInit == LABEL_INIT_FOR_INIT) {
PARAM_CHECK(paramSecurityOps->securityGetLabel != NULL, return -1, "Invalid securityGetLabel");
}
ret = paramSecurityOps->securityCheckFilePermission(&workSpace->securityLabel, PARAM_STORAGE_PATH, op);
PARAM_CHECK(ret == 0, return PARAM_CODE_INVALID_NAME, "No permission to read file %s", PARAM_STORAGE_PATH);
PARAM_LOGI("InitParamSecurity %s success", paramSecurityOps->name);
return 0;
}
PARAM_STATIC int RegisterSecurityOps(int onlyRead)
{
int isInit = 0;
int op = DAC_READ;
if (onlyRead == 0) {
isInit = LABEL_INIT_FOR_INIT;
op = DAC_WRITE;
}
int ret = InitParamSecurity(&g_paramWorkSpace, RegisterSecurityDacOps, PARAM_SECURITY_DAC, isInit, op);
PARAM_CHECK(ret == 0, return -1, "Failed to get security operations");
#ifdef PARAM_SUPPORT_SELINUX
ret = InitParamSecurity(&g_paramWorkSpace, RegisterSecuritySelinuxOps, PARAM_SECURITY_SELINUX, isInit, op);
PARAM_CHECK(ret == 0, return -1, "Failed to get security operations");
#endif
return ret;
}
INIT_PUBLIC_API int InitParamWorkSpace(int onlyRead)
{
PARAM_LOGI("InitParamWorkSpace %p", &g_paramWorkSpace);
if (PARAM_TEST_FLAG(g_paramWorkSpace.flags, WORKSPACE_FLAGS_INIT)) {
return 0;
}
paramMutexEnvInit();
HashInfo info = {
WorkSpaceNodeCompare,
WorkSpaceKeyCompare,
WorkSpaceGetNodeHasCode,
WorkSpaceGetKeyHasCode,
WorkSpaceFree,
HASH_BUTT
};
int ret = HashMapCreate(&g_paramWorkSpace.workSpaceHashHandle, &info);
PARAM_CHECK(ret == 0, return -1, "Failed to create hash map for workspace");
WORKSPACE_INIT_LOCK(g_paramWorkSpace);
ListInit(&g_paramWorkSpace.workSpaceList);
ret = RegisterSecurityOps(onlyRead);
PARAM_CHECK(ret == 0, return -1, "Failed to get security operations");
PARAM_SET_FLAG(g_paramWorkSpace.flags, WORKSPACE_FLAGS_INIT);
#ifndef PARAM_SUPPORT_SELINUX
ret = AddWorkSpace(WORKSPACE_NAME_NORMAL, onlyRead, PARAM_WORKSPACE_MAX);
PARAM_CHECK(ret == 0, return -1, "Failed to add dac workspace");
#endif
// add dac workspace
ret = AddWorkSpace(WORKSPACE_NAME_DAC, onlyRead, PARAM_WORKSPACE_SMALL);
PARAM_CHECK(ret == 0, return -1, "Failed to add dac workspace");
if (onlyRead == 0) {
// load user info for dac
LoadGroupUser();
// add default dac policy
ParamAuditData auditData = {};
auditData.name = "#";
auditData.dacData.gid = DAC_DEFAULT_GROUP; // 2000 for shell
auditData.dacData.uid = DAC_DEFAULT_USER; // for root
auditData.dacData.mode = DAC_DEFAULT_MODE; // 0774 default mode
ret = AddSecurityLabel(&auditData);
PARAM_CHECK(ret == 0, return ret, "Failed to add default dac label");
} else {
#ifdef PARAM_SUPPORT_SELINUX
OpenPermissionWorkSpace();
#endif
}
return ret;
}
INIT_INNER_API void CloseParamWorkSpace(void)
{
PARAM_LOGI("CloseParamWorkSpace %p", &g_paramWorkSpace);
if (!PARAM_TEST_FLAG(g_paramWorkSpace.flags, WORKSPACE_FLAGS_INIT)) {
return;
}
WORKSPACE_RW_LOCK(g_paramWorkSpace);
if (g_paramWorkSpace.workSpaceHashHandle != NULL) {
HashMapDestory(g_paramWorkSpace.workSpaceHashHandle);
g_paramWorkSpace.workSpaceHashHandle = NULL;
}
WORKSPACE_RW_UNLOCK(g_paramWorkSpace);
for (int i = 0; i < PARAM_SECURITY_MAX; i++) {
if (g_paramWorkSpace.paramSecurityOps[i].securityFreeLabel != NULL) {
g_paramWorkSpace.paramSecurityOps[i].securityFreeLabel(&g_paramWorkSpace.securityLabel);
}
}
#ifdef PARAMWORKSPACE_NEED_MUTEX
ParamRWMutexDelete(&g_paramWorkSpace.rwlock);
#endif
g_paramWorkSpace.flags = 0;
}
INIT_LOCAL_API int AddWorkSpace(const char *name, int onlyRead, uint32_t spaceSize)
{
int ret = 0;
// check exist
#ifdef PARAM_SUPPORT_SELINUX
const char *realName = name;
#else
const char *realName = WORKSPACE_NAME_NORMAL;
#endif
WORKSPACE_RW_LOCK(g_paramWorkSpace);
HashNode *node = HashMapGet(g_paramWorkSpace.workSpaceHashHandle, (const void *)realName);
if (node != NULL) {
WORKSPACE_RW_UNLOCK(g_paramWorkSpace);
return 0;
}
PARAM_LOGV("AddWorkSpace %s spaceSize: %u onlyRead %s", name, spaceSize, onlyRead ? "true" : "false");
WorkSpace *workSpace = NULL;
do {
ret = -1;
const size_t size = strlen(realName) + 1;
workSpace = (WorkSpace *)malloc(sizeof(WorkSpace) + size);
PARAM_CHECK(workSpace != NULL, break, "Failed to create workspace for %s", realName);
workSpace->flags = 0;
workSpace->area = NULL;
ListInit(&workSpace->node);
ret = ParamStrCpy(workSpace->fileName, size, realName);
PARAM_CHECK(ret == 0, break, "Failed to copy file name %s", realName);
HASHMAPInitNode(&workSpace->hashNode);
ret = InitWorkSpace(workSpace, onlyRead, spaceSize);
PARAM_CHECK(ret == 0, break, "Failed to init workspace %s", realName);
ret = HashMapAdd(g_paramWorkSpace.workSpaceHashHandle, &workSpace->hashNode);
PARAM_CHECK(ret == 0, CloseWorkSpace(workSpace);
workSpace = NULL;
break, "Failed to add hash node");
ListAddTail(&g_paramWorkSpace.workSpaceList, &workSpace->node);
ret = 0;
workSpace = NULL;
} while (0);
if (workSpace != NULL) {
free(workSpace);
}
WORKSPACE_RW_UNLOCK(g_paramWorkSpace);
PARAM_LOGV("AddWorkSpace %s %s", name, ret == 0 ? "success" : "fail");
return ret;
}
static uint32_t ReadCommitId(ParamNode *entry)
{
uint32_t commitId = ATOMIC_LOAD_EXPLICIT(&entry->commitId, memory_order_acquire);
while (commitId & PARAM_FLAGS_MODIFY) {
futex_wait(&entry->commitId, commitId);
commitId = ATOMIC_LOAD_EXPLICIT(&entry->commitId, memory_order_acquire);
}
return commitId & PARAM_FLAGS_COMMITID;
}
static int ReadParamValue(ParamHandle handle, char *value, uint32_t *length)
{
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return -1, "Invalid space");
PARAM_CHECK(length != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid param");
ParamNode *entry = (ParamNode *)GetTrieNodeByHandle(handle);
if (entry == NULL) {
return -1;
}
if (value == NULL) {
*length = entry->valueLength + 1;
return 0;
}
PARAM_CHECK(*length > entry->valueLength, return PARAM_CODE_INVALID_PARAM,
"Invalid value len %u %u", *length, entry->valueLength);
uint32_t commitId = ReadCommitId(entry);
do {
int ret = ParamMemcpy(value, *length, entry->data + entry->keyLength + 1, entry->valueLength);
PARAM_CHECK(ret == 0, return -1, "Failed to copy value");
value[entry->valueLength] = '\0';
*length = entry->valueLength;
} while (commitId != ReadCommitId(entry));
return 0;
}
static int ReadParamName(ParamHandle handle, char *name, uint32_t length)
{
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return -1, "Invalid space");
PARAM_CHECK(name != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid param");
ParamNode *entry = (ParamNode *)GetTrieNodeByHandle(handle);
if (entry == NULL) {
return -1;
}
PARAM_CHECK(length > entry->keyLength, return -1, "Invalid param size %u %u", entry->keyLength, length);
int ret = ParamMemcpy(name, length, entry->data, entry->keyLength);
PARAM_CHECK(ret == 0, return PARAM_CODE_INVALID_PARAM, "Failed to copy name");
name[entry->keyLength] = '\0';
return 0;
}
INIT_INNER_API int CheckParamPermission(const ParamSecurityLabel *srcLabel, const char *name, uint32_t mode)
{
PARAM_CHECK(srcLabel != NULL, return DAC_RESULT_FORBIDED, "The srcLabel is null");
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return DAC_RESULT_FORBIDED, "Invalid space");
int ret = DAC_RESULT_PERMISSION;
// for root, all permission
if (srcLabel->cred.uid != 0) {
for (int i = 0; i < PARAM_SECURITY_MAX; i++) {
if (PARAM_TEST_FLAG(g_paramWorkSpace.securityLabel.flags[i], LABEL_ALL_PERMISSION)) {
continue;
}
ParamSecurityOps *ops = GetParamSecurityOps(i);
if (ops == NULL) {
continue;
}
if (ops->securityCheckParamPermission == NULL) {
ret = DAC_RESULT_FORBIDED;
continue;
}
ret = ops->securityCheckParamPermission(srcLabel, name, mode);
PARAM_LOGV("CheckParamPermission %s %s ret %d", ops->name, name, ret);
if (ret == DAC_RESULT_PERMISSION) {
break;
}
}
}
return ret;
}
int SystemReadParam(const char *name, char *value, uint32_t *len)
{
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return -1, "Invalid space");
PARAM_CHECK(name != NULL && len != NULL && strlen(name) > 0, return -1, "The name or value is null");
ParamHandle handle = 0;
int ret = ReadParamWithCheck(name, DAC_READ, &handle);
if (ret != PARAM_CODE_NOT_FOUND && ret != 0 && ret != PARAM_CODE_NODE_EXIST) {
PARAM_CHECK(ret == 0, return ret, "Forbid to get parameter %s", name);
}
return ReadParamValue(handle, value, len);
}
int SystemGetParameterCommitId(ParamHandle handle, uint32_t *commitId)
{
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return -1, "Invalid space");
PARAM_CHECK(handle != 0 && commitId != NULL, return -1, "The handle is null");
ParamNode *entry = (ParamNode *)GetTrieNodeByHandle(handle);
if (entry == NULL) {
return -1;
}
*commitId = ReadCommitId(entry);
return 0;
}
long long GetSystemCommitId(void)
{
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return 0, "Invalid space");
WorkSpace *space = GetWorkSpace(WORKSPACE_NAME_DAC);
if (space == NULL || space->area == NULL) {
return 0;
}
return ATOMIC_LOAD_EXPLICIT(&space->area->commitId, memory_order_acquire);
}
int SystemGetParameterName(ParamHandle handle, char *name, unsigned int len)
{
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return -1, "Invalid space");
PARAM_CHECK(name != NULL && handle != 0, return -1, "The name is null");
return ReadParamName(handle, name, len);
}
int SystemGetParameterValue(ParamHandle handle, char *value, unsigned int *len)
{
PARAM_WORKSPACE_CHECK(&g_paramWorkSpace, return -1, "Invalid space");
PARAM_CHECK(len != NULL && handle != 0, return -1, "The value is null");
return ReadParamValue(handle, value, len);
}
INIT_INNER_API ParamWorkSpace *GetParamWorkSpace(void)
{
return &g_paramWorkSpace;
}
INIT_LOCAL_API int ParamSprintf(char *buffer, size_t buffSize, const char *format, ...)
{
int len = -1;
va_list vargs;
va_start(vargs, format);
#ifdef PARAM_BASE
len = vsnprintf(buffer, buffSize - 1, format, vargs);
#else
len = vsnprintf_s(buffer, buffSize, buffSize - 1, format, vargs);
#endif
va_end(vargs);
return len;
}
INIT_LOCAL_API int ParamMemcpy(void *dest, size_t destMax, const void *src, size_t count)
{
int ret = 0;
#ifdef PARAM_BASE
memcpy(dest, src, count);
#else
ret = memcpy_s(dest, destMax, src, count);
#endif
return ret;
}
INIT_LOCAL_API int ParamStrCpy(char *strDest, size_t destMax, const char *strSrc)
{
int ret = 0;
#ifdef PARAM_BASE
if (strlen(strSrc) >= destMax) {
return -1;
}
size_t i = 0;
while ((i < destMax) && *strSrc != '\0') {
*strDest = *strSrc;
strDest++;
strSrc++;
}
*strDest = '\0';
#else
ret = strcpy_s(strDest, destMax, strSrc);
#endif
return ret;
}
\ No newline at end of file
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef BASE_STARTUP_PARAM_BASE_H
#define BASE_STARTUP_PARAM_BASE_H
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include "beget_ext.h"
#ifndef PARAM_BASE
#include "securec.h"
#endif
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
INIT_LOCAL_API int ParamSprintf(char *buffer, size_t buffSize, const char *format, ...);
INIT_LOCAL_API int ParamMemcpy(void *dest, size_t destMax, const void *src, size_t count);
INIT_LOCAL_API int ParamStrCpy(char *strDest, size_t destMax, const char *strSrc);
INIT_INNER_API int ReadFileInDir(const char *dirPath, const char *includeExt,
int (*processFile)(const char *fileName, void *context), void *context);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif // BASE_STARTUP_PARAM_BASE_H
\ No newline at end of file
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <ctype.h>
#include <limits.h>
#include "param_manager.h"
#include "param_trie.h"
#include "param_base.h"
INIT_LOCAL_API WorkSpace *GetWorkSpace(const char *name)
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
PARAM_CHECK(paramSpace->workSpaceHashHandle != NULL, return NULL, "Invalid workSpaceHashHandle");
char *tmpName = (char *)name;
#ifndef PARAM_SUPPORT_SELINUX
tmpName = WORKSPACE_NAME_NORMAL;
#else
if (strcmp(name, WORKSPACE_NAME_DAC) != 0) {
tmpName = (char *)GetSelinuxContent(name);
}
#endif
WorkSpace *space = NULL;
WORKSPACE_RD_LOCK(*paramSpace);
HashNode *node = HashMapGet(paramSpace->workSpaceHashHandle, (const void *)tmpName);
if (node != NULL) {
space = HASHMAP_ENTRY(node, WorkSpace, hashNode);
}
WORKSPACE_RW_UNLOCK(*paramSpace);
return (space != NULL && space->area != NULL) ? space : NULL;
}
static int CompareIndex(const HashNode *node, const void *key)
{
WorkSpace *workSpace = HASHMAP_ENTRY(node, WorkSpace, hashNode);
if (workSpace == NULL || workSpace->area == NULL) {
return 1;
}
uint32_t index = *(uint32_t *)key;
if (workSpace->area->startIndex <= index && index < (workSpace->area->startIndex + workSpace->area->dataSize)) {
return 0;
}
return 1;
}
INIT_LOCAL_API ParamTrieNode *GetTrieNodeByHandle(ParamHandle handle)
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
PARAM_ONLY_CHECK(handle != (ParamHandle)-1, return NULL);
int hashCode = ((handle >> 24) & 0x000000ff); // 24 left shift
uint32_t index = handle & 0x00ffffff;
WORKSPACE_RD_LOCK(*paramSpace);
HashNode *node = HashMapFind(paramSpace->workSpaceHashHandle, hashCode, (const void *)&index, CompareIndex);
if (node == NULL) {
WORKSPACE_RW_UNLOCK(*paramSpace);
PARAM_LOGV("Failed to get workspace for 0x%x index %d hashCode %d", handle, index, hashCode);
return NULL;
}
WorkSpace *workSpace = HASHMAP_ENTRY(node, WorkSpace, hashNode);
WORKSPACE_RW_UNLOCK(*paramSpace);
index = index - workSpace->area->startIndex;
return (ParamTrieNode *)GetTrieNode(workSpace, index);
}
INIT_LOCAL_API WorkSpace *GetFirstWorkSpace(void)
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
WorkSpace *workSpace = NULL;
WORKSPACE_RD_LOCK(*paramSpace);
ListNode *node = paramSpace->workSpaceList.next;
if (node != &paramSpace->workSpaceList) {
workSpace = HASHMAP_ENTRY(node, WorkSpace, node);
}
WORKSPACE_RW_UNLOCK(*paramSpace);
return workSpace;
}
INIT_LOCAL_API WorkSpace *GetNextWorkSpace(WorkSpace *curr)
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
PARAM_CHECK(curr != NULL, return NULL, "Invalid curr");
WorkSpace *workSpace = NULL;
WORKSPACE_RD_LOCK(*paramSpace);
ListNode *node = curr->node.next;
if (node != &paramSpace->workSpaceList) {
workSpace = HASHMAP_ENTRY(node, WorkSpace, node);
}
WORKSPACE_RW_UNLOCK(*paramSpace);
return workSpace;
}
INIT_LOCAL_API int ReadParamWithCheck(const char *name, uint32_t op, ParamHandle *handle)
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace");
PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space");
PARAM_CHECK(handle != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid param handle");
PARAM_CHECK(name != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid param name");
*handle = -1;
int ret = CheckParamPermission(GetParamSecurityLabel(), name, op);
PARAM_CHECK(ret == 0, return ret, "Forbid to access parameter %s", name);
WorkSpace *space = GetWorkSpace(name);
PARAM_CHECK(space != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid workSpace");
ParamTrieNode *node = FindTrieNode(space, name, strlen(name), NULL);
if (node != NULL && node->dataIndex != 0) {
*handle = GetParamHandle(space, node->dataIndex, name);
PARAM_LOGV("ReadParamWithCheck %s 0x%x %d", name, *handle, node->dataIndex);
return 0;
} else if (node != NULL) {
return PARAM_CODE_NODE_EXIST;
}
return PARAM_CODE_NOT_FOUND;
}
INIT_LOCAL_API int CheckParamValue(const ParamTrieNode *node, const char *name, const char *value)
{
if (IS_READY_ONLY(name)) {
PARAM_CHECK(strlen(value) < PARAM_CONST_VALUE_LEN_MAX,
return PARAM_CODE_INVALID_VALUE, "Illegal param value %s", value);
if (node != NULL && node->dataIndex != 0) {
PARAM_LOGE("Read-only param was already set %s", name);
return PARAM_CODE_READ_ONLY;
}
} else {
PARAM_CHECK(strlen(value) < PARAM_VALUE_LEN_MAX,
return PARAM_CODE_INVALID_VALUE, "Illegal param value %s", value);
}
return 0;
}
INIT_LOCAL_API int CheckParamName(const char *name, int info)
{
PARAM_CHECK(name != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid param");
size_t nameLen = strlen(name);
if (nameLen >= PARAM_NAME_LEN_MAX) {
return PARAM_CODE_INVALID_NAME;
}
if (strcmp(name, "#") == 0) {
return 0;
}
if (nameLen < 1 || name[0] == '.' || (!info && name[nameLen - 1] == '.')) {
PARAM_LOGE("CheckParamName %s %d", name, info);
return PARAM_CODE_INVALID_NAME;
}
/* Only allow alphanumeric, plus '.', '-', '@', ':', or '_' */
/* Don't allow ".." to appear in a param name */
for (size_t i = 0; i < nameLen; i++) {
if (name[i] == '.') {
if (name[i - 1] == '.') {
return PARAM_CODE_INVALID_NAME;
}
continue;
}
if (name[i] == '_' || name[i] == '-' || name[i] == '@' || name[i] == ':') {
continue;
}
if (isalnum(name[i])) {
continue;
}
return PARAM_CODE_INVALID_NAME;
}
return 0;
}
static int AddParam(WorkSpace *workSpace, const char *name, const char *value, uint32_t *dataIndex)
{
ParamTrieNode *node = AddTrieNode(workSpace, name, strlen(name));
PARAM_CHECK(node != NULL, return PARAM_CODE_REACHED_MAX, "Failed to add node");
ParamNode *entry = (ParamNode *)GetTrieNode(workSpace, node->dataIndex);
if (entry == NULL) {
uint32_t offset = AddParamNode(workSpace, name, strlen(name), value, strlen(value));
PARAM_CHECK(offset > 0, return PARAM_CODE_REACHED_MAX, "Failed to allocate name %s", name);
SaveIndex(&node->dataIndex, offset);
long long globalCommitId = ATOMIC_LOAD_EXPLICIT(&workSpace->area->commitId, memory_order_relaxed);
ATOMIC_STORE_EXPLICIT(&workSpace->area->commitId, ++globalCommitId, memory_order_release);
#ifdef PARAM_SUPPORT_SELINUX
WorkSpace *space = GetWorkSpace(WORKSPACE_NAME_DAC);
if (space != workSpace) { // dac commit is global commit
globalCommitId = ATOMIC_LOAD_EXPLICIT(&space->area->commitId, memory_order_relaxed);
ATOMIC_STORE_EXPLICIT(&space->area->commitId, ++globalCommitId, memory_order_release);
}
#endif
}
if (dataIndex != NULL) {
*dataIndex = node->dataIndex;
}
PARAM_LOGV("AddParam name %s value: %s", name, value);
return 0;
}
static int UpdateParam(const WorkSpace *workSpace, uint32_t *dataIndex, const char *name, const char *value)
{
ParamNode *entry = (ParamNode *)GetTrieNode(workSpace, *dataIndex);
PARAM_CHECK(entry != NULL, return PARAM_CODE_REACHED_MAX, "Failed to update param value %s %u", name, *dataIndex);
PARAM_CHECK(entry->keyLength == strlen(name), return PARAM_CODE_INVALID_NAME, "Failed to check name len %s", name);
uint32_t valueLen = strlen(value);
uint32_t commitId = ATOMIC_LOAD_EXPLICIT(&entry->commitId, memory_order_relaxed);
ATOMIC_STORE_EXPLICIT(&entry->commitId, commitId | PARAM_FLAGS_MODIFY, memory_order_relaxed);
long long globalCommitId = ATOMIC_LOAD_EXPLICIT(&workSpace->area->commitId, memory_order_relaxed);
if (entry->valueLength < PARAM_VALUE_LEN_MAX && valueLen < PARAM_VALUE_LEN_MAX) {
int ret = ParamMemcpy(entry->data + entry->keyLength + 1, PARAM_VALUE_LEN_MAX, value, valueLen + 1);
PARAM_CHECK(ret == 0, return PARAM_CODE_INVALID_VALUE, "Failed to copy value");
entry->valueLength = valueLen;
}
uint32_t flags = commitId & ~PARAM_FLAGS_COMMITID;
ATOMIC_STORE_EXPLICIT(&entry->commitId, (++commitId) | flags, memory_order_release);
ATOMIC_STORE_EXPLICIT(&workSpace->area->commitId, ++globalCommitId, memory_order_release);
#ifdef PARAM_SUPPORT_SELINUX
WorkSpace *space = GetWorkSpace(WORKSPACE_NAME_DAC);
if (space != workSpace) { // dac commit is global commit
globalCommitId = ATOMIC_LOAD_EXPLICIT(&space->area->commitId, memory_order_relaxed);
ATOMIC_STORE_EXPLICIT(&space->area->commitId, ++globalCommitId, memory_order_release);
}
#endif
PARAM_LOGV("UpdateParam name %s value: %s", name, value);
futex_wake(&entry->commitId, INT_MAX);
return 0;
}
INIT_LOCAL_API int WriteParam(const char *name, const char *value, uint32_t *dataIndex, int mode)
{
PARAM_LOGV("WriteParam %s", name);
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace");
PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space");
PARAM_CHECK(value != NULL && name != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid name or value");
WorkSpace *workSpace = GetWorkSpace(name);
PARAM_CHECK(workSpace != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid workSpace");
ParamTrieNode *node = FindTrieNode(workSpace, name, strlen(name), NULL);
int ret = 0;
if (node != NULL && node->dataIndex != 0) {
if (dataIndex != NULL) {
*dataIndex = node->dataIndex;
}
if ((mode & LOAD_PARAM_ONLY_ADD) == LOAD_PARAM_ONLY_ADD) {
return PARAM_CODE_READ_ONLY;
}
ret = CheckParamValue(node, name, value);
PARAM_CHECK(ret == 0, return ret, "Invalid param value param: %s=%s", name, value);
PARAMSPACE_AREA_RW_LOCK(workSpace);
ret = UpdateParam(workSpace, &node->dataIndex, name, value);
PARAMSPACE_AREA_RW_UNLOCK(workSpace);
} else {
ret = CheckParamValue(node, name, value);
PARAM_CHECK(ret == 0, return ret, "Invalid param value param: %s=%s", name, value);
PARAMSPACE_AREA_RW_LOCK(workSpace);
ret = AddParam((WorkSpace *)workSpace, name, value, dataIndex);
PARAMSPACE_AREA_RW_UNLOCK(workSpace);
}
return ret;
}
INIT_LOCAL_API int AddSecurityLabel(const ParamAuditData *auditData)
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace");
PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space");
PARAM_CHECK(auditData != NULL && auditData->name != NULL, return -1, "Invalid auditData");
WorkSpace *workSpace = GetWorkSpace(WORKSPACE_NAME_DAC);
PARAM_CHECK(workSpace != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid workSpace");
int ret = CheckParamName(auditData->name, 1);
PARAM_CHECK(ret == 0, return ret, "Illegal param name \"%s\"", auditData->name);
ParamTrieNode *node = FindTrieNode(workSpace, auditData->name, strlen(auditData->name), NULL);
if (node == NULL) {
node = AddTrieNode(workSpace, auditData->name, strlen(auditData->name));
}
PARAM_CHECK(node != NULL, return PARAM_CODE_REACHED_MAX, "Failed to add node %s", auditData->name);
uint32_t offset = node->labelIndex;
if (node->labelIndex == 0) { // can not support update for label
offset = AddParamSecruityNode(workSpace, auditData);
PARAM_CHECK(offset != 0, return PARAM_CODE_REACHED_MAX, "Failed to add label");
SaveIndex(&node->labelIndex, offset);
} else {
#ifdef STARTUP_INIT_TEST
ParamSecurityNode *label = (ParamSecurityNode *)GetTrieNode(workSpace, node->labelIndex);
label->mode = auditData->dacData.mode;
label->uid = auditData->dacData.uid;
label->gid = auditData->dacData.gid;
#endif
PARAM_LOGE("Error, repeat to add label for name %s", auditData->name);
}
PARAM_LOGV("AddSecurityLabel label %d gid %d uid %d mode %o name: %s", offset,
auditData->dacData.gid, auditData->dacData.uid, auditData->dacData.mode, auditData->name);
return 0;
}
INIT_LOCAL_API ParamSecurityOps *GetParamSecurityOps(int type)
{
PARAM_CHECK(type < PARAM_SECURITY_MAX, return NULL, "Invalid type");
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
return &paramSpace->paramSecurityOps[type];
}
INIT_LOCAL_API ParamSecurityLabel *GetParamSecurityLabel()
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
return &paramSpace->securityLabel;
}
int SpliteString(char *line, const char *exclude[], uint32_t count,
int (*result)(const uint32_t *context, const char *name, const char *value), const uint32_t *context)
{
// Skip spaces
char *name = line;
while (isspace(*name) && (*name != '\0')) {
name++;
}
// Empty line or Comment line
if (*name == '\0' || *name == '#') {
return 0;
}
char *value = name;
// find the first delimiter '='
while (*value != '\0') {
if (*value == '=') {
(*value) = '\0';
value = value + 1;
break;
}
value++;
}
// Skip spaces
char *tmp = name;
while ((tmp < value) && (*tmp != '\0')) {
if (isspace(*tmp)) {
(*tmp) = '\0';
break;
}
tmp++;
}
// empty name, just ignore this line
if (*value == '\0') {
return 0;
}
// Filter excluded parameters
for (uint32_t i = 0; i < count; i++) {
if (strncmp(name, exclude[i], strlen(exclude[i])) == 0) {
return 0;
}
}
// Skip spaces for value
while (isspace(*value) && (*value != '\0')) {
value++;
}
// Trim the ending spaces of value
char *pos = value + strlen(value);
pos--;
while (isspace(*pos) && pos > value) {
(*pos) = '\0';
pos--;
}
// Strip starting and ending " for value
if ((*value == '"') && (pos > value) && (*pos == '"')) {
value = value + 1;
*pos = '\0';
}
return result(context, name, value);
}
\ No newline at end of file
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -19,15 +19,15 @@
#include <unistd.h>
#include "init_param.h"
#include "param_base.h"
#include "param_osadp.h"
#include "param_utils.h"
int GetRealFileName(WorkSpace *workSpace, char *buffer, uint32_t size)
{
int ret = sprintf_s(buffer, size, "%s/%s", PARAM_STORAGE_PATH, workSpace->fileName);
int ret = ParamSprintf(buffer, size, "%s/%s", PARAM_STORAGE_PATH, workSpace->fileName);
PARAM_CHECK(ret > 0, return -1, "Failed to copy file name %s", workSpace->fileName);
buffer[ret] = '\0';
CheckAndCreateDir(buffer);
return 0;
}
......@@ -75,8 +75,8 @@ static uint32_t AllocateParamTrieNode(WorkSpace *workSpace, const char *key, uin
"Failed to allocate currOffset %d, dataSize %d", workSpace->area->currOffset, workSpace->area->dataSize);
ParamTrieNode *node = (ParamTrieNode *)(workSpace->area->data + workSpace->area->currOffset);
node->length = keyLen;
int ret = memcpy_s(node->key, keyLen, key, keyLen);
PARAM_CHECK(ret == EOK, return 0, "Failed to copy key");
int ret = ParamMemcpy(node->key, keyLen, key, keyLen);
PARAM_CHECK(ret == 0, return 0, "Failed to copy key");
node->key[keyLen] = '\0';
node->left = 0;
node->right = 0;
......@@ -99,7 +99,7 @@ static int CompareParamTrieNode(const ParamTrieNode *node, const char *key, uint
return strncmp(node->key, key, keyLen);
}
int InitWorkSpace(WorkSpace *workSpace, int onlyRead, uint32_t spaceSize)
INIT_LOCAL_API int InitWorkSpace(WorkSpace *workSpace, int onlyRead, uint32_t spaceSize)
{
PARAM_CHECK(workSpace != NULL, return PARAM_CODE_INVALID_NAME, "Invalid workSpace");
if (PARAM_TEST_FLAG(workSpace->flags, WORKSPACE_FLAGS_INIT)) {
......@@ -112,11 +112,11 @@ int InitWorkSpace(WorkSpace *workSpace, int onlyRead, uint32_t spaceSize)
PARAM_CHECK(ret == 0, return ret, "Failed to init workspace %s", workSpace->fileName);
PARAMSPACE_AREA_INIT_LOCK(workSpace);
PARAM_SET_FLAG(workSpace->flags, WORKSPACE_FLAGS_INIT);
PARAM_LOGI("InitWorkSpace %s", workSpace->fileName);
PARAM_LOGV("InitWorkSpace %s for %s", workSpace->fileName, (onlyRead == 0) ? "init" : "other");
return ret;
}
void CloseWorkSpace(WorkSpace *workSpace)
INIT_LOCAL_API void CloseWorkSpace(WorkSpace *workSpace)
{
PARAM_CHECK(workSpace != NULL, return, "The workspace is null");
PARAM_LOGI("CloseWorkSpace %s", workSpace->fileName);
......@@ -302,7 +302,7 @@ static int TraversalSubTrieNode(const WorkSpace *workSpace,
return 0;
}
int TraversalTrieNode(const WorkSpace *workSpace,
INIT_LOCAL_API int TraversalTrieNode(const WorkSpace *workSpace,
const ParamTrieNode *root, TraversalTrieNodePtr walkFunc, const void *cookie)
{
PARAM_CHECK(walkFunc != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid param");
......@@ -323,7 +323,7 @@ int TraversalTrieNode(const WorkSpace *workSpace,
return 0;
}
uint32_t AddParamSecruityNode(WorkSpace *workSpace, const ParamAuditData *auditData)
INIT_LOCAL_API uint32_t AddParamSecruityNode(WorkSpace *workSpace, const ParamAuditData *auditData)
{
PARAM_CHECK(workSpace != NULL && workSpace->area != NULL, return 0, "Invalid param");
PARAM_CHECK(auditData != NULL && auditData->name != NULL, return 0, "Invalid auditData");
......@@ -343,8 +343,8 @@ uint32_t AddParamSecruityNode(WorkSpace *workSpace, const ParamAuditData *auditD
node->length = 0;
#ifdef PARAM_SUPPORT_SELINUX
if (labelLen != 0) {
int ret = memcpy_s(node->data, labelLen, auditData->label, labelLen);
PARAM_CHECK(ret == EOK, return 0, "Failed to copy key");
int ret = ParamMemcpy(node->data, labelLen, auditData->label, labelLen);
PARAM_CHECK(ret == 0, return 0, "Failed to copy key");
node->data[labelLen] = '\0';
node->length = labelLen;
}
......@@ -355,7 +355,8 @@ uint32_t AddParamSecruityNode(WorkSpace *workSpace, const ParamAuditData *auditD
return offset;
}
uint32_t AddParamNode(WorkSpace *workSpace, const char *key, uint32_t keyLen, const char *value, uint32_t valueLen)
INIT_LOCAL_API uint32_t AddParamNode(WorkSpace *workSpace,
const char *key, uint32_t keyLen, const char *value, uint32_t valueLen)
{
PARAM_CHECK(workSpace != NULL && workSpace->area != NULL, return 0, "Invalid param");
PARAM_CHECK(key != NULL && value != NULL, return 0, "Invalid param");
......@@ -377,15 +378,15 @@ uint32_t AddParamNode(WorkSpace *workSpace, const char *key, uint32_t keyLen, co
node->keyLength = keyLen;
node->valueLength = valueLen;
int ret = sprintf_s(node->data, realLen - 1, "%s=%s", key, value);
PARAM_CHECK(ret > EOK, return 0, "Failed to sprint key and value");
int ret = ParamSprintf(node->data, realLen, "%s=%s", key, value);
PARAM_CHECK(ret > 0, return 0, "Failed to sprint key and value");
uint32_t offset = workSpace->area->currOffset;
workSpace->area->currOffset += realLen;
workSpace->area->paramNodeCount++;
return offset;
}
ParamTrieNode *GetTrieNode(const WorkSpace *workSpace, uint32_t offset)
INIT_LOCAL_API ParamTrieNode *GetTrieNode(const WorkSpace *workSpace, uint32_t offset)
{
PARAM_CHECK(workSpace != NULL && workSpace->area != NULL, return NULL, "Invalid param");
if (offset == 0 || offset > workSpace->area->dataSize) {
......@@ -394,13 +395,14 @@ ParamTrieNode *GetTrieNode(const WorkSpace *workSpace, uint32_t offset)
return (ParamTrieNode *)(workSpace->area->data + offset);
}
void SaveIndex(uint32_t *index, uint32_t offset)
INIT_LOCAL_API void SaveIndex(uint32_t *index, uint32_t offset)
{
PARAM_CHECK(index != NULL, return, "Invalid index");
*index = offset;
}
ParamTrieNode *FindTrieNode(WorkSpace *workSpace, const char *key, uint32_t keyLen, uint32_t *matchLabel)
INIT_LOCAL_API ParamTrieNode *FindTrieNode(WorkSpace *workSpace,
const char *key, uint32_t keyLen, uint32_t *matchLabel)
{
PARAM_CHECK(workSpace != NULL && workSpace->area != NULL, return NULL, "Invalid workSpace");
ParamTrieNode *node = NULL;
......
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -71,38 +71,6 @@ typedef struct {
PersistParamOps persistParamOps;
} ParamPersistWorkSpace;
typedef struct {
uint32_t flags;
int clientFd;
pthread_mutex_t mutex;
} ClientWorkSpace;
int InitParamWorkSpace(int onlyRead);
void CloseParamWorkSpace(void);
WorkSpace *GetWorkSpace(const char *name);
int AddWorkSpace(const char *name, int onlyRead, uint32_t spacesize);
WorkSpace *GetFirstWorkSpace(void);
WorkSpace *GetNextWorkSpace(WorkSpace *curr);
ParamTrieNode *GetTrieNodeByHandle(ParamHandle handle);
int CheckParameterSet(const char *name, const char *value, const ParamSecurityLabel *srcLabel, int *ctrlService);
int ReadParamWithCheck(const char *name, uint32_t op, ParamHandle *handle);
int ReadParamValue(ParamHandle handle, char *value, uint32_t *len);
int ReadParamName(ParamHandle handle, char *name, uint32_t len);
int ReadParamCommitId(ParamHandle handle, uint32_t *commitId);
int CheckParamValue(const ParamTrieNode *node, const char *name, const char *value);
int CheckParamName(const char *name, int paramInfo);
int CheckParamPermission(const ParamSecurityLabel *srcLabel, const char *name, uint32_t mode);
ParamNode *SystemCheckMatchParamWait(const char *name, const char *value);
int WriteParam(const char *name, const char *value, uint32_t *dataIndex, int onlyAdd);
int AddSecurityLabel(const ParamAuditData *auditData);
int LoadSecurityLabel(const char *fileName);
ParamSecurityLabel *GetParamSecurityLabel(void);
typedef void (*TraversalParamPtr)(ParamHandle handle, void *context);
typedef struct {
TraversalParamPtr traversalParamPtr;
......@@ -110,19 +78,37 @@ typedef struct {
char *prefix;
} ParamTraversalContext;
const char *GetSelinuxContent(const char *name);
void LoadParamFromBuild(void);
int LoadParamFromCmdLine(void);
void LoadSelinuxLabel(void);
int InitPersistParamWorkSpace(void);
void ClosePersistParamWorkSpace(void);
int WritePersistParam(const char *name, const char *value);
long long GetPersistCommitId(void);
void UpdatePersistCommitId(void);
int SysCheckParamExist(const char *name);
INIT_LOCAL_API int AddWorkSpace(const char *name, int onlyRead, uint32_t spacesize);
INIT_LOCAL_API WorkSpace *GetFirstWorkSpace(void);
INIT_LOCAL_API WorkSpace *GetNextWorkSpace(WorkSpace *curr);
INIT_LOCAL_API WorkSpace *GetWorkSpace(const char *name);
INIT_LOCAL_API ParamTrieNode *GetTrieNodeByHandle(ParamHandle handle);
INIT_LOCAL_API int ReadParamWithCheck(const char *name, uint32_t op, ParamHandle *handle);
INIT_LOCAL_API int CheckParamValue(const ParamTrieNode *node, const char *name, const char *value);
INIT_LOCAL_API int CheckParamName(const char *name, int paramInfo);
INIT_LOCAL_API ParamNode *SystemCheckMatchParamWait(const char *name, const char *value);
INIT_LOCAL_API int WriteParam(const char *name, const char *value, uint32_t *dataIndex, int onlyAdd);
INIT_LOCAL_API int AddSecurityLabel(const ParamAuditData *auditData);
INIT_LOCAL_API ParamSecurityLabel *GetParamSecurityLabel(void);
INIT_LOCAL_API void LoadParamFromBuild(void);
INIT_LOCAL_API int LoadParamFromCmdLine(void);
INIT_LOCAL_API int InitPersistParamWorkSpace(void);
INIT_LOCAL_API void ClosePersistParamWorkSpace(void);
INIT_LOCAL_API int WritePersistParam(const char *name, const char *value);
INIT_INNER_API int CheckParameterSet(const char *name, const char *value,
const ParamSecurityLabel *srcLabel, int *ctrlService);
INIT_INNER_API ParamHandle GetParamHandle(const WorkSpace *workSpace, uint32_t index, const char *name);
INIT_INNER_API int CheckParamPermission(const ParamSecurityLabel *srcLabel, const char *name, uint32_t mode);
INIT_INNER_API int InitParamWorkSpace(int onlyRead);
INIT_INNER_API void CloseParamWorkSpace(void);
INIT_INNER_API const char *GetSelinuxContent(const char *name);
INIT_INNER_API ParamWorkSpace *GetParamWorkSpace(void);
INIT_INNER_API int GetParamSecurityAuditData(const char *name, int type, ParamAuditData *auditData);
INIT_INNER_API int SysCheckParamExist(const char *name);
#ifdef STARTUP_INIT_TEST
ParamService *GetParamService();
#endif
......
......@@ -37,7 +37,6 @@
#endif
#include "param_utils.h"
#include "securec.h"
#ifdef __cplusplus
#if __cplusplus
......
......@@ -27,6 +27,8 @@ typedef struct ParamContextsList_ {
} ParamContextsList;
#endif
#include "beget_ext.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
......@@ -93,13 +95,6 @@ typedef struct {
} ParamSecurityOps;
typedef int (*RegisterSecurityOpsPtr)(ParamSecurityOps *ops, int isInit);
int GetParamSecurityAuditData(const char *name, int type, ParamAuditData *auditData);
int RegisterSecurityDacOps(ParamSecurityOps *ops, int isInit);
void LoadGroupUser(void);
void OpenPermissionWorkSpace(void);
typedef int (*SelinuxSetParamCheck)(const char *paraName, struct ucred *uc);
typedef struct SelinuxSpace_ {
void *selinuxHandle;
......@@ -111,15 +106,19 @@ typedef struct SelinuxSpace_ {
void (*destroyParamList)(ParamContextsList **list);
} SelinuxSpace;
#ifdef PARAM_SUPPORT_SELINUX
int RegisterSecuritySelinuxOps(ParamSecurityOps *ops, int isInit);
INIT_LOCAL_API int RegisterSecuritySelinuxOps(ParamSecurityOps *ops, int isInit);
#endif
#if defined STARTUP_INIT_TEST || defined LOCAL_TEST
ParamSecurityOps *GetParamSecurityOps(int type);
int RegisterSecurityOps(int onlyRead);
void SetSelinuxOps(const SelinuxSpace *space);
#endif
INIT_LOCAL_API ParamSecurityOps *GetParamSecurityOps(int type);
INIT_LOCAL_API void LoadGroupUser(void);
INIT_LOCAL_API int RegisterSecurityDacOps(ParamSecurityOps *ops, int isInit);
INIT_LOCAL_API void OpenPermissionWorkSpace(void);
#ifdef __cplusplus
#if __cplusplus
}
......
......@@ -22,7 +22,6 @@
#include "list.h"
#include "param_osadp.h"
#include "param_security.h"
#include "securec.h"
#ifdef __cplusplus
#if __cplusplus
......@@ -94,21 +93,23 @@ typedef struct WorkSpace_ {
char fileName[0];
} WorkSpace;
int InitWorkSpace(WorkSpace *workSpace, int onlyRead, uint32_t spaceSize);
void CloseWorkSpace(WorkSpace *workSpace);
INIT_LOCAL_API int InitWorkSpace(WorkSpace *workSpace, int onlyRead, uint32_t spaceSize);
INIT_LOCAL_API void CloseWorkSpace(WorkSpace *workSpace);
ParamTrieNode *GetTrieNode(const WorkSpace *workSpace, uint32_t offset);
void SaveIndex(uint32_t *index, uint32_t offset);
INIT_LOCAL_API ParamTrieNode *GetTrieNode(const WorkSpace *workSpace, uint32_t offset);
INIT_LOCAL_API void SaveIndex(uint32_t *index, uint32_t offset);
ParamTrieNode *AddTrieNode(WorkSpace *workSpace, const char *key, uint32_t keyLen);
ParamTrieNode *FindTrieNode(WorkSpace *workSpace, const char *key, uint32_t keyLen, uint32_t *matchLabel);
INIT_LOCAL_API ParamTrieNode *AddTrieNode(WorkSpace *workSpace, const char *key, uint32_t keyLen);
INIT_LOCAL_API ParamTrieNode *FindTrieNode(
WorkSpace *workSpace, const char *key, uint32_t keyLen, uint32_t *matchLabel);
typedef int (*TraversalTrieNodePtr)(const WorkSpace *workSpace, const ParamTrieNode *node, const void *cookie);
int TraversalTrieNode(const WorkSpace *workSpace,
INIT_LOCAL_API int TraversalTrieNode(const WorkSpace *workSpace,
const ParamTrieNode *subTrie, TraversalTrieNodePtr walkFunc, const void *cookie);
uint32_t AddParamSecruityNode(WorkSpace *workSpace, const ParamAuditData *auditData);
uint32_t AddParamNode(WorkSpace *workSpace, const char *key, uint32_t keyLen, const char *value, uint32_t valueLen);
INIT_LOCAL_API uint32_t AddParamSecruityNode(WorkSpace *workSpace, const ParamAuditData *auditData);
INIT_LOCAL_API uint32_t AddParamNode(WorkSpace *workSpace,
const char *key, uint32_t keyLen, const char *value, uint32_t valueLen);
#ifdef __cplusplus
#if __cplusplus
}
......
......@@ -18,10 +18,9 @@
#include <stddef.h>
#include <stdint.h>
#include "init_log.h"
#include "beget_ext.h"
#include "init_param.h"
#include "init_utils.h"
#include "securec.h"
#ifdef __cplusplus
#if __cplusplus
......@@ -131,7 +130,6 @@ typedef struct cmdLineInfo {
#define SUBSTR_INFO_DAC 1
#endif
char *GetServiceCtrlName(const char *name, const char *value);
int SpliteString(char *line, const char *exclude[], uint32_t count,
int (*result)(const uint32_t *context, const char *name, const char *value), const uint32_t *context);
#ifdef __cplusplus
......
......@@ -22,7 +22,6 @@
#include "list.h"
#include "param_message.h"
#include "param_utils.h"
#include "securec.h"
#include "trigger_checker.h"
#ifdef __cplusplus
......
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
import("//build/ohos.gni")
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/interfaces/service/include/param",
"//base/startup/init_lite/interfaces/service/param/include",
]
}
param_include_dirs = [
"//base/startup/init_lite/services/param/include",
"//base/startup/init_lite/services/param/adapter",
"//base/startup/init_lite/services/param/linux",
"//base/startup/init_lite/services/param/base",
"//base/startup/init_lite/services/include/param",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/init/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/loopevent/include",
"//third_party/bounds_checking_function/include",
"//third_party/cJSON",
"//utils/native/lite/include",
"//base/security/selinux/interfaces/policycoreutils/include",
]
param_service_sources = [
"//base/startup/init_lite/services/param/adapter/param_persistadp.c",
"//base/startup/init_lite/services/param/linux/param_message.c",
"//base/startup/init_lite/services/param/linux/param_msgadp.c",
"//base/startup/init_lite/services/param/linux/param_service.c",
"//base/startup/init_lite/services/param/manager/param_manager.c",
"//base/startup/init_lite/services/param/manager/param_persist.c",
"//base/startup/init_lite/services/param/manager/param_server.c",
]
param_trigger_sources = [
"//base/startup/init_lite/services/param/trigger/trigger_checker.c",
"//base/startup/init_lite/services/param/trigger/trigger_manager.c",
"//base/startup/init_lite/services/param/trigger/trigger_processor.c",
]
param_client_sources = [
"//base/startup/init_lite/services/param/linux/param_message.c",
"//base/startup/init_lite/services/param/linux/param_request.c",
"//base/startup/init_lite/services/param/manager/param_manager.c",
]
# only for linux
if (defined(ohos_lite)) {
static_library("param_init") {
defines = []
sources = param_service_sources
sources += param_trigger_sources
include_dirs = param_include_dirs
public_configs = [ ":exported_header_files" ]
if (defined(boot_kernel_extended_cmdline)) {
defines += [ "BOOT_EXTENDED_CMDLINE=\"${boot_kernel_extended_cmdline}\"" ]
}
defines += [
"_GNU_SOURCE",
"__LINUX__",
"INCREMENTAL_VERSION=\"${ohos_version}\"",
"BUILD_TYPE=\"${ohos_build_type}\"",
"BUILD_USER=\"${ohos_build_user}\"",
"BUILD_TIME=\"${ohos_build_time}\"",
"BUILD_HOST=\"${ohos_build_host}\"",
"BUILD_ROOTHASH=\"${ohos_build_roothash}\"",
]
}
static_library("param_client") {
include_dirs = param_include_dirs
sources = param_client_sources
cflags = [ "-fPIC" ]
public_configs = [ ":exported_header_files" ]
defines = [
"_GNU_SOURCE",
"__LINUX__",
]
}
} else {
ohos_static_library("param_init") {
sources = param_service_sources
sources += param_trigger_sources
include_dirs = param_include_dirs
public_configs = [ ":exported_header_files" ]
defines = [ "_GNU_SOURCE" ]
if (defined(boot_kernel_extended_cmdline)) {
defines += [ "BOOT_EXTENDED_CMDLINE=\"${boot_kernel_extended_cmdline}\"" ]
}
if ("${product_name}" == "m40") {
defines += [ "USE_MTK_EMMC" ]
}
if (build_selinux) {
defines += [ "PARAM_SUPPORT_SELINUX" ]
}
part_name = "init"
subsystem_name = "startup"
}
ohos_static_library("param_client") {
sources = param_client_sources
include_dirs = param_include_dirs
public_configs = [ ":exported_header_files" ]
defines = [
"_GNU_SOURCE",
"INIT_AGENT",
]
if (build_selinux) {
defines += [
"PARAM_SUPPORT_SELINUX",
"PARAMWORKSPACE_NEED_MUTEX",
]
}
part_name = "init"
subsystem_name = "startup"
}
}
......@@ -21,8 +21,8 @@
#include <sys/un.h>
#include <unistd.h>
#include "param_message.h"
#include "param_utils.h"
#include "securec.h"
int ConntectServer(int fd, const char *servername)
{
......
......@@ -22,7 +22,6 @@
#include "loop_event.h"
#include "param_osadp.h"
#include "param_utils.h"
#include "securec.h"
#ifdef __cplusplus
#if __cplusplus
......
......@@ -21,6 +21,7 @@
#include "param_message.h"
#include "param_utils.h"
#include "securec.h"
static const uint32_t RECV_BUFFER_MAX = 5 * 1024;
......
......@@ -14,6 +14,7 @@
*/
#include "param_osadp.h"
#include <errno.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/mman.h>
......
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -26,56 +26,33 @@
#include "param_manager.h"
#include "param_message.h"
#include "param_security.h"
#include "securec.h"
#define INVALID_SOCKET (-1)
#define INIT_PROCESS_PID 1
static const uint32_t RECV_BUFFER_MAX = 5 * 1024;
static atomic_uint g_requestId = ATOMIC_VAR_INIT(1);
static ClientWorkSpace g_clientSpace = {};
__attribute__((constructor(100))) static void ClientInit(void);
__attribute__((destructor)) static void ClientDeinit(void);
static int g_clientFd = INVALID_SOCKET;
pthread_mutex_t g_clientMutex = PTHREAD_MUTEX_INITIALIZER;
static int InitParamClient(void)
__attribute__((constructor)) static void ParameterInit(void)
{
if (getpid() == INIT_PROCESS_PID) {
PARAM_LOGI("Init process, do not init client");
return 0;
if (getpid() == 1) {
return;
}
if (PARAM_TEST_FLAG(g_clientSpace.flags, WORKSPACE_FLAGS_INIT)) {
return 0;
}
PARAM_LOGI("InitParamClient %p", &g_clientSpace);
pthread_mutex_init(&g_clientSpace.mutex, NULL);
g_clientSpace.clientFd = INVALID_SOCKET;
int ret = InitParamWorkSpace(1);
PARAM_CHECK(ret == 0, return -1, "Failed to init param workspace");
PARAM_SET_FLAG(g_clientSpace.flags, WORKSPACE_FLAGS_INIT);
PARAM_LOGI("InitParamClient %p finish", &g_clientSpace);
return 0;
}
void ClientInit(void)
{
PARAM_LOGV("ClientInit");
#ifndef STARTUP_INIT_TEST
(void)InitParamClient();
#endif
EnableInitLog(INIT_INFO);
PARAM_LOGI("ParameterInit ");
InitParamWorkSpace(1);
}
void ClientDeinit(void)
__attribute__((destructor)) static void ParameterDeinit(void)
{
PARAM_LOGI("ClientDeinit %p", &g_clientSpace);
#ifndef STARTUP_INIT_TEST
if (PARAM_TEST_FLAG(g_clientSpace.flags, WORKSPACE_FLAGS_INIT)) {
CloseParamWorkSpace();
}
#endif
if (g_clientSpace.clientFd != INVALID_SOCKET) {
close(g_clientSpace.clientFd);
PARAM_LOGI("ParameterDeinit ");
if (g_clientFd != INVALID_SOCKET) {
close(g_clientFd);
g_clientFd = INVALID_SOCKET;
}
PARAM_SET_FLAG(g_clientSpace.flags, 0);
pthread_mutex_destroy(&g_clientSpace.mutex);
PARAM_LOGI("ClientDeinit %p finish", &g_clientSpace);
CloseParamWorkSpace();
pthread_mutex_destroy(&g_clientMutex);
}
static int ProcessRecvMsg(const ParamMessage *recvMsg)
......@@ -99,7 +76,7 @@ static int ProcessRecvMsg(const ParamMessage *recvMsg)
return result;
}
static int ReadMessage(int fd, char *buffer, int timeout)
static int ReadMessage(int fd, char *buffer, uint32_t timeout)
{
int ret = 0;
uint32_t diff = 0;
......@@ -123,7 +100,7 @@ static int ReadMessage(int fd, char *buffer, int timeout)
}
} while (1);
if (ret != 0) {
PARAM_LOGE("ReadMessage fd: %d errno %d diff %u timeout %d ret %d", errno, diff, timeout, ret);
PARAM_LOGE("ReadMessage errno %d diff %u timeout %d ret %d", errno, diff, timeout, ret);
}
return ret;
}
......@@ -161,7 +138,6 @@ static int StartRequest(int clientFd, ParamMessage *request, int timeout)
int SystemSetParameter(const char *name, const char *value)
{
(void)InitParamClient();
PARAM_CHECK(name != NULL && value != NULL, return -1, "Invalid name or value");
int ctrlService = 0;
int ret = CheckParameterSet(name, value, GetParamSecurityLabel(), &ctrlService);
......@@ -179,13 +155,14 @@ int SystemSetParameter(const char *name, const char *value)
request->msgSize = offset + sizeof(ParamMessage);
request->id.msgId = atomic_fetch_add(&g_requestId, 1);
PARAM_LOGI("SystemSetParameter name %s", name);
int fd = INVALID_SOCKET;
pthread_mutex_lock(&g_clientSpace.mutex);
if (g_clientSpace.clientFd == INVALID_SOCKET) {
g_clientSpace.clientFd = GetClientSocket(DEFAULT_PARAM_SET_TIMEOUT);
pthread_mutex_lock(&g_clientMutex);
if (g_clientFd == INVALID_SOCKET) {
g_clientFd = GetClientSocket(DEFAULT_PARAM_SET_TIMEOUT);
}
fd = g_clientSpace.clientFd;
pthread_mutex_unlock(&g_clientSpace.mutex);
fd = g_clientFd;
pthread_mutex_unlock(&g_clientMutex);
PARAM_CHECK(fd > 0, return -1, "Failed to connect server for set %s", name);
ret = StartRequest(fd, request, DEFAULT_PARAM_SET_TIMEOUT);
free(request);
......@@ -195,7 +172,6 @@ int SystemSetParameter(const char *name, const char *value)
int SystemWaitParameter(const char *name, const char *value, int32_t timeout)
{
InitParamClient();
PARAM_CHECK(name != NULL, return -1, "Invalid name");
int ret = CheckParamName(name, 0);
PARAM_CHECK(ret == 0, return ret, "Illegal param name %s", name);
......@@ -246,13 +222,11 @@ int SystemWaitParameter(const char *name, const char *value, int32_t timeout)
int SystemCheckParamExist(const char *name)
{
(void)InitParamClient();
return SysCheckParamExist(name);
}
int SystemFindParameter(const char *name, ParamHandle *handle)
{
(void)InitParamClient();
PARAM_CHECK(name != NULL && handle != NULL, return -1, "The name or handle is null");
int ret = ReadParamWithCheck(name, DAC_READ, handle);
if (ret != PARAM_CODE_NOT_FOUND && ret != 0 && ret != PARAM_CODE_NODE_EXIST) {
......@@ -263,7 +237,6 @@ int SystemFindParameter(const char *name, ParamHandle *handle)
int WatchParamCheck(const char *keyprefix)
{
(void)InitParamClient();
PARAM_CHECK(keyprefix != NULL, return PARAM_CODE_INVALID_PARAM, "Invalid keyprefix");
int ret = CheckParamName(keyprefix, 0);
PARAM_CHECK(ret == 0, return ret, "Illegal param name %s", keyprefix);
......
......@@ -30,6 +30,7 @@
#include "param_manager.h"
#include "param_message.h"
#include "trigger_manager.h"
#include "securec.h"
static ParamService g_paramService = {};
......@@ -93,6 +94,7 @@ static int SendResponseMsg(ParamTaskPtr worker, const ParamMessage *msg, int res
response->result = result;
response->msg.msgSize = sizeof(ParamResponseMessage);
ParamTaskSendMsg(worker, (ParamMessage *)response);
PARAM_LOGI("SendResponseMsg msgId %d", msg->id.msgId);
return 0;
}
......@@ -170,6 +172,7 @@ static int HandleParamSet(const ParamTaskPtr worker, const ParamMessage *msg)
srcLabel.cred.uid = cr.uid;
srcLabel.cred.pid = cr.pid;
srcLabel.cred.gid = cr.gid;
PARAM_LOGI("HandleParamSet msgId %d pid %d key: %s", msg->id.msgId, cr.pid, msg->key);
int ret = SystemSetParam(msg->key, valueContent->content, &srcLabel);
return SendResponseMsg(worker, msg, ret);
}
......@@ -352,10 +355,27 @@ PARAM_STATIC int OnIncomingConnect(LoopHandle loop, TaskHandle server)
return 0;
}
static void LoadSelinuxLabel(void)
{
ParamWorkSpace *paramSpace = GetParamWorkSpace();
PARAM_CHECK(paramSpace != NULL, return, "Invalid paramSpace");
PARAM_WORKSPACE_CHECK(paramSpace, return, "Invalid space");
// load security label
#ifdef PARAM_SUPPORT_SELINUX
ParamSecurityOps *ops = GetParamSecurityOps(PARAM_SECURITY_SELINUX);
PARAM_LOGI("load selinux label %p", ops->securityGetLabel);
if (ops != NULL && ops->securityGetLabel != NULL) {
ops->securityGetLabel(NULL);
}
#endif
}
void InitParamService(void)
{
PARAM_LOGI("InitParamService pipe: %s.", PIPE_NAME);
CheckAndCreateDir(PIPE_NAME);
CheckAndCreateDir(PARAM_STORAGE_PATH"/");
// param space
int ret = InitParamWorkSpace(0);
PARAM_CHECK(ret == 0, return, "Init parameter workspace fail");
......@@ -371,17 +391,18 @@ void InitParamService(void)
ret = ParamServerCreate(&g_paramService.serverTask, &info);
PARAM_CHECK(ret == 0, return, "Failed to create server");
}
// init trigger space
ret = InitTriggerWorkSpace();
PARAM_CHECK(ret == 0, return, "Failed to init trigger");
RegisterTriggerExec(TRIGGER_PARAM_WAIT, ExecuteWatchTrigger_);
RegisterTriggerExec(TRIGGER_PARAM_WATCH, ExecuteWatchTrigger_);
// read selinux label
LoadSelinuxLabel();
// from cmdline
LoadParamFromCmdLine();
// from build
LoadParamFromBuild();
// init trigger space
ret = InitTriggerWorkSpace();
PARAM_CHECK(ret == 0, return, "Failed to init trigger");
RegisterTriggerExec(TRIGGER_PARAM_WAIT, ExecuteWatchTrigger_);
RegisterTriggerExec(TRIGGER_PARAM_WATCH, ExecuteWatchTrigger_);
}
int StartParamService(void)
......
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/startup/init_lite/begetd.gni")
param_comm_sources = [
"//base/startup/init_lite/services/param/manager/param_manager.c",
"//base/startup/init_lite/services/param/manager/param_server.c",
]
param_include_dirs = [
"//base/startup/init_lite/services/param/include",
"//base/startup/init_lite/services/param/adapter",
"//base/startup/init_lite/services/include/param",
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/init/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/services/loopevent/include",
"//third_party/bounds_checking_function/include",
"//third_party/cJSON",
"//utils/native/lite/include",
]
param_build_defines = [
"_GNU_SOURCE",
"INCREMENTAL_VERSION=\"${ohos_version}\"",
"BUILD_TYPE=\"${ohos_build_type}\"",
"BUILD_USER=\"${ohos_build_user}\"",
"BUILD_TIME=\"${ohos_build_time}\"",
"BUILD_HOST=\"${ohos_build_host}\"",
"BUILD_ROOTHASH=\"${ohos_build_roothash}\"",
]
if (enable_ohos_startup_init_feature_begetctl_liteos) {
action("lite_const_param_to") {
script = "//base/startup/init_lite/scripts/param_cfg_to_code.py"
args = [
"--source",
rebase_path(
"//base/startup/init_lite/services/etc_lite/param/ohos_const/ohos.para"),
"--dest_dir",
rebase_path("$root_out_dir/gen/init_lite/"),
"--priority",
"0",
]
outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
}
action("lite_ohos_param_to") {
script = "//base/startup/init_lite/scripts/param_cfg_to_code.py"
args = [
"--source",
rebase_path("//base/startup/init_lite/services/etc/param/ohos.para"),
"--dest_dir",
rebase_path("$root_out_dir/gen/init_lite/"),
"--priority",
"0",
]
outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
}
action("vendor_param_to") {
script = "//base/startup/init_lite/scripts/param_cfg_to_code.py"
args = [
"--source",
rebase_path("$ohos_product_adapter_dir/utils/sys_param/vendor.para"),
"--dest_dir",
rebase_path("$root_out_dir/gen/init_lite/"),
"--priority",
"1",
]
outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
}
}
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/interfaces/service/include/param",
"//base/startup/init_lite/interfaces/service/param/include",
]
}
static_library("param_init_lite") {
defines = []
deps = []
sources = param_comm_sources
include_dirs = param_include_dirs
defines += param_build_defines
public_configs = [ ":exported_header_files" ]
if (ohos_kernel_type == "liteos_a") {
sources += [
"//base/startup/init_lite/services/param/adapter/param_persistadp.c",
"//base/startup/init_lite/services/param/liteos/param_service.c",
"//base/startup/init_lite/services/param/manager/param_persist.c",
]
defines += [
"WORKSPACE_AREA_NEED_MUTEX",
"PARAM_PERSIST_SAVE_MUTEX",
"PARAMWORKSPACE_NEED_MUTEX",
"__LITEOS_A__",
"PARAM_SUPPORT_CYCLE_CHECK",
]
}
}
static_library("param_client_lite") {
sources = param_comm_sources
include_dirs = param_include_dirs
cflags = [ "-fPIC" ]
defines = param_build_defines
public_configs = [ ":exported_header_files" ]
if (ohos_kernel_type == "liteos_a") {
sources += [
"//base/startup/init_lite/services/param/adapter/param_persistadp.c",
"//base/startup/init_lite/services/param/liteos/param_client.c",
"//base/startup/init_lite/services/param/manager/param_persist.c",
]
defines += [
"__LITEOS_A__",
"WORKSPACE_AREA_NEED_MUTEX",
"PARAM_PERSIST_SAVE_MUTEX",
"PARAMWORKSPACE_NEED_MUTEX",
]
} else if (ohos_kernel_type == "liteos_m") {
sources += [
"//base/startup/init_lite/services/log/init_commlog.c",
"//base/startup/init_lite/services/param/base/param_base.c",
"//base/startup/init_lite/services/param/base/param_comm.c",
"//base/startup/init_lite/services/param/base/param_trie.c",
"//base/startup/init_lite/services/param/liteos/param_client.c",
"//base/startup/init_lite/services/param/manager/param_persist.c",
"//base/startup/init_lite/services/utils/init_hashmap.c",
"//base/startup/init_lite/services/utils/list.c",
]
if (enable_ohos_startup_init_lite_use_posix_file_api) {
sources += [
"//base/startup/init_lite/services/param/adapter/param_persistadp.c",
]
} else {
sources +=
[ "//base/startup/init_lite/services/param/liteos/param_hal.c" ]
}
defines += [
"__LITEOS_M__",
"WORKSPACE_AREA_NEED_MUTEX",
"PARAM_PERSIST_SAVE_MUTEX",
"PARAMWORKSPACE_NEED_MUTEX",
"DATA_PATH=\"${config_ohos_startup_init_lite_data_path}\"",
]
if (enable_ohos_startup_init_feature_begetctl_liteos) {
deps = [
":lite_const_param_to",
":lite_ohos_param_to",
":vendor_param_to",
]
include_dirs += [ "$root_out_dir/gen/init_lite" ]
defines += [ "PARAM_LOAD_CFG_FROM_CODE" ]
}
}
}
......@@ -19,23 +19,24 @@
#endif
#define MIN_SLEEP (100 * 1000)
static ClientWorkSpace g_clientSpace = {};
static int g_flags = 0;
__attribute__((constructor)) static void ClientInit(void);
__attribute__((destructor)) static void ClientDeinit(void);
static int InitParamClient(void)
{
if (PARAM_TEST_FLAG(g_clientSpace.flags, WORKSPACE_FLAGS_INIT)) {
if (PARAM_TEST_FLAG(g_flags, WORKSPACE_FLAGS_INIT)) {
return 0;
}
#ifdef __LITEOS_M__
int ret = InitParamWorkSpace(0);
#else
EnableInitLog(INIT_INFO);
int ret = InitParamWorkSpace(1);
#endif
PARAM_LOGV("InitParamClient");
PARAM_CHECK(ret == 0, return -1, "Failed to init param workspace");
PARAM_SET_FLAG(g_clientSpace.flags, WORKSPACE_FLAGS_INIT);
PARAM_SET_FLAG(g_flags, WORKSPACE_FLAGS_INIT);
// init persist to save
InitPersistParamWorkSpace();
#ifdef PARAM_LOAD_CFG_FROM_CODE
......@@ -65,10 +66,10 @@ void ClientInit(void)
void ClientDeinit(void)
{
if (PARAM_TEST_FLAG(g_clientSpace.flags, WORKSPACE_FLAGS_INIT)) {
if (PARAM_TEST_FLAG(g_flags, WORKSPACE_FLAGS_INIT)) {
CloseParamWorkSpace();
}
PARAM_SET_FLAG(g_clientSpace.flags, 0);
PARAM_SET_FLAG(g_flags, 0);
}
int SystemSetParameter(const char *name, const char *value)
......
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "param_osadp.h"
#include "param_security.h"
static int InitLocalSecurityLabel(ParamSecurityLabel *security, int isInit)
{
UNUSED(isInit);
PARAM_CHECK(security != NULL, return -1, "Invalid security");
#if defined __LITEOS_A__
security->cred.pid = getpid();
security->cred.uid = getuid();
security->cred.gid = 0;
#else
security->cred.pid = 0;
security->cred.uid = 0;
security->cred.gid = 0;
#endif
security->flags[PARAM_SECURITY_DAC] |= LABEL_CHECK_IN_ALL_PROCESS;
return 0;
}
static int FreeLocalSecurityLabel(ParamSecurityLabel *srcLabel)
{
return 0;
}
static int DacGetParamSecurityLabel(const char *path)
{
UNUSED(path);
return 0;
}
static int CheckFilePermission(const ParamSecurityLabel *localLabel, const char *fileName, int flags)
{
UNUSED(flags);
PARAM_CHECK(localLabel != NULL && fileName != NULL, return -1, "Invalid param");
return 0;
}
static int DacCheckParamPermission(const ParamSecurityLabel *srcLabel, const char *name, uint32_t mode)
{
#if defined(__LITEOS_A__)
uid_t uid = getuid();
return uid <= SYS_UID_INDEX ? DAC_RESULT_PERMISSION : DAC_RESULT_FORBIDED;
#endif
#if defined(__LITEOS_M__)
return DAC_RESULT_PERMISSION;
#endif
return DAC_RESULT_PERMISSION;
}
INIT_LOCAL_API int RegisterSecurityDacOps(ParamSecurityOps *ops, int isInit)
{
PARAM_CHECK(ops != NULL, return -1, "Invalid param");
PARAM_LOGV("RegisterSecurityDacOps %d", isInit);
int ret = strcpy_s(ops->name, sizeof(ops->name), "dac");
ops->securityGetLabel = NULL;
ops->securityInitLabel = InitLocalSecurityLabel;
ops->securityCheckFilePermission = CheckFilePermission;
ops->securityCheckParamPermission = DacCheckParamPermission;
ops->securityFreeLabel = FreeLocalSecurityLabel;
if (isInit) {
ops->securityGetLabel = DacGetParamSecurityLabel;
}
return ret;
}
INIT_LOCAL_API void LoadGroupUser(void)
{
}
\ No newline at end of file
/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
......@@ -14,6 +14,7 @@
*/
#include "param_osadp.h"
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>
......@@ -32,6 +33,7 @@
#include <time.h>
#include "param_security.h"
#include "securec.h"
#define NSEC_PER_MSEC 1000000LL
#define MSEC_PER_SEC 1000LL
......@@ -309,75 +311,6 @@ int ParamMutexDelete(ParamMutex *mutex)
}
#endif
#ifndef STARTUP_INIT_TEST
static int InitLocalSecurityLabel(ParamSecurityLabel *security, int isInit)
{
UNUSED(isInit);
PARAM_CHECK(security != NULL, return -1, "Invalid security");
#if defined __LITEOS_A__
security->cred.pid = getpid();
security->cred.uid = getuid();
security->cred.gid = 0;
#else
security->cred.pid = 0;
security->cred.uid = 0;
security->cred.gid = 0;
#endif
security->flags[PARAM_SECURITY_DAC] |= LABEL_CHECK_IN_ALL_PROCESS;
return 0;
}
static int FreeLocalSecurityLabel(ParamSecurityLabel *srcLabel)
{
return 0;
}
static int DacGetParamSecurityLabel(const char *path)
{
UNUSED(path);
return 0;
}
static int CheckFilePermission(const ParamSecurityLabel *localLabel, const char *fileName, int flags)
{
UNUSED(flags);
PARAM_CHECK(localLabel != NULL && fileName != NULL, return -1, "Invalid param");
return 0;
}
static int DacCheckParamPermission(const ParamSecurityLabel *srcLabel, const char *name, uint32_t mode)
{
#if defined(__LITEOS_A__)
uid_t uid = getuid();
return uid <= SYS_UID_INDEX ? DAC_RESULT_PERMISSION : DAC_RESULT_FORBIDED;
#endif
#if defined(__LITEOS_M__)
return DAC_RESULT_PERMISSION;
#endif
return DAC_RESULT_PERMISSION;
}
int RegisterSecurityDacOps(ParamSecurityOps *ops, int isInit)
{
PARAM_CHECK(ops != NULL, return -1, "Invalid param");
PARAM_LOGV("RegisterSecurityDacOps %d", isInit);
int ret = strcpy_s(ops->name, sizeof(ops->name), "dac");
ops->securityGetLabel = NULL;
ops->securityInitLabel = InitLocalSecurityLabel;
ops->securityCheckFilePermission = CheckFilePermission;
ops->securityCheckParamPermission = DacCheckParamPermission;
ops->securityFreeLabel = FreeLocalSecurityLabel;
if (isInit) {
ops->securityGetLabel = DacGetParamSecurityLabel;
}
return ret;
}
void LoadGroupUser(void)
{
}
#endif
uint32_t Difftime(time_t curr, time_t base)
{
#ifndef __LITEOS_M__
......
......@@ -20,6 +20,8 @@
void InitParamService(void)
{
PARAM_LOGI("InitParamService");
CheckAndCreateDir(PARAM_STORAGE_PATH"/");
CheckAndCreateDir(DATA_PATH);
// param space
int ret = InitParamWorkSpace(0);
PARAM_CHECK(ret == 0, return, "Init parameter workspace fail");
......
此差异已折叠。
此差异已折叠。
......@@ -18,6 +18,7 @@
#include <ctype.h>
#include "init_param.h"
#include "trigger_manager.h"
#include "securec.h"
#define MAX_CALC_PARAM 100
// 申请整块能存作为计算的节点
......
......@@ -26,6 +26,7 @@
#include "init_cmds.h"
#include "param_manager.h"
#include "trigger_checker.h"
#include "securec.h"
int AddCommand(JobNode *trigger, uint32_t cmdKeyIndex, const char *content)
{
......
......@@ -24,6 +24,7 @@
#include "param_utils.h"
#include "trigger_checker.h"
#include "trigger_manager.h"
#include "securec.h"
#define MAX_TRIGGER_COUNT_RUN_ONCE 20
static TriggerWorkSpace g_triggerWorkSpace = {};
......
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
......@@ -11,49 +11,32 @@
# See the License for the specific language governing permissions and
# limitations under the License.
if (defined(ohos_lite)) {
static_library("libinit_tools") {
sources = [
"//base/startup/init_lite/services/utils/init_hashmap.c",
"//base/startup/init_lite/services/utils/init_utils.c",
"//base/startup/init_lite/services/utils/list.c",
]
config("exported_header_files") {
visibility = [ ":*" ]
include_dirs = [
"//base/startup/init_lite/services/include",
"//base/startup/init_lite/services/log",
]
}
if (defined(ohos_lite)) {
static_library("libinit_utils") {
sources = [ "init_utils.c" ]
public_configs = [ ":exported_header_files" ]
include_dirs = [
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include",
"//third_party/bounds_checking_function/include",
]
defines = [ "_GNU_SOURCE" ]
}
} else {
import("//build/ohos.gni")
ohos_static_library("libinit_tools") {
sources = [
"//base/startup/init_lite/services/utils/init_hashmap.c",
"//base/startup/init_lite/services/utils/list.c",
]
include_dirs = [
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include",
]
defines = [ "_GNU_SOURCE" ]
part_name = "init"
}
ohos_static_library("libinit_utils") {
sources = [ "init_utils.c" ]
public_configs = [ ":exported_header_files" ]
include_dirs = [
"//third_party/bounds_checking_function/include",
"//base/startup/init_lite/services/log",
"//base/startup/init_lite/interfaces/innerkits/include",
"//base/startup/init_lite/services/include",
"//third_party/bounds_checking_function/include",
]
defines = [ "_GNU_SOURCE" ]
part_name = "init"
......
......@@ -13,6 +13,7 @@
* limitations under the License.
*/
#include "init_hashmap.h"
#include "init_log.h"
typedef struct {
HashNodeCompare nodeCompare;
......@@ -39,8 +40,7 @@ int32_t HashMapCreate(HashMapHandle *handle, const HashInfo *info)
tab->keyCompare = info->keyCompare;
tab->nodeHash = info->nodeHash;
tab->nodeFree = info->nodeFree;
tab->tableId = g_tableId;
INIT_LOGI("Create hash map success %d", g_tableId);
tab->tableId = g_tableId++;
*handle = (HashMapHandle)tab;
return 0;
}
......
......@@ -438,7 +438,7 @@ int ReadFileInDir(const char *dirPath, const char *includeExt,
processFile(fileName, context);
}
}
INIT_LOGI("ReadFileInDir dirPath %s %d", dirPath, count);
INIT_LOGV("ReadFileInDir dirPath %s %d", dirPath, count);
free(fileName);
closedir(pDir);
return 0;
......
......@@ -22,8 +22,7 @@ ohos_executable("client") {
"//third_party/bounds_checking_function/include",
]
deps = [
"//base/startup/init_lite/interfaces/innerkits/socket:libsocket_static",
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//third_party/bounds_checking_function:libsec_static",
]
install_images = [ "system" ]
......@@ -60,8 +59,7 @@ ohos_executable("server") {
"//third_party/bounds_checking_function/include",
]
deps = [
"//base/startup/init_lite/interfaces/innerkits/socket:libsocket_static",
"//base/startup/init_lite/services/log:init_log",
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//third_party/bounds_checking_function:libsec_static",
]
install_images = [ "system" ]
......
此差异已折叠。
......@@ -32,7 +32,6 @@ ohos_shared_library("libparamtestmodule") {
deps = [
"//base/startup/init_lite/interfaces/innerkits:libbegetutil",
"//base/startup/init_lite/services/log:agent_log",
"//base/startup/init_lite/services/utils:libinit_tools",
"//third_party/bounds_checking_function:libsec_shared",
]
......
此差异已折叠。
......@@ -69,7 +69,9 @@ HWTEST_F(DeviceInfoUnittest, GetDevUdidTest, TestSize.Level1)
ASSERT_NE(nullptr, samgr);
OHOS::device_info::DeviceInfoKits &instance = OHOS::device_info::DeviceInfoKits::GetInstance();
auto deathRecipientPtr = instance.GetDeathRecipient();
deathRecipientPtr->OnRemoteDied(object);
if (deathRecipientPtr) {
deathRecipientPtr->OnRemoteDied(object);
}
}
HWTEST_F(DeviceInfoUnittest, StubTest, TestSize.Level1)
{
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册