#include "defs.h"
#define MAX_PATH_LEN 1024
-#define BINSH_NAME "/bin/sh"
-#define BINSH_SIZE 7
-#define VALGRIND_NAME "/home/developer/sdk_tools/valgrind/usr/bin/valgrind"
-#define VALGRIND_SIZE 51
-#define BASH_NAME "/bin/bash"
-#define BASH_SIZE 9
-#define OPROFILE_NAME "/usr/bin/oprofile_command"
-#define OPROFILE_SIZE 25
-#define OPTION_VALGRIND_NAME "valgrind"
-#define OPTION_VALGRIND_SIZE 8
#define MAX_CMD_BUFSZ 1024
#define PATH_TMP "/tmp"
#define PATH_DATA "/data"
__set_sdk_env(appinfo->appid, str_array[i]);
}
-static char **__add_arg(bundle * kb, char **argv, int *margc, const char *key)
+static char **__add_arg(bundle *kb, char **argv, int *margc, const char *key)
{
const char *str = NULL;
const char **str_array = NULL;
int i;
char **new_argv = NULL;
- if (bundle_get_type(kb, key) & BUNDLE_TYPE_ARRAY)
+ if (bundle_get_type(kb, key) & BUNDLE_TYPE_ARRAY) {
str_array = bundle_get_str_array(kb, key, &len);
- else {
+ } else {
str = bundle_get_val(kb, key);
if (str) {
str_array = &str;
if (str_array) {
if (strncmp(key, DLP_K_DEBUG_ARG, strlen(key)) == 0
- || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) {
+ || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) {
new_argv = (char **)realloc(argv,
sizeof(char *) * (*margc + len + 2));
if (new_argv == NULL) {
*margc += len;
} else {
if (strncmp(key, DLP_K_DEBUG_ARG, strlen(key)) == 0
- || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) {
+ || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) {
new_argv = (char **)realloc(argv,
sizeof(char *) * (*margc + 2));
if (new_argv == NULL) {
const char *str;
const char **str_array = NULL;
int len = 0;
+ const char *path;
argc = bundle_export_to_argv(kb, &argv);
- if (argv)
+ if (argv) {
argv[0] = strdup(app_path);
- else {
+ } else {
_E("bundle_export_to_argv() is failed.");
return NULL;
}
- if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY)
+ if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY) {
str_array = bundle_get_str_array(kb, AUL_K_SDK, &len);
- else {
+ } else {
str = bundle_get_val(kb, AUL_K_SDK);
if (str) {
str_array = &str;
else
argv[0] = strdup(buf);
+ path = bundle_get_val(kb, DLP_K_GDBSERVER_PATH);
+ if (path == NULL) {
+ _E("Failed to get gdbserver path");
+ if (argv[0])
+ free(argv[0]);
+ bundle_free_exported_argv(argc, &argv);
+ *margc = 0;
+ return NULL;
+ }
new_argv = __add_arg(kb, argv, &argc, DLP_K_DEBUG_ARG);
- new_argv[0] = strdup(PATH_GDBSERVER);
+ new_argv[0] = strdup(path);
argv = new_argv;
} else if (strncmp(str_array[i], SDK_VALGRIND, strlen(str_array[i])) == 0) {
+ path = bundle_get_val(kb, DLP_K_VALGRIND_PATH);
+ if (path == NULL) {
+ _E("Failed to get valgrind path");
+ if (argv[0])
+ free(argv[0]);
+ bundle_free_exported_argv(argc, &argv);
+ *margc = 0;
+ return NULL;
+ }
new_argv = __add_arg(kb, argv, &argc, DLP_K_VALGRIND_ARG);
- new_argv[0] = strdup(PATH_VALGRIND);
+ new_argv[0] = strdup(path);
argv = new_argv;
} else if (strncmp(str_array[i], SDK_UNIT_TEST, strlen(str_array[i])) == 0) {
new_argv = __add_arg(kb, argv, &argc, DLP_K_UNIT_TEST_ARG);
argv = new_argv;
} else if (strncmp(str_array[i], SDK_ATTACH, strlen(str_array[i])) == 0) {
+ path = bundle_get_val(kb, DLP_K_GDBSERVER_PATH);
+ if (path == NULL) {
+ _E("Failed to get gdbserver path");
+ if (argv[0])
+ free(argv[0]);
+ bundle_free_exported_argv(argc, &argv);
+ *margc = 0;
+ return NULL;
+ }
new_argv = __add_arg(kb, argv, &argc, DLP_K_ATTACH_ARG);
- new_argv[0] = strdup(PATH_GDBSERVER);
+ new_argv[0] = strdup(path);
argv = new_argv;
}
if (ret <= 0) {
close(fd);
return -1;
- } else
+ } else {
buf[ret] = 0;
+ }
close(fd);
return ret;
}
-char *_proc_get_cmdline_bypid(int pid)
+int _proc_check_cmdline_bypid(int pid)
{
char buf[MAX_CMD_BUFSZ];
int ret;
- char* ptr = NULL;
snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
ret = __read_proc(buf, buf, sizeof(buf));
if (ret <= 0)
- return NULL;
-
- /* support app launched by shell script*/
- if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
- return strdup(&buf[BINSH_SIZE + 1]);
- else if (strncmp(buf, VALGRIND_NAME, VALGRIND_SIZE) == 0) {
- /* buf comes with double null-terminated string */
- while (1) {
- while (*ptr)
- ptr++;
- ptr++;
-
- if (!(*ptr))
- break;
-
- /* ignore trailing "--" */
- if (strncmp(ptr, "-", 1) != 0)
- break;
- }
+ return -1;
- return strdup(ptr);
- } else if (strncmp(buf, BASH_NAME, BASH_SIZE) == 0) {
- if (strncmp(&buf[BASH_SIZE + 1], OPROFILE_NAME, OPROFILE_SIZE) == 0) {
- if (strncmp(&buf[BASH_SIZE + OPROFILE_SIZE + 2],
- OPTION_VALGRIND_NAME, OPTION_VALGRIND_SIZE) == 0) {
- return strdup(&buf[BASH_SIZE + OPROFILE_SIZE +
- OPTION_VALGRIND_SIZE + 3]);
- }
- }
- }
+ _D("cmdline: %s", buf);
- return strdup(buf);
+ return 0;
}
return 0;
}
-static void __send_result_to_caller(int clifd, int ret, const char* app_path)
+static void __send_result_to_caller(int clifd, int ret)
{
- char *cmdline;
+ int res;
_W("Check app launching");
return;
}
- cmdline = _proc_get_cmdline_bypid(ret);
- if (cmdline == NULL) {
+ res = _proc_check_cmdline_bypid(ret);
+ if (res < 0) {
_E("The app process might be terminated while we are wating %d", ret);
__real_send(clifd, -1); /* abnormally launched */
return;
static int __prepare_fork(bundle *kb, const char *appid)
{
- const char *str = NULL;
+ const char *str;
const char **str_array = NULL;
int len = 0;
- if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY)
+ if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY) {
str_array = bundle_get_str_array(kb, AUL_K_SDK, &len);
- else {
+ if (str_array == NULL)
+ return -1;
+ } else {
str = bundle_get_val(kb, AUL_K_SDK);
if (str) {
str_array = &str;
int i;
app_argv = _create_argc_argv(kb, &app_argc, app_path);
+ if (app_argv == NULL)
+ return;
+
for (i = 0; i < app_argc; i++)
_D("input argument %d : %s##", i, app_argv[i]);
PERF("setup argument done");
- /* Temporary log: launch time checking */
- LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:launchpad:done]", app_path);
-
__normal_fork_exec(app_argc, app_argv);
}
pid = __start_process(appinfo->appid, app_path, kb, appinfo);
end:
- __send_result_to_caller(clifd, pid, app_path);
+ __send_result_to_caller(clifd, pid);
if (pid > 0)
_send_app_launch_signal(pid, appinfo->appid);
return 0;
}
+
char *storeclientid = NULL;
pkgmgrinfo_pkginfo_h handle;
- r = pkgmgrinfo_pkginfo_get_pkginfo(appid, &handle);
+ r = pkgmgrinfo_pkginfo_get_usr_pkginfo(appid, getuid(), &handle);
if (r != PMINFO_R_OK) {
_E("Failed to get pkginfo: %s", appid);
return -1;
return 0;
}
-static int __prepare_gdbserver(const char *appid)
+static int __prepare_gdbserver(bundle *kb, const char *appid)
{
int r;
+ const char *path;
r = __check_pkginfo(appid);
if (r < 0)
return -1;
- if (_apply_smack_rules(LABEL_SDBD, appid, "w"))
- _E("Failed to apply smack rule %s %s w", LABEL_SDBD, appid);
-
- /* fixed debug-as fail issue (grant permission to use 10.0.2.2, 10.0.2.16) */
- if (_apply_smack_rules(appid, LABEL_NETWORK, "rw"))
- _E("Failed to apply smack rule %s %s rw", appid, LABEL_NETWORK);
-
- if (_apply_smack_rules(LABEL_NETWORK, appid, "w"))
- _E("Failed to apply smack rule %s %s w", LABEL_NETWORK, appid);
+ path = bundle_get_val(kb, DLP_K_GDBSERVER_PATH);
+ if (path == NULL)
+ return -1;
- r = dlp_chmod(PATH_GDBSERVER, S_IRUSR | S_IWUSR
+ r = dlp_chmod(path, S_IRUSR | S_IWUSR
| S_IXUSR | S_IRGRP | S_IXGRP
| S_IROTH | S_IXOTH, 1);
if (r != 0)
- _W("Failed to set 755: %s", PATH_GDBSERVER);
+ _W("Failed to set 755: %s", path);
gdbserver = true;
int len = 0;
int i;
- if (bundle_get_type(kb, DLP_K_VALGRIND_ARG) & BUNDLE_TYPE_ARRAY)
+ if (bundle_get_type(kb, DLP_K_VALGRIND_ARG) & BUNDLE_TYPE_ARRAY) {
str_arr = bundle_get_str_array(kb, DLP_K_VALGRIND_ARG, &len);
- else {
+ if (str_arr == NULL)
+ return -1;
+ } else {
str = bundle_get_val(kb, DLP_K_VALGRIND_ARG);
if (str) {
str_arr = &str;
if (strncmp(str_arr[i], SDK_DEBUG, strlen(SDK_DEBUG)) == 0
|| strncmp(str_arr[i], SDK_ATTACH, strlen(SDK_ATTACH)) == 0) {
- if (__prepare_gdbserver(appid) < 0)
+ if (__prepare_gdbserver(kb, appid) < 0)
return -1;
} else if (strncmp(str_arr[i], SDK_VALGRIND, strlen(SDK_VALGRIND)) == 0) {
__prepare_valgrind(kb);