# Set required packages
INCLUDE(FindPkgConfig)
-SET(AUL-1_LIB_PKG_CHECK_MODULES dlog bundle dbus-glib-1 xdgmime libtzplatform-config pkgmgr-info libsystemd-daemon security-manager cynara-client cynara-creds-socket cynara-session capi-system-info vconf sqlite3 iniparser)
+SET(AUL-1_LIB_PKG_CHECK_MODULES dlog bundle dbus-glib-1 xdgmime libtzplatform-config pkgmgr-info libsystemd-daemon capi-system-info vconf sqlite3 iniparser)
IF (with_wayland)
pkg_check_modules(libpkgs REQUIRED ${AUL-1_LIB_PKG_CHECK_MODULES} wayland-client tizen-extension-client ecore-wayland)
ENDIF (with_wayland)
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
ENDFOREACH(flag)
-SET(AUL-1_PKG_CHECK_MODULES dlog rua glib-2.0 gio-2.0 vconf pkgmgr-info pkgmgr bundle)
-pkg_check_modules(pkgs REQUIRED ${AUL-1_PKG_CHECK_MODULES} )
-FOREACH(flag ${pkgs_CFLAGS})
- SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
pkg_check_modules(APP_LAUNCHER_DEPS glib-2.0 pkgmgr-info bundle)
FOREACH(APP_LAUNCHER_FLAGS ${APP_LAUNCHER_DEPS_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${APP_LAUNCHER_FLAGS}")
SET_TARGET_PROPERTIES(aul PROPERTIES VERSION ${FULLVER})
INSTALL(TARGETS aul DESTINATION ${LIB_INSTALL_DIR} COMPONENT RuntimeLibraries)
-ADD_EXECUTABLE(amd
- am_daemon/amd_main.c
- am_daemon/amd_request.c
- am_daemon/amd_appinfo.c
- am_daemon/amd_launch.c
- am_daemon/amd_status.c
- am_daemon/amd_app_group.c
- am_daemon/amd_cynara.c
- )
-SET_TARGET_PROPERTIES(amd PROPERTIES COMPILE_FLAGS "${EXTRA_CFLAGS} -fPIE")
-TARGET_LINK_LIBRARIES(amd aul_mods aul ${pkgs_LDFLAGS} "-pie")
-INSTALL(TARGETS amd DESTINATION bin)
-
# app_launcher
SET(APP_LAUNCHER "app_launcher")
ADD_EXECUTABLE(${APP_LAUNCHER} app_launcher.c)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/aul.h DESTINATION include/aul)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/aul_rsc_mgr.h DESTINATION include/aul)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/aul_svc.h DESTINATION include/aul)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/aul_cmd.h DESTINATION include/aul)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/aul.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/legacy/preload_list.txt DESTINATION ${SHARE_INSTALL_PREFIX}/aul )
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/feature/preexec_list.txt DESTINATION ${SHARE_INSTALL_PREFIX}/aul )
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <glib.h>
-#include <aul.h>
-#include <aul_svc.h>
-#include <bundle_internal.h>
-
-#include "app_sock.h"
-#include "simple_util.h"
-#include "amd_app_group.h"
-#include "amd_launch.h"
-#include "amd_request.h"
-#include "amd_status.h"
-#include "app_signal.h"
-#include "amd_appinfo.h"
-
-#define APP_SVC_K_LAUNCH_MODE "__APP_SVC_LAUNCH_MODE__"
-
-#ifdef WAYLAND
-#include <Ecore_Wayland.h>
-#include <wayland-client.h>
-#include <tizen-extension-client-protocol.h>
-static struct tizen_policy *tz_policy;
-
-static void _reg_handle_global(void *data, struct wl_registry *reg,
- uint32_t id, const char *interface, uint32_t ver)
-{
- if (!strcmp(interface, "tizen_policy")) {
- tz_policy = wl_registry_bind(reg,
- id,
- &tizen_policy_interface,
- 1);
- }
-}
-
-static void _reg_handle_global_remove(void *data, struct wl_registry *reg,
- uint32_t id)
-{
- /* do nothing */
-}
-
-static const struct wl_registry_listener reg_listener = {
- _reg_handle_global,
- _reg_handle_global_remove
-};
-#endif
-
-static GHashTable *app_group_hash = NULL;
-static int dead_pid = -1;
-static int focused_leader_pid = -1;
-static GList *recycle_bin = NULL;
-
-extern char *home_appid;
-
-typedef struct _app_group_context_t {
- int pid;
- int wid;
- int status;
- int fg;
- int group_sig;
- int can_be_leader;
- int reroute;
- int caller_pid;
- int can_shift;
- int recycle;
- app_group_launch_mode launch_mode;
-} app_group_context_t;
-
-static void __attach_window(int parent_wid, int child_wid)
-{
-#ifdef WAYLAND
- struct wl_display *dpy;
- struct wl_registry *reg;
-
- dpy = wl_display_connect(NULL);
- reg = wl_display_get_registry(dpy);
- wl_registry_add_listener(reg, ®_listener, NULL);
- wl_display_roundtrip(dpy);
-
- if (!tz_policy) {
- _E("ERR: no tizen_policy global interface");
- wl_registry_destroy(reg);
- wl_display_disconnect(dpy);
- return;
- }
-
- tizen_policy_set_transient_for(tz_policy, child_wid, parent_wid);
- wl_display_roundtrip(dpy);
-
- tizen_policy_destroy(tz_policy);
- wl_registry_destroy(reg);
- wl_display_disconnect(dpy);
-#else
- /* ecore_x_icccm_transient_for_set(child_wid, parent_wid); */
-#endif
-}
-
-static void __detach_window(int child_wid)
-{
-#ifdef WAYLAND
- struct wl_display *dpy;
- struct wl_registry *reg;
-
- dpy = wl_display_connect(NULL);
- reg = wl_display_get_registry(dpy);
- wl_registry_add_listener(reg, ®_listener, NULL);
- wl_display_roundtrip(dpy);
-
- if (!tz_policy) {
- _E("ERR: no tz_policy global interface");
- wl_registry_destroy(reg);
- wl_display_disconnect(dpy);
- return;
- }
-
- tizen_policy_unset_transient_for(tz_policy, child_wid);
- wl_display_roundtrip(dpy);
-
- tizen_policy_destroy(tz_policy);
- wl_registry_destroy(reg);
- wl_display_disconnect(dpy);
-#else
- /* ecore_x_icccm_transient_for_unset(child_wid); */
-#endif
-}
-
-static gint __comp_pid(gconstpointer a, gconstpointer b)
-{
- app_group_context_t *ac1 = (app_group_context_t *)a;
-
- return ac1->pid - GPOINTER_TO_INT(b);
-}
-
-static void __list_destroy_cb(gpointer data)
-{
- free(data);
-}
-
-static gboolean __hash_table_cb(gpointer key, gpointer value,
- gpointer user_data)
-{
- int pid = GPOINTER_TO_INT(user_data);
- GList *list = (GList *)value;
- GList *itr = g_list_first(list);
- app_group_context_t *ac;
-
- while (itr != NULL) {
- ac = (app_group_context_t *)itr->data;
- if (ac && ac->pid == pid) {
- free(ac);
- list = g_list_remove_link(list, itr);
- if (g_list_length(list) == 0) {
- g_list_free_full(list, __list_destroy_cb);
- return TRUE;
- } else
- return FALSE;
- }
- itr = g_list_next(itr);
- }
-
- return FALSE;
-}
-
-static GList* __find_removable_apps(int from)
-{
- int cnt;
- int *pids = NULL;
- GList *list = NULL;
- gboolean found = FALSE;
- int i;
- int j;
- int *gpids = NULL;
- int gcnt;
-
- app_group_get_leader_pids(&cnt, &pids);
-
- for (i = 0; i < cnt; i++) {
- app_group_get_group_pids(pids[i], &gcnt, &gpids);
- for (j = 0; j < gcnt; j++) {
- if (gpids[j] == from) {
- found = TRUE;
- continue;
- }
-
- if (found)
- list = g_list_append(list, GINT_TO_POINTER(gpids[j]));
- }
-
- if (gpids != NULL)
- free(gpids);
-
- if (found)
- break;
- }
-
- if (pids != NULL)
- free(pids);
-
- return list;
-}
-
-static void __prepare_to_suspend_services(int pid)
-{
- /*
- int dummy;
- SECURE_LOGD("[__SUSPEND__] pid: %d", pid);
- __app_send_raw_with_noreply(pid, APP_SUSPEND, (unsigned char *)&dummy, sizeof(int));
- */
-}
-
-static void __prepare_to_wake_services(int pid)
-{
- /*
- int dummy;
- SECURE_LOGD("[__SUSPEND__] pid: %d", pid);
- __app_send_raw_with_noreply(pid, APP_WAKE, (unsigned char *)&dummy, sizeof(int));
- */
-}
-
-static void __set_fg_flag(int cpid, int flag, gboolean force)
-{
- int lpid = app_group_get_leader_pid(cpid);
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- const char *appid = NULL;
- const char *pkgid = NULL;
- const struct appinfo *ai = NULL;
- GList *list;
- GList *i;
- app_group_context_t *ac;
- int bg_category = 0x00;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
- ac = (app_group_context_t *)i->data;
- if (ac && ac->pid == lpid) {
- while (i != NULL) {
- ac = (app_group_context_t*) i->data;
- if ((ac && ac->fg != flag) || force == TRUE) {
- appid = _status_app_get_appid_bypid(ac->pid);
- ai = appinfo_find(getuid(), appid);
- pkgid = appinfo_get_value(ai, AIT_PKGID);
- bg_category = (bool)appinfo_get_value(ai, AIT_BG_CATEGORY);
-
- if (flag) {
- _D("send_signal FG %s", appid);
-
- aul_send_app_status_change_signal(ac->pid, appid,
- pkgid,
- STATUS_FOREGROUND,
- APP_TYPE_UI);
- if (!bg_category)
- _status_find_service_apps(ac->pid, getuid(), STATUS_VISIBLE, __prepare_to_wake_services, false);
-
- } else {
- _D("send_signal BG %s", appid);
- aul_send_app_status_change_signal(ac->pid, appid,
- pkgid,
- STATUS_BACKGROUND,
- APP_TYPE_UI);
- if (!bg_category)
- _status_find_service_apps(ac->pid, getuid(), STATUS_BG, __prepare_to_suspend_services, true);
-
- }
- ac->fg = flag;
- }
- i = g_list_next(i);
- }
- break;
- }
- }
-}
-
-static gboolean __is_visible(int cpid)
-{
- int lpid = app_group_get_leader_pid(cpid);
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
- ac = (app_group_context_t *)i->data;
- if (ac && ac->pid == lpid) {
- while (i != NULL) {
- ac = (app_group_context_t*) i->data;
- if (ac && ac->status == STATUS_VISIBLE)
- return TRUE;
-
- i = g_list_next(i);
- }
- break;
- }
- }
-
- return FALSE;
-}
-
-static gboolean __can_attach_window(bundle *b, const char *appid, app_group_launch_mode *launch_mode)
-{
- char *str = NULL;
- const char *mode = NULL;
- const struct appinfo *ai = NULL;
-
- ai = appinfo_find(getuid(), appid);
- mode = appinfo_get_value(ai, AIT_LAUNCH_MODE);
-
- if (mode == NULL)
- *launch_mode = APP_GROUP_LAUNCH_MODE_SINGLE;
- else if (strcmp(mode, "caller") == 0)
- *launch_mode = APP_GROUP_LAUNCH_MODE_CALLER;
- else if (strcmp(mode, "single") == 0)
- *launch_mode = APP_GROUP_LAUNCH_MODE_SINGLE;
- else if (strcmp(mode, "group") == 0)
- *launch_mode = APP_GROUP_LAUNCH_MODE_GROUP;
- else if (strcmp(mode, "singleton") == 0)
- *launch_mode = APP_GROUP_LAUNCH_MODE_SINGLETON;
-
- switch (*launch_mode) {
- case APP_GROUP_LAUNCH_MODE_CALLER:
- case APP_GROUP_LAUNCH_MODE_SINGLETON:
- _D("launch mode from db is caller or singleton");
-
- bundle_get_str(b, APP_SVC_K_LAUNCH_MODE, &str);
- if (str != NULL && strncmp(str, "group", 5) == 0)
- return TRUE;
- break;
- case APP_GROUP_LAUNCH_MODE_GROUP:
- return TRUE;
- case APP_GROUP_LAUNCH_MODE_SINGLE:
- return FALSE;
- }
-
- return FALSE;
-}
-
-static gboolean __can_be_leader(bundle *b)
-{
- char *str = NULL;
-
- bundle_get_str(b, AUL_SVC_K_CAN_BE_LEADER, &str);
-
- if (str != NULL && strcmp(str, "true") == 0)
- return TRUE;
-
- return FALSE;
-}
-
-static int __get_previous_pid(int pid)
-{
- int previous_pid = -1;
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
-
- while (i != NULL) {
- ac = (app_group_context_t*)i->data;
- if (ac && ac->pid == pid)
- return previous_pid;
-
- previous_pid = ac->pid;
- i = g_list_next(i);
- }
- }
-
- return -1;
-}
-
-static int __get_caller_pid(bundle *kb)
-{
- const char *pid_str;
- int pid;
-
- pid_str = bundle_get_val(kb, AUL_K_ORG_CALLER_PID);
- if (pid_str)
- goto end;
-
- pid_str = bundle_get_val(kb, AUL_K_CALLER_PID);
- if (pid_str == NULL)
- return -1;
-
-end:
- pid = atoi(pid_str);
- if (pid <= 1)
- return -1;
-
- return pid;
-}
-
-static app_group_context_t* __detach_context_from_recycle_bin(int pid)
-{
- GList *iter = recycle_bin;
- app_group_context_t *ac;
-
- while (iter) {
- ac = (app_group_context_t *)iter->data;
- if (ac && ac->pid == pid) {
- recycle_bin = g_list_remove_link(recycle_bin, iter);
- return ac;
- }
-
- iter = g_list_next(iter);
- }
-
- return NULL;
-
-}
-
-static void __group_add(int leader_pid, int pid, int wid, app_group_launch_mode mode,
- int caller_pid, int can_shift, int recycle)
-{
- app_group_context_t *ac = NULL;
- GList *list;
-
- if ((ac = __detach_context_from_recycle_bin(pid)) == NULL) {
- ac = malloc(sizeof(app_group_context_t));
- if (ac == NULL) {
- _E("out of memory");
- return;
- }
- ac->pid = pid;
- ac->wid = wid;
- ac->fg = 0;
- ac->can_be_leader = 0;
- ac->reroute = 0;
- ac->launch_mode = mode;
- ac->caller_pid = caller_pid;
- ac->can_shift = can_shift;
- ac->recycle = recycle;
- }
-
- if (leader_pid == pid || ac->recycle)
- ac->group_sig = 1;
- else
- ac->group_sig = 0;
-
- dead_pid = -1;
-
- list = (GList *)g_hash_table_lookup(app_group_hash,
- GINT_TO_POINTER(leader_pid));
- if (list != NULL) {
- if (g_list_find_custom(list, GINT_TO_POINTER(pid), __comp_pid) != NULL) {
- _E("pid exist");
- free(ac);
- return;
- }
- }
-
- list = g_list_append(list, ac);
- g_hash_table_insert(app_group_hash, GINT_TO_POINTER(leader_pid), list);
-
- if (ac->wid != 0)
- app_group_set_window(pid, ac->wid);
-}
-
-static void __group_remove(int pid)
-{
- int ppid = __get_previous_pid(pid);
-
- g_hash_table_foreach_remove(app_group_hash, __hash_table_cb,
- GINT_TO_POINTER(pid));
-
- if (ppid != -1)
- app_group_set_status(ppid, -1, false);
-}
-
-static app_group_context_t* __get_context(int pid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
- while (i != NULL) {
- ac = (app_group_context_t *)i->data;
- if (ac && ac->pid == pid)
- return ac;
-
- i = g_list_next(i);
- }
- }
-
- return NULL;
-}
-
-static int __can_recycle(int pid)
-{
- app_group_context_t *context = __get_context(pid);
-
- if (context)
- return context->recycle;
-
- return 0;
-}
-
-static int __can_reroute(int pid)
-{
- app_group_context_t *context = __get_context(pid);
-
- if (context)
- return context->reroute;
-
- return 0;
-}
-
-static app_group_context_t *__context_dup(const app_group_context_t *context)
-{
- app_group_context_t *dup;
-
- if (!context) {
- _E("context is NULL.");
- return NULL;
- }
-
- dup = malloc(sizeof(app_group_context_t));
- if (!dup) {
- _E("out of memory");
- return NULL;
- }
-
- memcpy(dup, context, sizeof(app_group_context_t));
- return dup;
-}
-
-static void __do_recycle(app_group_context_t *context)
-{
- const char *appid = NULL;
- const char *pkgid = NULL;
- const struct appinfo *ai = NULL;
-
- if (context->fg) {
- appid = _status_app_get_appid_bypid(context->pid);
- ai = appinfo_find(getuid(), appid);
- pkgid = appinfo_get_value(ai, AIT_PKGID);
-
- _D("send_signal BG %s", appid);
- aul_send_app_status_change_signal(context->pid, appid, pkgid,
- STATUS_BACKGROUND,
- APP_TYPE_UI);
- _status_find_service_apps(context->pid, getuid(), STATUS_BG, __prepare_to_suspend_services, true);
- context->fg = 0;
- }
- recycle_bin = g_list_append(recycle_bin, context);
- /* _revoke_temporary_permission(context->pid); */
-}
-
-void app_group_init()
-{
- app_group_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL,
- NULL);
-}
-
-void app_group_remove(int pid)
-{
- app_group_context_t *context;
-
- __group_remove(pid);
- context = __detach_context_from_recycle_bin(pid);
- if (context)
- free(context);
-}
-
-void app_group_remove_from_recycle_bin(int pid)
-{
- app_group_context_t *context = __detach_context_from_recycle_bin(pid);
-
- if (context)
- free(context);
-}
-
-int app_group_get_window(int pid)
-{
- app_group_context_t *context = __get_context(pid);
-
- if (context)
- return context->wid;
-
- return -1;
-}
-
-int app_group_set_window(int pid, int wid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- int previous_wid;
- int caller_wid;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
- previous_wid = 0;
- while (i != NULL) {
- app_group_context_t *ac = (app_group_context_t*) i->data;
- if (ac && ac->pid == pid) {
- ac->wid = wid;
- if (previous_wid != 0)
- __attach_window(previous_wid, wid);
-
- if (ac->can_shift && ac->caller_pid > 0) {
- caller_wid = app_group_get_window(ac->caller_pid);
- if (caller_wid != 0)
- __attach_window(caller_wid, wid);
- }
-
- i = g_list_next(i);
- if (i) {
- ac = (app_group_context_t*) i->data;
- if (ac->wid != 0)
- __attach_window(wid, ac->wid);
- }
-
- return 0;
- }
- previous_wid = ac->wid;
- i = g_list_next(i);
- }
- }
-
- return -1;
-}
-
-void app_group_clear_top(int pid)
-{
- int p;
- GList *list = __find_removable_apps(pid);
-
- if (list != NULL) {
- GList *itr = g_list_last(list);
-
- while (itr != NULL) {
- p = GPOINTER_TO_INT(itr->data);
- __detach_window(p);
- _term_sub_app(p);
- app_group_remove(p);
- itr = g_list_previous(itr);
- }
- g_list_free(list);
- }
-}
-
-gboolean app_group_is_group_app(bundle* kb)
-{
- char *str = NULL;
- const char *mode = NULL;
- char *appid = NULL;
- const struct appinfo *ai = NULL;
-
- if (kb == NULL)
- return FALSE;
-
- bundle_get_str(kb, AUL_K_APPID, &appid);
-
- if (appid == NULL)
- return FALSE;
-
- ai = appinfo_find(getuid(), appid);
- mode = appinfo_get_value(ai, AIT_LAUNCH_MODE);
-
- if (mode != NULL && (strncmp(mode, "caller", 6) == 0 ||
- strncmp(mode, "singleton", 9) == 0)) {
- bundle_get_str(kb, APP_SVC_K_LAUNCH_MODE, &str);
-
- if (str != NULL && strncmp(str, "group", 5) == 0)
- return TRUE;
- } else if (mode != NULL && strncmp(mode, "group", 5) == 0) {
- return TRUE;
- }
-
- return FALSE;
-}
-
-void app_group_get_leader_pids(int *cnt, int **pids)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- int size = g_hash_table_size(app_group_hash);
- int *leader_pids;
- int i;
-
- if (size > 0) {
- leader_pids = (int*)malloc(sizeof(int) * size);
- if (leader_pids == NULL) {
- _E("out of memory");
- *cnt = 0;
- *pids = NULL;
- return;
- }
-
- g_hash_table_iter_init(&iter, app_group_hash);
- i = 0;
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- leader_pids[i] = GPOINTER_TO_INT(key);
- i++;
- }
-
- *cnt = size;
- *pids = leader_pids;
- } else {
- *cnt = 0;
- *pids = NULL;
- }
-}
-
-gboolean app_group_is_leader_pid(int pid)
-{
- int cnt;
- int *pids = NULL;
- int i;
-
- app_group_get_leader_pids(&cnt, &pids);
-
- for (i = 0; i < cnt; i++) {
- if (pid == pids[i]) {
- free(pids);
- return TRUE;
- }
- }
-
- if (pids != NULL)
- free(pids);
-
- return FALSE;
-}
-
-void app_group_get_group_pids(int leader_pid, int *cnt, int **pids)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- int size;
- int *pid_array;
- int j;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- if (GPOINTER_TO_INT(key) == leader_pid) {
- list = (GList *)value;
- i = g_list_first(list);
- size = g_list_length(list);
-
- if (size > 0) {
- j = 0;
- pid_array = (int *)malloc(sizeof(int) * size);
- if (pid_array == NULL) {
- _E("out of memory");
- *cnt = 0;
- *pids = NULL;
- return;
- }
-
- while (i != NULL) {
- app_group_context_t *ac = (app_group_context_t*) i->data;
-
- pid_array[j] = ac->pid;
- i = g_list_next(i);
- j++;
- }
-
- *cnt = size;
- *pids = pid_array;
- } else {
- *cnt = 0;
- *pids = NULL;
- }
- return;
- }
- }
-
- *cnt = 0;
- *pids = NULL;
-}
-
-gboolean app_group_is_sub_app(int pid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *found;;
-
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- found = NULL;
-
- if (list != NULL) {
- if ((found = g_list_find_custom(list, GINT_TO_POINTER(pid), __comp_pid)) != NULL) {
- if (g_list_first(list) == found)
- return FALSE;
- return TRUE;
- }
- }
- }
-
- return FALSE;
-}
-
-void app_group_reroute(int pid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *found = NULL;
- GList *before = NULL;
- GList *after = NULL;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- found = NULL;
- before = NULL;
- after = NULL;
-
- if (list != NULL) {
- if ((found = g_list_find_custom(list, GINT_TO_POINTER(pid), __comp_pid)) != NULL) {
- before = g_list_previous(found);
- after = g_list_next(found);
-
- if (before == NULL || after == NULL)
- return;
-
- _D("reroute");
- app_group_context_t *ac1 = (app_group_context_t*) before->data;
- app_group_context_t *ac2 = (app_group_context_t*) after->data;
-
- __detach_window(ac2->wid);
- __attach_window(ac1->wid, ac2->wid);
- break;
- }
- }
- }
-}
-
-int app_group_get_leader_pid(int pid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- int lpid = -1;
- int again = 0;
-
-repeat:
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- if (list != NULL) {
- if (g_list_find_custom(list, GINT_TO_POINTER(pid), __comp_pid) != NULL) {
- lpid = GPOINTER_TO_INT(key);
- break;
- }
- }
- }
-
- if (lpid == -1 && dead_pid == pid)
- lpid = focused_leader_pid;
-
- if (lpid == -1 && again == 0) {
- pid = getpgid(pid);
- again = 1;
- goto repeat;
- }
-
- return lpid;
-}
-
-void app_group_set_dead_pid(int pid)
-{
- focused_leader_pid = app_group_get_leader_pid(pid);
- dead_pid = pid;
-
- if (dead_pid == focused_leader_pid) {
- focused_leader_pid = -1;
- dead_pid = -1;
- }
-}
-
-int app_group_get_status(int pid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
-
- while (i != NULL) {
- ac = (app_group_context_t*) i->data;
- if (ac && ac->pid == pid)
- return ac->status;
-
- i = g_list_next(i);
- }
- }
- return -1;
-}
-
-int app_group_set_status(int pid, int status, gboolean force)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
- GList *last;
- app_group_context_t *last_ac;
- char *appid = NULL;
- const char *pkgid = NULL;
- const struct appinfo *ai = NULL;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
-
- while (i != NULL) {
- ac = (app_group_context_t*) i->data;
- if (ac && ac->pid == pid) {
- if (status > 0)
- ac->status = status;
- last = g_list_last(list);
- last_ac = (app_group_context_t *)last->data;
-
- if (last_ac->wid != 0 || status == STATUS_VISIBLE || force == TRUE) {
- if (__is_visible(pid)) {
- __set_fg_flag(pid, 1, force);
- if (!ac->group_sig && GPOINTER_TO_INT(key) != pid) {
- appid = _status_app_get_appid_bypid(pid);
- ai = appinfo_find(getuid(), appid);
- pkgid = appinfo_get_value(ai, AIT_PKGID);
-
- _D("send group signal %d", pid);
- aul_send_app_group_signal(GPOINTER_TO_INT(key), pid, pkgid);
- ac->group_sig = 1;
- }
- } else {
- __set_fg_flag(pid, 0, force);
- }
- }
- return 0;
- }
- i = g_list_next(i);
- }
- }
- return -1;
-}
-
-int app_group_get_fg_flag(int pid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList*) value;
- i = g_list_first(list);
- while (i != NULL) {
- ac = (app_group_context_t*) i->data;
- if (ac && ac->pid == pid)
- return ac->fg;
-
- i = g_list_next(i);
- }
- }
-
- return 0;
-}
-
-int app_group_set_hint(int pid, bundle *kb)
-{
- char *str_leader = NULL;
- char *str_reroute = NULL;
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
-
- if (kb == NULL)
- return -1;
-
- bundle_get_str(kb, AUL_SVC_K_CAN_BE_LEADER, &str_leader);
- bundle_get_str(kb, AUL_SVC_K_REROUTE, &str_reroute);
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
- while (i != NULL) {
- ac = (app_group_context_t *)i->data;
- if (ac && ac->pid == pid) {
- if (str_leader != NULL && strcmp(str_leader, "true") == 0)
- ac->can_be_leader = 1;
- if (str_reroute != NULL && strcmp(str_reroute, "true") == 0)
- ac->reroute = 1;
- return 0;
- }
- i = g_list_next(i);
- }
- }
-
- return -1;
-}
-
-int app_group_find_second_leader(int lpid)
-{
- app_group_context_t *ac;
- GList *list = (GList *)g_hash_table_lookup(app_group_hash,
- GINT_TO_POINTER(lpid));
- if (list != NULL) {
- list = g_list_next(list);
- if (list != NULL) {
- ac = (app_group_context_t*) list->data;
- if (ac && ac->can_be_leader) {
- _W("found the second leader, lpid: %d, pid: %d", lpid, ac->pid);
- return ac->pid;
- }
- }
- }
-
- return -1;
-}
-
-void app_group_remove_leader_pid(int lpid)
-{
- app_group_context_t *ac;
- GList *next;
- GList *list = (GList*)g_hash_table_lookup(app_group_hash,
- GINT_TO_POINTER(lpid));
-
- if (list != NULL) {
- next = g_list_next(list);
- if (next != NULL) {
- ac = (app_group_context_t *)list->data;
- if (ac)
- free(ac);
- list = g_list_remove_link(list, list);
-
- ac = (app_group_context_t *)next->data;
- g_hash_table_insert(app_group_hash, GINT_TO_POINTER(ac->pid), next);
- g_hash_table_remove(app_group_hash, GINT_TO_POINTER(lpid));
- }
- }
-}
-
-int app_group_can_start_app(const char *appid, bundle *b, gboolean *can_attach,
- int *lpid, app_group_launch_mode *mode)
-{
- const char *val = NULL;
- int caller_pid;
- int caller_wid;
-
- *can_attach = FALSE;
- if (__can_attach_window(b, appid, mode)) {
- *can_attach = TRUE;
-
- val = bundle_get_val(b, AUL_K_ORG_CALLER_PID);
- if (val == NULL)
- val = bundle_get_val(b, AUL_K_CALLER_PID);
-
- if (val == NULL) {
- _E("no caller pid");
- return -1;
- }
-
- caller_pid = atoi(val);
-
- *lpid = app_group_get_leader_pid(caller_pid);
- if (*lpid != -1) {
- caller_wid = app_group_get_window(caller_pid);
-
- if (caller_wid == 0) {
- _E("caller window wasn't ready");
- if (__can_be_leader(b))
- *can_attach = FALSE;
- else
- *can_attach = TRUE;
- }
-
- } else {
- _E("no lpid");
- if (__can_be_leader(b))
- *can_attach = FALSE;
- else
- return -1;
- }
- }
-
- return 0;
-}
-
-void app_group_start_app(int pid, bundle *b, int lpid, gboolean can_attach,
- app_group_launch_mode mode)
-{
- _E("app_group_start_app");
-
- int caller_pid = __get_caller_pid(b);
- int can_shift = 0;
- int recycle = 0;
- const char *str;
-
- str = bundle_get_val(b, AUL_SVC_K_SHIFT_WINDOW);
- if (str != NULL && strcmp(str, "true") == 0)
- can_shift = 1;
-
- str = bundle_get_val(b, AUL_SVC_K_RECYCLE);
- if (str != NULL && strcmp(str, "true") == 0)
- recycle = 1;
-
- if (can_attach)
- __group_add(lpid, pid, 0, mode, caller_pid, 0, recycle);
- else
- __group_add(pid, pid, 0, mode, caller_pid, can_shift, 0);
- app_group_set_hint(pid, b);
-}
-
-int app_group_find_singleton(const char *appid, int *found_pid, int *found_lpid)
-{
- GHashTableIter iter;
- gpointer key = NULL;
- gpointer value = NULL;
- char *target = NULL;
- GList *list;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- while (list != NULL) {
- ac = (app_group_context_t *)list->data;
- if (ac && ac->launch_mode == APP_GROUP_LAUNCH_MODE_SINGLETON) {
- target = _status_app_get_appid_bypid(ac->pid);
- if (appid != NULL && target != NULL && strcmp(appid, target) == 0) {
- *found_pid = ac->pid;
- *found_lpid = GPOINTER_TO_INT(key);
- return 0;
- }
- }
- list = g_list_next(list);
- }
- }
-
- return -1;
-}
-
-int app_group_can_reroute(int pid)
-{
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
- while (i != NULL) {
- ac = (app_group_context_t *)i->data;
- if (ac && ac->pid == pid)
- return ac->reroute;
-
- i = g_list_next(i);
- }
- }
-
- return 0;
-}
-
-void app_group_lower(int pid, int *exit)
-{
- app_group_context_t *ac;
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- GList *list;
- GList *i;
-
- if (app_group_is_sub_app(pid)) {
- if (__can_recycle(pid) && __can_reroute(pid)) {
- ac = __get_context(pid);
- if (ac) {
- if (ac->wid != 0)
- __detach_window(ac->wid);
- app_group_reroute(pid);
- ac = __context_dup(ac);
- __group_remove(pid);
- if (ac)
- __do_recycle(ac);
- }
- *exit = 0;
- } else
- *exit = 1;
- return;
- }
-
- *exit = 0;
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList *)value;
- i = g_list_first(list);
- while (i != NULL) {
- ac = (app_group_context_t *)i->data;
- if (ac && ac->can_shift) {
- __detach_window(ac->wid);
- ac->can_shift = 0;
-#ifdef WAYLAND
- ecore_wl_window_lower((Ecore_Wl_Window *)((intptr_t)ac->wid));
-#else
- /* ecore_x_window_lower(ac->wid); */
-#endif
- }
- return;
- }
- i = g_list_next(i);
- }
-}
-
-void app_group_restart_app(int pid, bundle *b)
-{
- const char *pid_str;
- int cwid;
- GList *list;
- GList *i;
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- app_group_context_t *ac;
-
- if (b == NULL)
- return;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList*) value;
- i = g_list_first(list);
-
- while (i != NULL) {
- ac = (app_group_context_t *)i->data;
- if (ac && ac->pid == pid) {
- ac->caller_pid = __get_caller_pid(b);
-
- if (ac->can_shift) {
- if (ac->wid != 0)
- __detach_window(ac->wid);
- ac->can_shift = 0;
- }
-
- pid_str = bundle_get_val(b, AUL_SVC_K_SHIFT_WINDOW);
- if (pid_str != NULL && strcmp(pid_str, "true") == 0) {
- ac->can_shift = 1;
- if (ac->wid != 0) {
- if (ac->caller_pid > 0) {
- cwid = app_group_get_window(ac->caller_pid);
- if (cwid != 0)
- __attach_window(cwid, ac->wid);
- else
- _E("invalid caller wid");
- } else {
- _E("invalid caller pid");
- }
- }
- }
- return;
- }
- i = g_list_next(i);
- }
- }
-}
-
-int app_group_find_pid_from_recycle_bin(const char *appid)
-{
- app_group_context_t *ac;
- const char *appid_from_bin;
- GList *iter = recycle_bin;
-
- while (iter) {
- ac = (app_group_context_t *)iter->data;
- appid_from_bin = _status_app_get_appid_bypid(ac->pid);
- if (appid && appid_from_bin && strcmp(appid, appid_from_bin) == 0)
- return ac->pid;
-
- iter = g_list_next(iter);
- }
-
- return -1;
-}
-
-void app_group_get_idle_pids(int *cnt, int **pids)
-{
- GList *iter = recycle_bin;
- int idle_cnt = g_list_length(iter);
- int *idle_pids = NULL;
- int i = 0;
- app_group_context_t *ac;
-
- if (idle_cnt <= 0) {
- *cnt = 0;
- *pids = NULL;
- return;
- }
-
- idle_pids = malloc(sizeof(int) * idle_cnt);
- if (idle_pids == NULL) {
- _E("Out-of-memory");
- *cnt = 0;
- *pids = NULL;
- return;
- }
-
- while (iter) {
- ac = (app_group_context_t *)iter->data;
- idle_pids[i] = ac->pid;
- iter = g_list_next(iter);
- i++;
- }
-
- *cnt = idle_cnt;
- *pids = idle_pids;
-}
-
-int app_group_get_next_caller_pid(int pid)
-{
- GList *list;
- GList *i;
- GHashTableIter iter;
- gpointer key;
- gpointer value;
- app_group_context_t *ac;
-
- g_hash_table_iter_init(&iter, app_group_hash);
- while (g_hash_table_iter_next(&iter, &key, &value)) {
- list = (GList*)value;
- i = g_list_first(list);
-
- while (i != NULL) {
- ac = (app_group_context_t *)i->data;
- if (ac && ac->pid == pid) {
- i = g_list_next(i);
- if (i == NULL)
- return -1;
-
- ac = (app_group_context_t *)i->data;
- return ac->caller_pid;
- }
- i = g_list_next(i);
- }
- }
-
- return -1;
-}
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <glib.h>
-#include <bundle.h>
-
-typedef enum {
- APP_GROUP_LAUNCH_MODE_SINGLE = 0,
- APP_GROUP_LAUNCH_MODE_GROUP,
- APP_GROUP_LAUNCH_MODE_CALLER,
- APP_GROUP_LAUNCH_MODE_SINGLETON,
-} app_group_launch_mode;
-
-void app_group_init();
-void app_group_remove(int pid);
-int app_group_get_window(int pid);
-int app_group_set_window(int pid, int wid);
-void app_group_get_leader_pids(int *cnt, int **pids);
-void app_group_get_group_pids(int leader_pid, int *cnt, int **pids);
-gboolean app_group_is_leader_pid(int pid);
-gboolean app_group_is_group_app(bundle* kb);
-gboolean app_group_is_sub_app(int pid);
-void app_group_reroute(int pid);
-int app_group_get_caller_pid();
-void app_group_clear_top(int pid);
-int app_group_get_leader_pid(int pid);
-void app_group_set_dead_pid(int pid);
-int app_group_get_status(int pid);
-int app_group_set_status(int pid, int status, gboolean force);
-int app_group_get_fg_flag(int pid);
-int app_group_set_hint(int pid, bundle *kb);
-int app_group_find_second_leader(int lpid);
-void app_group_remove_leader_pid(int lpid);
-int app_group_can_start_app(const char *appid, bundle *b, gboolean *can_attach, int *lpid, app_group_launch_mode *mode);
-void app_group_start_app(int pid, bundle *b, int lpid, gboolean can_attach, app_group_launch_mode mode);
-int app_group_find_singleton(const char *appid, int *found_pid, int *found_lpid);
-int app_group_can_reroute(int pid);
-void app_group_lower(int pid, int *exit);
-void app_group_restart_app(int pid, bundle *b);
-int app_group_find_pid_from_recycle_bin(const char *appid);
-void app_group_get_idle_pids(int *cnt, int **pids);
-void app_group_remove_from_recycle_bin(int pid);
-int app_group_get_next_caller_pid(int pid);
-
-
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-#include <glib.h>
-#include <dirent.h>
-
-#include <package-manager.h>
-#include <pkgmgr-info.h>
-#include <vconf.h>
-#include "amd_config.h"
-#include "simple_util.h"
-#include "amd_appinfo.h"
-#include "amd_launch.h"
-#include "amd_status.h"
-
-#define SERVICE_GROUP "Service"
-
-static pkgmgr_client *pc;
-static GHashTable *user_tbl;
-static GHashTable *pkg_pending;
-struct user_appinfo {
- uid_t uid;
- GHashTable *tbl; /* key is filename, value is struct appinfo */
- void *extra_data;
-};
-
-enum _appinfo_idx {
- _AI_FILE = 0, /* service filename */
- _AI_NAME,
- _AI_EXEC,
- _AI_TYPE,
- _AI_ONBOOT,
- _AI_RESTART,
- _AI_MULTI,
- _AI_HWACC,
- _AI_PERM,
- _AI_PKGID,
- _AI_PRELOAD,
- _AI_STATUS,
- _AI_POOL,
- _AI_COMPTYPE,
- _AI_TEP,
- _AI_STORAGE_TYPE,
- _AI_BG_CATEGORY,
- _AI_LAUNCH_MODE,
- _AI_GLOBAL,
- _AI_EFFECTIVE_APPID,
- _AI_MAX,
-};
-#define _AI_START _AI_NAME /* start index */
-
-typedef int (*appinfo_handler_cb)(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data);
-
-struct appinfo_t {
- char *name;
- enum appinfo_type type;
- appinfo_handler_cb add;
-};
-
-enum _background_category {
- _BACKGROUND_CATEGORY_MEDIA = 0x01,
- _BACKGROUND_CATEGORY_DOWNLOAD = 0x02,
- _BACKGROUND_CATEGORY_BACKGROUND_NETWORK = 0x04,
- _BACKGROUND_CATEGORY_LOCATION = 0x08,
- _BACKGROUND_CATEGORY_SENSOR = 0x10,
- _BACKGROUND_CATEGORY_IOT_COMMUNICATION = 0x20,
- _BACKGROUND_CATEGORY_SYSTEM = 0x40
-};
-
-struct appinfo {
- char *val[_AI_MAX];
-};
-
-static int gles = 1;
-
-static void __free_appinfo(gpointer data)
-{
- struct appinfo *c = data;
- int i;
-
- if (!c)
- return;
-
- for (i = 0; i < sizeof(c->val)/sizeof(c->val[0]); i++) {
- if (i != _AI_BG_CATEGORY && c->val[i] != NULL)
- free(c->val[i]);
- }
-
- free(c);
-}
-
-static void __free_user_appinfo(gpointer data)
-{
- struct user_appinfo *info = (struct user_appinfo *)data;
-
- g_hash_table_destroy(info->tbl);
- free(info);
-}
-
-static char *__convert_apptype(const char *type)
-{
- if (strncmp(type, "capp", 4) == 0) {
- return strdup("rpm");
- } else if (strncmp(type, "c++app", 6) == 0 ||
- strncmp(type, "ospapp", 6) == 0) {
- return strdup("tpk");
- } else if (strncmp(type, "webapp", 6) == 0) {
- return strdup("wgt");
- }
-
- return NULL;
-}
-
-static int __read_background_category(const char *category_name, void *user_data)
-{
- struct appinfo *c = user_data;
- int category = (intptr_t)(c->val[_AI_BG_CATEGORY]);
-
- if (!category_name)
- return 0;
-
- if (strncmp(category_name, "disable", strlen("disable")) == 0) {
- c->val[_AI_BG_CATEGORY] = 0x00;
- return -1;
- }
-
- if (strncmp(category_name, "media", strlen("media")) == 0)
- c->val[_AI_BG_CATEGORY] = (char *)((intptr_t)(category | _BACKGROUND_CATEGORY_MEDIA));
- else if (strncmp(category_name, "download", strlen("download")) == 0)
- c->val[_AI_BG_CATEGORY] = (char *)((intptr_t)(category | _BACKGROUND_CATEGORY_DOWNLOAD));
- else if (strncmp(category_name, "background-network", strlen("background-network")) == 0)
- c->val[_AI_BG_CATEGORY] = (char *)((intptr_t)(category | _BACKGROUND_CATEGORY_BACKGROUND_NETWORK));
- else if (strncmp(category_name, "location", strlen("location")) == 0)
- c->val[_AI_BG_CATEGORY] = (char *)((intptr_t)(category | _BACKGROUND_CATEGORY_LOCATION));
- else if (strncmp(category_name, "sensor", strlen("sensor")) == 0)
- c->val[_AI_BG_CATEGORY] = (char *)((intptr_t)(category | _BACKGROUND_CATEGORY_SENSOR));
- else if (strncmp(category_name, "iot-communication", strlen("iot-communication")) == 0)
- c->val[_AI_BG_CATEGORY] = (char *)((intptr_t)(category | _BACKGROUND_CATEGORY_IOT_COMMUNICATION));
- else if (strncmp(category_name, "system", strlen("system")) == 0)
- c->val[_AI_BG_CATEGORY] = (char *)((intptr_t)(category | _BACKGROUND_CATEGORY_SYSTEM));
-
- return 0;
-}
-
-static int __appinfo_add_name(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *appid = NULL;
-
- if (pkgmgrinfo_appinfo_get_appid(handle, &appid) != PMINFO_R_OK) {
- _E("fail to get appinfo");
- return -1;
- }
-
- info->val[_AI_NAME] = strdup(appid);
-
- return 0;
-}
-
-static int __appinfo_add_exec(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *exec = NULL;
-
- if (pkgmgrinfo_appinfo_get_exec(handle, &exec) != PMINFO_R_OK) {
- _E("failed to get exec");
- return -1;
- }
-
- info->val[_AI_EXEC] = strdup(exec);
-
- return 0;
-}
-
-static int __appinfo_add_type(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *type = NULL;
-
- if (pkgmgrinfo_appinfo_get_apptype(handle, &type) != PMINFO_R_OK) {
- _E("failed to get apptype");
- return -1;
- }
-
- info->val[_AI_TYPE] = __convert_apptype(type);
-
- return 0;
-}
-
-static int __appinfo_add_onboot(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- bool onboot = false;
-
- if (pkgmgrinfo_appinfo_is_onboot(handle, &onboot) != PMINFO_R_OK) {
- _E("failed to get onboot");
- return -1;
- }
-
- info->val[_AI_ONBOOT] = strdup(onboot ? "true" : "false");
-
- return 0;
-}
-
-static int __appinfo_add_restart(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- bool restart = false;
-
- if (pkgmgrinfo_appinfo_is_autorestart(handle, &restart) != PMINFO_R_OK) {
- _E("failed to get restart");
- return -1;
- }
-
- info->val[_AI_RESTART] = strdup(restart ? "true" : "false");
-
- return 0;
-}
-
-static int __appinfo_add_multi(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- bool multiple = false;
-
- if (pkgmgrinfo_appinfo_is_multiple(handle, &multiple) != PMINFO_R_OK) {
- _E("failed to get multiple");
- return -1;
- }
-
- info->val[_AI_MULTI] = strdup(multiple ? "true" : "false");
-
- return 0;
-}
-
-static int __appinfo_add_hwacc(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- pkgmgrinfo_app_hwacceleration hwacc;
-
- if (pkgmgrinfo_appinfo_get_hwacceleration(handle, &hwacc)) {
- _E("failed to get hwacc");
- return -1;
- }
-
- info->val[_AI_HWACC] = strdup(
- (gles == 0 ||
- hwacc == PMINFO_HWACCELERATION_NOT_USE_GL) ?
- "NOT_USE" :
- (hwacc == PMINFO_HWACCELERATION_USE_GL) ?
- "USE" :
- "SYS");
-
- return 0;
-}
-
-static int __appinfo_add_perm(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- pkgmgrinfo_permission_type permission;
-
- if (pkgmgrinfo_appinfo_get_permission_type(handle,
- &permission) != PMINFO_R_OK) {
- _E("failed to get permission type");
- return -1;
- }
-
- info->val[_AI_PERM] = strdup(
- (permission == PMINFO_PERMISSION_SIGNATURE) ?
- "signature" :
- (permission == PMINFO_PERMISSION_PRIVILEGE) ?
- "privilege" :
- "normal");
-
- return 0;
-}
-
-static int __appinfo_add_pkgid(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *pkgid = NULL;
-
- if (pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid) != PMINFO_R_OK) {
- _E("failed to get pkgid");
- return -1;
- }
-
- info->val[_AI_PKGID] = strdup(pkgid);
-
- return 0;
-}
-
-static int __appinfo_add_preload(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- bool preload = false;
-
- if (pkgmgrinfo_appinfo_is_preload(handle, &preload) != PMINFO_R_OK) {
- _E("failed to get preload");
- return -1;
- }
-
- info->val[_AI_PRELOAD] = strdup(preload ? "true" : "false");
-
- return 0;
-}
-
-static int __appinfo_add_status(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- info->val[_AI_STATUS] = strdup("installed");
-
- return 0;
-}
-
-static int __appinfo_add_pool(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- bool process_pool = false;
-
- if (pkgmgrinfo_appinfo_is_process_pool(handle, &process_pool) != PMINFO_R_OK) {
- _E("failed to get process_pool");
- return -1;
- }
-
- info->val[_AI_POOL] = strdup(process_pool ? "true" : "false");
-
- return 0;
-}
-
-static int __appinfo_add_comptype(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *component_type = NULL;
-
- if (pkgmgrinfo_appinfo_get_component_type(handle,
- &component_type) != PMINFO_R_OK) {
- _E("failed to get component type");
- return -1;
- }
-
- info->val[_AI_COMPTYPE] = strdup(component_type);
-
- return 0;
-}
-
-static int __appinfo_add_tep(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *tep_name = NULL;
- struct user_appinfo *user_data = (struct user_appinfo *)data;
-
- if (pkgmgrinfo_pkginfo_get_tep_name((pkgmgrinfo_pkginfo_h)user_data->extra_data,
- &tep_name) != PMINFO_R_OK) {
- _E("failed to get tep_name");
- info->val[_AI_TEP] = NULL;
- } else {
- info->val[_AI_TEP] = strdup(tep_name);
- }
-
- return 0;
-}
-
-static int __appinfo_add_storage_type(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- pkgmgrinfo_installed_storage installed_storage;
-
- if (pkgmgrinfo_appinfo_get_installed_storage_location(handle,
- &installed_storage) == PMINFO_R_OK) {
- if (installed_storage == PMINFO_INTERNAL_STORAGE)
- info->val[_AI_STORAGE_TYPE] = strdup("internal");
- else if (installed_storage == PMINFO_EXTERNAL_STORAGE)
- info->val[_AI_STORAGE_TYPE] = strdup("external");
- } else {
- info->val[_AI_STORAGE_TYPE] = strdup("internal");
- }
-
- return 0;
-}
-
-static int __appinfo_add_bg_category(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- info->val[_AI_BG_CATEGORY] = 0x0;
- if (pkgmgrinfo_appinfo_foreach_background_category(handle,
- __read_background_category, info) != PMINFO_R_OK) {
- _E("Failed to get background category");
- return -1;
- }
-
- return 0;
-}
-
-static int __appinfo_add_launch_mode(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *mode = NULL;
-
- if (pkgmgrinfo_appinfo_get_launch_mode(handle, &mode) != PMINFO_R_OK) {
- _E("failed to get launch_mode");
- return -1;
- }
-
- info->val[_AI_LAUNCH_MODE] = strdup(mode ? mode : "single");
-
- return 0;
-}
-
-static int __appinfo_add_global(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- bool is_global = false;
- struct user_appinfo *user_data = (struct user_appinfo *)data;
-
- if (pkgmgrinfo_pkginfo_is_for_all_users((pkgmgrinfo_pkginfo_h)user_data->extra_data,
- &is_global) != PMINFO_R_OK) {
- _E("get pkginfo failed");
- return -1;
- }
-
- info->val[_AI_GLOBAL] = strdup(is_global ? "true" : "false");
-
- return 0;
-}
-
-static int __appinfo_add_effective_appid(const pkgmgrinfo_appinfo_h handle, struct appinfo *info, void *data)
-{
- char *effective_appid = NULL;
-
- if (pkgmgrinfo_appinfo_get_effective_appid(handle, &effective_appid) != PMINFO_R_OK) {
- _D("Failed to get effective appid");
- info->val[_AI_EFFECTIVE_APPID] = NULL;
- } else {
- if (effective_appid && strlen(effective_appid) > 0)
- info->val[_AI_EFFECTIVE_APPID] = strdup(effective_appid);
- }
-
- return 0;
-}
-
-static struct appinfo_t _appinfos[] = {
- [_AI_NAME] = {"Name", AIT_NAME, __appinfo_add_name},
- [_AI_EXEC] = {"Exec", AIT_EXEC, __appinfo_add_exec},
- [_AI_TYPE] = {"PkgType", AIT_TYPE, __appinfo_add_type},
- [_AI_ONBOOT] = {"StartOnBoot", AIT_ONBOOT, __appinfo_add_onboot},
- [_AI_RESTART] = {"AutoRestart", AIT_RESTART, __appinfo_add_restart},
- [_AI_MULTI] = {"Multiple", AIT_MULTI, __appinfo_add_multi},
- [_AI_HWACC] = {"Hwacceleration", AIT_HWACC, __appinfo_add_hwacc},
- [_AI_PERM] = {"PermissionType", AIT_PERM, __appinfo_add_perm},
- [_AI_PKGID] = {"PackageId", AIT_PKGID, __appinfo_add_pkgid},
- [_AI_PRELOAD] = {"Preload", AIT_PRELOAD, __appinfo_add_preload},
- [_AI_STATUS] = {"Status", AIT_STATUS, __appinfo_add_status},
- [_AI_POOL] = {"ProcessPool", AIT_POOL, __appinfo_add_pool},
- [_AI_COMPTYPE] = {"ComponentType", AIT_COMPTYPE, __appinfo_add_comptype},
- [_AI_TEP] = {"Tep", AIT_TEP, __appinfo_add_tep},
- [_AI_STORAGE_TYPE] = {"StorageType", AIT_STORAGE_TYPE, __appinfo_add_storage_type},
- [_AI_BG_CATEGORY] = {"BackgroundCategory", AIT_BG_CATEGORY, __appinfo_add_bg_category},
- [_AI_LAUNCH_MODE] = {"launch_mode", AIT_LAUNCH_MODE, __appinfo_add_launch_mode},
- [_AI_GLOBAL] = {"global", AIT_GLOBAL, __appinfo_add_global},
- [_AI_EFFECTIVE_APPID] = {"effective-appid", AIT_EFFECTIVE_APPID, __appinfo_add_effective_appid},
-};
-
-static int __appinfo_insert_handler (const pkgmgrinfo_appinfo_h handle,
- void *data)
-{
- int i;
- struct appinfo *c;
- struct user_appinfo *info = (struct user_appinfo *)data;
- char *appid;
-
- if (!handle) {
- _E("null app handle");
- return -1;
- }
-
- if (pkgmgrinfo_appinfo_get_appid(handle, &appid) != PMINFO_R_OK) {
- _E("fail to get appinfo");
- return -1;
- }
-
- g_hash_table_remove(info->tbl, appid);
-
- c = calloc(1, sizeof(struct appinfo));
- if (!c) {
- _E("create appinfo: %s", strerror(errno));
- return -1;
- }
-
- c->val[_AI_FILE] = strdup(appid);
-
- for (i = 0; i < _AI_MAX; i++) {
- if (_appinfos[i].add && _appinfos[i].add(handle, c, info) < 0) {
- __free_appinfo(c);
- return -1;
- }
- }
-
- SECURE_LOGD("%s : %s : %s", c->val[_AI_FILE], c->val[_AI_COMPTYPE],
- c->val[_AI_TYPE]);
-
- g_hash_table_insert(info->tbl, c->val[_AI_FILE], c);
-
- return 0;
-}
-
-static int __pkg_list_cb(pkgmgrinfo_pkginfo_h handle, void *user_data)
-{
- bool is_global;
- struct user_appinfo *info = (struct user_appinfo *)user_data;
-
- if (pkgmgrinfo_pkginfo_is_for_all_users(handle, &is_global)) {
- _E("get pkginfo failed");
- return -1;
- }
-
- /* do not load appinfo for attached global apps */
- if (info->uid != GLOBAL_USER && is_global)
- return 0;
-
- info->extra_data = handle;
- if (pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
- __appinfo_insert_handler, user_data,
- info->uid)) {
- _E("get appinfo failed");
- return -1;
- }
-
- return 0;
-}
-
-static void __remove_user_appinfo(uid_t uid)
-{
- g_hash_table_remove(user_tbl, GINT_TO_POINTER(uid));
-}
-
-static void __handle_onboot(void *user_data, const char *appid,
- struct appinfo *info)
-{
- uid_t uid = (uid_t)(intptr_t)user_data;
-
- if (!strcmp(info->val[_AI_ONBOOT], "true")) {
- if (_status_app_is_running(appid, uid) > 0)
- return;
- _D("start app %s from user %d by onboot", appid, uid);
- _start_app_local(uid, info->val[_AI_NAME]);
- }
-}
-
-static struct user_appinfo *__add_user_appinfo(uid_t uid)
-{
- int r;
- struct user_appinfo *info;
-
- info = calloc(1, sizeof(struct user_appinfo));
- if (info == NULL) {
- _E("out of memory");
- return NULL;
- }
-
- info->uid = uid;
- info->tbl = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
- __free_appinfo);
- if (info->tbl == NULL) {
- _E("out of memory");
- free(info);
- return NULL;
- }
-
- g_hash_table_insert(user_tbl, GINT_TO_POINTER(uid), info);
-
- r = pkgmgrinfo_pkginfo_get_usr_list(__pkg_list_cb, info, info->uid);
- if (r != PMINFO_R_OK) {
- __remove_user_appinfo(uid);
- return NULL;
- }
-
- if (uid != GLOBAL_USER) {
- appinfo_foreach(uid, __handle_onboot, (void *)(intptr_t)uid);
- appinfo_foreach(GLOBAL_USER, __handle_onboot,
- (void *)(intptr_t)uid);
- }
-
- _D("loaded appinfo table for uid %d", uid);
-
- return info;
-}
-
-static struct user_appinfo *__find_user_appinfo(uid_t uid)
-{
- return g_hash_table_lookup(user_tbl, GINT_TO_POINTER(uid));
-}
-
-static void __appinfo_set_blocking_cb(void *user_data,
- const char *appid, struct appinfo *info)
-{
- char *pkgid = (char *)user_data;
-
- if (strcmp(info->val[_AI_PKGID], pkgid))
- return;
-
- free(info->val[_AI_STATUS]);
- info->val[_AI_STATUS] = strdup("blocking");
- _D("%s status changed: blocking", appid);
-}
-
-static void __appinfo_unset_blocking_cb(void *user_data,
- const char *appid, struct appinfo *info)
-{
- char *pkgid = (char *)user_data;
-
- if (strcmp(info->val[_AI_PKGID], pkgid))
- return;
-
- free(info->val[_AI_STATUS]);
- info->val[_AI_STATUS] = strdup("installed");
- _D("%s status changed: installed", appid);
-}
-
-static gboolean __appinfo_remove_cb(gpointer key, gpointer value, gpointer data)
-{
- char *pkgid = (char *)data;
- struct appinfo *info = (struct appinfo *)value;
-
- if (!strcmp(info->val[_AI_PKGID], pkgid)) {
- _D("appinfo removed: %s", info->val[_AI_NAME]);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void __appinfo_delete_on_event(uid_t uid, const char *pkgid)
-{
- struct user_appinfo *info;
-
- info = __find_user_appinfo(uid);
- if (info == NULL) {
- _E("cannot find appinfo for uid %d", uid);
- return;
- }
-
- g_hash_table_foreach_remove(info->tbl, __appinfo_remove_cb,
- (gpointer)pkgid);
-}
-
-static void __appinfo_insert_on_event(uid_t uid, const char *pkgid)
-{
- appinfo_insert(uid, pkgid);
- appinfo_foreach(uid, __handle_onboot, (void *)(intptr_t)uid);
-}
-
-static int __package_event_cb(uid_t target_uid, int req_id,
- const char *pkg_type, const char *pkgid,
- const char *key, const char *val, const void *pmsg, void *data)
-{
- char *op;
-
- if (!strcasecmp(key, "start")) {
- if (!strcasecmp(val, "uninstall") ||
- !strcasecmp(val, "update")) {
- appinfo_foreach(target_uid, __appinfo_set_blocking_cb,
- (void *)pkgid);
- }
- g_hash_table_insert(pkg_pending, strdup(pkgid), strdup(val));
- }
-
- if (!strcasecmp(key, "error")) {
- if (!strcasecmp(val, "uninstall") ||
- !strcasecmp(val, "update")) {
- appinfo_foreach(target_uid, __appinfo_unset_blocking_cb,
- (void *)pkgid);
- }
- g_hash_table_remove(pkg_pending, pkgid);
- }
-
- if (!strcasecmp(key, "end")) {
- op = g_hash_table_lookup(pkg_pending, pkgid);
- if (op == NULL)
- return 0;
-
- if (!strcasecmp(op, "uninstall")) {
- __appinfo_delete_on_event(target_uid, pkgid);
- } else if (!strcasecmp(op, "install")) {
- __appinfo_insert_on_event(target_uid, pkgid);
- } else if (!strcasecmp(op, "update")) {
- __appinfo_delete_on_event(target_uid, pkgid);
- __appinfo_insert_on_event(target_uid, pkgid);
- }
-
- g_hash_table_remove(pkg_pending, pkgid);
- }
-
- return 0;
-}
-
-static int __init_package_event_handler(void)
-{
- pc = pkgmgr_client_new(PC_LISTENING);
- if (pc == NULL)
- return -1;
-
- if (pkgmgr_client_listen_status(pc, __package_event_cb, NULL) < 0)
- return -1;
-
- return 0;
-}
-
-static void __fini_package_event_handler(void)
-{
- pkgmgr_client_free(pc);
-}
-
-int appinfo_init(void)
-{
- FILE *fp;
- char buf[4096] = {0,};
- char *tmp;
- struct user_appinfo *global_appinfo;
-
- fp = fopen("/proc/cmdline", "r");
- if (fp == NULL) {
- _E("appinfo init failed: %s", strerror(errno));
- return -1;
- }
-
- if (fgets(buf, sizeof(buf), fp) != NULL) {
- tmp = strstr(buf, "gles");
- if (tmp != NULL)
- sscanf(tmp, "gles=%d", &gles);
- }
- fclose(fp);
-
- user_tbl = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL,
- __free_user_appinfo);
- if (user_tbl == NULL)
- return -1;
-
- pkg_pending = g_hash_table_new_full(g_str_hash, g_str_equal,
- free, free);
- if (pkg_pending == NULL)
- return -1;
-
-
- global_appinfo = __add_user_appinfo(GLOBAL_USER);
- if (global_appinfo == NULL) {
- appinfo_fini();
- return -1;
- }
-
- if (__init_package_event_handler()) {
- appinfo_fini();
- return -1;
- }
-
- return 0;
-}
-
-void appinfo_fini(void)
-{
- g_hash_table_destroy(user_tbl);
- g_hash_table_destroy(pkg_pending);
- __fini_package_event_handler();
-}
-
-struct appinfo *appinfo_find(uid_t caller_uid, const char *appid)
-{
- struct user_appinfo *info;
- struct appinfo *ai;
-
- /* search from user table */
- info = __find_user_appinfo(caller_uid);
- if (info == NULL) {
- info = __add_user_appinfo(caller_uid);
- if (info == NULL)
- return NULL;
- }
-
- ai = g_hash_table_lookup(info->tbl, appid);
- if (ai)
- return ai;
-
- if (caller_uid == GLOBAL_USER)
- return NULL;
-
- /* search again from global table */
- info = __find_user_appinfo(GLOBAL_USER);
- if (info == NULL) {
- _E("cannot find global appinfo table!");
- return NULL;
- }
-
- return g_hash_table_lookup(info->tbl, appid);
-}
-
-int appinfo_insert(uid_t uid, const char *pkgid)
-{
- struct user_appinfo *info;
- pkgmgrinfo_pkginfo_h handle;
-
- info = __find_user_appinfo(uid);
- if (info == NULL) {
- info = __add_user_appinfo(uid);
- if (info == NULL)
- _E("load appinfo for uid %d failed", uid);
- return 0;
- }
-
- if (pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle)) {
- _E("get pkginfo failed: %s", pkgid);
- return -1;
- }
-
- info->extra_data = handle;
- if (pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
- __appinfo_insert_handler,
- info, info->uid)) {
- _E("add appinfo of pkg %s failed", pkgid);
- pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
- return -1;
- }
-
- pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
-
- return 0;
-}
-
-static void __reload_appinfo(gpointer key, gpointer value, gpointer user_data)
-{
- int r;
- struct user_appinfo *info = (struct user_appinfo *)value;
-
- g_hash_table_remove_all(info->tbl);
-
- r = pkgmgrinfo_pkginfo_get_usr_list(__pkg_list_cb, info, info->uid);
- if (r != PMINFO_R_OK) {
- __remove_user_appinfo(info->uid);
- return;
- }
-
- _D("reloaded appinfo table for uid %d", info->uid);
-}
-
-void appinfo_reload(void)
-{
- g_hash_table_foreach(user_tbl, __reload_appinfo, NULL);
-}
-
-const char *appinfo_get_value(const struct appinfo *c, enum appinfo_type type)
-{
- enum _appinfo_idx i;
-
- if (!c) {
- errno = EINVAL;
- _E("appinfo get value: %s", strerror(errno));
- return NULL;
- }
-
- for (i = _AI_START; i < sizeof(_appinfos)/sizeof(_appinfos[0]); i++) {
- if (type == _appinfos[i].type)
- return c->val[i];
- }
-
- errno = ENOENT;
- _E("appinfo get value: %s", strerror(errno));
-
- return NULL;
-}
-
-int appinfo_set_value(struct appinfo *c, enum appinfo_type type, const char *val)
-{
- int i;
-
- if (!c || !val) {
- errno = EINVAL;
- _E("appinfo is NULL, type: %d, val %s", type, val);
- return -1;
- }
-
- for (i = _AI_START; i < sizeof(_appinfos)/sizeof(_appinfos[0]); i++) {
- if (type == _appinfos[i].type)
- _D("%s : %s : %s", c->val[_AI_FILE], c->val[i], val);
- free(c->val[i]);
- c->val[i] = strdup(val);
- }
-
- return 0;
-}
-
-const char *appinfo_get_filename(const struct appinfo *c)
-{
- if (!c) {
- errno = EINVAL;
- SECURE_LOGE("appinfo get filename: %s", strerror(errno));
- return NULL;
- }
-
- return c->val[_AI_FILE];
-}
-
-struct _cbinfo {
- appinfo_iter_callback cb;
- void *cb_data;
-};
-
-static void __iter_cb(gpointer key, gpointer value, gpointer user_data)
-{
- struct _cbinfo *cbi = user_data;
-
- cbi->cb(cbi->cb_data, key, value);
-}
-
-void appinfo_foreach(uid_t uid, appinfo_iter_callback cb, void *user_data)
-{
- struct user_appinfo *info;
- struct _cbinfo cbi;
-
- info = __find_user_appinfo(uid);
- if (info == NULL) {
- info = __add_user_appinfo(uid);
- if (info == NULL)
- return;
- }
-
- if (!cb) {
- errno = EINVAL;
- _E("appinfo foreach: %s", strerror(errno));
- return;
- }
-
- cbi.cb = cb;
- cbi.cb_data = user_data;
-
- g_hash_table_foreach(info->tbl, __iter_cb, &cbi);
-}
-
-int appinfo_get_boolean(const struct appinfo *c, enum appinfo_type type)
-{
- const char *v;
-
- v = appinfo_get_value(c, type);
- if (!v)
- return -1;
-
- if (!strcmp(v, "1") || !strcasecmp(v, "true"))
- return 1;
-
- if (!strcmp(v, "0") || !strcasecmp(v, "false"))
- return 0;
-
- errno = EFAULT;
-
- return -1;
-}
-
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <sys/types.h>
-
-struct appinfomgr;
-struct appinfo;
-
-enum appinfo_type {
- AIT_NAME,
- AIT_EXEC,
- AIT_TYPE,
- AIT_ONBOOT, /* start on boot: boolean */
- AIT_RESTART, /* auto restart: boolean */
- AIT_MULTI,
- AIT_HWACC,
- AIT_PERM,
- AIT_PKGID,
- AIT_PRELOAD,
- AIT_STATUS,
- AIT_POOL,
- AIT_COMPTYPE,
- AIT_TEP,
- AIT_STORAGE_TYPE,
- AIT_BG_CATEGORY,
- AIT_LAUNCH_MODE,
- AIT_GLOBAL,
- AIT_EFFECTIVE_APPID,
- AIT_MAX
-};
-
-#define APP_TYPE_SERVICE "svcapp"
-#define APP_TYPE_UI "uiapp"
-#define APP_TYPE_WIDGET "widgetapp"
-#define APP_TYPE_WATCH "watchapp"
-
-int appinfo_init(void);
-void appinfo_fini(void);
-
-int appinfo_insert(uid_t uid, const char *pkgid);
-
-struct appinfo *appinfo_find(uid_t caller_uid, const char *appid);
-const char *appinfo_get_value(const struct appinfo *c, enum appinfo_type type);
-int appinfo_set_value(struct appinfo *c, enum appinfo_type, const char *val);
-const char *appinfo_get_filename(const struct appinfo *c);
-int appinfo_get_boolean(const struct appinfo *c, enum appinfo_type type);
-
-typedef void (*appinfo_iter_callback)(void *user_data,
- const char *filename, struct appinfo *c);
-void appinfo_foreach(uid_t uid, appinfo_iter_callback cb, void *user_data);
-void appinfo_reload(void);
-
-
+++ /dev/null
-/*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-#define AMD_LOG
-
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-#include <malloc.h>
-#include <cynara-client.h>
-#include <cynara-creds-socket.h>
-#include <cynara-session.h>
-
-#include "simple_util.h"
-
-static cynara *r_cynara = NULL;
-
-static int _get_caller_info_from_cynara(int sockfd, char **client, char **user, char **session)
-{
- pid_t pid;
- int r;
- char buf[MAX_LOCAL_BUFSZ] = {0,};
-
- r = cynara_creds_socket_get_pid(sockfd, &pid);
- if (r != CYNARA_API_SUCCESS) {
- cynara_strerror(r, buf, MAX_LOCAL_BUFSZ);
- _E("cynara_creds_socket_get_pid failed: %s", buf);
- return -1;
- }
-
- *session = cynara_session_from_pid(pid);
- if (*session == NULL) {
- _E("cynara_session_from_pid failed.");
- return -1;
- }
-
- r = cynara_creds_socket_get_user(sockfd, USER_METHOD_DEFAULT, user);
- if (r != CYNARA_API_SUCCESS) {
- cynara_strerror(r, buf, MAX_LOCAL_BUFSZ);
- _E("cynara_cred_socket_get_user failed.");
- return -1;
- }
-
- r = cynara_creds_socket_get_client(sockfd, CLIENT_METHOD_DEFAULT, client);
- if (r != CYNARA_API_SUCCESS) {
- cynara_strerror(r, buf, MAX_LOCAL_BUFSZ);
- _E("cynara_creds_socket_get_client failed.");
- return -1;
- }
-
- return 0;
-}
-
-int check_privilege_by_cynara(int sockfd, const char *privilege)
-{
- int r;
- int ret;
- char buf[MAX_LOCAL_BUFSZ] = {0,};
- char *client = NULL;
- char *session = NULL;
- char *user = NULL;
-
- r = _get_caller_info_from_cynara(sockfd, &client, &user, &session);
- if (r < 0) {
- ret = -1;
- goto end;
- }
-
- r = cynara_check(r_cynara, client, session, user, privilege);
- switch (r) {
- case CYNARA_API_ACCESS_ALLOWED:
- _D("%s(%s) from user %s privilege %s allowed.", client, session, user, privilege);
- ret = 0;
- break;
- case CYNARA_API_ACCESS_DENIED:
- _E("%s(%s) from user %s privilege %s denied.", client, session, user, privilege);
- ret = -1;
- break;
- default:
- cynara_strerror(r, buf, MAX_LOCAL_BUFSZ);
- _E("cynara_check failed: %s", buf);
- ret = -1;
- break;
- }
-
-end:
- if (user)
- free(user);
- if (session)
- free(session);
- if (client)
- free(client);
-
- return ret;
-}
-
-int init_cynara(void)
-{
- int ret;
-
- ret = cynara_initialize(&r_cynara, NULL);
- if (ret != CYNARA_API_SUCCESS) {
- _E("cynara initialize failed.");
- return ret;
- }
-
- return 0;
-}
-
-void finish_cynara(void)
-{
- if (r_cynara)
- cynara_finish(r_cynara);
- r_cynara = NULL;
-}
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-int init_cynara(void);
-void finish_cynara(void);
-int check_privilege_by_cynara(int sockfd, const char *privilege);
+++ /dev/null
-/*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-#include <stdbool.h>
-#include <signal.h>
-#include <bundle.h>
-#include <bundle_internal.h>
-#include <aul.h>
-#include <glib.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/prctl.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <pkgmgr-info.h>
-#include <poll.h>
-#include <tzplatform_config.h>
-
-#include "amd_config.h"
-#include "amd_launch.h"
-#include "amd_appinfo.h"
-#include "amd_status.h"
-#include "amd_app_group.h"
-#include "app_sock.h"
-#include "simple_util.h"
-#include "launch.h"
-#include "app_signal.h"
-#include "aul_svc.h"
-#include "aul_svc_priv_key.h"
-#include "amd_cynara.h"
-
-#define DAC_ACTIVATE
-
-#define TERM_WAIT_SEC 3
-#define INIT_PID 1
-
-#define AUL_PR_NAME 16
-
-/* SDK related defines */
-#define PATH_APP_ROOT tzplatform_getenv(TZ_USER_APP)
-#define PATH_GLOBAL_APP_ROOT tzplatform_getenv(TZ_SYS_RW_APP)
-#define PATH_DATA "/data"
-#define SDK_CODE_COVERAGE "CODE_COVERAGE"
-#define SDK_DYNAMIC_ANALYSIS "DYNAMIC_ANALYSIS"
-#define PATH_DA_SO "/home/developer/sdk_tools/da/da_probe.so"
-#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
-#define PREFIX_EXTERNAL_STORAGE_PATH "/opt/storage/sdcard/"
-
-typedef struct {
- char *pkg_name; /* package */
- char *app_path; /* exec */
- char *original_app_path; /* exec */
- int multiple; /* x_slp_multiple */
- char *pkg_type;
-} app_info_from_pkgmgr;
-
-static int __pid_of_last_launched_ui_app;
-
-static void __set_reply_handler(int fd, int pid, int clifd, int cmd);
-static void __real_send(int clifd, int ret);
-static int __nofork_processing(int cmd, int pid, bundle * kb, int clifd);
-
-static void __set_stime(bundle *kb)
-{
- struct timeval tv;
- char tmp[MAX_LOCAL_BUFSZ];
-
- gettimeofday(&tv, NULL);
- snprintf(tmp, MAX_LOCAL_BUFSZ, "%ld/%ld", tv.tv_sec, tv.tv_usec);
- bundle_add(kb, AUL_K_STARTTIME, tmp);
-}
-
-int _start_app_local_with_bundle(uid_t uid, const char *appid, bundle *kb)
-{
- bool dummy;
-
- __set_stime(kb);
- bundle_add(kb, AUL_K_APPID, appid);
- return _start_app(appid, kb, APP_START, getpid(), uid, -1, &dummy);
-}
-
-int _start_app_local(uid_t uid, const char *appid)
-{
- int pid;
- bundle *kb;
-
- kb = bundle_create();
- if (kb == NULL) {
- _E("out of memory");
- return -1;
- }
-
- pid = _start_app_local_with_bundle(uid, appid, kb);
-
- bundle_free(kb);
-
- return pid;
-}
-
-int _send_to_sigkill(int pid)
-{
- int pgid;
-
- pgid = getpgid(pid);
- if (pgid <= 1)
- return -1;
-
- if (killpg(pgid, SIGKILL) < 0)
- return -1;
-
- return 0;
-}
-
-int _resume_app(int pid, int clifd)
-{
- int dummy;
- int ret;
-
- if ((ret = __app_send_raw_with_delay_reply(pid, APP_RESUME_BY_PID,
- (unsigned char *)&dummy, 0)) < 0) {
- if (ret == -EAGAIN)
- _E("resume packet timeout error");
- else {
- _E("raise failed - %d resume fail\n", pid);
- _E("we will term the app - %d\n", pid);
- _send_to_sigkill(pid);
- ret = -1;
- }
- __real_send(clifd, ret);
- }
- _D("resume done\n");
-
- if (ret > 0)
- __set_reply_handler(ret, pid, clifd, APP_RESUME_BY_PID);
-
- return ret;
-}
-
-int _pause_app(int pid, int clifd)
-{
- int dummy;
- int ret;
-
- if ((ret = __app_send_raw_with_delay_reply(pid, APP_PAUSE_BY_PID,
- (unsigned char *)&dummy, 0)) < 0) {
- if (ret == -EAGAIN)
- _E("pause packet timeout error");
- else {
- _E("iconify failed - %d pause fail", pid);
- _E("we will term the app - %d", pid);
- _send_to_sigkill(pid);
- ret = -1;
- }
- close(clifd);
- }
- _D("pause done");
-
- if (ret > 0)
- __set_reply_handler(ret, pid, clifd, APP_PAUSE_BY_PID);
-
- return ret;
-}
-
-int _term_sub_app(int pid)
-{
- int dummy;
- int ret;
-
- if ((ret = __app_send_raw_with_noreply(pid, APP_TERM_BY_PID_ASYNC,
- (unsigned char *)&dummy, 0)) < 0) {
- _E("terminate packet send error - use SIGKILL");
- if (_send_to_sigkill(pid) < 0) {
- _E("fail to killing - %d\n", pid);
- return -1;
- }
- }
-
- return 0;
-}
-
-int _term_app(int pid, int clifd)
-{
- int dummy;
- int ret;
-
- if (app_group_is_leader_pid(pid)) {
- int cnt;
- int *pids = NULL;
- int i;
-
- app_group_get_group_pids(pid, &cnt, &pids);
- if (cnt > 0) {
- for (i = cnt - 1 ; i >= 0; i--) {
- if (i != 0)
- _term_sub_app(pids[i]);
- app_group_remove(pids[i]);
-
- }
- free(pids);
- }
- }
-
- if ((ret = __app_send_raw_with_delay_reply(pid, APP_TERM_BY_PID,
- (unsigned char *)&dummy, 0)) < 0) {
- _D("terminate packet send error - use SIGKILL");
- if (_send_to_sigkill(pid) < 0) {
- _E("fail to killing - %d\n", pid);
- __real_send(clifd, -1);
- return -1;
- }
- __real_send(clifd, 0);
- }
- _D("term done\n");
- if (ret > 0)
- __set_reply_handler(ret, pid, clifd, APP_TERM_BY_PID);
-
- return 0;
-}
-
-int _term_req_app(int pid, int clifd)
-{
- int dummy;
- int ret;
-
- if ((ret = __app_send_raw_with_delay_reply(pid, APP_TERM_REQ_BY_PID,
- (unsigned char *)&dummy, 0)) < 0) {
- _D("terminate req send error");
- __real_send(clifd, ret);
- }
-
- if (ret > 0)
- __set_reply_handler(ret, pid, clifd, APP_TERM_REQ_BY_PID);
-
- return 0;
-}
-
-int _term_bgapp(int pid, int clifd)
-{
- int dummy;
- int fd;
- int cnt;
- int *pids = NULL;
- int i;
- int status = -1;
-
- if (app_group_is_leader_pid(pid)) {
- app_group_get_group_pids(pid, &cnt, &pids);
- if (cnt > 0) {
- status = _status_get_app_info_status(pids[cnt - 1], getuid());
- if (status == STATUS_BG) {
- for (i = cnt - 1 ; i >= 0; i--) {
- if (i != 0)
- _term_sub_app(pids[i]);
- app_group_remove(pids[i]);
- }
- }
- }
- free(pids);
- }
-
- if ((fd = __app_send_raw_with_delay_reply(pid, APP_TERM_BGAPP_BY_PID,
- (unsigned char *)&dummy, sizeof(int))) < 0) {
- _D("terminate packet send error - use SIGKILL");
- if (_send_to_sigkill(pid) < 0) {
- _E("fail to killing - %d", pid);
- __real_send(clifd, -1);
- return -1;
- }
- __real_send(clifd, 0);
- }
- _D("term_bgapp done");
- if (fd > 0)
- __set_reply_handler(fd, pid, clifd, APP_TERM_BGAPP_BY_PID);
-
- return 0;
-}
-
-int _fake_launch_app(int cmd, int pid, bundle *kb, int clifd)
-{
- int datalen;
- int ret;
- bundle_raw *kb_data;
-
- bundle_encode(kb, &kb_data, &datalen);
- if ((ret = __app_send_raw_with_delay_reply(pid, cmd, kb_data, datalen)) < 0) {
- _E("error request fake launch - error code = %d", ret);
- __real_send(clifd, ret);
- }
- free(kb_data);
-
- if (ret > 0)
- __set_reply_handler(ret, pid, clifd, cmd);
-
- return ret;
-}
-
-static void __real_send(int clifd, int ret)
-{
- if (clifd < 0)
- return;
-
- if (send(clifd, &ret, sizeof(int), MSG_NOSIGNAL) < 0) {
- if (errno == EPIPE)
- _E("send failed due to EPIPE.\n");
-
- _E("send fail to client");
- }
-
- close(clifd);
-}
-
-static gboolean __au_glib_check(GSource *src)
-{
- GSList *fd_list;
- GPollFD *tmp;
-
- fd_list = src->poll_fds;
- do {
- tmp = (GPollFD *) fd_list->data;
- if ((tmp->revents & (POLLIN | POLLPRI)))
- return TRUE;
- fd_list = fd_list->next;
- } while (fd_list);
-
- return FALSE;
-}
-
-static gboolean __au_glib_dispatch(GSource *src, GSourceFunc callback, gpointer data)
-{
- callback(data);
- return TRUE;
-}
-
-static gboolean __au_glib_prepare(GSource *src, gint *timeout)
-{
- return FALSE;
-}
-
-static GSourceFuncs funcs = {
- .prepare = __au_glib_prepare,
- .check = __au_glib_check,
- .dispatch = __au_glib_dispatch,
- .finalize = NULL
-};
-
-struct reply_info {
- GSource *src;
- GPollFD *gpollfd;
- guint timer_id;
- int clifd;
- int pid;
- int cmd;
-};
-
-static gboolean __reply_handler(gpointer data)
-{
- struct reply_info *r_info = (struct reply_info *) data;;
- int fd = r_info->gpollfd->fd;
- int len;
- int res = 0;
- int clifd = r_info->clifd;
- int pid = r_info->pid;
-
- len = recv(fd, &res, sizeof(int), 0);
- if (len == -1) {
- if (errno == EAGAIN) {
- _E("recv timeout : %s", strerror(errno));
- res = -EAGAIN;
- } else {
- _E("recv error : %s", strerror(errno));
- res = -ECOMM;
- }
- }
- close(fd);
-
- if (res < 0)
- __real_send(clifd, res);
- else
- __real_send(clifd, pid);
-
- _D("listen fd : %d , send fd : %d, pid : %d", fd, clifd, pid);
-
- g_source_remove(r_info->timer_id);
- g_source_remove_poll(r_info->src, r_info->gpollfd);
- g_source_destroy(r_info->src);
- g_free(r_info->gpollfd);
- free(r_info);
-
- return TRUE;
-}
-
-static gboolean __recv_timeout_handler(gpointer data)
-{
- struct reply_info *r_info = (struct reply_info *) data;
- int fd = r_info->gpollfd->fd;
- int clifd = r_info->clifd;
-
- __real_send(clifd, -EAGAIN);
-
- close(fd);
-
- g_source_remove_poll(r_info->src, r_info->gpollfd);
- g_source_destroy(r_info->src);
- g_free(r_info->gpollfd);
- free(r_info);
-
- return FALSE;
-}
-
-static void __set_reply_handler(int fd, int pid, int clifd, int cmd)
-{
- GPollFD *gpollfd;
- GSource *src;
- struct reply_info *r_info;
-
- src = g_source_new(&funcs, sizeof(GSource));
-
- gpollfd = (GPollFD *) g_malloc(sizeof(GPollFD));
- gpollfd->events = POLLIN;
- gpollfd->fd = fd;
-
- r_info = malloc(sizeof(*r_info));
- if (r_info == NULL) {
- _E("out of memory");
- g_free(gpollfd);
- g_source_unref(src);
- return;
- }
-
- r_info->clifd = clifd;
- r_info->pid = pid;
- r_info->src = src;
- r_info->gpollfd = gpollfd;
- r_info->cmd = cmd;
-
- r_info->timer_id = g_timeout_add(5000, __recv_timeout_handler, (gpointer) r_info);
- g_source_add_poll(src, gpollfd);
- g_source_set_callback(src, (GSourceFunc) __reply_handler, (gpointer) r_info, NULL);
- g_source_set_priority(src, G_PRIORITY_DEFAULT);
- g_source_attach(src, NULL);
-
- _D("listen fd : %d, send fd : %d", fd, clifd);
-}
-
-static int __nofork_processing(int cmd, int pid, bundle * kb, int clifd)
-{
- int ret;
-
- switch (cmd) {
- case APP_OPEN:
- case APP_RESUME:
- _D("resume app's pid : %d\n", pid);
- if ((ret = _resume_app(pid, clifd)) < 0)
- _E("__resume_app failed. error code = %d", ret);
- _D("resume app done");
- break;
-
- case APP_START:
- case APP_START_RES:
- _D("fake launch pid : %d\n", pid);
- if ((ret = _fake_launch_app(cmd, pid, kb, clifd)) < 0)
- _E("fake_launch failed. error code = %d", ret);
- _D("fake launch done");
- break;
- default:
- _E("unknown command: %d", cmd);
- ret = -1;
- }
-
- return ret;
-}
-
-static int __compare_signature(const struct appinfo *ai, int cmd,
- uid_t caller_uid, const char* appid, char *caller_appid, int fd)
-{
- const char *permission;
- int ret;
- const struct appinfo *caller_ai;
- const char *preload;
- pkgmgrinfo_cert_compare_result_type_e compare_result;
-
- permission = appinfo_get_value(ai, AIT_PERM);
- if (permission && strncmp(permission, "signature", 9) == 0) {
- if (caller_uid != 0 && (cmd == APP_START || cmd == APP_START_RES)) {
- caller_ai = appinfo_find(caller_uid, caller_appid);
- preload = appinfo_get_value(caller_ai, AIT_PRELOAD);
- if (preload && strncmp(preload, "true", 4) != 0) {
- /* is admin is global */
- if (caller_uid != GLOBAL_USER)
- pkgmgrinfo_pkginfo_compare_usr_app_cert_info(caller_appid,
- appid, caller_uid, &compare_result);
- else
- pkgmgrinfo_pkginfo_compare_app_cert_info(caller_appid,
- appid, &compare_result);
- if (compare_result != PMINFO_CERT_COMPARE_MATCH) {
- ret = -EILLEGALACCESS;
- __real_send(fd, ret);
- return ret;
- }
- }
- }
- }
-
- return 0;
-}
-
-static int __get_pid_for_app_group(const char *appid, int pid, int caller_uid, bundle* kb,
- int *lpid, gboolean *can_attach, gboolean *new_process,
- app_group_launch_mode* launch_mode, bool *is_subapp)
-{
- int st = -1;
- int found_pid = -1;
- int found_lpid = -1;
-
- if (app_group_is_group_app(kb)) {
- pid = -1;
- *is_subapp = true;
- } else {
- *is_subapp = false;
- }
-
- if (pid > 0)
- st = _status_get_app_info_status(pid, caller_uid);
-
- if (pid == -1 || st == STATUS_DYING) {
-
- if (app_group_find_singleton(appid, &found_pid, &found_lpid) == 0) {
- pid = found_pid;
- *new_process = FALSE;
- } else {
- *new_process = TRUE;
- }
-
- if (app_group_can_start_app(appid, kb, can_attach, lpid, launch_mode) != 0) {
- _E("can't make group info");
- return -EILLEGALACCESS;
- }
-
- if (*can_attach && *lpid == found_lpid) {
- _E("can't launch singleton app in the same group");
- return -EILLEGALACCESS;
- }
-
- if (found_pid != -1) {
- _W("app_group_clear_top, pid: %d", found_pid);
- app_group_clear_top(found_pid);
- }
- }
-
- if (pid == -1 && *can_attach)
- pid = app_group_find_pid_from_recycle_bin(appid);
-
- return pid;
-}
-
-static int __tep_mount(char *mnt_path[])
-{
- DBusMessage *msg;
- int func_ret = 0;
- int rv = 0;
- struct stat link_buf = {0,};
-
- static DBusConnection *conn = NULL;
-
- if (!conn) {
- conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
- if (!conn) {
- _E("dbus_bus_get error");
- return -1;
- }
- }
-
- rv = lstat(mnt_path[0], &link_buf);
- if (rv == 0) {
- rv = unlink(mnt_path[0]);
- if (rv)
- _E("Unable tp remove link file %s", mnt_path[0]);
- }
-
- msg = dbus_message_new_method_call(TEP_BUS_NAME, TEP_OBJECT_PATH,
- TEP_INTERFACE_NAME, TEP_MOUNT_METHOD);
- if (!msg) {
- _E("dbus_message_new_method_call(%s:%s-%s)", TEP_OBJECT_PATH,
- TEP_INTERFACE_NAME, TEP_MOUNT_METHOD);
- return -1;
- }
-
- if (!dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &mnt_path[0],
- DBUS_TYPE_STRING, &mnt_path[1],
- DBUS_TYPE_INVALID)) {
- _E("Ran out of memory while constructing args\n");
- func_ret = -1;
- goto func_out;
- }
-
- if (dbus_connection_send(conn, msg, NULL) == FALSE) {
- _E("dbus_connection_send error");
- func_ret = -1;
- goto func_out;
- }
-
-func_out:
- dbus_message_unref(msg);
-
- return func_ret;
-}
-
-static void __send_mount_request(const struct appinfo *ai, const char *tep_name,
- bundle *kb)
-{
- SECURE_LOGD("tep name is: %s", tep_name);
- char *mnt_path[2] = {NULL, };
- const char *installed_storage = NULL;
- char tep_path[PATH_MAX] = {0, };
- const char *path_app_root = NULL;
-
- const char *global = appinfo_get_value(ai, AIT_GLOBAL);
- const char *pkgid = appinfo_get_value(ai, AIT_PKGID);
- installed_storage = appinfo_get_value(ai, AIT_STORAGE_TYPE);
-
- if (global && strcmp("true", global) == 0)
- path_app_root = PATH_GLOBAL_APP_ROOT;
- else
- path_app_root = PATH_APP_ROOT;
-
- if (installed_storage != NULL) {
- SECURE_LOGD("storage: %s", installed_storage);
- if (strncmp(installed_storage, "internal", 8) == 0) {
- snprintf(tep_path, PATH_MAX, "%s/%s/res/%s",
- path_app_root, pkgid, tep_name);
- mnt_path[1] = strdup(tep_path);
- snprintf(tep_path, PATH_MAX, "%s/%s/res/tep",
- path_app_root, pkgid);
- mnt_path[0] = strdup(tep_path);
- } else if (strncmp(installed_storage, "external", 8) == 0) {
- snprintf(tep_path, PATH_MAX, "%step/%s",
- PREFIX_EXTERNAL_STORAGE_PATH, tep_name);
- mnt_path[1] = strdup(tep_path);
- snprintf(tep_path, PATH_MAX, "%step/tep-access",
- PREFIX_EXTERNAL_STORAGE_PATH); /* TODO : keeping tep/tep-access for now for external storage */
- mnt_path[0] = strdup(tep_path);
- }
-
- if (mnt_path[0] && mnt_path[1]) {
- bundle_add(kb, AUL_TEP_PATH, mnt_path[0]);
- int ret = -1;
- ret = aul_is_tep_mount_dbus_done(mnt_path[0]);
- if (ret != 1) {
- ret = __tep_mount(mnt_path);
- if (ret < 0)
- _E("dbus error %d", ret);
- }
- }
- if (mnt_path[0])
- free(mnt_path[0]);
- if (mnt_path[1])
- free(mnt_path[1]);
- }
-}
-
-int _send_hint_for_visibility(uid_t uid)
-{
- bundle *b = NULL;
- int ret;
-
- b = bundle_create();
-
- ret = app_agent_send_cmd(uid, LAUNCHPAD_PROCESS_POOL_SOCK,
- PAD_CMD_VISIBILITY, b);
-
- if (b)
- bundle_free(b);
- __pid_of_last_launched_ui_app = 0;
-
- return ret;
-}
-
-int _get_pid_of_last_launched_ui_app()
-{
- return __pid_of_last_launched_ui_app;
-}
-
-int _start_app(const char* appid, bundle* kb, int cmd, int caller_pid,
- uid_t caller_uid, int fd, bool *pending)
-{
- int ret;
- const struct appinfo *ai;
- const char *status;
- const char *multiple = NULL;
- const char *app_path = NULL;
- const char *pkg_type = NULL;
- const char *pkg_id = NULL;
- const char *component_type = NULL;
- const char *process_pool = NULL;
- const char *tep_name = NULL;
- int pid = -1;
- char tmpbuf[MAX_PID_STR_BUFSZ];
- const char *hwacc;
- char *caller_appid;
- int lpid;
- int callee_status = -1;
- gboolean can_attach = FALSE;
- gboolean new_process = FALSE;
- app_group_launch_mode launch_mode;
- const char *pad_type = LAUNCHPAD_PROCESS_POOL_SOCK;
- bool is_subapp = false;
-
- snprintf(tmpbuf, MAX_PID_STR_BUFSZ, "%d", caller_pid);
- bundle_add(kb, AUL_K_CALLER_PID, tmpbuf);
-
- snprintf(tmpbuf, MAX_PID_STR_BUFSZ, "%d", caller_uid);
- bundle_add(kb, AUL_K_CALLER_UID, tmpbuf);
-
- _D("_start_app: caller pid=%d uid=%d", caller_pid, caller_uid);
-
- if (cmd == APP_START_RES)
- bundle_add(kb, AUL_K_WAIT_RESULT, "1");
-
- caller_appid = _status_app_get_appid_bypid(caller_pid);
- if (caller_appid != NULL) {
- bundle_add(kb, AUL_K_CALLER_APPID, caller_appid);
- } else {
- caller_appid = _status_app_get_appid_bypid(getpgid(caller_pid));
- if (caller_appid != NULL)
- bundle_add(kb, AUL_K_CALLER_APPID, caller_appid);
- }
-
- ai = appinfo_find(caller_uid, appid);
- if (ai == NULL) {
- _D("cannot find appinfo of %s", appid);
- __real_send(fd, -ENOENT);
- return -1;
- }
-
- status = appinfo_get_value(ai, AIT_STATUS);
- if (status == NULL)
- return -1;
-
- if (!strcmp(status, "blocking")) {
- _D("blocking");
- __real_send(fd, -EREJECTED);
- return -EREJECTED;
- }
-
- app_path = appinfo_get_value(ai, AIT_EXEC);
- pkg_type = appinfo_get_value(ai, AIT_TYPE);
- pkg_id = appinfo_get_value(ai, AIT_PKGID);
- process_pool = appinfo_get_value(ai, AIT_POOL);
-
- if ((ret = __compare_signature(ai, cmd, caller_uid, appid, caller_appid, fd)) != 0)
- return ret;
-
- multiple = appinfo_get_value(ai, AIT_MULTI);
- if (!multiple || strncmp(multiple, "false", 5) == 0)
- pid = _status_app_is_running(appid, caller_uid);
-
- component_type = appinfo_get_value(ai, AIT_COMPTYPE);
- if (strncmp(component_type, APP_TYPE_UI, strlen(APP_TYPE_UI)) == 0) {
- pid = __get_pid_for_app_group(appid, pid, caller_uid, kb,
- &lpid, &can_attach, &new_process, &launch_mode, &is_subapp);
- if (pid == -EILLEGALACCESS) {
- __real_send(fd, pid);
- return pid;
- }
- }
-
- tep_name = appinfo_get_value(ai, AIT_TEP);
- if (tep_name != NULL)
- __send_mount_request(ai, tep_name, kb);
-
- if (pid > 0)
- callee_status = _status_get_app_info_status(pid, caller_uid);
-
- if (pid > 0 && callee_status != STATUS_DYING) {
- if (caller_pid == pid) {
- SECURE_LOGD("caller process & callee process is same.[%s:%d]", appid, pid);
- pid = -ELOCALLAUNCH_ID;
- __real_send(fd, pid);
- } else {
- aul_send_app_resume_request_signal(pid, appid, pkg_id, component_type);
- if ((ret = __nofork_processing(cmd, pid, kb, fd)) < 0) {
- pid = ret;
- __real_send(fd, pid);
- }
- }
- } else {
- if (callee_status == STATUS_DYING && pid > 0) {
- ret = kill(pid, SIGKILL);
- if (ret == -1)
- _W("send SIGKILL: %s", strerror(errno));
- }
-
- hwacc = appinfo_get_value(ai, AIT_HWACC);
- bundle_add(kb, AUL_K_HWACC, hwacc);
- bundle_add(kb, AUL_K_EXEC, app_path);
- bundle_add(kb, AUL_K_PACKAGETYPE, pkg_type);
- bundle_add(kb, AUL_K_PKGID, pkg_id);
- bundle_add(kb, AUL_K_INTERNAL_POOL, process_pool);
- bundle_add(kb, AUL_K_COMP_TYPE, component_type);
-
- if (bundle_get_type(kb, AUL_K_SDK) != BUNDLE_TYPE_NONE)
- pad_type = DEBUG_LAUNCHPAD_SOCK;
-
- pid = app_agent_send_cmd(caller_uid, pad_type, PAD_CMD_LAUNCH, kb);
- if (pid > 0) {
- *pending = true;
- aul_send_app_launch_request_signal(pid, appid, pkg_id, component_type);
- }
- }
-
- if (pid > 0) {
- _status_add_app_info_list(appid, app_path, pid, LAUNCHPAD_PID, is_subapp, caller_uid);
- if (strncmp(component_type, APP_TYPE_UI, strlen(APP_TYPE_UI)) == 0) {
- if (new_process) {
- _D("add app group info");
- __pid_of_last_launched_ui_app = pid;
- app_group_start_app(pid, kb, lpid, can_attach, launch_mode);
- } else {
- app_group_restart_app(pid, kb);
- }
- }
- }
-
- return pid;
-}
+++ /dev/null
-/*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <stdbool.h>
-
-#include <bundle.h>
-#include "aul_util.h"
-#include "amd_appinfo.h"
-
-int _send_to_sigkill(int pid);
-int _resume_app(int pid, int clifd);
-int _pause_app(int pid, int clifd);
-int _term_app(int pid, int clifd);
-int _term_req_app(int pid, int clifd);
-int _term_bgapp(int pid, int clifd);
-int _term_sub_app(int pid);
-int _fake_launch_app(int cmd, int pid, bundle * kb, int clifd);
-int _start_app(const char* appid, bundle* kb, int cmd, int caller_pid, uid_t caller_uid, int fd, bool *pend);
-int _start_app_local(uid_t uid, const char *appid);
-int _start_app_local_with_bundle(uid_t uid, const char *appid, bundle *kb);
-int _get_pid_of_last_launched_ui_app();
-int _send_hint_for_visibility(uid_t uid);
-
-
+++ /dev/null
-/*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-#include <aul.h>
-#include <vconf.h>
-#include <pkgmgr-info.h>
-#include <glib.h>
-#include <stdlib.h>
-#include <tzplatform_config.h>
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib-lowlevel.h>
-#include <bundle.h>
-#include <stdbool.h>
-
-#include "amd_config.h"
-#include "simple_util.h"
-#include "aul_util.h"
-#include "amd_appinfo.h"
-#include "amd_status.h"
-#include "amd_launch.h"
-#include "amd_request.h"
-#include "amd_app_group.h"
-
-#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
-#define AUL_SP_DBUS_PATH "/Org/Tizen/Aul/Syspopup"
-#define AUL_SP_DBUS_SIGNAL_INTERFACE "org.tizen.aul.syspopup"
-#define AUL_SP_DBUS_LAUNCH_REQUEST_SIGNAL "syspopup_launch_request"
-
-struct restart_info {
- char *appid;
- int count;
- guint timer;
-};
-
-static GHashTable *restart_tbl;
-
-static void __vconf_cb(keynode_t *key, void *data);
-static int __init(void);
-
-static void __vconf_cb(keynode_t *key, void *data)
-{
- const char *name;
-
- name = vconf_keynode_get_name(key);
- if (name == NULL)
- return;
- else if (strcmp(name, VCONFKEY_SETAPPL_DEVOPTION_BGPROCESS) == 0) {
- //TODO : clear bgapp
-
- }
-}
-
-static gboolean __restart_timeout_handler(void *data)
-{
- struct restart_info *ri = (struct restart_info *)data;
-
- _D("ri (%x)", ri);
- _D("appid (%s)", ri->appid);
-
- g_hash_table_remove(restart_tbl, ri->appid);
- free(ri->appid);
- free(ri);
-
- return FALSE;
-}
-
-static bool __check_restart(const char *appid)
-{
- struct restart_info *ri = NULL;
-
- ri = g_hash_table_lookup(restart_tbl, appid);
- if (!ri) {
- ri = malloc(sizeof(struct restart_info));
- if (!ri) {
- _E("create restart info: %s", strerror(errno));
- return false;
- }
- memset(ri, 0, sizeof(struct restart_info));
- ri->appid = strdup(appid);
- ri->count = 1;
- g_hash_table_insert(restart_tbl, ri->appid, ri);
-
- _D("ri (%x)", ri);
- _D("appid (%s)", appid);
-
- ri->timer = g_timeout_add(10 * 1000, __restart_timeout_handler, ri);
- } else {
- ri->count++;
- _D("count (%d)", ri->count);
- if (ri->count > 5) {
- g_source_remove(ri->timer);
- g_hash_table_remove(restart_tbl, ri->appid);
- free(ri->appid);
- free(ri);
- return false;
- }
- }
- return true;
-}
-
-static bool __can_restart_app(int pid)
-{
- const char *pkg_status;
- const char *appid = NULL;
- const struct appinfo *ai = NULL;
-
- appid = _status_app_get_appid_bypid(pid);
-
- if (!appid)
- return false;
-
- ai = appinfo_find(getuid(), appid);
- pkg_status = appinfo_get_value(ai, AIT_STATUS);
- _D("appid: %s", appid);
-
- if (ai && pkg_status && strncmp(pkg_status, "blocking", 8) == 0) {
- appinfo_set_value((struct appinfo *)ai, AIT_STATUS, "restart");
- } else if (ai && pkg_status && strncmp(pkg_status, "norestart", 9) == 0) {
- appinfo_set_value((struct appinfo *)ai, AIT_STATUS, "installed");
- } else {
- int r = appinfo_get_boolean(ai, AIT_RESTART);
-
- if (r && __check_restart(appid))
- return true;
- }
-
- return false;
-}
-
-static int __app_dead_handler(int pid, void *data)
-{
- if (pid <= 0)
- return 0;
-
- _D("APP_DEAD_SIGNAL : %d", pid);
-
- bool restart;
- char *appid = NULL;
- const char *tmp_appid;
-
- restart = __can_restart_app(pid);
- if (restart) {
- tmp_appid = _status_app_get_appid_bypid(pid);
-
- if (tmp_appid)
- appid = strdup(tmp_appid);
- }
-
- if (app_group_is_leader_pid(pid)) {
- _W("app_group_leader_app, pid: %d", pid);
- if (app_group_find_second_leader(pid) == -1) {
- app_group_clear_top(pid);
- app_group_set_dead_pid(pid);
- app_group_remove(pid);
- } else
- app_group_remove_leader_pid(pid);
- } else if (app_group_is_sub_app(pid)) {
- _W("app_group_sub_app, pid: %d", pid);
- int caller_pid = app_group_get_next_caller_pid(pid);
-
- if (app_group_can_reroute(pid) || (caller_pid > 0 && caller_pid != pid)) {
- _W("app_group reroute");
- app_group_reroute(pid);
- } else {
- _W("app_group clear top");
- app_group_clear_top(pid);
- }
- app_group_set_dead_pid(pid);
- app_group_remove(pid);
- }
-
- _status_remove_app_info_list(pid, getuid());
- _request_flush_pending_request(pid);
- aul_send_app_terminated_signal(pid);
-
- if (restart)
- _start_app_local(getuid(), appid);
- if (appid)
- free(appid);
-
- return 0;
-}
-
-int __agent_dead_handler(uid_t user)
-{
- _status_remove_app_info_list_with_uid(user);
- return 0;
-}
-
-static DBusHandlerResult __syspopup_signal_filter(DBusConnection *conn,
- DBusMessage *message, void *data)
-{
- DBusError error;
- const char *interface;
- const char *appid;
- const char *b_raw;
- bundle *kb;
-
- dbus_error_init(&error);
-
- interface = dbus_message_get_interface(message);
- if (interface == NULL) {
- _E("reject by security issue - no interface");
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- if (dbus_message_is_signal(message, interface,
- AUL_SP_DBUS_LAUNCH_REQUEST_SIGNAL)) {
- if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &appid,
- DBUS_TYPE_STRING, &b_raw, DBUS_TYPE_INVALID) == FALSE) {
- _E("Failed to get data: %s", error.message);
- dbus_error_free(&error);
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- _D("syspopup launch request: %s", appid);
- kb = bundle_decode((const bundle_raw *)b_raw, strlen(b_raw));
- if (kb) {
- if (_start_app_local_with_bundle(getuid(), appid, kb) < 0)
- _E("syspopup launch request failed: %s", appid);
-
- bundle_free(kb);
- }
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static int __syspopup_dbus_signal_handler_init(void)
-{
- DBusError error;
- DBusConnection *conn;
- char rule[MAX_LOCAL_BUFSZ];
-
- dbus_error_init(&error);
-
- conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
- if (conn == NULL) {
- _E("Failed to connect to the D-BUS Daemon: %s", error.message);
- dbus_error_free(&error);
- return -1;
- }
-
- dbus_connection_setup_with_g_main(conn, NULL);
-
- snprintf(rule, sizeof(rule), "path='%s',type='signal',interface='%s'",
- AUL_SP_DBUS_PATH, AUL_SP_DBUS_SIGNAL_INTERFACE);
- dbus_bus_add_match(conn, rule, &error);
- if (dbus_error_is_set(&error)) {
- _E("Failed to rule set: %s", error.message);
- dbus_error_free(&error);
- return -1;
- }
-
- if (dbus_connection_add_filter(conn,
- __syspopup_signal_filter, NULL, NULL) == FALSE) {
- _E("Failed to add filter");
- return -1;
- }
-
- _D("syspopup dbus signal initialized");
-
- return 0;
-}
-
-static int __init(void)
-{
- if (appinfo_init()) {
- _E("appinfo_init failed\n");
- return -1;
- }
-
- if (aul_listen_app_dead_signal(__app_dead_handler, NULL)) {
- _E("aul_listen_app_dead_signal failed");
- return -1;
- }
-
- restart_tbl = g_hash_table_new(g_str_hash, g_str_equal);
- _request_init();
- _status_init();
- app_group_init();
-
- if (vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVOPTION_BGPROCESS,
- __vconf_cb, NULL) != 0)
- _E("Unable to register callback for VCONFKEY_SETAPPL_DEVOPTION_BGPROCESS\n");
-
- if (__syspopup_dbus_signal_handler_init() < 0)
- _E("__syspopup_dbus_signal_handler_init failed");
-
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- GMainLoop *mainloop = NULL;
-
- if (__init() != 0) {
- _E("AMD Initialization failed!\n");
- return -1;
- }
-
- mainloop = g_main_loop_new(NULL, FALSE);
- if (!mainloop) {
- _E("failed to create glib main loop");
- return -1;
- }
- g_main_loop_run(mainloop);
-
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <string.h>
-#include <dlfcn.h>
-#include <poll.h>
-
-#include <glib.h>
-
-#include <aul.h>
-#include <bundle.h>
-#include <bundle_internal.h>
-#include <rua.h>
-#include <rua_stat.h>
-#include <tzplatform_config.h>
-#include <systemd/sd-login.h>
-
-#include "amd_config.h"
-#include "simple_util.h"
-#include "app_sock.h"
-#include "aul_util.h"
-#include "amd_request.h"
-#include "amd_launch.h"
-#include "amd_appinfo.h"
-#include "amd_status.h"
-#include "amd_app_group.h"
-#include "amd_cynara.h"
-#include "launch.h"
-#include "aul_svc.h"
-#include "aul_svc_priv_key.h"
-
-#define INHOUSE_UID tzplatform_getuid(TZ_USER_NAME)
-#define REGULAR_UID_MIN 5000
-
-#define PRIVILEGE_APPMANAGER_LAUNCH "http://tizen.org/privilege/appmanager.launch"
-#define PRIVILEGE_APPMANAGER_KILL "http://tizen.org/privilege/appmanager.kill"
-#define PRIVILEGE_APPMANAGER_KILL_BGAPP "http://tizen.org/privilege/appmanager.kill.bgapp"
-#define PRIVILEGE_DOWNLOAD "http://tizen.org/privilege/download"
-#define PRIVILEGE_CALL "http://tizen.org/privilege/call"
-
-#define MAX_NR_OF_DESCRIPTORS 2
-#define PENDING_REQUEST_TIMEOUT 5000 /* msec */
-
-static GHashTable *__socket_pair_hash = NULL;
-static GHashTable *pending_table;
-
-struct pending_item {
- int clifd;
- int pid;
- guint timer;
- GList *pending_list;
-};
-
-struct request {
- int clifd;
- app_pkt_t *pkt;
- struct ucred cr;
-};
-
-typedef struct _rua_stat_pkt_t {
- int uid;
- char *stat_tag;
- char *stat_caller;
- char appid[512];
- gboolean is_group_app;
- char *data;
- int len;
-} rua_stat_pkt_t;
-
-typedef int (*app_cmd_dispatch_func)(int clifd, const app_pkt_t *pkt, struct ucred *cr);
-
-static int __send_result_to_client(int fd, int res);
-static gboolean __request_handler(gpointer data);
-static gboolean __timeout_pending_item(gpointer user_data);
-
-static int __send_message(int sock, const struct iovec *vec, int vec_size, const int *desc, int nr_desc)
-{
- struct msghdr msg = {0};
- int sndret;
-
- if (vec == NULL || vec_size < 1)
- return -EINVAL;
- if (nr_desc < 0 || nr_desc > MAX_NR_OF_DESCRIPTORS)
- return -EINVAL;
- if (desc == NULL)
- nr_desc = 0;
-
- msg.msg_iov = (struct iovec *)vec;
- msg.msg_iovlen = vec_size;
-
- /* sending ancillary data */
- if (nr_desc > 0) {
- int desclen = 0;
- struct cmsghdr *cmsg = NULL;
- char buff[CMSG_SPACE(sizeof(int) * MAX_NR_OF_DESCRIPTORS)] = {0};
-
- msg.msg_control = buff;
- msg.msg_controllen = sizeof(buff);
- cmsg = CMSG_FIRSTHDR(&msg);
- if (cmsg == NULL)
- return -EINVAL;
-
- /* packing files descriptors */
- if (nr_desc > 0) {
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- desclen = cmsg->cmsg_len = CMSG_LEN(sizeof(int) * nr_desc);
- memcpy((int *)CMSG_DATA(cmsg), desc, sizeof(int) * nr_desc);
- cmsg = CMSG_NXTHDR(&msg, cmsg);
-
- _D("packing file descriptors done");
- }
-
- /* finished packing updating the corect length */
- msg.msg_controllen = desclen;
- } else {
- msg.msg_control = NULL;
- msg.msg_controllen = 0;
- }
-
- sndret = sendmsg(sock, &msg, 0);
-
- _D("sendmsg ret : %d", sndret);
- if (sndret < 0)
- return -errno;
- else
- return sndret;
-}
-
-static int __send_result_data(int fd, int cmd, unsigned char *kb_data, int datalen)
-{
- int len;
- int sent = 0;
- int res = 0;
- app_pkt_t *pkt = NULL;
-
- pkt = (app_pkt_t *)malloc(AUL_PKT_HEADER_SIZE + datalen);
- if (NULL == pkt) {
- _E("Malloc Failed!");
- return -ENOMEM;
- }
-
- pkt->cmd = cmd;
- pkt->len = datalen;
- memcpy(pkt->data, kb_data, datalen);
-
- while (sent != AUL_PKT_HEADER_SIZE + datalen) {
- len = send(fd, pkt, AUL_PKT_HEADER_SIZE + datalen - sent, 0);
- if (len <= 0) {
- _E("send error fd:%d (errno %d)", fd, errno);
- close(fd);
- free(pkt);
- return -ECOMM;
- }
- sent += len;
- }
-
- free(pkt);
- close(fd);
-
- return res;
-}
-
-extern int __app_dead_handler(int pid, uid_t user);
-extern int __agent_dead_handler(uid_t user);
-
-static int __send_result_to_client(int fd, int res)
-{
- if (send(fd, &res, sizeof(int), MSG_NOSIGNAL) < 0) {
- if (errno == EPIPE)
- _E("send failed due to EPIPE.\n");
- _E("send fail to client");
- }
- close(fd);
- return 0;
-}
-
-static void __real_send(int clifd, int ret)
-{
- if (send(clifd, &ret, sizeof(int), MSG_NOSIGNAL) < 0) {
- if (errno == EPIPE)
- _E("send failed due to EPIPE.\n");
-
- _E("send fail to client");
- }
-
- close(clifd);
-}
-
-static int __get_caller_pid(bundle *kb)
-{
- const char *pid_str;
- int pid;
-
- pid_str = bundle_get_val(kb, AUL_K_ORG_CALLER_PID);
- if (pid_str)
- goto end;
-
- pid_str = bundle_get_val(kb, AUL_K_CALLER_PID);
- if (pid_str == NULL)
- return -1;
-
-end:
- pid = atoi(pid_str);
- if (pid <= 1)
- return -1;
-
- return pid;
-}
-
-static int __foward_cmd(int cmd, bundle *kb, int cr_pid)
-{
- int pid;
- int pgid;
- char tmp_pid[MAX_PID_STR_BUFSZ];
- int datalen;
- bundle_raw *kb_data;
- int res;
-
- if ((pid = __get_caller_pid(kb)) < 0)
- return AUL_R_ERROR;
-
- pgid = getpgid(cr_pid);
- if (pgid > 0) {
- snprintf(tmp_pid, MAX_PID_STR_BUFSZ, "%d", pgid);
- bundle_del(kb, AUL_K_CALLEE_PID);
- bundle_add(kb, AUL_K_CALLEE_PID, tmp_pid);
- }
-
- bundle_encode(kb, &kb_data, &datalen);
- if ((res = __app_send_raw_with_noreply(pid, cmd, kb_data, datalen)) < 0)
- res = AUL_R_ERROR;
-
- free(kb_data);
-
- return res;
-}
-
-static int __app_process_by_pid(int cmd,
- const char *pkg_name, struct ucred *cr, int clifd)
-{
- int pid;
- int ret;
- int dummy;
- char *appid;
- const char *pkgid = NULL;
- const char *type = NULL;
- const struct appinfo *ai = NULL;
-
- if (pkg_name == NULL)
- return -1;
-
- pid = atoi(pkg_name);
- if (pid <= 1) {
- _E("invalid pid");
- return -1;
- }
-
- appid = _status_app_get_appid_bypid(pid);
- if (appid == NULL) {
- _E("pid %d is not an app", pid);
- __real_send(clifd, -1);
- return -1;
- }
-
- ai = appinfo_find(cr->uid, appid);
- if (ai) {
- pkgid = appinfo_get_value(ai, AIT_PKGID);
- type = appinfo_get_value(ai, AIT_COMPTYPE);
- }
-
- if (ai && (cmd == APP_RESUME_BY_PID || cmd == APP_PAUSE_BY_PID))
- aul_send_app_resume_request_signal(pid, appid, pkgid, type);
- else
- aul_send_app_terminate_request_signal(pid, appid, pkgid, type);
-
- switch (cmd) {
- case APP_RESUME_BY_PID:
- ret = _resume_app(pid, clifd);
- break;
- case APP_TERM_BY_PID:
- case APP_TERM_BY_PID_WITHOUT_RESTART:
- ret = _term_app(pid, clifd);
- break;
- case APP_TERM_BGAPP_BY_PID:
- ret = _term_bgapp(pid, clifd);
- break;
- case APP_KILL_BY_PID:
- if ((ret = _send_to_sigkill(pid)) < 0)
- _E("fail to killing - %d\n", pid);
- _status_update_app_info_list(pid, STATUS_DYING, cr->uid);
- __real_send(clifd, ret);
- break;
- case APP_TERM_REQ_BY_PID:
- ret = _term_req_app(pid, clifd);
- break;
- case APP_TERM_BY_PID_ASYNC:
- if ((ret = __app_send_raw_with_noreply(pid, cmd, (unsigned char *)&dummy, sizeof(int))) < 0)
- _D("terminate req packet send error");
-
- __real_send(clifd, ret);
- break;
- case APP_PAUSE_BY_PID:
- ret = _pause_app(pid, clifd);
- break;
- default:
- _E("unknown command: %d", cmd);
- ret = -1;
- }
-
- return ret;
-}
-
-static void __set_effective_appid(uid_t uid, bundle *kb)
-{
- const struct appinfo *ai;
- const struct appinfo *effective_ai;
- const char *appid;
- const char *effective_appid;
- const char *pkgid;
- const char *effective_pkgid;
-
- appid = bundle_get_val(kb, AUL_K_APPID);
- if (appid == NULL)
- return;
-
- ai = appinfo_find(uid, appid);
- if (ai == NULL)
- return;
-
- effective_appid = appinfo_get_value(ai, AIT_EFFECTIVE_APPID);
- if (effective_appid == NULL)
- return;
-
- effective_ai = appinfo_find(uid, effective_appid);
- if (effective_ai == NULL)
- return;
-
- pkgid = appinfo_get_value(ai, AIT_PKGID);
- effective_pkgid = appinfo_get_value(effective_ai, AIT_PKGID);
- if (pkgid && effective_pkgid && strcmp(pkgid, effective_pkgid) == 0) {
- _D("use effective appid instead of the real appid");
- bundle_del(kb, AUL_K_APPID);
- bundle_add(kb, AUL_K_APPID, effective_appid);
- }
-}
-
-static gboolean __add_history_handler(gpointer user_data)
-{
- struct rua_rec rec;
- int ret;
- char *app_path = NULL;
- struct appinfo *ai;
-
- rua_stat_pkt_t *pkt = (rua_stat_pkt_t *)user_data;
-
- if (!pkt)
- return FALSE;
-
- if (!pkt->is_group_app) {
- ai = (struct appinfo *)appinfo_find(pkt->uid, pkt->appid);;
- app_path = (char *)appinfo_get_value(ai, AIT_EXEC);
-
- memset((void *)&rec, 0, sizeof(rec));
-
- rec.pkg_name = pkt->appid;
- rec.app_path = app_path;
-
- if (pkt->len > 0)
- rec.arg = pkt->data;
-
- SECURE_LOGD("add rua history %s %s", rec.pkg_name, rec.app_path);
-
- ret = rua_add_history(&rec);
- if (ret == -1)
- _D("rua add history error");
- }
-
- if (pkt->stat_caller != NULL && pkt->stat_tag != NULL) {
- SECURE_LOGD("rua_stat_caller: %s, rua_stat_tag: %s", pkt->stat_caller, pkt->stat_tag);
- rua_stat_update(pkt->stat_caller, pkt->stat_tag);
- }
- if (pkt) {
- if (pkt->data)
- free(pkt->data);
- if (pkt->stat_caller)
- free(pkt->stat_caller);
- if (pkt->stat_tag)
- free(pkt->stat_tag);
- free(pkt);
- }
-
- return FALSE;
-}
-
-static int __add_rua_info(const app_pkt_t *pkt, bundle *kb, uid_t uid, const char *appid)
-{
- const char *stat_caller = NULL;
- const char *stat_tag = NULL;
- rua_stat_pkt_t *rua_stat_item = NULL;
-
- rua_stat_item = calloc(1, sizeof(rua_stat_pkt_t));
- if (rua_stat_item == NULL) {
- _E("out of memory");
- goto error;
- }
-
- if (pkt->len > 0) {
- rua_stat_item->data = (char *)calloc(pkt->len, sizeof(char));
- if (rua_stat_item->data == NULL) {
- _E("out of memory");
- goto error;
- }
- memcpy(rua_stat_item->data, pkt->data, pkt->len);
- }
- stat_caller = bundle_get_val(kb, AUL_SVC_K_RUA_STAT_CALLER);
- stat_tag = bundle_get_val(kb, AUL_SVC_K_RUA_STAT_TAG);
-
- rua_stat_item->len = pkt->len;
- if (stat_caller != NULL) {
- rua_stat_item->stat_caller = strdup(stat_caller);
- if (rua_stat_item->stat_caller == NULL) {
- _E("Out of memory");
- goto error;
- }
- }
-
- if (stat_tag != NULL) {
- rua_stat_item->stat_tag = strdup(stat_tag);
- if (rua_stat_item->stat_tag == NULL) {
- _E("Out of memory");
- goto error;
- }
-
- }
- rua_stat_item->uid = uid;
- rua_stat_item->is_group_app = app_group_is_group_app(kb);
- strncpy(rua_stat_item->appid, appid, 511);
-
- g_timeout_add(1500, __add_history_handler, rua_stat_item);
-
- return 0;
-error:
- if (rua_stat_item) {
- if (rua_stat_item->data)
- free(rua_stat_item->data);
- if (rua_stat_item->stat_caller)
- free(rua_stat_item->stat_caller);
- if (rua_stat_item->stat_tag)
- free(rua_stat_item->stat_tag);
- free(rua_stat_item);
- }
- return -1;
-}
-
-static void __handle_agent_dead_signal(struct ucred *pcr)
-{
- /* TODO: check the credentials from the caller: must be the amd agent */
-
- _D("AGENT_DEAD_SIGNAL : %d", pcr->uid);
- __agent_dead_handler(pcr->uid);
-}
-
-static int __check_app_control_privilege(int fd, const char *operation)
-{
- int ret = 0;
-
- if (operation == NULL || fd < 0)
- return 0;
-
- if (!strcmp(operation, AUL_SVC_OPERATION_DOWNLOAD)) {
- ret = check_privilege_by_cynara(fd, PRIVILEGE_DOWNLOAD);
- if (ret != 0) {
- _E("no privilege for DOWNLOAD operation");
- return -EILLEGALACCESS;
- }
- } else if (!strcmp(operation, AUL_SVC_OPERATION_CALL)) {
- ret = check_privilege_by_cynara(fd, PRIVILEGE_CALL);
- if (ret != 0) {
- _E("no privilege for CALL operation");
- return -EILLEGALACCESS;
- }
- }
-
- return 0;
-}
-
-static int __dispatch_get_socket_pair(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- char *caller;
- char *callee;
- char *socket_pair_key;
- int socket_pair_key_len;
- int *handles = NULL;
- struct iovec vec[3];
- int msglen = 0;
- char buffer[1024];
- struct sockaddr_un saddr;
- char *datacontrol_type;
- bundle *kb;
-
- kb = bundle_decode(pkt->data, pkt->len);
- caller = (char *)bundle_get_val(kb, AUL_K_CALLER_APPID);
- callee = (char *)bundle_get_val(kb, AUL_K_CALLEE_APPID);
- datacontrol_type = (char *)bundle_get_val(kb, "DATA_CONTOL_TYPE");
-
- socket_pair_key_len = strlen(caller) + strlen(callee) + 2;
-
- socket_pair_key = (char *)calloc(socket_pair_key_len, sizeof(char));
- if (socket_pair_key == NULL) {
- _E("calloc fail");
- goto err_out;
- }
-
- snprintf(socket_pair_key, socket_pair_key_len, "%s_%s", caller, callee);
- _D("socket pair key : %s", socket_pair_key);
-
- handles = g_hash_table_lookup(__socket_pair_hash, socket_pair_key);
- if (handles == NULL) {
- handles = (int *)calloc(2, sizeof(int));
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, handles) != 0) {
- _E("error create socket pair");
- __send_result_to_client(clifd, -1);
-
- if (handles)
- free(handles);
- goto err_out;
- }
-
- if (handles[0] == -1) {
- _E("error socket open");
- __send_result_to_client(clifd, -1);
-
- if (handles)
- free(handles);
- goto err_out;
- }
- g_hash_table_insert(__socket_pair_hash, strdup(socket_pair_key),
- handles);
-
- _D("New socket pair insert done.");
- }
-
-
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
-
- SECURE_LOGD("amd send fd : [%d, %d]", handles[0], handles[1]);
- vec[0].iov_base = buffer;
- vec[0].iov_len = strlen(buffer) + 1;
-
- if (datacontrol_type != NULL) {
- _D("datacontrol_type : %s", datacontrol_type);
- if (strcmp(datacontrol_type, "consumer") == 0) {
- msglen = __send_message(clifd, vec, 1, &handles[0], 1);
- if (msglen < 0) {
- _E("Error[%d]: while sending message\n", -msglen);
- __send_result_to_client(clifd, -1);
- g_hash_table_remove(__socket_pair_hash, socket_pair_key);
- goto err_out;
- }
- close(handles[0]);
- handles[0] = -1;
- if (handles[1] == -1) {
- _E("remove from hash : %s", socket_pair_key);
- g_hash_table_remove(__socket_pair_hash, socket_pair_key);
- }
-
- } else {
- msglen = __send_message(clifd, vec, 1, &handles[1], 1);
- if (msglen < 0) {
- _E("Error[%d]: while sending message\n", -msglen);
- __send_result_to_client(clifd, -1);
- g_hash_table_remove(__socket_pair_hash, socket_pair_key);
- goto err_out;
- }
- close(handles[1]);
- handles[1] = -1;
- if (handles[0] == -1) {
- _E("remove from hash : %s", socket_pair_key);
- g_hash_table_remove(__socket_pair_hash, socket_pair_key);
- }
- }
- }
- SECURE_LOGD("send_message msglen : [%d]\n", msglen);
- if (socket_pair_key)
- free(socket_pair_key);
- if (kb)
- bundle_free(kb);
-
- return 0;
-
-err_out:
- if (socket_pair_key)
- free(socket_pair_key);
- if (kb)
- bundle_free(kb);
-
- return -1;
-}
-
-static int __dispatch_remove_history(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
-/*
- int result = 0;
- bundle *b = NULL;
- b = bundle_decode(pkt->data, pkt->len);
- result = rua_delete_history_from_db(b);
- bundle_free(b);
-
- __send_result_data(clifd, APP_REMOVE_HISTORY,
- (unsigned char *)&result, sizeof(int));
-*/
- return 0;
-}
-
-static int __dispatch_app_group_get_window(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *b;
- char *buf;
- int pid;
- int wid;
-
- b = bundle_decode(pkt->data, pkt->len);
- bundle_get_str(b, AUL_K_PID, &buf);
- pid = atoi(buf);
- bundle_free(b);
- wid = app_group_get_window(pid);
- __send_result_to_client(clifd, wid);
-
- return 0;
-}
-
-static int __dispatch_app_group_set_window(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *b;
- char *buf;
- int wid;
- int ret;
-
- b = bundle_decode(pkt->data, pkt->len);
- bundle_get_str(b, AUL_K_WID, &buf);
- wid = atoi(buf);
- bundle_free(b);
- ret = app_group_set_window(cr->pid, wid);
- __send_result_to_client(clifd, ret);
-
- return ret;
-}
-
-static int __dispatch_app_group_get_fg_flag(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *b;
- char *buf;
- int pid;
- int fg;
-
- b = bundle_decode(pkt->data, pkt->len);
- bundle_get_str(b, AUL_K_PID, &buf);
- pid = atoi(buf);
- bundle_free(b);
- fg = app_group_get_fg_flag(pid);
- __send_result_to_client(clifd, fg);
-
- return 0;
-}
-
-static int __dispatch_app_group_clear_top(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- app_group_clear_top(cr->pid);
- __send_result_to_client(clifd, 0);
-
- return 0;
-}
-
-static int __dispatch_app_group_get_leader_pid(int clifd,
- const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *b;
- char *buf;
- int pid;
- int lpid;
-
- b = bundle_decode(pkt->data, pkt->len);
- bundle_get_str(b, AUL_K_PID, &buf);
- pid = atoi(buf);
- bundle_free(b);
- lpid = app_group_get_leader_pid(pid);
- __send_result_to_client(clifd, lpid);
-
- return 0;
-}
-
-static int __dispatch_app_group_get_leader_pids(int clifd,
- const app_pkt_t *pkt, struct ucred *cr)
-{
- int cnt;
- int *pids;
- unsigned char empty[1] = { 0 };
-
- app_group_get_leader_pids(&cnt, &pids);
-
- if (pids == NULL || cnt == 0) {
- __send_result_data(clifd, APP_GROUP_GET_LEADER_PIDS, empty, 0);
- } else {
- __send_result_data(clifd, APP_GROUP_GET_LEADER_PIDS,
- (unsigned char *)pids, cnt * sizeof(int));
- }
- if (pids != NULL)
- free(pids);
-
- return 0;
-}
-
-static int __dispatch_app_group_get_idle_pids(int clifd,
- const app_pkt_t *pkt, struct ucred *cr)
-{
- int cnt;
- int *pids;
- unsigned char empty[1] = { 0 };
-
- app_group_get_idle_pids(&cnt, &pids);
-
- if (pids == NULL || cnt == 0) {
- __send_result_data(clifd, APP_GROUP_GET_IDLE_PIDS, empty, 0);
- } else {
- __send_result_data(clifd, APP_GROUP_GET_IDLE_PIDS,
- (unsigned char *)pids, cnt * sizeof(int));
- }
- if (pids != NULL)
- free(pids);
-
- return 0;
-}
-
-static int __dispatch_app_group_get_group_pids(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *b;
- char *buf;
- int leader_pid;
- int cnt;
- int *pids;
- unsigned char empty[1] = { 0 };
-
- b = bundle_decode(pkt->data, pkt->len);
- bundle_get_str(b, AUL_K_LEADER_PID, &buf);
- leader_pid = atoi(buf);
- bundle_free(b);
-
- app_group_get_group_pids(leader_pid, &cnt, &pids);
- if (pids == NULL || cnt == 0) {
- __send_result_data(clifd, APP_GROUP_GET_GROUP_PIDS, empty, 0);
- } else {
- __send_result_data(clifd, APP_GROUP_GET_GROUP_PIDS,
- (unsigned char *)pids, cnt * sizeof(int));
- }
- if (pids != NULL)
- free(pids);
-
- return 0;
-}
-
-static int __dispatch_app_group_lower(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- int ret = 0;
-
- app_group_lower(cr->pid, &ret);
- __send_result_to_client(clifd, ret);
-
- return ret;
-}
-
-static int __dispatch_app_start(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- const char *appid;
- const char *target_uid;
- bundle *kb;
- int ret = -1;
- int t_uid;
- char *state;
- bool pending = false;
- struct pending_item *pending_item;
- const char *operation = NULL;
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- __set_effective_appid(cr->uid, kb);
-
- appid = bundle_get_val(kb, AUL_K_APPID);
- if (cr->uid < REGULAR_UID_MIN) {
- target_uid = bundle_get_val(kb, AUL_K_TARGET_UID);
- if (target_uid != NULL) {
- t_uid = atoi(target_uid);
- sd_uid_get_state(t_uid, &state);
- if (strcmp(state, "offline") &&
- strcmp(state, "closing")) {
- ret = _start_app(appid, kb, pkt->cmd, cr->pid,
- t_uid, clifd, &pending);
- } else {
- _E("uid:%d session is %s", t_uid, state);
- __real_send(clifd, AUL_R_ERROR);
- goto error;
- }
- } else {
- _E("request from root, treat as global user");
- ret = _start_app(appid, kb, pkt->cmd, cr->pid,
- GLOBAL_USER, clifd, &pending);
- }
- } else {
- operation = bundle_get_val(kb, AUL_SVC_K_OPERATION);
- if (operation) {
- ret = __check_app_control_privilege(clifd, operation);
- if (ret != 0) {
- __real_send(clifd, ret);
- goto error;
- }
- }
-
- ret = _start_app(appid, kb, pkt->cmd, cr->pid, cr->uid, clifd,
- &pending);
- }
-
- /* add pending list to wait app launched successfully */
- if (pending) {
- pending_item = calloc(1, sizeof(struct pending_item));
- pending_item->clifd = clifd;
- pending_item->pid = ret;
- pending_item->timer = g_timeout_add(PENDING_REQUEST_TIMEOUT,
- __timeout_pending_item, (gpointer)pending_item);
- g_hash_table_insert(pending_table, GINT_TO_POINTER(ret),
- pending_item);
- }
-
- if (ret > 0 && __add_rua_info(pkt, kb, cr->uid, appid) < 0)
- goto error;
- bundle_free(kb);
- return 0;
-
-error:
- if (kb)
- bundle_free(kb);
- return -1;
-}
-
-static int __dispatch_app_result(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *kb;
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- __foward_cmd(pkt->cmd, kb, cr->pid);
- close(clifd);
- bundle_free(kb);
-
- return 0;
-}
-
-static int __dispatch_app_pause(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- char *appid;
- bundle *kb;
- int ret;
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- appid = (char *)bundle_get_val(kb, AUL_K_APPID);
- ret = _status_app_is_running_v2(appid, cr->uid);
- if (ret > 0) {
- ret = _pause_app(ret, clifd);
- } else {
- _E("%s is not running", appid);
- close(clifd);
- }
- bundle_free(kb);
-
- return 0;
-}
-
-static int __dispatch_app_process_by_pid(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- char *appid;
- bundle *kb;
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- appid = (char *)bundle_get_val(kb, AUL_K_APPID);
- __app_process_by_pid(pkt->cmd, appid, cr, clifd);
- bundle_free(kb);
-
- return 0;
-}
-
-static int __dispatch_app_term_async(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- char *appid;
- bundle *kb;
- char *term_pid;
- struct appinfo *ai;
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- term_pid = (char *)bundle_get_val(kb, AUL_K_APPID);
- appid = _status_app_get_appid_bypid(atoi(term_pid));
- ai = appinfo_find(cr->uid, appid);
- if (ai) {
- appinfo_set_value(ai, AIT_STATUS, "norestart");
- __app_process_by_pid(pkt->cmd, term_pid, cr, clifd);
- } else {
- close(clifd);
- }
- bundle_free(kb);
-
- return 0;
-}
-
-static int __dispatch_app_term(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- char *appid;
- bundle *kb;
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- appid = (char *)bundle_get_val(kb, AUL_K_APPID);
- __app_process_by_pid(pkt->cmd, appid, cr, clifd);
- bundle_free(kb);
-
- return 0;
-}
-
-static int __dispatch_app_running_info(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- _status_send_running_appinfo(clifd, cr->uid);
- return 0;
-}
-
-static int __dispatch_app_is_running(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- char *appid = NULL;
- int ret;
-
- appid = malloc(MAX_PACKAGE_STR_SIZE);
- if (appid == NULL) {
- _E("out of memory");
- __send_result_to_client(clifd, -1);
- return -1;
- }
- strncpy(appid, (const char*)pkt->data, MAX_PACKAGE_STR_SIZE-1);
- ret = _status_app_is_running(appid, cr->uid);
- SECURE_LOGD("APP_IS_RUNNING : %s : %d", appid, ret);
- __send_result_to_client(clifd, ret);
- free(appid);
-
- return 0;
-}
-
-static int __dispatch_app_get_appid_by_pid(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- int pid;
- int ret;
-
- memcpy(&pid, pkt->data, pkt->len);
- ret = _status_get_appid_bypid(clifd, pid);
- _D("app_get_appid_bypid : %d : %d", pid, ret);
- return 0;
-}
-
-static int __dispatch_app_get_pkgid_by_pid(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- int pid;
- int ret;
-
- memcpy(&pid, pkt->data, sizeof(int));
- ret = _status_get_pkgid_bypid(clifd, pid);
- _D("APP_GET_PKGID_BYPID : %d : %d", pid, ret);
- return 0;
-}
-
-static int __dispatch_legacy_command(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- __send_result_to_client(clifd, 0);
- return 0;
-}
-
-static int __dispatch_app_status_update(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- int *status;
- char *appid;
- struct appinfo *ai;
-
- status = (int *)pkt->data;
- if (*status == STATUS_NORESTART) {
- appid = _status_app_get_appid_bypid(cr->pid);
- ai = appinfo_find(cr->uid, appid);
- appinfo_set_value((struct appinfo *)ai, AIT_STATUS, "norestart");
- } else {
- if (*status == STATUS_VISIBLE && cr->pid == _get_pid_of_last_launched_ui_app())
- _send_hint_for_visibility(cr->uid);
- _status_update_app_info_list(cr->pid, *status, cr->uid);
- }
- close(clifd);
-
- return 0;
-}
-
-static int __dispatch_app_get_status(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- int pid;
- int ret;
-
- memcpy(&pid, pkt->data, sizeof(int));
- ret = _status_get_app_info_status(pid, 0);
- __send_result_to_client(clifd, ret);
-
- return 0;
-}
-
-static int __dispatch_app_add_loader(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *kb;
- int ret;
- char tmpbuf[MAX_PID_STR_BUFSZ];
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- snprintf(tmpbuf, sizeof(tmpbuf), "%d", getpgid(cr->pid));
- bundle_add(kb, AUL_K_CALLER_PID, tmpbuf);
- ret = app_agent_send_cmd(cr->uid, LAUNCHPAD_PROCESS_POOL_SOCK,
- PAD_CMD_ADD_LOADER, kb);
- bundle_free(kb);
- __send_result_to_client(clifd, ret);
-
- return ret;
-}
-
-static int __dispatch_app_remove_loader(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- bundle *kb;
- int ret;
-
- kb = bundle_decode(pkt->data, pkt->len);
- if (kb == NULL) {
- close(clifd);
- return -1;
- }
-
- ret = app_agent_send_cmd(cr->uid, LAUNCHPAD_PROCESS_POOL_SOCK,
- PAD_CMD_REMOVE_LOADER, kb);
- bundle_free(kb);
- __send_result_to_client(clifd, ret);
-
- return ret;
-}
-
-static int __dispatch_agent_dead_signal(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- _D("AMD_AGENT_DEAD_SIGNAL");
- __handle_agent_dead_signal(cr);
- close(clifd);
-
- return 0;
-}
-
-static int __dispatch_amd_reload_appinfo(int clifd, const app_pkt_t *pkt, struct ucred *cr)
-{
- _D("AMD_RELOAD_APPINFO");
- appinfo_reload();
- __send_result_to_client(clifd, 0);
-
- return 0;
-}
-
-static const char *__convert_cmd_to_privilege(int cmd)
-{
- switch (cmd) {
- case APP_OPEN:
- case APP_RESUME:
- case APP_START:
- case APP_START_RES:
- return PRIVILEGE_APPMANAGER_LAUNCH;
- case APP_TERM_BY_PID_WITHOUT_RESTART:
- case APP_TERM_BY_PID_ASYNC:
- case APP_TERM_BY_PID:
- case APP_KILL_BY_PID:
- return PRIVILEGE_APPMANAGER_KILL;
- case APP_TERM_BGAPP_BY_PID:
- return PRIVILEGE_APPMANAGER_KILL_BGAPP;
- default:
- return NULL;
- }
-}
-
-static app_cmd_dispatch_func dispatch_table[APP_CMD_MAX] = {
- [APP_GET_SOCKET_PAIR] = __dispatch_get_socket_pair,
- [APP_START] = __dispatch_app_start,
- [APP_OPEN] = __dispatch_app_start,
- [APP_RESUME] = __dispatch_app_start,
- [APP_RESUME_BY_PID] = __dispatch_app_process_by_pid,
- [APP_TERM_BY_PID] = __dispatch_app_term,
- [APP_TERM_BY_PID_WITHOUT_RESTART] = __dispatch_app_term_async,
- [APP_RESULT] = __dispatch_app_result,
- [APP_START_RES] = __dispatch_app_start,
- [APP_CANCEL] = __dispatch_app_result,
- [APP_KILL_BY_PID] = __dispatch_app_term,
- [APP_ADD_HISTORY] = NULL,
- [APP_REMOVE_HISTORY] = __dispatch_remove_history,
- [APP_RUNNING_INFO] = __dispatch_app_running_info,
- [APP_RUNNING_INFO_RESULT] = NULL,
- [APP_IS_RUNNING] = __dispatch_app_is_running,
- [APP_GET_APPID_BYPID] = __dispatch_app_get_appid_by_pid,
- [APP_GET_PKGID_BYPID] = __dispatch_app_get_pkgid_by_pid,
- [APP_GET_INFO_OK] = NULL,
- [APP_GET_INFO_ERROR] = NULL,
- [APP_KEY_EVENT] = NULL,
- [APP_KEY_RESERVE] = __dispatch_legacy_command,
- [APP_KEY_RELEASE] = __dispatch_legacy_command,
- [APP_STATUS_UPDATE] = __dispatch_app_status_update,
- [APP_RUNNING_LIST_UPDATE] = __dispatch_legacy_command,
- [APP_TERM_REQ_BY_PID] = __dispatch_app_process_by_pid,
- [APP_TERM_BY_PID_ASYNC] = __dispatch_app_term_async,
- [APP_TERM_BGAPP_BY_PID] = __dispatch_app_term,
- [APP_PAUSE] = __dispatch_app_pause,
- [APP_PAUSE_BY_PID] = __dispatch_app_process_by_pid,
- [APP_GROUP_GET_WINDOW] = __dispatch_app_group_get_window,
- [APP_GROUP_SET_WINDOW] = __dispatch_app_group_set_window,
- [APP_GROUP_GET_FG] = __dispatch_app_group_get_fg_flag,
- [APP_GROUP_GET_LEADER_PID] = __dispatch_app_group_get_leader_pid,
- [APP_GROUP_GET_LEADER_PIDS] = __dispatch_app_group_get_leader_pids,
- [APP_GROUP_GET_GROUP_PIDS] = __dispatch_app_group_get_group_pids,
- [APP_GROUP_GET_IDLE_PIDS] = __dispatch_app_group_get_idle_pids,
- [APP_GROUP_LOWER] = __dispatch_app_group_lower,
- [APP_GROUP_CLEAR_TOP] = __dispatch_app_group_clear_top,
- [APP_GET_STATUS] = __dispatch_app_get_status,
- [APP_ADD_LOADER] = __dispatch_app_add_loader,
- [APP_REMOVE_LOADER] = __dispatch_app_remove_loader,
- [APP_GET_PID] = __dispatch_app_is_running,
- [AMD_RELOAD_APPINFO] = __dispatch_amd_reload_appinfo,
- [AGENT_DEAD_SIGNAL] = __dispatch_agent_dead_signal,
-};
-
-static void __free_request(gpointer data)
-{
- struct request *req = (struct request *)data;
-
- free(req->pkt);
- free(req);
-}
-
-static void __free_pending_item(struct pending_item *item)
-{
- g_list_free_full(item->pending_list, __free_request);
- if (g_main_context_find_source_by_user_data(NULL, item))
- g_source_remove(item->timer);
- free(item);
-}
-
-static void __process_pending_request(gpointer data, gpointer user_data)
-{
- struct request *req = (struct request *)data;
-
- dispatch_table[req->pkt->cmd](req->clifd, req->pkt, &req->cr);
-}
-
-static void __timeout_pending_request(gpointer data, gpointer user_data)
-{
- struct request *req = (struct request *)data;
-
- __send_result_to_client(req->clifd, -1);
-}
-
-static gboolean __timeout_pending_item(gpointer user_data)
-{
- struct pending_item *item = (struct pending_item *)user_data;
-
- __send_result_to_client(item->clifd, item->pid);
- g_list_foreach(item->pending_list, __timeout_pending_request, NULL);
-
- g_hash_table_remove(pending_table, GINT_TO_POINTER(item->pid));
- __free_pending_item(item);
-
- return FALSE;
-}
-
-int _request_flush_pending_request(int pid)
-{
- struct pending_item *item;
-
- item = (struct pending_item *)g_hash_table_lookup(
- pending_table, GINT_TO_POINTER(pid));
- if (item == NULL)
- return -1;
-
- __timeout_pending_item((gpointer)item);
-
- return 0;
-}
-
-int _request_reply_for_pending_request(int pid)
-{
- struct pending_item *item;
-
- item = (struct pending_item *)g_hash_table_lookup(
- pending_table, GINT_TO_POINTER(pid));
- if (item == NULL)
- return -1;
-
- __send_result_to_client(item->clifd, pid);
- g_hash_table_remove(pending_table, GINT_TO_POINTER(pid));
- g_list_foreach(item->pending_list, __process_pending_request, NULL);
-
- __free_pending_item(item);
-
- return 0;
-}
-
-static struct request *__get_request(int clifd, app_pkt_t *pkt,
- struct ucred cr)
-{
- struct request *req;
-
- req = malloc(sizeof(struct request));
- if (req == NULL)
- return NULL;
-
- req->clifd = clifd;
- req->pkt = calloc(1, AUL_PKT_HEADER_SIZE + pkt->len + 1);
- memcpy(req->pkt, pkt, AUL_PKT_HEADER_SIZE + pkt->len + 1);
- memcpy(&req->cr, &cr, sizeof(struct ucred));
-
- return req;
-}
-
-static int __check_app_is_running(struct request *req)
-{
- bundle *b;
- char *str;
- int pid;
- int ret = 0;
-
- b = bundle_decode(req->pkt->data, req->pkt->len);
- if (b == NULL)
- return -1;
-
- if (bundle_get_str(b, AUL_K_APPID, &str)) {
- _E("cannot get target pid");
- bundle_free(b);
- return -1;
- }
-
- switch (req->pkt->cmd) {
- case APP_RESUME_BY_PID:
- case APP_TERM_BY_PID:
- case APP_TERM_BY_PID_WITHOUT_RESTART:
- case APP_KILL_BY_PID:
- case APP_TERM_REQ_BY_PID:
- case APP_TERM_BY_PID_ASYNC:
- case APP_TERM_BGAPP_BY_PID:
- case APP_PAUSE_BY_PID:
- /* get pid */
- pid = atoi(str);
- if (_status_app_get_appid_bypid(pid))
- ret = pid;
- break;
- default:
- pid = _status_app_is_running(str, req->cr.uid);
- if (pid > 0)
- ret = pid;
- }
-
- bundle_free(b);
-
- return ret;
-}
-
-static int __check_request(struct request *req)
-{
- int pid;
- struct pending_item *item;
-
- /* TODO: categorize commands */
- if (req->pkt->cmd != APP_START && req->pkt->cmd != APP_OPEN &&
- req->pkt->cmd != APP_RESUME &&
- req->pkt->cmd != APP_RESUME_BY_PID &&
- req->pkt->cmd != APP_TERM_BY_PID &&
- req->pkt->cmd != APP_TERM_BY_PID_WITHOUT_RESTART &&
- req->pkt->cmd != APP_START_RES &&
- req->pkt->cmd != APP_KILL_BY_PID &&
- req->pkt->cmd != APP_TERM_REQ_BY_PID &&
- req->pkt->cmd != APP_TERM_BY_PID_ASYNC &&
- req->pkt->cmd != APP_TERM_BGAPP_BY_PID &&
- req->pkt->cmd != APP_PAUSE &&
- req->pkt->cmd != APP_PAUSE_BY_PID)
- return 0;
-
- pid = __check_app_is_running(req);
- if (pid < 0)
- return -1;
- else if (pid == 0)
- return 0;
-
- if (_status_get_app_info_status(pid, req->cr.uid) == STATUS_DYING)
- return 0;
-
- item = g_hash_table_lookup(pending_table, GINT_TO_POINTER(pid));
- if (item == NULL)
- return 0;
-
- item->pending_list = g_list_append(item->pending_list, req);
-
- return 1;
-}
-
-static gboolean __request_handler(gpointer data)
-{
- GPollFD *gpollfd = (GPollFD *) data;
- int fd = gpollfd->fd;
- app_pkt_t *pkt;
- int ret;
- int clifd;
- struct ucred cr;
- const char *privilege;
- struct request *req;
-
- if ((pkt = __app_recv_raw(fd, &clifd, &cr)) == NULL) {
- _E("recv error");
- return FALSE;
- }
-
- req = __get_request(clifd, pkt, cr);
- if (req == NULL) {
- close(clifd);
- free(pkt);
- return TRUE;
- }
-
- if (cr.uid >= REGULAR_UID_MIN) {
- privilege = __convert_cmd_to_privilege(pkt->cmd);
- if (privilege) {
- ret = check_privilege_by_cynara(clifd, privilege);
- if (ret < 0) {
- _E("request has been denied by smack");
- ret = -EILLEGALACCESS;
- __real_send(clifd, ret);
- __free_request(req);
- free(pkt);
- return TRUE;
- }
- }
- }
-
- ret = __check_request(req);
- if (ret < 0) {
- __real_send(clifd, ret);
- __free_request(req);
- free(pkt);
- return TRUE;
- } else if (ret > 0) {
- free(pkt);
- return TRUE;
- }
-
- if (pkt->cmd >= 0 && pkt->cmd < APP_CMD_MAX && dispatch_table[pkt->cmd]) {
- if (dispatch_table[pkt->cmd](clifd, pkt, &cr) != 0)
- _E("callback returns FALSE : %d", pkt->cmd);
- } else {
- _E("Invalid packet or not supported command");
- close(clifd);
- }
- __free_request(req);
- free(pkt);
-
- return TRUE;
-}
-
-static gboolean __au_glib_check(GSource *src)
-{
- GSList *fd_list;
- GPollFD *tmp;
-
- fd_list = src->poll_fds;
- do {
- tmp = (GPollFD *) fd_list->data;
- if ((tmp->revents & (POLLIN | POLLPRI)))
- return TRUE;
- fd_list = fd_list->next;
- } while (fd_list);
-
- return FALSE;
-}
-
-static gboolean __au_glib_dispatch(GSource *src, GSourceFunc callback,
- gpointer data)
-{
- callback(data);
- return TRUE;
-}
-
-static gboolean __au_glib_prepare(GSource *src, gint *timeout)
-{
- return FALSE;
-}
-
-static GSourceFuncs funcs = {
- .prepare = __au_glib_prepare,
- .check = __au_glib_check,
- .dispatch = __au_glib_dispatch,
- .finalize = NULL
-};
-
-int _request_init(void)
-{
- int fd;
- int r;
- GPollFD *gpollfd;
- GSource *src;
-
- __socket_pair_hash = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
- pending_table = g_hash_table_new(g_direct_hash, g_direct_equal);
-
- fd = __create_sock_activation();
- if (fd == -1) {
- _D("Create server socket without socket activation");
- fd = __create_server_sock(AUL_UTIL_PID);
- if (fd == -1) {
- _E("Create server socket failed.");
- return -1;
- }
- }
-
- r = init_cynara();
- if (r != 0) {
- _E("cynara initialize failed.");
- close(fd);
- return -1;
- }
-
- src = g_source_new(&funcs, sizeof(GSource));
- if (!src) {
- _E("out of memory");
- finish_cynara();
- close(fd);
- return -1;
- }
-
- gpollfd = (GPollFD *) g_malloc(sizeof(GPollFD));
- if (!gpollfd) {
- _E("out of memory");
- g_source_destroy(src);
- finish_cynara();
- close(fd);
- return -1;
- }
-
- gpollfd->events = POLLIN;
- gpollfd->fd = fd;
-
- g_source_add_poll(src, gpollfd);
- g_source_set_callback(src, (GSourceFunc) __request_handler,
- (gpointer) gpollfd, NULL);
- g_source_set_priority(src, G_PRIORITY_DEFAULT);
-
- r = g_source_attach(src, NULL);
- if (r == 0) {
- g_free(gpollfd);
- g_source_destroy(src);
- finish_cynara();
- close(fd);
- return -1;
- }
- r = rua_init();
- r = rua_clear_history();
-
- _D("rua_clear_history : %d", r);
-
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-int _request_init(void);
-int _request_reply_for_pending_request(int pid);
-int _request_flush_pending_request(int pid);
-
-
+++ /dev/null
-/*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define _GNU_SOURCE
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include <glib.h>
-#include <aul.h>
-#include <string.h>
-#include <linux/limits.h>
-
-#include <gio/gio.h>
-
-#include "amd_config.h"
-#include "amd_status.h"
-#include "amd_appinfo.h"
-#include "amd_request.h"
-#include "aul_util.h"
-#include "simple_util.h"
-#include "app_sock.h"
-#include "menu_db_util.h"
-#include "amd_app_group.h"
-
-typedef struct _pkg_status_info_t {
- char *pkgid;
- int status;
- GSList *ui_list;
- GSList *svc_list;
-} pkg_status_info_t;
-
-typedef struct _app_status_info_t {
- char *appid;
- char *app_path;
- char *pkgid;
- int status;
- int pid;
- int pad_pid;
- bool is_subapp;
- pkg_status_info_t *pkginfo;
- uid_t uid;
-} app_status_info_t;
-
-static GSList *app_status_info_list = NULL;
-static GHashTable *pkg_status_info_table = NULL;
-
-static void __add_pkg_info(const char *pkgid, app_status_info_t *appinfo)
-{
- pkg_status_info_t *pkginfo = NULL;
-
- if (pkgid == NULL || appinfo == NULL) {
- _E("empty arguments: %s", pkgid == NULL ? (appinfo == NULL ? "appinfo, pkgid" : "pkgid") : "appinfo");
- return;
- }
-
- if (pkg_status_info_table == NULL)
- pkg_status_info_table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
-
- pkginfo = g_hash_table_lookup(pkg_status_info_table, pkgid);
- if (pkginfo == NULL) {
- pkginfo = (pkg_status_info_t *)malloc(sizeof(pkg_status_info_t));
- if (pkginfo == NULL) {
- _E("failed to allocate memory");
- return;
- }
-
- memset(pkginfo, 0, sizeof(pkg_status_info_t));
- pkginfo->pkgid = strdup(pkgid);
- if (pkginfo->pkgid == NULL) {
- free(pkginfo);
- _E("failed to allocate memory");
- return;
- }
-
- g_hash_table_insert(pkg_status_info_table, pkginfo->pkgid, pkginfo);
- }
-
- pkginfo->status = appinfo->status;
- appinfo->pkginfo = pkginfo;
-
- if (appinfo->status == STATUS_SERVICE)
- pkginfo->svc_list = g_slist_append(pkginfo->svc_list, appinfo);
- else
- pkginfo->ui_list = g_slist_append(pkginfo->ui_list, appinfo);
-}
-
-static int __get_ui_app_status_pkg_info(pkg_status_info_t *pkginfo)
-{
- app_status_info_t *appinfo = NULL;
- GSList *iter = NULL;
- int status = STATUS_BG;
-
- if (pkginfo == NULL)
- return -1;
-
- iter = pkginfo->ui_list;
- while (iter) {
- appinfo = (app_status_info_t *)iter->data;
- if (appinfo->status != STATUS_BG)
- status = appinfo->status;
-
- iter = g_slist_next(iter);
- }
-
- return status;
-}
-
-static int __update_pkg_info(const char *pkgid, app_status_info_t *appinfo)
-{
- pkg_status_info_t *pkginfo = NULL;
- int ret = 0;
-
- if (pkgid == NULL || appinfo == NULL)
- return -1;
-
- if (pkg_status_info_table == NULL)
- return -1;
-
- pkginfo = (pkg_status_info_t *)g_hash_table_lookup(pkg_status_info_table, pkgid);
- if (pkginfo == NULL) {
- _E("pkgid(%s) is not on list");
- return -1;
- }
-
- if (pkginfo->ui_list) {
- ret = __get_ui_app_status_pkg_info(pkginfo);
- if (ret > -1)
- pkginfo->status = ret;
- } else {
- pkginfo->status = STATUS_SERVICE;
- }
-
- return 0;
-}
-
-
-static void __remove_pkg_info(const char *pkgid, app_status_info_t *appinfo, uid_t caller_uid)
-{
- pkg_status_info_t *pkginfo = NULL;
- const struct appinfo *ai = NULL;
- const char *component_type = NULL;
-
- if (pkgid == NULL || appinfo == NULL) {
- _E("empty arguments: %s", pkgid == NULL ? (appinfo == NULL ? "appinfo, pkgid" : "pkgid") : "appinfo");
- return;
- }
-
- ai = appinfo_find(caller_uid, appinfo->appid);
- component_type = appinfo_get_value(ai, AIT_COMPTYPE);
-
- pkginfo = (pkg_status_info_t *)g_hash_table_lookup(pkg_status_info_table, pkgid);
- if (pkginfo == NULL) {
- _E("pkgid(%s) is not on list");
- return;
- }
-
- if (component_type && strcmp(component_type, APP_TYPE_SERVICE) == 0) {
- if (pkginfo->svc_list) {
- pkginfo->svc_list = g_slist_remove(pkginfo->svc_list, appinfo);
- _D("STATUS_SERVICE : appid(%s)", appinfo->appid);
- }
- } else {
- if (pkginfo->ui_list) {
- pkginfo->ui_list = g_slist_remove(pkginfo->ui_list, appinfo);
- _D("~STATUS_SERVICE : appid(%s)", appinfo->appid);
- }
- }
-
- if (!pkginfo->svc_list && !pkginfo->ui_list) {
- g_hash_table_remove(pkg_status_info_table, pkgid);
- if (pkginfo->pkgid) {
- free(pkginfo->pkgid);
- pkginfo->pkgid = NULL;
- }
- free(pkginfo);
- }
-}
-
-static void __destroy_app_status_info(app_status_info_t *info_t)
-{
- if (info_t == NULL)
- return;
-
- if (info_t->appid) {
- free(info_t->appid);
- info_t->appid = NULL;
- }
-
- if (info_t->app_path) {
- free(info_t->app_path);
- info_t->app_path = NULL;
- }
-
- if (info_t->pkgid) {
- free(info_t->pkgid);
- info_t->pkgid = NULL;
- }
-
- free(info_t);
-}
-
-int _status_add_app_info_list(const char *appid, const char *app_path, int pid,
- int pad_pid, bool is_subapp, uid_t uid)
-{
- GSList *iter;
- GSList *iter_next;
- app_status_info_t *info_t;
- const struct appinfo *ai;
- const char *component_type = NULL;
- const char *pkgid = NULL;
-
- if (!appid || !app_path)
- return -1;
-
- GSLIST_FOREACH_SAFE(app_status_info_list, iter, iter_next) {
- info_t = (app_status_info_t *)iter->data;
- if (pid == info_t->pid) {
- if (uid == info_t->uid)
- return 0;
- else {
- /* PID is unique so if it is exist but user value is not correct remove it. */
- app_status_info_list = g_slist_remove(app_status_info_list, info_t);
- __remove_pkg_info(info_t->pkgid, info_t, uid);
- __destroy_app_status_info(info_t);
- break;
- }
- }
- }
-
- ai = appinfo_find(uid, appid);
-
- info_t = malloc(sizeof(app_status_info_t));
- if (info_t == NULL) {
- _E("out of memory");
- return -1;
- }
-
- memset(info_t, 0, sizeof(app_status_info_t));
-
- info_t->appid = strdup(appid);
- if (info_t->appid == NULL)
- goto error;
-
- info_t->app_path = strdup(app_path);
- if (info_t->app_path == NULL)
- goto error;
-
- component_type = appinfo_get_value(ai, AIT_COMPTYPE);
- if (component_type && strcmp(component_type, APP_TYPE_SERVICE) == 0)
- info_t->status = STATUS_SERVICE;
- else
- info_t->status = STATUS_LAUNCHING;
-
- pkgid = appinfo_get_value(ai, AIT_PKGID);
- if (pkgid == NULL)
- goto error;
-
- info_t->pid = pid;
- info_t->pad_pid = pad_pid;
- info_t->is_subapp = is_subapp;
- info_t->uid = uid;
- info_t->pkgid = strdup(pkgid);
- if (info_t->pkgid == NULL)
- goto error;
-
- app_status_info_list = g_slist_append(app_status_info_list, info_t);
- __add_pkg_info(pkgid, info_t);
- _D("pid(%d) appid(%s) pkgid(%s) comp(%s)", pid, appid, pkgid, component_type);
-
- return 0;
-error:
- __destroy_app_status_info(info_t);
-
- return -1;
-}
-
-int _status_update_app_info_list(int pid, int status, uid_t uid)
-{
- GSList *iter = NULL;
- app_status_info_t *info_t = NULL;
-
- _D("pid(%d) status(%d)", pid, status);
- for (iter = app_status_info_list; iter != NULL; iter = g_slist_next(iter)) {
- info_t = (app_status_info_t *)iter->data;
- if ((pid == info_t->pid) && ((info_t->uid == uid) || (info_t->uid == 0))) {
- info_t->status = status;
- __update_pkg_info(info_t->pkgid, info_t);
-
- _D("pid(%d) appid(%s) pkgid(%s) status(%d)", pid, info_t->appid, info_t->pkgid, info_t->status);
- break;
- }
- }
-
- app_group_set_status(pid, status, false);
-
- return 0;
-}
-
-int _status_remove_app_info_list_with_uid(uid_t uid)
-{
- GSList *iter;
- GSList *iter_next;
- app_status_info_t *info_t;
-
- GSLIST_FOREACH_SAFE(app_status_info_list, iter, iter_next) {
- info_t = (app_status_info_t *)iter->data;
- if (info_t->uid == uid) {
- app_status_info_list =
- g_slist_remove(app_status_info_list, info_t);
- free(info_t);
- }
- }
-
- return 0;
-}
-
-int _status_remove_app_info_list(int pid, uid_t uid)
-{
- GSList *iter;
- GSList *iter_next;
- app_status_info_t *info_t;
-
- GSLIST_FOREACH_SAFE(app_status_info_list, iter, iter_next) {
- info_t = (app_status_info_t *)iter->data;
- if ((pid == info_t->pid) && ((info_t->uid == uid) || (info_t->uid == 0))) {
- app_status_info_list = g_slist_remove(app_status_info_list, info_t);
- __remove_pkg_info(info_t->pkgid, info_t, uid);
- __destroy_app_status_info(info_t);
- break;
- }
- }
-
- return 0;
-}
-
-int _status_get_app_info_status(int pid, uid_t uid)
-{
- GSList *iter = NULL;
- app_status_info_t *info_t = NULL;
-
- for (iter = app_status_info_list; iter != NULL; iter = g_slist_next(iter)) {
- info_t = (app_status_info_t *)iter->data;
- if (pid == info_t->pid
- && ((uid == 0) ? true : (uid == info_t->uid)))
- return info_t->status;
- }
-
- return app_group_get_status(pid);
-}
-
-static gint __find_app_bypid(gconstpointer app_data, gconstpointer pid_data)
-{
- int pid = GPOINTER_TO_INT(pid_data);
- app_status_info_t *appinfo = (app_status_info_t *)app_data;
-
- if (appinfo && pid && appinfo->pid == pid)
- return 0;
-
- return -1;
-}
-
-void _status_find_service_apps(int pid, uid_t uid, enum app_status status, void (*send_event_to_svc_core) (int), bool suspend)
-{
- GSList *app_list = NULL;
- GSList *svc_list = NULL;
- app_status_info_t *info_t = NULL;
- app_status_info_t *svc_info_t = NULL;
- const struct appinfo *ai = NULL;
- int bg_allowed = 0x00;
-
- app_list = g_slist_find_custom(app_status_info_list, GINT_TO_POINTER(pid), __find_app_bypid);
-
- if (!app_list) {
- _E("unable to find app by pid:%d", pid);
- return;
- }
-
- info_t = (app_status_info_t *)app_list->data;
- if (info_t && info_t->pkginfo && info_t->pkginfo->status == status)
- svc_list = info_t->pkginfo->svc_list;
-
- while (svc_list) {
- svc_info_t = (app_status_info_t *)svc_list->data;
- if (svc_info_t) {
- ai = appinfo_find(uid, svc_info_t->appid);
- bg_allowed = (intptr_t)appinfo_get_value(ai, AIT_BG_CATEGORY);
- if (!bg_allowed) {
- send_event_to_svc_core(svc_info_t->pid);
- /* TODO: APIs should be prepared
- if (suspend)
- _amd_suspend_add_timer(svc_info_t->pid, ai);
- else
- _amd_suspend_remove_timer(svc_info_t->pid);
- */
- }
- }
- svc_list = g_slist_next(svc_list);
- }
-}
-
-void _status_check_service_only(int pid, uid_t uid, void (*send_event_to_svc_core) (int))
-{
- GSList *app_list = NULL;
- GSList *ui_list = NULL;
- app_status_info_t *info_t = NULL;
- app_status_info_t *ui_info_t = NULL;
- int ui_cnt = 0;
-
- app_list = g_slist_find_custom(app_status_info_list, GINT_TO_POINTER(pid), __find_app_bypid);
-
- if (!app_list) {
- _E("unable to find app by pid:%d", pid);
- return;
- }
-
- info_t = (app_status_info_t *)app_list->data;
- ui_list = info_t->pkginfo->ui_list;
- while (ui_list) {
- ui_info_t = (app_status_info_t *)ui_list->data;
- if (ui_info_t && _status_app_is_running_v2(ui_info_t->appid, uid) > 0)
- ui_cnt++;
- ui_list = g_slist_next(ui_list);
- }
-
- if (ui_cnt == 0) {
- const char *appid = NULL;
- const struct appinfo *ai = NULL;
- int bg_allowed = 0x00;
-
- appid = _status_app_get_appid_bypid(pid);
- if (appid) {
- ai = appinfo_find(uid, appid);
- bg_allowed = (intptr_t)appinfo_get_value(ai, AIT_BG_CATEGORY);
-
- if (!bg_allowed) {
- send_event_to_svc_core(pid);
- /* TODO: APIs should be prepared
- _amd_suspend_add_timer(pid, ai);
- */
- }
- }
- }
-}
-
-int _status_app_is_running(const char *appid, uid_t uid)
-{
- GSList *iter = NULL;
- app_status_info_t *info_t = NULL;
-
- for (iter = app_status_info_list; iter != NULL; iter = g_slist_next(iter)) {
- info_t = (app_status_info_t *)iter->data;
- if ((strncmp(appid, info_t->appid, MAX_PACKAGE_STR_SIZE) == 0)
- && (info_t->uid == uid) && !info_t->is_subapp)
- return info_t->pid;
- }
-
- return -1;
-}
-
-char* _status_app_get_appid_bypid(int pid)
-{
- GSList *iter = NULL;
- app_status_info_t *info_t = NULL;
-
- for (iter = app_status_info_list; iter != NULL; iter = g_slist_next(iter)) {
- info_t = (app_status_info_t *)iter->data;
- if (pid == info_t->pid)
- return info_t->appid;
- }
-
- return NULL;
-}
-
-int _status_send_running_appinfo(int fd, uid_t uid)
-{
- GSList *iter = NULL;
- app_status_info_t *info_t = NULL;
- app_pkt_t *pkt = NULL;
- int len;
- char tmp_pid[MAX_PID_STR_BUFSZ];
- char buf[AUL_SOCK_MAXBUFF] = {0, };
-
- for (iter = app_status_info_list; iter != NULL; iter = g_slist_next(iter)) {
- info_t = (app_status_info_t *)iter->data;
- if (info_t->uid != uid || app_group_is_sub_app(info_t->pid))
- continue;
-
- snprintf(tmp_pid, MAX_PID_STR_BUFSZ, "%d", info_t->pid);
- strncat(buf, tmp_pid, MAX_PID_STR_BUFSZ);
- strncat(buf, ":", 1);
- strncat(buf, info_t->appid, MAX_PACKAGE_STR_SIZE);
- strncat(buf, ":", 1);
- strncat(buf, info_t->app_path, MAX_PACKAGE_APP_PATH_SIZE);
- strncat(buf, ";", 1);
- }
-
- len = strlen(buf);
- pkt = (app_pkt_t *)malloc(AUL_PKT_HEADER_SIZE + len);
- if (!pkt) {
- _E("malloc fail");
- return 0;
- }
-
- pkt->cmd = APP_RUNNING_INFO_RESULT;
- pkt->len = len;
- memcpy(pkt->data, buf, len);
-
- if ((len = send(fd, pkt, pkt->len + AUL_PKT_HEADER_SIZE, 0)) !=
- pkt->len + AUL_PKT_HEADER_SIZE) {
- if (errno == EPIPE)
- _E("send failed due to EPIPE.\n");
- _E("send fail to client");
- }
-
- if (pkt)
- free(pkt);
-
- close(fd);
-
- return 0;
-}
-
-static inline int __find_pid_by_appid(const char *dname, const char *appid,
- void *priv, uid_t uid)
-{
- int pid = 0;
-
- if (strncmp(appid, (char *)priv, MAX_LOCAL_BUFSZ-1) == 0) {
- pid = atoi(dname);
- if (pid != getpgid(pid) || app_group_is_sub_app(pid))
- pid = 0;
- }
-
- return pid;
-}
-
-int _status_app_is_running_v2(const char *appid, uid_t caller_uid)
-{
- int ret;
- struct appinfo *ai;
-
- if (appid == NULL)
- return -1;
-
- ai = appinfo_find(caller_uid, appid);
- if (ai == NULL)
- return -1;
-
- ret = __proc_iter_appid(__find_pid_by_appid, (void *)appid);
-
- return ret;
-}
-
-static int __get_appid_bypid(int pid, char *appid, int len)
-{
- char *result;
-
- result = __proc_get_appid_bypid(pid);
- if (result == NULL)
- return -1;
-
- snprintf(appid, len, "%s", result);
- free(result);
-
- return 0;
-}
-
-int _status_get_appid_bypid(int fd, int pid)
-{
- app_pkt_t *pkt = NULL;
- int cmd;
- int len = 0;
- int pgid;
- char appid[MAX_PACKAGE_STR_SIZE] = {0, };
-
- cmd = APP_GET_INFO_ERROR;
-
- if (__get_appid_bypid(pid, appid, MAX_PACKAGE_STR_SIZE) == 0) {
- SECURE_LOGD("appid for %d is %s", pid, appid);
- len = strlen(appid);
- cmd = APP_GET_INFO_OK;
- goto out;
- }
- /* support app launched by shell script*/
- _D("second chance");
- pgid = getpgid(pid);
- if (pgid <= 1) {
- close(fd);
- return 0;
- }
-
- _D("second change pgid = %d, pid = %d", pgid, pid);
- if (__get_appid_bypid(pgid, appid, MAX_PACKAGE_STR_SIZE) == 0) {
- len = strlen(appid);
- cmd = APP_GET_INFO_OK;
- }
-
- out:
- pkt = (app_pkt_t *)malloc(AUL_PKT_HEADER_SIZE + len);
- if (!pkt) {
- _E("malloc fail");
- close(fd);
- return 0;
- }
- pkt->cmd = cmd;
- pkt->len = len;
- memcpy(pkt->data, appid, len);
-
- if ((len = send(fd, pkt, pkt->len + AUL_PKT_HEADER_SIZE, 0)) !=
- pkt->len + AUL_PKT_HEADER_SIZE) {
- if (errno == EPIPE)
- _E("send failed due to EPIPE.\n");
- _E("send fail to client");
- }
-
- if (pkt)
- free(pkt);
-
- close(fd);
-
- return 0;
-}
-
-static int __get_pkgid_bypid(int pid, char *pkgid, int len)
-{
- char *appid;
- app_info_from_db *menu_info;
- uid_t uid;
- appid = __proc_get_appid_bypid(pid);
- if (appid == NULL)
- return -1;
-
- uid = __proc_get_usr_bypid(pid);
- if (uid == -1) {
- free(appid);
- return -1;
- }
-
- if ((menu_info = _get_app_info_from_db_by_appid_user(appid, uid)) == NULL) {
- free(appid);
- return -1;
- } else {
- snprintf(pkgid, len, "%s", _get_pkgid(menu_info));
- }
-
- free(appid);
- _free_app_info_from_db(menu_info);
-
- return 0;
-}
-
-int _status_get_pkgid_bypid(int fd, int pid)
-{
- app_pkt_t *pkt = NULL;
- int cmd;
- int len = 0;
- int pgid;
- char pkgid[MAX_PACKAGE_STR_SIZE] = {0, };
-
- cmd = APP_GET_INFO_ERROR;
-
- if (__get_pkgid_bypid(pid, pkgid, MAX_PACKAGE_STR_SIZE) == 0) {
- SECURE_LOGD("pkgid for %d is %s", pid, pkgid);
- len = strlen(pkgid);
- cmd = APP_GET_INFO_OK;
- goto out;
- }
- /* support app launched by shell script*/
- _D("second chance");
- pgid = getpgid(pid);
- if (pgid <= 1) {
- close(fd);
- return 0;
- }
-
- _D("second change pgid = %d, pid = %d", pgid, pid);
- if (__get_pkgid_bypid(pgid, pkgid, MAX_PACKAGE_STR_SIZE) == 0) {
- len = strlen(pkgid);
- cmd = APP_GET_INFO_OK;
- }
-
- out:
- pkt = (app_pkt_t *)malloc(AUL_PKT_HEADER_SIZE + len);
- if (!pkt) {
- _E("malloc fail");
- close(fd);
- return 0;
- }
- pkt->cmd = cmd;
- pkt->len = len;
- memcpy(pkt->data, pkgid, len);
-
- if ((len = send(fd, pkt, pkt->len + AUL_PKT_HEADER_SIZE, 0)) !=
- pkt->len + AUL_PKT_HEADER_SIZE) {
- if (errno == EPIPE)
- _E("send failed due to EPIPE.\n");
- _E("send fail to client");
- }
-
- if (pkt)
- free(pkt);
-
- close(fd);
-
- return 0;
-}
-
-static void __socket_monitor_cb(GFileMonitor *monitor, GFile *file,
- GFile *other_file, GFileMonitorEvent event_type,
- gpointer user_data)
-{
- char *path;
- char *p;
- int pid;
-
- if (event_type != G_FILE_MONITOR_EVENT_CREATED)
- return;
-
- path = g_file_get_path(file);
- p = strrchr(path, '/');
- pid = atoi(p + 1);
-
- if (pid < 1)
- return;
-
- _request_reply_for_pending_request(pid);
-
- g_free(path);
-}
-
-int _status_init(void)
-{
- char buf[PATH_MAX];
- GFile *file;
- GFileMonitor *monitor;
- GError *err = NULL;
-
- snprintf(buf, sizeof(buf), "/run/user/%d", getuid());
- file = g_file_new_for_path(buf);
- if (file == NULL)
- return -1;
-
- monitor = g_file_monitor_directory(file, G_FILE_MONITOR_NONE,
- NULL, &err);
- if (monitor == NULL)
- return -1;
-
- g_signal_connect(monitor, "changed", G_CALLBACK(__socket_monitor_cb),
- NULL);
-
- return 0;
-}
+++ /dev/null
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <glib.h>
-#include <stdbool.h>
-#include <aul.h>
-
-int _status_add_app_info_list(const char *appid, const char *app_path, int pid, int pad_pid, bool is_subapp, uid_t uid);
-int _status_update_app_info_list(int pid, int status, uid_t uid);
-int _status_remove_app_info_list_with_uid(uid_t uid);
-int _status_remove_app_info_list(int pid, uid_t uid);
-int _status_get_app_info_status(int pid, uid_t uid);
-int _status_send_running_appinfo(int fd, uid_t uid);
-int _status_app_is_running(const char *appid, uid_t uid);
-int _status_app_is_running_v2(const char *appid, uid_t caller_uid);
-void _status_find_service_apps(int pid, uid_t uid, enum app_status status, void (*send_event_to_svc_core) (int), bool suspend);
-void _status_check_service_only(int pid, uid_t uid, void (*send_event_to_svc_core) (int));
-char *_status_app_get_appid_bypid(int pid);
-int _status_get_appid_bypid(int fd, int pid);
-int _status_get_pkgid_bypid(int fd, int pid);
-int _status_init(void);
-
-
#include <sys/socket.h>
#include <sys/un.h>
-enum app_cmd {
- APP_START = 0,
- APP_OPEN,
- APP_RESUME,
- APP_RESUME_BY_PID,
- APP_TERM_BY_PID,
- APP_TERM_BY_PID_WITHOUT_RESTART,
- APP_RESULT,
- APP_START_RES,
- APP_CANCEL,
- APP_KILL_BY_PID,
- APP_ADD_HISTORY,
- APP_REMOVE_HISTORY,
- APP_RUNNING_INFO,
- APP_RUNNING_INFO_RESULT,
- APP_IS_RUNNING,
- APP_GET_APPID_BYPID,
- APP_GET_PKGID_BYPID,
- APP_GET_INFO_OK,
- APP_GET_INFO_ERROR,
- APP_KEY_EVENT,
- APP_KEY_RESERVE,
- APP_KEY_RELEASE,
- APP_STATUS_UPDATE,
- APP_RUNNING_LIST_UPDATE,
- APP_TERM_REQ_BY_PID,
- APP_TERM_BY_PID_ASYNC,
- APP_TERM_BGAPP_BY_PID,
- APP_PAUSE,
- APP_PAUSE_BY_PID,
- APP_GROUP_GET_WINDOW,
- APP_GROUP_SET_WINDOW,
- APP_GROUP_GET_FG,
- APP_GROUP_GET_LEADER_PID,
- APP_GROUP_GET_LEADER_PIDS,
- APP_GROUP_GET_GROUP_PIDS,
- APP_GROUP_GET_IDLE_PIDS,
- APP_GROUP_LOWER,
- APP_GROUP_CLEAR_TOP,
- APP_GET_STATUS,
- APP_GET_SOCKET_PAIR,
- APP_ADD_LOADER,
- APP_REMOVE_LOADER,
- APP_GET_PID,
-
- /* for special purpose */
- AMD_RELOAD_APPINFO,
- /* reserved for AMD Agent */
- AGENT_DEAD_SIGNAL,
- APP_CMD_MAX
-};
+#include "aul_cmd.h"
#define AUL_SOCK_PREFIX "/tmp/alaunch"
#define AUL_SOCK_MAXBUFF 65535
--- /dev/null
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#pragma once
+
+enum app_cmd {
+ APP_START = 0,
+ APP_OPEN,
+ APP_RESUME,
+ APP_RESUME_BY_PID,
+ APP_TERM_BY_PID,
+ APP_TERM_BY_PID_WITHOUT_RESTART,
+ APP_RESULT,
+ APP_START_RES,
+ APP_CANCEL,
+ APP_KILL_BY_PID,
+ APP_ADD_HISTORY,
+ APP_REMOVE_HISTORY,
+ APP_RUNNING_INFO,
+ APP_RUNNING_INFO_RESULT,
+ APP_IS_RUNNING,
+ APP_GET_APPID_BYPID,
+ APP_GET_PKGID_BYPID,
+ APP_GET_INFO_OK,
+ APP_GET_INFO_ERROR,
+ APP_KEY_EVENT,
+ APP_KEY_RESERVE,
+ APP_KEY_RELEASE,
+ APP_STATUS_UPDATE,
+ APP_RUNNING_LIST_UPDATE,
+ APP_TERM_REQ_BY_PID,
+ APP_TERM_BY_PID_ASYNC,
+ APP_TERM_BGAPP_BY_PID,
+ APP_PAUSE,
+ APP_PAUSE_BY_PID,
+ APP_GROUP_GET_WINDOW,
+ APP_GROUP_SET_WINDOW,
+ APP_GROUP_GET_FG,
+ APP_GROUP_GET_LEADER_PID,
+ APP_GROUP_GET_LEADER_PIDS,
+ APP_GROUP_GET_GROUP_PIDS,
+ APP_GROUP_GET_IDLE_PIDS,
+ APP_GROUP_LOWER,
+ APP_GROUP_CLEAR_TOP,
+ APP_GET_STATUS,
+ APP_GET_SOCKET_PAIR,
+ APP_ADD_LOADER,
+ APP_REMOVE_LOADER,
+ APP_GET_PID,
+
+ /* for special purpose */
+ AMD_RELOAD_APPINFO,
+ /* reserved for AMD Agent */
+ AGENT_DEAD_SIGNAL,
+ APP_CMD_MAX
+};
+
+
+++ /dev/null
-d /tmp/alaunch 1777 root root
-t /tmp/alaunch - - - - security.SMACK64=*
-d /tmp/data-control 1770 owner users
-t /tmp/data-control - - - - security.SMACK64="User::App::Shared"
-t /tmp/data-control - - - - security.SMACK64TRANSMUTE="TRUE"
+++ /dev/null
-#
-# Systemd script to Launch AMD
-#
-
-[Unit]
-Description=Start the Access Control server
-
-[Service]
-EnvironmentFile=-/run/tizen-system-env
-ExecStart=/usr/bin/amd
-
-OOMScoreAdjust=-100
-
-[Install]
-WantedBy=default.target
+++ /dev/null
-[Socket]
-ListenStream=/run/user/%U/-2
-DirectoryMode=0777
-
-[Install]
-WantedBy=sockets.target
+++ /dev/null
-* Tue Nov 19 2013 Patrick McCarty <patrick.mccarty@linux.intel.com> cd1dd9c
-- Move package manifest to the proper location (packaging directory)
-
-* Fri Nov 08 2013 Casey Schaufler <casey@schaufler-ca.com> 7ae8114
-- Assign launchpad_preloading_preinitializing_daemon a Smack execution label of
- "User". This sets the Smack label on the daemon process upon invocation. This
- allows the daemon to launch applications into the User security domain.
-
-* Thu Oct 31 2013 Rusty Lynch <rusty.lynch@intel.com> accepted/tizen/20131022.163320@68dbf2e
-- Add warning when ecore_x_init() failes
-- Adding initial changelog so all further development will follow the Tizen 3.0 guidelines
- which requires proper changelog updates
-
Summary: App utility library
Version: 0.0.300
Release: 1
-Group: System/Libraries
+Group: Application Framework/Libraries
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz
-Source100: ac.conf
-Source101: ac.service
-Source102: ac.socket
Source1001: %{name}.manifest
Requires(post): /sbin/ldconfig
Requires(postun): /usr/bin/systemctl
Requires(preun): /usr/bin/systemctl
Requires: tizen-platform-config
+Requires: amd
BuildRequires: cmake
BuildRequires: pkgconfig(dbus-glib-1)
BuildRequires: pkgconfig(glib-2.0)
-BuildRequires: pkgconfig(gio-2.0)
BuildRequires: pkgconfig(bundle)
BuildRequires: pkgconfig(dlog)
BuildRequires: xdgmime-devel, pkgconfig(xdgmime)
-BuildRequires: pkgconfig(security-manager)
-BuildRequires: pkgconfig(rua)
BuildRequires: pkgconfig(vconf)
-BuildRequires: pkgconfig(libsmack)
BuildRequires: pkgconfig(pkgmgr-info)
-BuildRequires: pkgconfig(pkgmgr)
BuildRequires: libattr-devel
BuildRequires: pkgconfig(libtzplatform-config)
BuildRequires: pkgconfig(libsystemd-daemon)
-BuildRequires: pkgconfig(cynara-client)
-BuildRequires: pkgconfig(cynara-creds-socket)
-BuildRequires: pkgconfig(cynara-session)
BuildRequires: pkgconfig(capi-system-info)
BuildRequires: pkgconfig(iniparser)
BuildRequires: pkgconfig(sqlite3)
%make_install
mkdir -p %{buildroot}%{_tmpfilesdir}
-mkdir -p %{buildroot}%{_unitdir_user}/default.target.wants
-mkdir -p %{buildroot}%{_unitdir_user}/sockets.target.wants
mkdir -p %{buildroot}%{_sysconfdir}/skel/.applications/dbspace
install -m 0644 .appsvc.db %{buildroot}%{_sysconfdir}/skel/.applications/dbspace/.appsvc.db
-install -m 0644 %SOURCE100 %{buildroot}%{_tmpfilesdir}/ac.conf
-install -m 0644 %SOURCE101 %{buildroot}%{_unitdir_user}/ac.service
-install -m 0644 %SOURCE102 %{buildroot}%{_unitdir_user}/ac.socket
-ln -sf ../ac.service %{buildroot}%{_unitdir_user}/default.target.wants/ac.service
-ln -sf ../ac.socket %{buildroot}%{_unitdir_user}/sockets.target.wants/ac.socket
mkdir -p %{buildroot}%{_datadir}/appsvc
cp -R %{_builddir}/%{name}-%{version}/alias/* %{buildroot}%{_datadir}/appsvc
%preun
-if [ $1 == 0 ]; then
- systemctl stop ac.service
- systemctl disable ac
-fi
%post
/sbin/ldconfig
chsmack -a 'User::Home' %{_sysconfdir}/skel/.applications/dbspace/.appsvc.db
-systemctl daemon-reload
-if [ $1 == 1 ]; then
- systemctl restart ac.service
-fi
-
%postun
/sbin/ldconfig
-systemctl daemon-reload
%files
%license LICENSE
%{_datadir}/aul/preload_list.txt
%{_datadir}/aul/preexec_list.txt
%{_datadir}/appsvc/*
-%{_tmpfilesdir}/ac.conf
-%{_unitdir_user}/ac.service
-%{_unitdir_user}/default.target.wants/ac.service
-%{_unitdir_user}/ac.socket
-%{_unitdir_user}/sockets.target.wants/ac.socket
-%{_bindir}/amd
%{_sysconfdir}/skel/.applications/dbspace/.appsvc.db
%files test