hal-backend-service: Change to use proc_name from the commandline argument 11/320511/10
authorSangYoun Kwak <sy.kwak@samsung.com>
Tue, 4 Mar 2025 09:25:00 +0000 (18:25 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Wed, 19 Mar 2025 02:12:01 +0000 (02:12 +0000)
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 <proc_name> <modules> [ <modules> ... ]

Change-Id: If39d1e57b7f43e0c83e6143cbe7e3854821bc8aa
Signed-off-by: SangYoun Kwak <sy.kwak@samsung.com>
hal-backend-service/hal-backend-service.c
packaging/hal-backend-service.service

index 10381a3f32e165cea21743101dae57958bd96604..15c896548df219e6327648aece6a4a1f37cdd815 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdbool.h>
 #include <dlfcn.h>
 #include <dirent.h>
+#include <getopt.h>
 #include <errno.h>
 
 #include <glib.h>
 #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 <proc_name> <modules> [ <modules> ... ]\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: <proc_name> 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: <proc_name> 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();
 
index 9a782314465522288d6c01334a2cba80048733cd..170f85340fd2e3679c255871b67a3906b10c261f 100644 (file)
@@ -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