#include <glib.h>
#include <gio/gio.h>
-#include <gum/gum-user.h>
-#include <gum/common/gum-user-types.h>
-#include "pm-queue.h"
+#include "queue.h"
+#include "pkgmgr-info.h"
#include "pkgmgr-server.h"
#include "package-manager.h"
" </method>"
" <method name='reinstall'>"
" <arg type='u' name='uid' direction='in'/>"
- " <arg type='s' name='pkgtype' direction='in'/>"
" <arg type='s' name='pkgid' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" <arg type='s' name='reqkey' direction='out'/>"
" </method>"
" <method name='uninstall'>"
" <arg type='u' name='uid' direction='in'/>"
- " <arg type='s' name='pkgtype' direction='in'/>"
" <arg type='s' name='pkgid' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" <arg type='s' name='reqkey' direction='out'/>"
" </method>"
" <method name='move'>"
" <arg type='u' name='uid' direction='in'/>"
- " <arg type='s' name='pkgtype' direction='in'/>"
" <arg type='s' name='pkgid' direction='in'/>"
" <arg type='i' name='movetype' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" <arg type='s' name='reqkey' direction='out'/>"
" </method>"
- " <method name='enable_pkg'>"
+ " <method name='enable_pkgs'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='as' name='pkgids' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " <arg type='s' name='reqkey' direction='out'/>"
+ " </method>"
+ " <method name='disable_pkgs'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='as' name='pkgids' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " <arg type='s' name='reqkey' direction='out'/>"
+ " </method>"
+ " <method name='register_pkg_update_info'>"
" <arg type='u' name='uid' direction='in'/>"
- " <arg type='s' name='pkgtype' direction='in'/>"
" <arg type='s' name='pkgid' direction='in'/>"
+ " <arg type='s' name='version' direction='in'/>"
+ " <arg type='i' name='type' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" </method>"
- " <method name='disable_pkg'>"
+ " <method name='unregister_pkg_update_info'>"
" <arg type='u' name='uid' direction='in'/>"
- " <arg type='s' name='pkgtype' direction='in'/>"
" <arg type='s' name='pkgid' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" </method>"
+ " <method name='unregister_all_pkg_update_info'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " </method>"
" <method name='enable_app'>"
" <arg type='u' name='uid' direction='in'/>"
" <arg type='s' name='appid' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" <arg type='s' name='reqkey' direction='out'/>"
" </method>"
+ " <method name='enable_apps'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='as' name='appids' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " <arg type='s' name='reqkey' direction='out'/>"
+ " </method>"
+ " <method name='disable_apps'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='as' name='appids' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " <arg type='s' name='reqkey' direction='out'/>"
+ " </method>"
" <method name='enable_global_app_for_uid'>"
" <arg type='u' name='uid' direction='in'/>"
" <arg type='s' name='appid' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" <arg type='s' name='reqkey' direction='out'/>"
" </method>"
+ " <method name='getsize_sync'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='s' name='pkgid' direction='in'/>"
+ " <arg type='i' name='get_type' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " <arg type='x' name='size_info' direction='out'/>"
+ " </method>"
" <method name='cleardata'>"
" <arg type='u' name='uid' direction='in'/>"
- " <arg type='s' name='pkgtype' direction='in'/>"
" <arg type='s' name='pkgid' direction='in'/>"
" <arg type='i' name='ret' direction='out'/>"
" </method>"
" <arg type='i' name='result' direction='out'/>"
" <arg type='i' name='ret' direction='out'/>"
" </method>"
+ " <method name='set_app_label'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='s' name='appid' direction='in'/>"
+ " <arg type='s' name='label' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " </method>"
+ " <method name='set_app_icon'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='s' name='appid' direction='in'/>"
+ " <arg type='s' name='icon_path' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " </method>"
+ " <method name='migrate_external_image'>"
+ " <arg type='u' name='uid' direction='in'/>"
+ " <arg type='s' name='pkgid' direction='in'/>"
+ " <arg type='i' name='ret' direction='out'/>"
+ " </method>"
" </interface>"
"</node>";
static GDBusNodeInfo *instropection_data;
size = strlen(pkgid) + strlen(timestr) + 2;
str_req_key = (char *)calloc(size, sizeof(char));
if (str_req_key == NULL) {
- DBG("calloc failed");
+ ERR("calloc failed");
return NULL;
}
snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
return str_req_key;
}
-static int __is_admin_user(uid_t uid)
-{
- GumUser *guser;
- GumUserType ut = GUM_USERTYPE_NONE;
-
- guser = gum_user_get_sync(uid, FALSE);
- if (guser == NULL) {
- ERR("cannot get user information from gumd");
- return -1;
- }
-
- g_object_get(G_OBJECT(guser), "usertype", &ut, NULL);
- if (ut == GUM_USERTYPE_NONE) {
- ERR("cannot get user type");
- g_object_unref(guser);
- return -1;
- } else if (ut != GUM_USERTYPE_ADMIN) {
- g_object_unref(guser);
- return 0;
- }
-
- g_object_unref(guser);
-
- return 1;
-}
-
-#define REGULAR_USER 5000
static int __check_caller_permission(uid_t uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
return 0;
}
-static int __handle_request_install(uid_t uid,
+static int __handle_request_install(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
- char *pkgpath = NULL;
+ char *arg_pkgtype = NULL;
+ const char *pkgtype;
+ const char *pkgpath = NULL;
char *args = NULL;
char *reqkey = NULL;
gchar **tmp_args = NULL;
int i = 0;
int len = 0;
- g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
+ g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
+ &pkgpath, &value);
tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
for (i = 0; i < args_count; i++)
}
for (i = 0; i < args_count; i++) {
- strncat(args, tmp_args[i], strlen(tmp_args[i]));
+ strncat(args, tmp_args[i], len - strlen(args) - 1);
if (i != args_count - 1)
- strncat(args, " ", strlen(" "));
+ strncat(args, " ", len - strlen(args) - 1);
}
- if (target_uid == (uid_t)-1 || pkgtype == NULL) {
+ if (target_uid == (uid_t)-1 || pkgpath == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
ret = -1;
goto catch;
}
- if (pkgpath == NULL) {
+ pkgpath = _get_adjusted_pkgpath(pkgpath, caller_uid);
+ pkgtype = _get_pkgtype_from_file(pkgpath);
+ if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
+ pkgtype = (const char *)arg_pkgtype;
+ if (pkgtype == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
ret = -1;
goto catch;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype,
- pkgpath, args)) {
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_INSTALL,
+ pkgtype, pkgpath, args, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
if (args)
free(args);
+ if (tmp_args)
+ g_free(tmp_args);
+
return ret;
}
-static int __handle_request_mount_install(uid_t uid,
+static int __handle_request_mount_install(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
- char *pkgpath = NULL;
+ char *arg_pkgtype = NULL;
+ const char *pkgtype;
+ const char *pkgpath = NULL;
char *args = NULL;
char *reqkey = NULL;
gchar **tmp_args = NULL;
int i = 0;
int len = 0;
- g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
+ g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
+ &pkgpath, &value);
tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
for (i = 0; i < args_count; i++)
}
for (i = 0; i < args_count; i++) {
- strncat(args, tmp_args[i], strlen(tmp_args[i]));
+ strncat(args, tmp_args[i], len - strlen(args) - 1);
if (i != args_count - 1)
- strncat(args, " ", strlen(" "));
+ strncat(args, " ", len - strlen(args) - 1);
}
- if (target_uid == (uid_t)-1 || pkgtype == NULL) {
+ if (target_uid == (uid_t)-1 || pkgpath == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
ret = -1;
goto catch;
}
- if (pkgpath == NULL) {
+ pkgpath = _get_adjusted_pkgpath(pkgpath, caller_uid);
+ pkgtype = _get_pkgtype_from_file(pkgpath);
+ if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
+ pkgtype = (const char *)arg_pkgtype;
+ if (pkgtype == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
ret = -1;
goto catch;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOUNT_INSTALL,
- pkgtype, pkgpath, args)) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_MOUNT_INSTALL,
+ pkgtype, pkgpath, args, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
if (args)
free(args);
+ if (tmp_args)
+ g_free(tmp_args);
+
return ret;
}
-static int __handle_request_reinstall(uid_t uid,
+static int __handle_request_reinstall(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
+ char *pkgtype;
char *pkgid = NULL;
char *reqkey;
- g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
- if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+ g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+ if (target_uid == (uid_t)-1 || pkgid == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
return -1;
}
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
+ return -1;
+ }
+
reqkey = __generate_reqkey(pkgid);
if (reqkey == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ free(pkgtype);
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype,
- pkgid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_REINSTALL,
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
+ free(pkgtype);
return -1;
}
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_OK, reqkey));
free(reqkey);
+ free(pkgtype);
return 0;
}
-static int __handle_request_uninstall(uid_t uid,
+static int __handle_request_uninstall(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
+ char *pkgtype;
char *pkgid = NULL;
char *reqkey;
- g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
- if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+ g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+ if (target_uid == (uid_t)-1 || pkgid == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
return -1;
}
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
+ return -1;
+ }
+
reqkey = __generate_reqkey(pkgid);
if (reqkey == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ free(pkgtype);
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype,
- pkgid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_UNINSTALL,
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
+ free(pkgtype);
return -1;
}
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_OK, reqkey));
free(reqkey);
+ free(pkgtype);
return 0;
}
-static int __handle_request_move(uid_t uid,
+static int __handle_request_move(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
+ char *pkgtype;
char *pkgid = NULL;
char *reqkey;
int move_type = -1;
char buf[4] = { '\0' };
- g_variant_get(parameters, "(u&s&si)", &target_uid, &pkgtype, &pkgid, &move_type);
- if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+ g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &move_type);
+ if (target_uid == (uid_t)-1 || pkgid == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
return -1;
}
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
+ return -1;
+ }
+
reqkey = __generate_reqkey(pkgid);
if (reqkey == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ free(pkgtype);
return -1;
}
snprintf(buf, sizeof(buf), "%d", move_type);
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype,
- pkgid, buf)) {
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_MOVE,
+ pkgtype, pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
+ free(pkgtype);
return -1;
}
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_OK, reqkey));
free(reqkey);
+ free(pkgtype);
return 0;
}
-static int __handle_request_enable_pkg(uid_t uid,
+static int __handle_request_enable_pkgs(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
- char *pkgid = NULL;
- char *reqkey = NULL;
+ char *pkgtype;
+ char *pkgid;
+ char *reqkey;
+ GVariantIter *iter;
- g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
- if (target_uid == (uid_t)-1 || pkgid == NULL) {
+ g_variant_get(parameters, "(uas)", &target_uid, &iter);
+ if (target_uid == (uid_t)-1 || iter == NULL) {
g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(i)", PKGMGR_R_ECOMM));
+ g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
return -1;
}
- reqkey = __generate_reqkey(pkgid);
+ reqkey = __generate_reqkey("enable_pkgs");
if (reqkey == NULL) {
g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ return -1;
+ }
+
+ while (g_variant_iter_next(iter, "&s", &pkgid)) {
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)",
+ PKGMGR_R_ENOPKG, ""));
+ free(reqkey);
+ return -1;
+ }
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_ENABLE_PKG,
+ pkgtype, pkgid, NULL, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)",
+ PKGMGR_R_ESYSTEM, ""));
+ free(pkgtype);
+ free(reqkey);
+ return -1;
+ }
+ free(pkgtype);
+ }
+
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+ free(reqkey);
+
+ return 0;
+}
+
+static int __handle_request_register_pkg_update_info(
+ uid_t caller_uid, GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ char *reqkey;
+ char buf[MAX_PKG_ARGS_LEN];
+ int ret;
+ pkgmgrinfo_pkginfo_h pkg_info;
+ bool is_global_pkg;
+ pkgmgrinfo_updateinfo_h update_info;
+ pkgmgrinfo_updateinfo_update_type converted_type;
+ uid_t target_uid = (uid_t)-1;
+ gchar *pkgid = NULL;
+ gchar *version = NULL;
+
+ g_variant_get(parameters, "(ussi)", &target_uid, &pkgid, &version, &converted_type);
+
+ ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
+ if (ret != PMINFO_R_OK) {
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+
+ /* return error if given pkg is global pkg but caller is not admin */
+ if (caller_uid >= REGULAR_USER && is_global_pkg
+ && !__is_admin_user(caller_uid)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EPRIV));
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_create(&update_info);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_set_pkgid(update_info, (char *)pkgid);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ pkgmgrinfo_updateinfo_destroy(update_info);
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_set_version(update_info, (char *)version);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ pkgmgrinfo_updateinfo_destroy(update_info);
+ return -1;
+ }
+
+ ret = pkgmgrinfo_updateinfo_set_type(update_info, converted_type);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ pkgmgrinfo_updateinfo_destroy(update_info);
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("register_pkg_update_info");
+ if (reqkey == NULL) {
+ pkgmgrinfo_updateinfo_destroy(update_info);
+ g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ENOMEM));
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_PKG, pkgtype,
- pkgid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_REGISTER_PKG_UPDATE_INFO, "default",
+ NULL, buf, update_info)) {
+ pkgmgrinfo_updateinfo_destroy(update_info);
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
return -1;
}
-
- g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(i)", PKGMGR_R_OK));
- free(reqkey);
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
return 0;
}
-static int __handle_request_disable_pkg(uid_t uid,
- GDBusMethodInvocation *invocation, GVariant *parameters)
+static int __handle_request_unregister_pkg_update_info(
+ uid_t caller_uid, GDBusMethodInvocation *invocation,
+ GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
char *pkgid = NULL;
- char *reqkey = NULL;
+ char *reqkey;
+ pkgmgrinfo_pkginfo_h pkg_info;
+ bool is_global_pkg;
+ int ret;
- g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
+ g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
if (target_uid == (uid_t)-1 || pkgid == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ECOMM));
return -1;
}
- reqkey = __generate_reqkey(pkgid);
+ ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
+ if (ret != PMINFO_R_OK) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
+ if (ret != PMINFO_R_OK) {
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EIO));
+ return -1;
+ }
+ pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
+
+ /* return error if given pkg is global pkg but caller is not admin */
+ if (caller_uid >= REGULAR_USER && is_global_pkg
+ && !__is_admin_user(caller_uid)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_EPRIV));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("unregister_pkg_update_info");
if (reqkey == NULL) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ENOMEM));
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_PKG, pkgtype,
- pkgid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_UNREGISTER_PKG_UPDATE_INFO, "default",
+ pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
return -1;
}
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+
+ return 0;
+
+}
+
+static int __handle_request_unregister_all_pkg_update_info(
+ uid_t caller_uid, GDBusMethodInvocation *invocation,
+ GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *reqkey;
+
+ g_variant_get(parameters, "(u)", &target_uid);
+ if (target_uid == (uid_t)-1) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("unregister_all_pkg_update_info");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_UNREGISTER_ALL_PKG_UPDATE_INFO, "default",
+ NULL, NULL, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+ free(reqkey);
+ return -1;
+ }
+
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+ return 0;
+}
+
+static int __handle_request_disable_pkgs(uid_t caller_uid,
+ GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *pkgtype;
+ char *pkgid;
+ char *reqkey;
+ GVariantIter *iter;
+
+ g_variant_get(parameters, "(uas)", &target_uid, &iter);
+ if (target_uid == (uid_t)-1 || iter == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("disable_pkgs");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ return -1;
+ }
+
+ while (g_variant_iter_next(iter, "&s", &pkgid)) {
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)",
+ PKGMGR_R_ENOPKG, ""));
+ free(reqkey);
+ return -1;
+ }
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_DISABLE_PKG,
+ pkgtype, pkgid, NULL, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)",
+ PKGMGR_R_ESYSTEM, ""));
+ free(pkgtype);
+ free(reqkey);
+ return -1;
+ }
+ free(pkgtype);
+ }
+
g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(i)", PKGMGR_R_OK));
+ g_variant_new("(is)", PKGMGR_R_OK, reqkey));
free(reqkey);
return 0;
}
-static int __handle_request_enable_app(uid_t uid,
+static int __handle_request_enable_apps(uid_t caller_uid,
+ GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *appid;
+ char *reqkey;
+ char buf[MAX_PKG_ARGS_LEN];
+ GVariantIter *iter;
+
+ g_variant_get(parameters, "(uas)", &target_uid, &iter);
+ if (target_uid == (uid_t)-1 || iter == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("enable_apps");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ return -1;
+ }
+
+ while (g_variant_iter_next(iter, "&s", &appid)) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_ENABLE_APP,
+ "default", appid, buf, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)",
+ PKGMGR_R_ESYSTEM, ""));
+ free(reqkey);
+ return -1;
+ }
+ }
+
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+
+ free(reqkey);
+ return 0;
+}
+
+static int __handle_request_disable_apps(uid_t caller_uid,
+ GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *appid;
+ char *reqkey;
+ char buf[MAX_PKG_ARGS_LEN];
+ GVariantIter *iter;
+
+ g_variant_get(parameters, "(uas)", &target_uid, &iter);
+ if (target_uid == (uid_t)-1 || iter == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("disable_apps");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+ return -1;
+ }
+
+ while (g_variant_iter_next(iter, "&s", &appid)) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_DISABLE_APP,
+ "default", appid, buf, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)",
+ PKGMGR_R_ESYSTEM, ""));
+ free(reqkey);
+ return -1;
+ }
+ }
+
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+
+ free(reqkey);
+ return 0;
+
+}
+
+static int __handle_request_enable_app(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
goto catch;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_APP, "default",
- appid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_ENABLE_APP, "default",
+ appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
return ret;
}
-static int __handle_request_disable_app(uid_t uid,
+static int __handle_request_disable_app(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
goto catch;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_APP, "default",
- appid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_DISABLE_APP, "default",
+ appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
return ret;
}
-static int __handle_request_enable_global_app_for_uid(uid_t uid,
+static int __handle_request_enable_global_app_for_uid(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
goto catch;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID, "default",
- appid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID,
+ "default", appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
return ret;
}
-static int __handle_request_disable_global_app_for_uid(uid_t uid,
+static int __handle_request_disable_global_app_for_uid(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
goto catch;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID, "default",
- appid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID,
+ "default", appid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
ret = -1;
return ret;
}
-static int __handle_request_getsize(uid_t uid,
+static int __handle_request_getsize(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
}
snprintf(buf, sizeof(buf), "%d", get_type);
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "pkgtool",
- pkgid, buf)) {
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE,
+ "pkgtool", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
return 0;
}
-static int __handle_request_cleardata(uid_t uid,
+static int __handle_request_getsize_sync(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
- char *pkgtype = NULL;
char *pkgid = NULL;
- char *reqkey = NULL;
+ int get_type = -1;
+ char *reqkey;
+ char buf[4];
- g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
- if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+ g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
+ if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(i)", PKGMGR_R_ECOMM));
+ g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
return -1;
}
reqkey = __generate_reqkey(pkgid);
if (reqkey == NULL) {
g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype,
- pkgid, "")) {
+ snprintf(buf, sizeof(buf), "%d", get_type);
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE_SYNC,
+ "pkgtool", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+ g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
free(reqkey);
return -1;
}
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+ return 0;
+}
+
+static int __handle_request_cleardata(uid_t caller_uid,
+ GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *pkgid = NULL;
+ char *pkgtype;
+
+ g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+ if (target_uid == (uid_t)-1 || pkgid == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ECOMM));
+ return -1;
+ }
+
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARDATA,
+ pkgtype, pkgid, NULL, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+ free(pkgtype);
+ return -1;
+ }
+
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_OK));
-
- free(reqkey);
+ free(pkgtype);
return 0;
}
-static int __handle_request_clearcache(uid_t uid,
+static int __handle_request_clearcache(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
char *pkgid = NULL;
+ char *pkgtype;
g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
if (target_uid == (uid_t)-1 || pkgid == NULL) {
return -1;
}
- if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE,
- "pkgtool", pkgid, "")) {
+ if (strcmp(PKG_CLEAR_ALL_CACHE, pkgid) == 0)
+ pkgtype = strdup("pkgtool");
+ else
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARCACHE,
+ pkgtype, pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+ free(pkgtype);
return -1;
}
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_OK));
+ free(pkgtype);
return 0;
}
-static int __handle_request_kill(uid_t uid,
+static int __handle_request_kill(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_KILL,
- "default", pkgid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_KILL,
+ "default", pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
free(reqkey);
return 0;
}
-static int __handle_request_check(uid_t uid,
+static int __handle_request_check(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_CHECK,
- "default", pkgid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CHECK,
+ "default", pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
free(reqkey);
return 0;
}
-static int __handle_request_generate_license_request(uid_t uid,
+static int __handle_request_generate_license_request(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
char *reqkey;
return -1;
}
- if (_pm_queue_push(uid, reqkey,
- PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
- "default", "", resp_data)) {
+ if (_push_queue(caller_uid, caller_uid, reqkey,
+ REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
+ "default", NULL, resp_data, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
""));
return 0;
}
-static int __handle_request_register_license(uid_t uid,
+static int __handle_request_register_license(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
char *reqkey;
return -1;
}
- if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REGISTER_LICENSE,
- "default", "", resp_data)) {
+ if (_push_queue(caller_uid, caller_uid, reqkey,
+ REQUEST_TYPE_REGISTER_LICENSE,
+ "default", NULL, resp_data, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
return 0;
}
-static int __handle_request_decrypt_package(uid_t uid,
+static int __handle_request_decrypt_package(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
char *reqkey;
return -1;
}
- if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE,
- "default", drm_file_path, decrypted_file_path)) {
+ if (_push_queue(caller_uid, caller_uid, reqkey,
+ REQUEST_TYPE_DECRYPT_PACKAGE,
+ "default", drm_file_path,
+ decrypted_file_path, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
return 0;
}
-static int __update_app_splash_screen(uid_t uid,
+static int __update_app_splash_screen(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters,
int req_type)
{
return -1;
}
- if (_pm_queue_push(target_uid, reqkey, req_type, "default",
- appid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey, req_type, "default",
+ appid, NULL, NULL)) {
ERR("Failed to push request");
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
return 0;
}
-static int __handle_request_enable_app_splash_screen(uid_t uid,
+static int __handle_request_enable_app_splash_screen(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
- return __update_app_splash_screen(uid, invocation, parameters,
- PKGMGR_REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
+ return __update_app_splash_screen(caller_uid, invocation, parameters,
+ REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
}
-static int __handle_request_disable_app_splash_screen(uid_t uid,
+static int __handle_request_disable_app_splash_screen(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
- return __update_app_splash_screen(uid, invocation, parameters,
- PKGMGR_REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
+ return __update_app_splash_screen(caller_uid, invocation, parameters,
+ REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
}
-static int __handle_request_set_restriction_mode(uid_t uid,
+static int __handle_request_set_restriction_mode(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
}
snprintf(buf, sizeof(buf), "%d", mode);
- if (_pm_queue_push(target_uid, reqkey,
- PKGMGR_REQUEST_TYPE_SET_RESTRICTION_MODE,
- "default", pkgid, buf)) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_SET_RESTRICTION_MODE,
+ "default", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
return 0;
}
-static int __handle_request_unset_restriction_mode(uid_t uid,
+static int __handle_request_unset_restriction_mode(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
}
snprintf(buf, sizeof(buf), "%d", mode);
- if (_pm_queue_push(target_uid, reqkey,
- PKGMGR_REQUEST_TYPE_UNSET_RESTRICTION_MODE,
- "default", pkgid, buf)) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_UNSET_RESTRICTION_MODE,
+ "default", pkgid, buf, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(i)", PKGMGR_R_ESYSTEM));
free(reqkey);
return 0;
}
-static int __handle_request_get_restriction_mode(uid_t uid,
+static int __handle_request_get_restriction_mode(uid_t caller_uid,
GDBusMethodInvocation *invocation, GVariant *parameters)
{
uid_t target_uid = (uid_t)-1;
return -1;
}
- if (_pm_queue_push(target_uid, reqkey,
- PKGMGR_REQUEST_TYPE_GET_RESTRICTION_MODE,
- "default", pkgid, "")) {
+ if (_push_queue(target_uid, caller_uid, reqkey,
+ REQUEST_TYPE_GET_RESTRICTION_MODE,
+ "default", pkgid, NULL, NULL)) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(ii)", -1, PKGMGR_R_ESYSTEM));
free(reqkey);
return 0;
}
+static int __handle_request_set_app_label(uid_t uid,
+ GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *appid = NULL;
+ char *label = NULL;
+ char *reqkey;
+
+ g_variant_get(parameters, "(uss)", &target_uid, &appid, &label);
+ if (target_uid == (uid_t)-1 || appid == NULL || label == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ECOMM));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("appid");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, uid, reqkey,
+ REQUEST_TYPE_SET_APP_LABEL,
+ "default", appid, label, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+ free(reqkey);
+ return -1;
+ }
+
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+ return 0;
+}
+
+static int __handle_request_set_app_icon(uid_t uid,
+ GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *appid = NULL;
+ char *icon_path = NULL;
+ char *reqkey;
+
+ g_variant_get(parameters, "(uss)", &target_uid, &appid, &icon_path);
+ if (target_uid == (uid_t)-1 || appid == NULL || icon_path == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ECOMM));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey("app_icon");
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ return -1;
+ }
+
+ if (_push_queue(target_uid, uid, reqkey,
+ REQUEST_TYPE_SET_APP_ICON,
+ "default", appid, icon_path, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+ free(reqkey);
+ return -1;
+ }
+
+ if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+ (gpointer)invocation))
+ ERR("reqkey already exists");
+
+ return 0;
+}
+
+static int __handle_request_migrate_external_image(uid_t uid,
+ GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+ uid_t target_uid = (uid_t)-1;
+ char *pkgid = NULL;
+ char *pkgtype;
+ char *reqkey;
+
+ g_variant_get(parameters, "(us)", &target_uid, &pkgid);
+ if (target_uid == (uid_t)-1 || pkgid == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ECOMM));
+ return -1;
+ }
+
+ pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+ if (pkgtype == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOPKG));
+ return -1;
+ }
+
+ reqkey = __generate_reqkey(pkgid);
+ if (reqkey == NULL) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ENOMEM));
+ free(pkgtype);
+ return -1;
+ }
+
+ if (_push_queue(target_uid, uid, reqkey,
+ REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE,
+ pkgtype, pkgid, NULL, NULL)) {
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+ free(reqkey);
+ free(pkgtype);
+ return -1;
+ }
+
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", PKGMGR_R_OK));
+
+ free(reqkey);
+ free(pkgtype);
+
+ return 0;
+}
+
static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
{
GError *err = NULL;
}
g_variant_get(result, "(u)", &uid);
+ g_variant_unref(result);
return uid;
}
if (g_strcmp0(method_name, "install") == 0)
ret = __handle_request_install(uid, invocation, parameters);
else if (g_strcmp0(method_name, "mount_install") == 0)
- ret = __handle_request_mount_install(uid, invocation, parameters);
+ ret = __handle_request_mount_install(uid, invocation,
+ parameters);
else if (g_strcmp0(method_name, "reinstall") == 0)
ret = __handle_request_reinstall(uid, invocation, parameters);
else if (g_strcmp0(method_name, "uninstall") == 0)
ret = __handle_request_cleardata(uid, invocation, parameters);
else if (g_strcmp0(method_name, "move") == 0)
ret = __handle_request_move(uid, invocation, parameters);
- else if (g_strcmp0(method_name, "enable_pkg") == 0)
- ret = __handle_request_enable_pkg(uid, invocation, parameters);
- else if (g_strcmp0(method_name, "disable_pkg") == 0)
- ret = __handle_request_disable_pkg(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "enable_pkgs") == 0)
+ ret = __handle_request_enable_pkgs(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "disable_pkgs") == 0)
+ ret = __handle_request_disable_pkgs(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "register_pkg_update_info") == 0)
+ ret = __handle_request_register_pkg_update_info(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "unregister_pkg_update_info") == 0)
+ ret = __handle_request_unregister_pkg_update_info(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "unregister_all_pkg_update_info") == 0)
+ ret = __handle_request_unregister_all_pkg_update_info(uid, invocation, parameters);
else if (g_strcmp0(method_name, "getsize") == 0)
ret = __handle_request_getsize(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "getsize_sync") == 0)
+ ret = __handle_request_getsize_sync(uid, invocation, parameters);
else if (g_strcmp0(method_name, "clearcache") == 0)
ret = __handle_request_clearcache(uid, invocation, parameters);
else if (g_strcmp0(method_name, "enable_app") == 0)
ret = __handle_request_enable_app(uid, invocation, parameters);
else if (g_strcmp0(method_name, "disable_app") == 0)
ret = __handle_request_disable_app(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "enable_apps") == 0)
+ ret = __handle_request_enable_apps(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "disable_apps") == 0)
+ ret = __handle_request_disable_apps(uid, invocation, parameters);
else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
- ret = __handle_request_enable_global_app_for_uid(uid, invocation, parameters);
+ ret = __handle_request_enable_global_app_for_uid(uid,
+ invocation, parameters);
else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
- ret = __handle_request_disable_global_app_for_uid(uid, invocation, parameters);
+ ret = __handle_request_disable_global_app_for_uid(uid,
+ invocation, parameters);
else if (g_strcmp0(method_name, "kill") == 0)
ret = __handle_request_kill(uid, invocation, parameters);
else if (g_strcmp0(method_name, "check") == 0)
else if (g_strcmp0(method_name, "get_restriction_mode") == 0)
ret = __handle_request_get_restriction_mode(uid, invocation,
parameters);
+ else if (g_strcmp0(method_name, "set_app_label") == 0)
+ ret = __handle_request_set_app_label(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "set_app_icon") == 0)
+ ret = __handle_request_set_app_icon(uid, invocation, parameters);
+ else if (g_strcmp0(method_name, "migrate_external_image") == 0)
+ ret = __handle_request_migrate_external_image(uid, invocation,
+ parameters);
else
ret = -1;
g_idle_add(queue_job, NULL);
}
-int __return_value_to_caller(const char *req_key, GVariant *result)
+int _return_value_to_caller(const char *req_key, GVariant *result)
{
GDBusMethodInvocation *invocation;
DBG("on name lost: %s", name);
}
-int __init_request_handler(void)
+int _init_request_handler(void)
{
- instropection_data = g_dbus_node_info_new_for_xml(instropection_xml, NULL);
+ instropection_data = g_dbus_node_info_new_for_xml(instropection_xml,
+ NULL);
owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, PKGMGR_DBUS_SERVICE,
G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
return 0;
}
-void __fini_request_handler(void)
+void _fini_request_handler(void)
{
g_hash_table_destroy(req_table);
g_bus_unown_name(owner_id);