From: SangYoun Kwak Date: Tue, 4 Mar 2025 09:25:00 +0000 (+0900) Subject: hal-backend-service: Change to use proc_name from the commandline argument X-Git-Tag: accepted/tizen/unified/20250322.012724~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=729d77e29a96e38577eba2fcadfe82bbc8560c0f;p=platform%2Fhal%2Fapi%2Fcommon.git hal-backend-service: Change to use proc_name from the commandline argument The proc_name for rpc communication should be unique through the whole system. Also, proc_name should be shared with proxy process, so it should be come from out of the process. To accomplish this, hal-backend-service is changed to get commandline argument with option --stub-proc-name and use it as a proc_name. Usage: hal-backend-service --stub-proc-name [ ... ] Change-Id: If39d1e57b7f43e0c83e6143cbe7e3854821bc8aa Signed-off-by: SangYoun Kwak --- diff --git a/hal-backend-service/hal-backend-service.c b/hal-backend-service/hal-backend-service.c index 10381a3..15c8965 100644 --- a/hal-backend-service/hal-backend-service.c +++ b/hal-backend-service/hal-backend-service.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -35,13 +36,12 @@ #include "hal-api-list.h" #include "common.h" -#define RPC_STUB_PROC_NAME "d::HalBackendService" +#define COMMANDLINE_OPTION_STUB_PROC_NAME "stub-proc-name" struct hal_backend_service_data { enum hal_module *modules; size_t modules_len; tizen_core_task_h task; - char *task_name; bool is_initialized; }; @@ -637,15 +637,41 @@ static void hal_backend_service_finalize_cb(tizen_core_source_h source, void *da _D("Exit done."); } +static int create_task_name(struct hal_backend_service_data *service_data, char **task_name) +{ + char *task_name_temp = NULL; + struct __hal_module_info *module_info = NULL; + + if (service_data == NULL) { + _E("Invalid parameter: service_data(NULL)"); + return -EINVAL; + } + + module_info = _hal_api_conf_get_module_info(service_data->modules[0], NULL); + if (module_info == NULL) { + _E("Failed to get module info for module(%d)", service_data->modules[0]); + return -EINVAL; + } + + task_name_temp = strdup(module_info->backend_module_name); + if (task_name_temp == NULL) { + _E("Failed to duplicate task name"); + return -ENOMEM; + } + + *task_name = task_name_temp; + + return 0; +} + static void create_hal_backend_service_task(gpointer data, gpointer user_data) { tizen_core_task_h task = NULL; tizen_core_h core = NULL; tizen_core_source_h source = NULL; + char *task_name = NULL; struct hal_backend_service_data *service_data = NULL; - struct __hal_module_info *module_info = NULL; - GString *task_name = NULL; size_t *failed_count = NULL; int ret = 0; @@ -657,28 +683,19 @@ static void create_hal_backend_service_task(gpointer data, gpointer user_data) service_data = (struct hal_backend_service_data *)data; failed_count = (size_t *)user_data; - task_name = g_string_new(""); - if (!task_name) { - _E("Failed to allocate memory for task_name"); - ret = -ENOMEM; + ret = create_task_name(service_data, &task_name); + if (ret != 0) { + _E("Failed to create task name: ret(%d)", ret); goto error; } - for (size_t i = 0; i < service_data->modules_len; ++i) { - module_info = _hal_api_conf_get_module_info(service_data->modules[i], NULL); - if (module_info == NULL) { - _E("Failed to get module info for module(%d)", service_data->modules[i]); - ret = -EINVAL; - goto error; - } - g_string_append(task_name, "_"); - g_string_append(task_name, module_info->backend_module_name); - } - ret = tizen_core_task_create(task_name->str, true, &task); + ret = tizen_core_task_create(task_name, true, &task); if (ret != TIZEN_CORE_ERROR_NONE) { _E("Failed to create tizen_core task: ret(%d)", ret); goto error; } + free(task_name); + task_name = NULL; ret = tizen_core_source_create(&source); if (ret != TIZEN_CORE_ERROR_NONE) { @@ -710,18 +727,16 @@ static void create_hal_backend_service_task(gpointer data, gpointer user_data) goto error; } + service_data->task = task; + + _D("Task created for %zu task(s)", service_data->modules_len); + ret = tizen_core_task_run(task); if (ret != TIZEN_CORE_ERROR_NONE) { _E("Failed to run tizen_core task: ret(%d)", ret); goto error; } - service_data->task = task; - service_data->task_name = g_string_free_and_steal(task_name); - task_name = NULL; - - _D("Task created: %s", service_data->task_name); - return; error: @@ -731,8 +746,8 @@ error: if (task != NULL) tizen_core_task_destroy(task); - if (task_name != NULL) - g_string_free(task_name, TRUE); + free(task_name); + task_name = NULL; (*failed_count)++; @@ -769,22 +784,31 @@ static void delete_hal_backend_service_task(gpointer data, gpointer user_data) } service_data->task = NULL; - g_free(service_data->task_name); - service_data->task_name = NULL; _D("Task destroyed for %zu hal_modules", service_data->modules_len); } -static void hal_backend_service_start(void) +static int hal_backend_service_start(void) { size_t failed_count = 0; + size_t hal_backend_service_len = g_slist_length(g_hal_backend_service_data_list); /* Create tasks for hal-backend-service and then tie them */ g_slist_foreach(g_hal_backend_service_data_list, (GFunc)create_hal_backend_service_task, &failed_count); - if (failed_count != 0) - _W("Cannot register %zu service(s)", failed_count); + + if (failed_count > 0) { + _W("Cannot register %zu/%zu service(s)", + failed_count, hal_backend_service_len); + } + + if (failed_count == hal_backend_service_len) { + _E("Failed to start hal backend service, no task is created"); + return -EINVAL; + } + + return 0; } static void hal_backend_service_stop(void) @@ -823,13 +847,81 @@ static void attach_signal_handlers(void) signal(SIGABRT, handle_signal_std); } +static void print_usage(char *exec_name) +{ + _E("Usage: %s --%s [ ... ]\n", + exec_name, COMMANDLINE_OPTION_STUB_PROC_NAME); +} + +static int parse_arguments(int argc, char **argv, char **proc_name, int *modules_arg_start_index) +{ + int opt_flag = 0; + char *parsed_proc_name = NULL; + + struct option options[] = { + { + .name = COMMANDLINE_OPTION_STUB_PROC_NAME, + .has_arg = required_argument, + .flag = &opt_flag, + .val = 1 + }, { + .name = NULL, + .has_arg = 0, + .flag = NULL, + .val = 0 + }, + }; + + if (proc_name == NULL || modules_arg_start_index == NULL) { + _E("Invalid argument: proc_name and modules_arg_start_index should not be NULL"); + return -EINVAL; + } + + opt_flag = 0; + opterr = 0; + while (getopt_long(argc, argv, "", options, NULL) != -1) { + switch (opt_flag) { + case 1: + if (parsed_proc_name != NULL) { + _E("Invalid commandline argument: provided twice\n"); + return -EINVAL; + } + parsed_proc_name = optarg; + break; + default: + _E("Invalid commandline argument: %s", argv[optind - 1]); + return -EINVAL; + } + + opt_flag = 0; + } + + if (parsed_proc_name == NULL) { + _E("Invalid commandline argument: is not provided\n"); + return -EINVAL; + } + + if (optind >= argc) { + _E("No module name provided."); + return -EINVAL; + } + + *proc_name = parsed_proc_name; + *modules_arg_start_index = optind; + + return 0; +} + int main(int argc, char **argv) { int ret = 0; + char *proc_name = NULL; + int modules_arg_start_index = 0; - if (argc < 2) { - _E("No module name provided, exit."); - return 1; + ret = parse_arguments(argc, argv, &proc_name, &modules_arg_start_index); + if (ret != 0) { + print_usage(argv[0]); + return ret; } _D("Initialize hal-backend-service"); @@ -843,15 +935,14 @@ int main(int argc, char **argv) return 1; } - ret = rpc_port_register_proc_info(RPC_STUB_PROC_NAME, NULL); + ret = rpc_port_register_proc_info(proc_name, NULL); if (ret != RPC_PORT_ERROR_NONE) { - _E("Failed to call rpc_port_register_proc_info: ret(%d)", ret); - tizen_core_task_destroy(g_main_task); - tizen_core_shutdown(); - return 1; + _E("Failed to register rpc port proc info: proc_name(%s), ret(%d)", + proc_name, ret); + return false; } - for (int i = 1; i < argc; ++i) { + for (int i = modules_arg_start_index; i < argc; ++i) { char *module_names_str = argv[i]; gchar **module_names = g_strsplit(module_names_str, ",", 0); @@ -869,7 +960,15 @@ int main(int argc, char **argv) return 0; } - hal_backend_service_start(); + ret = hal_backend_service_start(); + if (ret != 0) { + _E("Failed to start hal-backend-service: ret(%d)", ret); + + tizen_core_task_destroy(g_main_task); + tizen_core_shutdown(); + + return 1; + } attach_signal_handlers(); diff --git a/packaging/hal-backend-service.service b/packaging/hal-backend-service.service index 9a78231..170f853 100644 --- a/packaging/hal-backend-service.service +++ b/packaging/hal-backend-service.service @@ -8,7 +8,7 @@ After=local-fs.target hal-backend-service.socket [Service] Type=simple SmackProcessLabel=System -ExecStart=/usr/bin/hal-backend-service device-display device-led device-battery +ExecStart=/usr/bin/hal-backend-service --stub-proc-name 'd::HalBackendService' device-display device-led device-battery KillSignal=SIGUSR1 MemoryMax=20M