Fix to send signal to session bus 52/108352/4
authorSangyoon Jang <s89.jang@samsung.com>
Wed, 4 Jan 2017 06:29:34 +0000 (15:29 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Wed, 4 Jan 2017 07:51:54 +0000 (23:51 -0800)
To send signal session bus, now pkg_cleardata should be run as app_fw user.

Submit together:
 - https://review.tizen.org/gerrit/108349

Change-Id: Ib6940db81539d9bd9eda73c4b9629892e72db0fd
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
src/pkg_cleardata.c

index de2cc675642df74e52b632ace9392c6e2f6e8345..fe542062dee0f40bf907fab5e1c490bca63da686 100644 (file)
 #define LOG_TAG "PKGMGR_CLEARDATA"
 #endif                         /* LOG_TAG */
 
-const char short_options[] = "cdhn:";
+const char short_options[] = "cdhn:u:";
 
 const struct option long_options[] = {
        {"cache", 0, NULL, 'c'},
        {"data", 0, NULL, 'd'},
        {"help", 0, NULL, 'h'},
        {"pkgid", 1, NULL, 'n'},
+       {"uid", 1, NULL, 'u'},
        {0, 0, 0, 0}            /* sentinel */
 };
 
+static uid_t uid;
+
+static pkgmgr_installer *pi;
+
+static void __send_signal(const char *pkgid, const char *event_type,
+               const char *key, const char *val)
+{
+       pkgmgr_installer_send_signal(pi, event_type, pkgid, key, val);
+       pkgmgr_installer_send_signal_for_uid(pi, uid, event_type, pkgid, key,
+                       val);
+}
 
 static int __clear_dir(const char *dirname)
 {
@@ -138,7 +150,6 @@ err:
 static int __clear_cache_dir(const char *pkgid)
 {
        int ret = 0;
-       uid_t uid = getuid();
        char dirname[PATH_MAX] = {0,};
 
        if (pkgid == NULL) {
@@ -146,6 +157,8 @@ static int __clear_cache_dir(const char *pkgid)
                return -1;
        }
 
+       tzplatform_set_user(uid);
+
        /* cache internal */
        snprintf(dirname, sizeof(dirname), "%s/%s%s",
                INTERNAL_CACHE_PATH_PREFIX, pkgid, CACHE_PATH_POSTFIX);
@@ -163,7 +176,6 @@ static int __clear_cache_dir(const char *pkgid)
                LOGE("Failed to clear internal shared cache dir.");
 
        /* cache external */
-       tzplatform_set_user(uid);
 
        snprintf(dirname, sizeof(dirname), "%s%s%s",
                EXTERNAL_CACHE_PATH_PREFIX,
@@ -193,8 +205,7 @@ static int __clear_data_dir(const char *pkgid)
 {
        int ret = 0;
        char dirname[PATH_MAX] = {0,};
-       const char *rootpath = tzplatform_getenv(TZ_USER_APP);
-       pkgmgr_installer *pi = NULL;
+       const char *rootpath;
        pkgmgrinfo_pkginfo_h pkg_handle = NULL;
        char *pkg_type = NULL;
 
@@ -203,14 +214,7 @@ static int __clear_data_dir(const char *pkgid)
                return -1;
        }
 
-       pi = pkgmgr_installer_new();
-       if (pi == NULL) {
-               LOGE("Failed to create installer");
-               return -1;
-       }
-       pkgmgr_installer_set_request_type(pi, PKGMGR_REQ_CLEAR);
-
-       ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, getuid(), &pkg_handle);
+       ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkg_handle);
        if (ret != PMINFO_R_OK) {
                LOGE("Failed to get pkginfo");
                ret = -1;
@@ -224,19 +228,24 @@ static int __clear_data_dir(const char *pkgid)
                goto catch;
        }
 
+       tzplatform_set_user(uid);
+       rootpath = tzplatform_getenv(TZ_USER_APP);
+       tzplatform_reset_user();
+
        snprintf(dirname, sizeof(dirname), "%s/%s/data", rootpath, pkgid);
-       pkgmgr_installer_send_signal(pi, pkg_type, pkgid,
+       __send_signal(pkgid, pkg_type,
                        PKGMGR_INSTALLER_START_KEY_STR,
                        PKGMGR_INSTALLER_CLEAR_EVENT_STR);
 
        ret = __clear_dir(dirname);
        if (ret != 0) {
                LOGE("Failed to clear data for pkg %s", pkgid);
-               pkgmgr_installer_send_signal(pi, pkg_type, pkgid,
+               __send_signal(pkgid, pkg_type,
                                PKGMGR_INSTALLER_END_KEY_STR,
                                PKGMGR_INSTALLER_FAIL_EVENT_STR);
+
        } else {
-               pkgmgr_installer_send_signal(pi, pkg_type, pkgid,
+               __send_signal(pkgid, pkg_type,
                                PKGMGR_INSTALLER_END_KEY_STR,
                                PKGMGR_INSTALLER_OK_EVENT_STR);
        }
@@ -244,7 +253,6 @@ static int __clear_data_dir(const char *pkgid)
 catch:
        if (pkg_handle)
                pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle);
-       pkgmgr_installer_free(pi);
        return ret;
 }
 
@@ -278,7 +286,7 @@ static int __clear_all_cache_dir(void)
        int res;
 
        res = pkgmgrinfo_pkginfo_get_usr_list(__clear_all_cache_dir_cb,
-               &err_cnt, getuid());
+               &err_cnt, uid);
        if (res != PMINFO_R_OK) {
                LOGE("Failed to get pkg list. (%d)", res);
                return -1;
@@ -322,8 +330,8 @@ int main(int argc, char *argv[])
                return -1;
        }
 
-       if (getuid() < REGULAR_USER) {
-               LOGE("Should be run by regular user\n");
+       if (getuid() >= REGULAR_USER) {
+               LOGE("Regular user cannot run this tool");
                return -1;
        }
 
@@ -351,16 +359,29 @@ int main(int argc, char *argv[])
                                return -1;
                        }
                        break;
+               case 'u': /* uid */
+                       if (optarg) {
+                               uid = atoi(optarg);
+                       } else {
+                               print_usage();
+                               return -1;
+                       }
                default:
                        break;
                }
        }
 
-       if ((!clear_cache && !clear_data) || (pkgid[0] == '\0')) {
+       if ((!clear_cache && !clear_data) || (pkgid[0] == '\0') || uid == 0) {
                print_usage();
                return -1;
        }
 
+       pi = pkgmgr_installer_new();
+       if (pi == NULL) {
+               LOGE("Failed to create installer");
+               return -1;
+       }
+
        if (clear_cache) {
                if (strcmp(pkgid, PKG_CLEAR_ALL_CACHE) == 0)
                        ret = __clear_all_cache_dir();
@@ -368,8 +389,12 @@ int main(int argc, char *argv[])
                        ret = __clear_cache_dir(pkgid);
        }
 
-       if (clear_data)
+       if (clear_data) {
+               pkgmgr_installer_set_request_type(pi, PKGMGR_REQ_CLEAR);
                ret = __clear_data_dir(pkgid);
+       }
+
+       pkgmgr_installer_free(pi);
 
        return ret;
 }