Fix sending app signal 44/88044/1
authorSangyoon Jang <s89.jang@samsung.com>
Tue, 13 Sep 2016 01:18:54 +0000 (10:18 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Tue, 13 Sep 2016 01:18:54 +0000 (10:18 +0900)
Send to signal agent too.

Change-Id: Ifa2229c35ef5c9ce92938885892f2b78e3f65c52
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
CMakeLists.txt
include/pkgmgr-server.h
packaging/pkgmgr-server.spec
src/pkgmgr-server.c
src/signal.c [new file with mode: 0644]

index aab4587..3abb01a 100644 (file)
@@ -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)
index 0c8b9dc..13efc58 100644 (file)
@@ -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);
index 49f81b1..dbb360f 100644 (file)
@@ -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
index 15cd72c..061c2b8 100644 (file)
@@ -133,90 +133,6 @@ static void __set_backend_free(int position)
        backend_busy = backend_busy & ~(1<<position);
 }
 
-static 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;
-
-       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);
-
-catch:
-       pkgmgr_installer_free(pi);
-
-       return;
-}
-
-static void __send_fail_signal(backend_info *info)
-{
-       int req_type;
-       pkgmgr_installer *pi;
-       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");
-       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 (file)
index 0000000..536f8b3
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <systemd/sd-login.h>
+
+#include <pkgmgr_installer.h>
+#include <tzplatform_config.h>
+
+#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;
+}
+
+