From 02a73649f87abaa63b6ad893d3ea305ef5fa8770 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 13 Sep 2016 10:18:54 +0900 Subject: [PATCH] Fix sending app signal Send to signal agent too. Change-Id: Ifa2229c35ef5c9ce92938885892f2b78e3f65c52 Signed-off-by: Sangyoon Jang --- CMakeLists.txt | 3 +- include/pkgmgr-server.h | 4 ++ packaging/pkgmgr-server.spec | 1 + src/pkgmgr-server.c | 84 ---------------------- src/signal.c | 166 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 173 insertions(+), 85 deletions(-) create mode 100644 src/signal.c diff --git a/CMakeLists.txt b/CMakeLists.txt index aab4587..3abb01a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,9 +30,10 @@ SET(SRCS src/request.c src/pm-queue.c src/restriction_mode.c + src/signal.c ) -SET(SERVER_CHECK_MODULES gio-2.0 dlog pkgmgr-parser pkgmgr-info libtzplatform-config drm-service-core-tizen libgum sqlite3 pkgmgr pkgmgr-installer) +SET(SERVER_CHECK_MODULES gio-2.0 dlog pkgmgr-parser pkgmgr-info libtzplatform-config drm-service-core-tizen libgum sqlite3 pkgmgr pkgmgr-installer libsystemd) IF(TIZEN_FEATURE_CSR) SET(SERVER_CHECK_MODULES "${SERVER_CHECK_MODULES} csr") ENDIF(TIZEN_FEATURE_CSR) diff --git a/include/pkgmgr-server.h b/include/pkgmgr-server.h index 0c8b9dc..13efc58 100644 --- a/include/pkgmgr-server.h +++ b/include/pkgmgr-server.h @@ -109,6 +109,10 @@ gboolean queue_job(void *data); int __return_value_to_caller(const char *req_key, GVariant *result); int __init_request_handler(void); void __fini_request_handler(void); +void __send_app_signal(uid_t uid, const char *req_id, + const char *pkgid, const char *appid, + const char *key, const char *val, int req_type); +void __send_fail_signal(backend_info *info); int _restriction_mode_set(uid_t uid, const char *pkgid, int mode); int _restriction_mode_unset(uid_t uid, const char *pkgid, int mode); int _restriction_mode_get(uid_t uid, const char *pkgid, int *mode); diff --git a/packaging/pkgmgr-server.spec b/packaging/pkgmgr-server.spec index 49f81b1..dbb360f 100644 --- a/packaging/pkgmgr-server.spec +++ b/packaging/pkgmgr-server.spec @@ -25,6 +25,7 @@ BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgconfig(drm-service-core-tizen) BuildRequires: pkgconfig(libgum) BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(libsystemd) BuildRequires: pkgmgr-info-parser-devel BuildRequires: pkgmgr-info-parser BuildRequires: fdupes diff --git a/src/pkgmgr-server.c b/src/pkgmgr-server.c index 15cd72c..061c2b8 100644 --- a/src/pkgmgr-server.c +++ b/src/pkgmgr-server.c @@ -133,90 +133,6 @@ static void __set_backend_free(int position) backend_busy = backend_busy & ~(1<req_id); - switch (info->req_type) { - case PKGMGR_REQUEST_TYPE_INSTALL: - case PKGMGR_REQUEST_TYPE_MOUNT_INSTALL: - case PKGMGR_REQUEST_TYPE_REINSTALL: - req_type = PKGMGR_REQ_INSTALL; - break; - case PKGMGR_REQUEST_TYPE_UNINSTALL: - req_type = PKGMGR_REQ_UNINSTALL; - break; - case PKGMGR_REQUEST_TYPE_MOVE: - req_type = PKGMGR_REQ_MOVE; - break; - case PKGMGR_REQUEST_TYPE_GETSIZE: - req_type = PKGMGR_REQ_GETSIZE; - break; - default: - req_type = PKGMGR_REQ_INVALID; - break; - } - pkgmgr_installer_set_request_type(pi, req_type); - pkgmgr_installer_send_signal(pi, info->pkgtype, info->pkgid, "end", "fail"); - pkgmgr_installer_free(pi); - return; -} - static gboolean pipe_io_handler(GIOChannel *io, GIOCondition cond, gpointer data) { int x; diff --git a/src/signal.c b/src/signal.c new file mode 100644 index 0000000..536f8b3 --- /dev/null +++ b/src/signal.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2016 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. + * + */ + +#include +#include +#include + +#include + +#include +#include + +#include "pkgmgr-server.h" + +#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) + +static int __get_uid_list(uid_t target_uid, uid_t **uids) +{ + int n; + + if (target_uid != GLOBAL_USER) { + *uids = malloc(sizeof(uid_t)); + if (*uids == NULL) { + ERR("out of memory"); + return 0; + } + (*uids)[0] = target_uid; + n = 1; + } else { + n = sd_get_uids(uids); + if (n < 0) { + ERR("cannot get login user list"); + return 0; + } + } + + return n; +} + +static void __free_uid_list(uid_t *uids) +{ + free(uids); +} + +void __send_app_signal(uid_t uid, const char *req_id, + const char *pkgid, const char *appid, + const char *key, const char *val, int req_type) +{ + pkgmgr_installer *pi; + uid_t *uids = NULL; + int n; + int i; + + pi = pkgmgr_installer_new(); + if (!pi) { + DBG("Failure in creating the pkgmgr_installer object"); + return; + } + + if (pkgmgr_installer_set_uid(pi, uid)) + goto catch; + + switch (req_type) { + case PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID: + case PKGMGR_REQUEST_TYPE_ENABLE_APP: + if (pkgmgr_installer_set_request_type(pi, + PKGMGR_REQ_ENABLE_APP)) + goto catch; + break; + case PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID: + case PKGMGR_REQUEST_TYPE_DISABLE_APP: + if (pkgmgr_installer_set_request_type(pi, + PKGMGR_REQ_DISABLE_APP)) + goto catch; + break; + case PKGMGR_REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN: + if (pkgmgr_installer_set_request_type(pi, + PKGMGR_REQ_ENABLE_APP_SPLASH_SCREEN)) + goto catch; + break; + case PKGMGR_REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN: + if (pkgmgr_installer_set_request_type(pi, + PKGMGR_REQ_DISABLE_APP_SPLASH_SCREEN)) + goto catch; + break; + default: + DBG("Unsupported req_type[%d]", req_type); + goto catch; + } + + if (pkgmgr_installer_set_session_id(pi, req_id)) + goto catch; + pkgmgr_installer_send_app_signal(pi, "app", pkgid, appid, key, val); + n = __get_uid_list(uid, &uids); + for (i = 0; i < n; i++) + pkgmgr_installer_send_app_signal_for_uid(pi, uids[i], "app", + pkgid, appid, key, val); + +catch: + __free_uid_list(uids); + pkgmgr_installer_free(pi); + + return; +} + +void __send_fail_signal(backend_info *info) +{ + int req_type; + pkgmgr_installer *pi; + uid_t *uids = NULL; + int n; + int i; + + pi = pkgmgr_installer_new(); + if (!pi) { + ERR("Failure in creating the pkgmgr_installer object"); + return; + } + pkgmgr_installer_set_session_id(pi, info->req_id); + switch (info->req_type) { + case PKGMGR_REQUEST_TYPE_INSTALL: + case PKGMGR_REQUEST_TYPE_MOUNT_INSTALL: + case PKGMGR_REQUEST_TYPE_REINSTALL: + req_type = PKGMGR_REQ_INSTALL; + break; + case PKGMGR_REQUEST_TYPE_UNINSTALL: + req_type = PKGMGR_REQ_UNINSTALL; + break; + case PKGMGR_REQUEST_TYPE_MOVE: + req_type = PKGMGR_REQ_MOVE; + break; + case PKGMGR_REQUEST_TYPE_GETSIZE: + req_type = PKGMGR_REQ_GETSIZE; + break; + default: + req_type = PKGMGR_REQ_INVALID; + break; + } + pkgmgr_installer_set_request_type(pi, req_type); + pkgmgr_installer_send_signal(pi, info->pkgtype, info->pkgid, + "end", "fail"); + n = __get_uid_list(info->uid, &uids); + for (i = 0; i < n; i++) + pkgmgr_installer_send_signal_for_uid(pi, uids[i], + info->pkgtype, info->pkgid, "end", "fail"); + + __free_uid_list(uids); + pkgmgr_installer_free(pi); + return; +} + + -- 2.7.4