summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHwankyu Jhun <h.jhun@samsung.com>2017-01-04 17:02:35 +0900
committerHwankyu Jhun <h.jhun@samsung.com>2017-01-04 17:04:26 +0900
commitf5896cdce7731d89f810139076b118fa4bcafbc2 (patch)
tree1d560c6f0d7115a1f165437c0b9fc8653f84d94c
parent2855afa7f8aa9315fbffc3629cb1fa4624843672 (diff)
parent6f59e47b0770f4ce5cd0a3ef3475d00b4047b4e9 (diff)
downloadlaunchpad-accepted/tizen/wearable/20170105.223120.tar.gz
launchpad-accepted/tizen/wearable/20170105.223120.tar.bz2
launchpad-accepted/tizen/wearable/20170105.223120.zip
Change-Id: I99a654708caa2a2058b8dba1dd29c3b8945cffb9
-rwxr-xr-xCMakeLists.txt1
-rw-r--r--inc/debugger_info.h1
-rw-r--r--inc/launchpad_common.h6
-rw-r--r--inc/launchpad_debug.h1
-rw-r--r--packaging/default.debugger.in6
-rw-r--r--packaging/launchpad-process-pool.service4
-rw-r--r--src/debugger_info.c32
-rwxr-xr-xsrc/launchpad.c51
-rw-r--r--src/launchpad_common.c103
-rw-r--r--src/launchpad_debug.c104
-rw-r--r--src/launchpad_lib.c2
-rw-r--r--src/launchpad_loader.c8
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,