#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;
};
_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;
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) {
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:
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)++;
}
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)
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");
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);
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();