diff --git a/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service-Add-to-build-system.patch b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service-Add-to-build-system.patch new file mode 100644 index 0000000000000000000000000000000000000000..a0cd282f4d45220d3c1bd9ac90f7b6983fd05228 --- /dev/null +++ b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service-Add-to-build-system.patch @@ -0,0 +1,110 @@ +# SPDX-FileCopyrightText: Huawei Inc. +# +# SPDX-License-Identifier: Apache-2.0 + +Patch for //base/startup/init_lite + +param_service: Add to build system + +In OpenHarmony 3.0 Param Service is a part of the whole Init system. This +service is required by many other services. Therefore we have to split out +the service as an independent from Init when Init is not used. + +Signed-off-by: Robert Drab <robert.drab@huawei.com> +Upstream-Status: Inappropriate + +diff --git a/services/BUILD.gn b/services/BUILD.gn +index 1994c2ef..e094f7ce 100644 +--- a/services/BUILD.gn ++++ b/services/BUILD.gn +@@ -85,6 +85,25 @@ if (defined(ohos_lite)) { + } else { + import("//build/ohos.gni") + ++ ohos_executable("param_service") { ++ sources = [ "param/src/param_service_main.c" ] ++ include_dirs = [ ++ "//base/startup/init_lite/services/include/param", ++ "//base/startup/init_lite/services/log", ++ "//third_party/cJSON", ++ ] ++ deps = [ ++ "//base/startup/init_lite/services/log:init_log", ++ "//base/startup/init_lite/services/param:paramservice", ++ ] ++ install_images = [ ++ "system", ++ "updater", ++ ] ++ install_enable = true ++ part_name = "startup_l2" ++ } ++ + ohos_executable("init") { + sources = [ + "src/device.c", +@@ -132,6 +151,7 @@ if (defined(ohos_lite)) { + + group("startup_init") { + deps = [ ++ ":param_service", + ":init", + ":init_etc", + "//base/startup/init_lite/interfaces/innerkits/socket:libsocket", +@@ -180,7 +200,7 @@ if (defined(ohos_lite)) { + + ohos_prebuilt_etc("ohos.para") { + source = "//base/startup/init_lite/services/etc/ohos.para" +- part_name = "init" ++ part_name = "startup_l2" + } + + group("init_etc") { +diff --git a/services/param/BUILD.gn b/services/param/BUILD.gn +index 07e1d278..ba420b66 100644 +--- a/services/param/BUILD.gn ++++ b/services/param/BUILD.gn +@@ -83,7 +83,7 @@ ohos_executable("getparam") { + "//third_party/cJSON:cjson_static", + ] + install_enable = true +- part_name = "init" ++ part_name = "startup_l2" + } + + ohos_executable("setparam") { +@@ -100,5 +100,5 @@ ohos_executable("setparam") { + "//third_party/cJSON:cjson_static", + ] + install_enable = true +- part_name = "init" ++ part_name = "startup_l2" + } +diff --git a/services/param/service/param_service.c b/services/param/service/param_service.c +index cd5d93be..03a10ae0 100644 +--- a/services/param/service/param_service.c ++++ b/services/param/service/param_service.c +@@ -131,7 +131,11 @@ static int ProcessParamSet(const RequestMsg *msg) + ret = WritePersistParam(info[0].value, info[1].value); + PARAM_CHECK(ret == 0, return ret, "Failed to set param"); + // notify event to process trigger ++// TODO: add some flag or something instead of if 0 ++// The following call is a part of OpenHarmony init system ++#if 0 + PostTrigger(EVENT_PROPERTY, msg->content, msg->contentSize); ++#endif + return 0; + } + +@@ -267,7 +271,11 @@ int SystemWriteParam(const char *name, const char *value) + PARAM_CHECK(ret == 0, return ret, "Failed to set persist param %s", name); + + // notify event to process trigger ++// TODO: add some flag or something instead of if 0 ++// The following call is a part of OpenHarmony init system ++#if 0 + PostParamTrigger(name, value); ++#endif + return ret; + } + diff --git a/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service-Add-to-startup-l2-part.patch b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service-Add-to-startup-l2-part.patch new file mode 100644 index 0000000000000000000000000000000000000000..1160f798c69f2de0e8e561792b22cea6ef57f513 --- /dev/null +++ b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service-Add-to-startup-l2-part.patch @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: Huawei Inc. +# +# SPDX-License-Identifier: Apache-2.0 + +Patch for //base/startup/appspawn_standard + +appspawn_standard: Add param_service to startup l2 part + +In OpenHarmony 3.0 param service is a part of init part which is we don not +use and therefore we have to add it to a different part. + +Signed-off-by: Robert Drab <robert.drab@huawei.com> +Upstream-Status: Inappropriate + +diff --git a/ohos.build b/ohos.build +index 650790f..85b3bde 100644 +--- a/ohos.build ++++ b/ohos.build +@@ -9,7 +9,11 @@ + "//base/startup/appspawn_standard:appspawn.rc", + "//base/startup/syspara_lite/interfaces/innerkits/native/syspara:syspara", + "//base/startup/syspara_lite/interfaces/kits/js:deviceinfo", +- "//base/startup/syspara_lite/interfaces/kits/js:systemparameter" ++ "//base/startup/syspara_lite/interfaces/kits/js:systemparameter", ++ "//base/startup/init_lite/services:param_service", ++ "//base/startup/init_lite/services:ohos.para", ++ "//base/startup/init_lite/services/param:getparam", ++ "//base/startup/init_lite/services/param:setparam" + ], + "inner_kits": [ + { diff --git a/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service.c-Fix-stopping-param_service.patch b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service.c-Fix-stopping-param_service.patch new file mode 100644 index 0000000000000000000000000000000000000000..77a7cb1a2ffd4a4db8e473b39694d030eff713b9 --- /dev/null +++ b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service.c-Fix-stopping-param_service.patch @@ -0,0 +1,74 @@ +# SPDX-FileCopyrightText: Huawei Inc. +# +# SPDX-License-Identifier: Apache-2.0 + +Patch for //base/startup/init_lite + +param_service.c: Fix stopping param_service + +StopParamService() have to be called from the uv_loop context to be able to +successfully stop the uv_loop. To achieve that we need an uv_idle callback. + +Signed-off-by: Robert Drab <robert.drab@huawei.com> +Upstream-Status: Pending + +diff --git a/services/param/service/param_service.c b/services/param/service/param_service.c +index cd5d93be..6634fa3d 100644 +--- a/services/param/service/param_service.c ++++ b/services/param/service/param_service.c +@@ -241,12 +241,36 @@ void StopParamService() + PARAM_LOGI("StopParamService."); + } + ++/* ++ * uv_stop() must be called from the uv_loop context and therefore ++ * StopParamService() cannot do it's job when called from the signal handler. ++ * We need a uv_idle callback that will call StopParamService() which calls ++ * uv_stop() from the uv_loop context to actually stop the param service loop. ++ */ ++int g_paramService_asyncStopRequest = 0; ++ ++int ParamServiceAsyncStopRequest() { ++ g_paramService_asyncStopRequest = 0; ++ return 0; ++} ++ ++void ParamServiceLoopIdleCallback(uv_idle_t *handle) { ++ if (g_paramService_asyncStopRequest) { ++ PARAM_LOGI("%s(): %d Stopping param service...", __FUNCTION__, __LINE__); ++ StopParamService(); ++ } ++} ++ + int StartParamService() + { + PARAM_LOGI("StartParamService."); + uv_fs_t req; + uv_fs_unlink(uv_default_loop(), &req, PIPE_NAME, NULL); + ++ uv_idle_t idler; ++ uv_idle_init(uv_default_loop(), &idler); ++ uv_idle_start(&idler, ParamServiceLoopIdleCallback); ++ + uv_pipe_t pipeServer; + int ret = uv_pipe_init(uv_default_loop(), &pipeServer, 0); + PARAM_CHECK(ret == 0, return ret, "Failed to uv_pipe_init %d", ret); +diff --git a/services/include/param/init_param.h b/services/include/param/init_param.h +index 73a06795..4574cbaa 100644 +--- a/services/include/param/init_param.h ++++ b/services/include/param/init_param.h +@@ -51,6 +51,14 @@ int StartParamService(); + */ + void StopParamService(); + ++/** ++ * ParamServiceAsyncStopRequest interface ++ * Allows stopping ParamService from outside event loop context, ++ * e.g. from signal handler ++ * ++ */ ++int ParamServiceAsyncStopRequest(void); ++ + /** + * Init æŽ¥å£ + * åŠ è½½é»˜è®¤çš„å‚æ•°å€¼ diff --git a/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service_main.c b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service_main.c new file mode 100644 index 0000000000000000000000000000000000000000..5cd2a6c2cff59b6b09ddb756e9561c9d841b6332 --- /dev/null +++ b/recipes-openharmony/openharmony/openharmony-standard-3.0/param_service_main.c @@ -0,0 +1,66 @@ +/* + * SPDX-FileCopyrightText: Huawei Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include <init_log.h> +#include <init_param.h> +#include <errno.h> +#include <unistd.h> + +#include <signal.h> + +void sig_handler(int signum) { + INIT_LOGI("Requesting param service to stop..."); + ParamServiceAsyncStopRequest(); +} + +char *parse_args(int argc, char **argv) { + char *fpath = NULL; + + if (argc == 2 && argv[1]) { + if (access(argv[1], R_OK) == 0) { + fpath = argv[1]; + } + } + + return fpath; +} + +int main(int argc, char **argv) +{ + char *params_fpath = "/system/etc/ohos.para"; + + if (argc > 1) + params_fpath = parse_args(argc, argv); + + if (!params_fpath) { + INIT_LOGI("Invalid params file path!"); + return -EINVAL; + } + + InitParamService(); + int ret = LoadDefaultParams(params_fpath); + if (ret) { + INIT_LOGE("Failed to load default params! Error code: %d", ret); + } + ret = LoadPersistParams(); + if (ret) { + INIT_LOGE("Failed to load persist params! Error code: %d", ret); + } + + struct sigaction action = { 0 }; + action.sa_handler = sig_handler; + + sigaction(SIGTERM, &action, NULL); + sigaction(SIGINT, &action, NULL); + sigaction(SIGHUP, &action, NULL); + + // Following call spins up libuv event loop that will keep service running + INIT_LOGI("Starting param service..."); + StartParamService(); + INIT_LOGI("Param service stopped."); + + return 0; +} diff --git a/recipes-openharmony/openharmony/openharmony-standard_3.0.bb b/recipes-openharmony/openharmony/openharmony-standard_3.0.bb index 1f8aaf1702c018d55c80ea799d0716d45f7aa03f..137d993e8b3913795d8009966456e21a873f0495 100644 --- a/recipes-openharmony/openharmony/openharmony-standard_3.0.bb +++ b/recipes-openharmony/openharmony/openharmony-standard_3.0.bb @@ -61,6 +61,11 @@ SRC_URI += "file://appspawn-procps.patch;patchdir=${S}/base/startup/appspawn_sta SRC_URI += "file://base_startup_appspawn_standard-disable-longProcName-resetting.patch;patchdir=${S}/base/startup/appspawn_standard" SRC_URI += "file://test_xts_acts-Align-tests-list-with-mandatory-set.patch;patchdir=${S}/test/xts/acts" +SRC_URI += "file://param_service_main.c;subdir=${S}/base/startup/init_lite/services/param/src" +SRC_URI += "file://param_service-Add-to-build-system.patch;patchdir=${S}/base/startup/init_lite" +SRC_URI += "file://param_service.c-Fix-stopping-param_service.patch;patchdir=${S}/base/startup/init_lite" +SRC_URI += "file://param_service-Add-to-startup-l2-part.patch;patchdir=${S}/base/startup/appspawn_standard" + inherit python3native gn_base ptest B = "${S}/out/ohos-arm-release"