diff options
author | Hwankyu Jhun <h.jhun@samsung.com> | 2017-01-04 17:02:35 +0900 |
---|---|---|
committer | Hwankyu Jhun <h.jhun@samsung.com> | 2017-01-04 17:04:26 +0900 |
commit | f5896cdce7731d89f810139076b118fa4bcafbc2 (patch) | |
tree | 1d560c6f0d7115a1f165437c0b9fc8653f84d94c | |
parent | 2855afa7f8aa9315fbffc3629cb1fa4624843672 (diff) | |
parent | 6f59e47b0770f4ce5cd0a3ef3475d00b4047b4e9 (diff) | |
download | launchpad-accepted/tizen/wearable/20170105.223120.tar.gz launchpad-accepted/tizen/wearable/20170105.223120.tar.bz2 launchpad-accepted/tizen/wearable/20170105.223120.zip |
Merge branch 'tizen_3.0' into tizensubmit/tizen/20170105.005252accepted/tizen/wearable/20170105.223120accepted/tizen/tv/20170105.223101accepted/tizen/mobile/20170105.223028accepted/tizen/ivi/20170105.223141accepted/tizen/common/20170109.202222
Change-Id: I99a654708caa2a2058b8dba1dd29c3b8945cffb9
-rwxr-xr-x | CMakeLists.txt | 1 | ||||
-rw-r--r-- | inc/debugger_info.h | 1 | ||||
-rw-r--r-- | inc/launchpad_common.h | 6 | ||||
-rw-r--r-- | inc/launchpad_debug.h | 1 | ||||
-rw-r--r-- | packaging/default.debugger.in | 6 | ||||
-rw-r--r-- | packaging/launchpad-process-pool.service | 4 | ||||
-rw-r--r-- | src/debugger_info.c | 32 | ||||
-rwxr-xr-x | src/launchpad.c | 51 | ||||
-rw-r--r-- | src/launchpad_common.c | 103 | ||||
-rw-r--r-- | src/launchpad_debug.c | 104 | ||||
-rw-r--r-- | src/launchpad_lib.c | 2 | ||||
-rw-r--r-- | src/launchpad_loader.c | 8 |
12 files changed, 288 insertions, 31 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 2989bb8..15735c7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ PKG_CHECK_MODULES(${this_target_loader} REQUIRED aul vconf buxton2 + libsystemd-daemon ) FOREACH(flag ${${this_target_loader}_CFLAGS}) diff --git a/inc/debugger_info.h b/inc/debugger_info.h index 7f61846..22bd253 100644 --- a/inc/debugger_info.h +++ b/inc/debugger_info.h @@ -29,5 +29,6 @@ GList *_debugger_info_get_extra_key_list(debugger_info_h info); GList *_debugger_info_get_extra_env_list(debugger_info_h info); GList *_debugger_info_get_unlink_list(debugger_info_h info); const char *_debugger_info_get_attach(debugger_info_h info); +GList *_debugger_info_get_last_extra_key_list(debugger_info_h info); #endif /* __DEBUGGER_INFO_H__ */ diff --git a/inc/launchpad_common.h b/inc/launchpad_common.h index f1907c1..63a9de3 100644 --- a/inc/launchpad_common.h +++ b/inc/launchpad_common.h @@ -44,6 +44,10 @@ #define PAD_CMD_REMOVE_LOADER 12 #define PAD_CMD_MAKE_DEFAULT_SLOTS 13 #define PAD_CMD_DEMAND 14 +#define PAD_CMD_PING 15 + +#define LAUNCHPAD_LAUNCH_SIGNAL 85 +#define LAUNCHPAD_DEAD_SIGNAL 61 #define PAD_LOADER_ID_STATIC 0 #define PAD_LOADER_ID_DIRECT 1 @@ -85,6 +89,7 @@ typedef struct { void _modify_bundle(bundle *kb, int caller_pid, appinfo_t *menu_info, int cmd); +int _send_cmd_to_amd(int cmd); int _create_server_sock(const char *name); app_pkt_t *_recv_pkt_raw(int fd, int *clifd, struct ucred *cr); int _send_pkt_raw(int client_fd, app_pkt_t *pkt); @@ -101,6 +106,7 @@ char *_appinfo_get_app_path(appinfo_t *menu_info); int _proc_get_attr_by_pid(int pid, char *buf, int size); int _close_all_fds(void); void _get_cpu_idle(long long *total, long long *idle); +int _setup_stdio(const char *ident); #endif /* __LAUNCHPAD_COMMON_H__ */ diff --git a/inc/launchpad_debug.h b/inc/launchpad_debug.h index 8bdb6ef..a866270 100644 --- a/inc/launchpad_debug.h +++ b/inc/launchpad_debug.h @@ -20,6 +20,7 @@ #include <stdbool.h> #include <bundle.h> +int _debug_create_extra_argv(int *arg, char ***argv); int _debug_create_argv(int *argc, char ***argv, bool *attach); void _debug_destroy_argv(int argc, char **argv); int _debug_get_caller_pid(bundle *kb); diff --git a/packaging/default.debugger.in b/packaging/default.debugger.in index ee2e717..7b8428d 100644 --- a/packaging/default.debugger.in +++ b/packaging/default.debugger.in @@ -18,3 +18,9 @@ EXE /opt/usr/home/owner/share/tmp/sdk_tools/gdbserver/gdbserver APP_TYPE capp|c++app EXTRA_KEY __DLP_ATTACH_ARG__ ATTACH true + +[DEBUGGER] +NAME UNIT_TEST +APP_TYPE capp|c++app +LAST_EXTRA_KEY __DLP_UNIT_TEST_ARG__ + diff --git a/packaging/launchpad-process-pool.service b/packaging/launchpad-process-pool.service index 2d633ec..c890e2d 100644 --- a/packaging/launchpad-process-pool.service +++ b/packaging/launchpad-process-pool.service @@ -5,11 +5,15 @@ [Unit] Description=Start the USER Access Control Agent DefaultDependencies=false +Requires=enlightenment-user.service +After=enlightenment-user.service [Service] ExecStartPre=-/usr/bin/mkdir -p /run/aul/daemons/%U ExecStartPre=-/usr/bin/chmod 0777 /run/aul/daemons/%U ExecStartPre=-/usr/bin/mkdir -p /run/aul/apps/%U ExecStartPre=-/usr/bin/chmod 0700 /run/aul/apps/%U +ExecStartPre=-/usr/bin/mkdir -p /run/aul/dbspace/%U +ExecStartPre=-/usr/bin/chmod 0700 /run/aul/dbspace/%U ExecStart=/bin/sh -l -c "/usr/bin/launchpad-process-pool" Sockets=launchpad-process-pool.socket diff --git a/src/debugger_info.c b/src/debugger_info.c index 1ba596b..aa576ac 100644 --- a/src/debugger_info.c +++ b/src/debugger_info.c @@ -25,14 +25,15 @@ #include "launchpad_common.h" #include "debugger_info.h" -#define TAG_DEBUGGER "[DEBUGGER]" -#define TAG_NAME "NAME" -#define TAG_EXE "EXE" -#define TAG_APP_TYPE "APP_TYPE" -#define TAG_EXTRA_KEY "EXTRA_KEY" -#define TAG_EXTRA_ENV "EXTRA_ENV" -#define TAG_UNLINK "UNLINK" -#define TAG_ATTACH "ATTACH" +#define TAG_DEBUGGER "[DEBUGGER]" +#define TAG_NAME "NAME" +#define TAG_EXE "EXE" +#define TAG_APP_TYPE "APP_TYPE" +#define TAG_EXTRA_KEY "EXTRA_KEY" +#define TAG_EXTRA_ENV "EXTRA_ENV" +#define TAG_UNLINK "UNLINK" +#define TAG_ATTACH "ATTACH" +#define TAG_LAST_EXTRA_KEY "LAST_EXTRA_KEY" struct debugger_info_s { char *name; @@ -42,6 +43,7 @@ struct debugger_info_s { GList *extra_env_list; GList *unlink_list; char *attach; + GList *last_extra_key_list; }; static struct debugger_info_s *__create_debugger_info(void) @@ -64,6 +66,8 @@ static void __destroy_debugger_info(gpointer data) if (info == NULL) return; + if (info->last_extra_key_list) + g_list_free_full(info->last_extra_key_list, free); if (info->attach) free(info->attach); if (info->unlink_list) @@ -175,6 +179,10 @@ static GList *__parse_file(GList *list, const char *path) info = NULL; break; } + } else if (strcasecmp(TAG_LAST_EXTRA_KEY, tok1) == 0) { + info->last_extra_key_list = g_list_append( + info->last_extra_key_list, + strdup(tok2)); } } fclose(fp); @@ -292,3 +300,11 @@ const char *_debugger_info_get_attach(debugger_info_h info) return info->attach; } + +GList *_debugger_info_get_last_extra_key_list(debugger_info_h info) +{ + if (info == NULL) + return NULL; + + return info->last_extra_key_list; +} diff --git a/src/launchpad.c b/src/launchpad.c index 4cf0919..f1c8011 100755 --- a/src/launchpad.c +++ b/src/launchpad.c @@ -387,6 +387,7 @@ static int __exec_loader_process(void *arg) _signal_fini(); _close_all_fds(); + _setup_stdio(basename(argv[LOADER_ARG_PATH])); if (execv(argv[LOADER_ARG_PATH], argv) < 0) _E("Failed to prepare candidate_process"); @@ -507,6 +508,7 @@ static int __normal_fork_exec(int argc, char **argv, const char *app_path) } _close_all_fds(); + if (execv(argv[LOADER_ARG_PATH], argv) < 0) { /* Flawfinder: ignore */ if (errno == EACCES) { _E("such a file is no executable - %s", @@ -590,6 +592,7 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, struct app_arg debug_arg = {0,}; struct app_arg launcher_arg = {0,}; struct app_arg arg = {0,}; + struct app_arg debug_extra_arg = {0,}; int ret; int i; int c; @@ -606,10 +609,19 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, return 0; } + ret = _debug_create_extra_argv(&debug_extra_arg.argc, + &debug_extra_arg.argv); + if (ret < 0) { + _E("Failed to create debugger extra argv"); + _debug_destroy_argv(debug_arg.argc, debug_arg.argv); + return -1; + } + ret = __create_launcher_argv(&launcher_arg.argc, &launcher_arg.argv, app_type); if (ret < 0) { _E("Failed to create launcher argv"); + _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv); _debug_destroy_argv(debug_arg.argc, debug_arg.argv); return -1; } @@ -618,12 +630,14 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, if (arg.argc <= 0) { _E("Failed to export bundle"); __destroy_launcher_argv(launcher_arg.argc, launcher_arg.argv); + _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv); _debug_destroy_argv(debug_arg.argc, debug_arg.argv); return -1; } arg.argv[LOADER_ARG_PATH] = strdup(app_path); - new_argc = debug_arg.argc + launcher_arg.argc + arg.argc; + new_argc = debug_arg.argc + launcher_arg.argc + arg.argc + + debug_extra_arg.argc; if (new_argc == arg.argc) { *argc = arg.argc; *argv = arg.argv; @@ -636,6 +650,7 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, free(arg.argv[LOADER_ARG_PATH]); bundle_free_exported_argv(arg.argc, &arg.argv); __destroy_launcher_argv(launcher_arg.argc, launcher_arg.argv); + _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv); _debug_destroy_argv(debug_arg.argc, debug_arg.argv); return -1; } @@ -647,6 +662,8 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, new_argv[c++] = launcher_arg.argv[i]; for (i = 0; i < arg.argc; i++) new_argv[c++] = arg.argv[i]; + for (i = 0; i < debug_extra_arg.argc; i++) + new_argv[c++] = debug_extra_arg.argv[i]; *argc = new_argc; *argv = new_argv; @@ -698,6 +715,9 @@ static int __prepare_exec(const char *appid, const char *app_path, return PAD_ERR_REJECTED; } + if (bundle_get_type(kb, AUL_K_SDK) == BUNDLE_TYPE_NONE) + _setup_stdio(basename(app_path)); + /* SET DUMPABLE - for coredump*/ prctl(PR_SET_DUMPABLE, 1); @@ -1304,6 +1324,10 @@ static gboolean __handle_launch_event(gpointer data) __real_send(clifd, ret); clifd = -1; goto end; + case PAD_CMD_PING: + __real_send(clifd, 0); + clifd = -1; + goto end; } INIT_PERF(kb); @@ -1340,6 +1364,10 @@ static gboolean __handle_launch_event(gpointer data) if (menu_info->comp_type && strcmp(menu_info->comp_type, "svcapp") == 0) { loader_id = PAD_LOADER_ID_DIRECT; + } else if (menu_info->comp_type && menu_info->app_type && + strcmp(menu_info->comp_type, "widgetapp") == 0 && + strcmp(menu_info->app_type, "webapp") == 0) { + loader_id = PAD_LOADER_ID_DIRECT; } else { loader_id = __get_loader_id(kb); if (loader_id <= PAD_LOADER_ID_STATIC) { @@ -1556,7 +1584,8 @@ static void __add_slot_from_info(gpointer data, gpointer user_data) candidate_process_context_t *cpc; bundle_raw *extra = NULL; int len; - int ret; + long long total = 0; + long long idle = 0; if (!strcmp(info->exe, "null")) { cpc = __add_slot(LAUNCHPAD_TYPE_USER + user_slot_offset, @@ -1581,11 +1610,11 @@ static void __add_slot_from_info(gpointer data, gpointer user_data) if (cpc == NULL) return; - ret = __prepare_candidate_process( - LAUNCHPAD_TYPE_USER + user_slot_offset, - PAD_LOADER_ID_STATIC); - if (ret != 0) - return; + _get_cpu_idle(&total, &idle); + cpc->cpu_idle_time = idle; + cpc->cpu_total_time = total; + cpc->idle_checker = g_timeout_add(CPU_CHECKER_TIMEOUT, + __handle_idle_checker, cpc); info->type = LAUNCHPAD_TYPE_USER + user_slot_offset; user_slot_offset++; @@ -1653,13 +1682,21 @@ static int __before_loop(int argc, char **argv) VCONFKEY_SETAPPL_APP_HW_ACCELERATION); } + __add_default_slots(); launcher_info_list = _launcher_info_load(LAUNCHER_INFO_PATH); + ret = _send_cmd_to_amd(LAUNCHPAD_LAUNCH_SIGNAL); + if (ret < 0) + _W("Failed to send cmd(%d) to amd", LAUNCHPAD_LAUNCH_SIGNAL); + return 0; } static void __after_loop(void) { + if (_send_cmd_to_amd(LAUNCHPAD_DEAD_SIGNAL) < 0) + _W("Failed to send cmd(%d) to amd", LAUNCHPAD_DEAD_SIGNAL); + _debug_fini(); _launcher_info_unload(launcher_info_list); diff --git a/src/launchpad_common.c b/src/launchpad_common.c index dbfbee4..8d6c001 100644 --- a/src/launchpad_common.c +++ b/src/launchpad_common.c @@ -32,6 +32,8 @@ #include <unistd.h> #include <tzplatform_config.h> #include <stdio.h> +#include <stdbool.h> +#include <systemd/sd-journal.h> #include "launchpad_common.h" #include "key.h" @@ -43,6 +45,8 @@ #define CONNECT_RETRY_TIME (100 * 1000) #define CONNECT_RETRY_COUNT 3 #define AUL_PKT_HEADER_SIZE (sizeof(int) + sizeof(int) + sizeof(int)) +#define PATH_AMD_SOCK "/run/aul/daemons/.amd-sock" +#define PATH_DEV_NULL "/dev/null" static int __read_proc(const char *path, char *buf, int size) { @@ -208,6 +212,55 @@ static int __parse_app_path(const char *arg, char *out, int out_size) return -2; } +int _send_cmd_to_amd(int cmd) +{ + struct sockaddr_un addr = {0,}; + int fd; + int ret; + int retry = CONNECT_RETRY_COUNT; + app_pkt_t pkt = {0,}; + + fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + /* support above version 2.6.27*/ + if (fd < 0) { + if (errno == EINVAL) { + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + _E("second chance - socket create error"); + return -1; + } + } else { + _E("socket error"); + return -1; + } + } + + addr.sun_family = AF_UNIX; + snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", PATH_AMD_SOCK); + while (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + if (errno != ETIMEDOUT || retry <= 0) { + _E("Failed to connect error(%d)", errno); + close(fd); + return -1; + } + + usleep(CONNECT_RETRY_TIME); + --retry; + _D("re-connect to %s (%d)", addr.sun_path, retry); + } + + pkt.cmd = cmd; + ret = send(fd, &pkt, sizeof(app_pkt_t), 0); + if (ret <= 0) { + _E("Failed to send cmd(%d), errno(%d)", cmd, errno); + close(fd); + return -ECOMM; + } + + close(fd); + return 0; +} + int _create_server_sock(const char *name) { struct sockaddr_un saddr; @@ -740,3 +793,53 @@ int _close_all_fds(void) return 0; } +int _setup_stdio(const char *ident) +{ + int fd; + + /* stdin */ + fd = open(PATH_DEV_NULL, O_RDONLY | O_NOCTTY); + if (fd < 0) { + _W("Failed to open /dev/null - err(%d)", errno); + return -1; + } + if (dup2(fd, STDIN_FILENO) < 0) { + _W("Failed to duplicate fd - oldfd(%d), newfd(%d)", + fd, STDIN_FILENO); + } + close(fd); + + /* stdout */ + fd = sd_journal_stream_fd(ident, LOG_INFO, false); + if (fd < 0) { + _W("Failed to connect journal socket - err(%d)", errno); + fd = open(PATH_DEV_NULL, O_WRONLY | O_NOCTTY); + if (fd < 0) { + _W("Failed to open /dev/null - err(%d)", errno); + return -1; + } + } + if (dup2(fd, STDOUT_FILENO) < 0) { + _W("Failed to duplicate fd - oldfd(%d), newfd(%d)", + fd, STDOUT_FILENO); + } + close(fd); + + /* stderr */ + fd = sd_journal_stream_fd(ident, LOG_INFO, false); + if (fd < 0) { + _W("Failed to connect journal socket - err(%d)", errno); + fd = open(PATH_DEV_NULL, O_WRONLY | O_NOCTTY); + if (fd < 0) { + _W("Failed to open /dev/null - err(%d)", errno); + return -1; + } + } + if (dup2(fd, STDERR_FILENO) < 0) { + _W("Failed to duplicate fd - oldfd(%d), newfd(%d)", + fd, STDERR_FILENO); + } + close(fd); + + return 0; +} diff --git a/src/launchpad_debug.c b/src/launchpad_debug.c index 10afec8..4ead375 100644 --- a/src/launchpad_debug.c +++ b/src/launchpad_debug.c @@ -34,14 +34,58 @@ static int debug_initialized; static GList *debugger_info_list; static debugger_info_h debugger_info; +static GList *debug_argv_list; static GList *extra_argv_list; +int _debug_create_extra_argv(int *argc, char ***argv) +{ + int new_argc; + char **new_argv; + const char *extra_argv; + GList *iter; + int i; + + if (argc == NULL || argv == NULL) { + _E("[DEBUG] Invalid parameter"); + return -1; + } + + if (debugger_info == NULL) + return 0; + + new_argc = g_list_length(extra_argv_list); + if (new_argc == 0) + return 0; + + new_argv = (char **)calloc(new_argc, sizeof(char *)); + if (new_argv == NULL) { + _E("out of memory"); + return -1; + } + + i = LOADER_ARG_PATH; + iter = g_list_first(extra_argv_list); + while (iter) { + extra_argv = (const char *)iter->data; + if (extra_argv) + new_argv[i++] = strdup(extra_argv); + + iter = g_list_next(iter); + } + + *argc = new_argc; + *argv = new_argv; + _D("[DEBUG] argc: %d, i: %d", argc, i); + + return 0; +} + int _debug_create_argv(int *argc, char ***argv, bool *attach) { int new_argc; char **new_argv; const char *exe; - const char *extra_argv; + const char *debug_argv; const char *attach_str; GList *iter; int i; @@ -56,13 +100,13 @@ int _debug_create_argv(int *argc, char ***argv, bool *attach) exe = _debugger_info_get_exe(debugger_info); if (exe == NULL) - return -1; + return 0; attach_str = _debugger_info_get_attach(debugger_info); if (attach_str && strcasecmp(attach_str, "true") == 0) *attach = true; - new_argc = g_list_length(extra_argv_list) + 1; + new_argc = g_list_length(debug_argv_list) + 1; new_argv = (char **)calloc(new_argc, sizeof(char *)); if (new_argv == NULL) { _E("out of memory"); @@ -72,11 +116,11 @@ int _debug_create_argv(int *argc, char ***argv, bool *attach) i = LOADER_ARG_PATH; new_argv[i++] = strdup(exe); - iter = g_list_first(extra_argv_list); + iter = g_list_first(debug_argv_list); while (iter) { - extra_argv = (const char *)iter->data; - if (extra_argv) - new_argv[i++] = strdup(extra_argv); + debug_argv = (const char *)iter->data; + if (debug_argv) + new_argv[i++] = strdup(debug_argv); iter = g_list_next(iter); } @@ -198,6 +242,41 @@ static void __add_extra_argv(gpointer data, gpointer user_data) bundle_del(kb, key); } +static void __add_debug_argv(gpointer data, gpointer user_data) +{ + const char *key = (const char *)data; + bundle *kb = (bundle *)user_data; + const char *str; + const char **str_arr = NULL; + int len = 0; + int i; + + if (key == NULL || kb == NULL) + return; + + _D("[DEBUG] key: %s", key); + if (bundle_get_type(kb, key) & BUNDLE_TYPE_ARRAY) { + str_arr = bundle_get_str_array(kb, key, &len); + } else { + str = bundle_get_val(kb, key); + if (str) { + str_arr = &str; + len = 1; + } + } + + for (i = 0; i < len; i++) { + if (str_arr[i] == NULL) + break; + + debug_argv_list = g_list_append(debug_argv_list, + strdup(str_arr[i])); + } + + if (str_arr) + bundle_del(kb, key); +} + static void __set_debug_env(gpointer data, gpointer user_data) { const char *key = (const char *)data; @@ -266,15 +345,15 @@ void _debug_prepare_debugger(bundle *kb) if (debugger == NULL) return; + ret = __redirect_std_fds(kb); + if (ret < 0) + _E("[DEBUG] Failed to redirect standard fds"); + _D("[DEBUG] debugger: %s", debugger); debugger_info = _debugger_info_find(debugger_info_list, debugger); if (debugger_info == NULL) return; - ret = __redirect_std_fds(kb); - if (ret < 0) - _E("[DEBUG] Failed to redirect standard fds"); - list = _debugger_info_get_unlink_list(debugger_info); g_list_foreach(list, __remove_file, NULL); @@ -282,6 +361,9 @@ void _debug_prepare_debugger(bundle *kb) g_list_foreach(list, __set_debug_env, kb); list = _debugger_info_get_extra_key_list(debugger_info); + g_list_foreach(list, __add_debug_argv, kb); + + list = _debugger_info_get_last_extra_key_list(debugger_info); g_list_foreach(list, __add_extra_argv, kb); } diff --git a/src/launchpad_lib.c b/src/launchpad_lib.c index 6336a19..17553ba 100644 --- a/src/launchpad_lib.c +++ b/src/launchpad_lib.c @@ -77,6 +77,8 @@ static int __prepare_exec(const char *appid, const char *app_path, return -1; } + _setup_stdio(basename(app_path)); + ret = buxton_open(&bxt_cli, NULL, NULL); if (ret != 0) { _E("buxton_open() failed"); diff --git a/src/launchpad_loader.c b/src/launchpad_loader.c index 8559b73..5dfe2e1 100644 --- a/src/launchpad_loader.c +++ b/src/launchpad_loader.c @@ -195,6 +195,7 @@ static void __loader_create_cb(bundle *extra, int type, void *user_data) elm_init_cnt = elm_init(__argc, __argv); _D("[candidate] elm init, returned: %d", elm_init_cnt); + setenv("AUL_LOADER_INIT", "1", 1); switch (__type) { case TYPE_SW: @@ -270,7 +271,6 @@ static int __loader_launch_cb(int argc, char **argv, const char *app_path, static int __loader_terminate_cb(int argc, char **argv, void *user_data) { void *handle; - int res; int (*dl_main)(int, char **); char err_str[MAX_LOCAL_BUFSZ]; char old_cwd[PATH_MAX]; @@ -319,10 +319,7 @@ do_dlopen: } free(libdir); - res = dl_main(argc, argv); - dlclose(handle); - - return res; + return dl_main(argc, argv); do_exec: if (access(argv[LOADER_ARG_PATH], F_OK | R_OK)) { @@ -336,6 +333,7 @@ do_exec: if (libdir) setenv("LD_LIBRARY_PATH", libdir, 1); free(libdir); + unsetenv("AUL_LOADER_INIT"); if (execv(argv[LOADER_ARG_PATH], argv) < 0) { SECURE_LOGE("execv() failed for file: \"%s\", " \ "error: %d (%s)", argv[LOADER_ARG_PATH], errno, |