From ef1da22e96d67de02122ded04626e98736d76210 Mon Sep 17 00:00:00 2001 From: Arkadiusz Szulakiewicz Date: Wed, 13 Apr 2016 11:05:06 +0200 Subject: [PATCH] Add support for mount install Change-Id: I084d0359ece0d0bcaad80ccba1fa022da897f967 --- include/pkgmgr-server.h | 1 + org.tizen.pkgmgr.conf.in | 1 + src/pkgmgr-server.c | 28 +++++++++++++++ src/request.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+) diff --git a/include/pkgmgr-server.h b/include/pkgmgr-server.h index ea02b8f..602e0fa 100644 --- a/include/pkgmgr-server.h +++ b/include/pkgmgr-server.h @@ -58,6 +58,7 @@ enum request_type { PKGMGR_REQUEST_TYPE_INSTALL, + PKGMGR_REQUEST_TYPE_MOUNT_INSTALL, PKGMGR_REQUEST_TYPE_REINSTALL, PKGMGR_REQUEST_TYPE_UNINSTALL, PKGMGR_REQUEST_TYPE_MOVE, diff --git a/org.tizen.pkgmgr.conf.in b/org.tizen.pkgmgr.conf.in index f3c5caf..c3b0204 100644 --- a/org.tizen.pkgmgr.conf.in +++ b/org.tizen.pkgmgr.conf.in @@ -9,6 +9,7 @@ + diff --git a/src/pkgmgr-server.c b/src/pkgmgr-server.c index 6414b57..78ed2b3 100644 --- a/src/pkgmgr-server.c +++ b/src/pkgmgr-server.c @@ -858,6 +858,29 @@ static int __process_install(pm_dbus_msg *item) return pid; } +static int __process_mount_install(pm_dbus_msg *item) +{ + char *backend_cmd; + char **argv; + char args[MAX_PKG_ARGS_LEN] = {'\0', }; + int pid; + + backend_cmd = _get_backend_cmd(item->pkg_type); + if (backend_cmd == NULL) + return -1; + + snprintf(args, sizeof(args), "%s -k %s -w %s %s", backend_cmd, + item->req_id, item->pkgid, item->args); + + argv = __generate_argv(args); + + pid = __fork_and_exec_with_args(argv, item->uid); + g_strfreev(argv); + free(backend_cmd); + + return pid; +} + static int __process_reinstall(pm_dbus_msg *item) { char *backend_cmd; @@ -1361,6 +1384,11 @@ gboolean queue_job(void *data) __set_recovery_mode(item->uid, item->pkgid, item->pkg_type); ret = __process_install(item); break; + case PKGMGR_REQUEST_TYPE_MOUNT_INSTALL: + __set_backend_busy(x); + __set_recovery_mode(item->uid, item->pkgid, item->pkg_type); + ret = __process_mount_install(item); + break; case PKGMGR_REQUEST_TYPE_REINSTALL: __set_backend_busy(x); __set_recovery_mode(item->uid, item->pkgid, item->pkg_type); diff --git a/src/request.c b/src/request.c index 70a7182..daf4d12 100644 --- a/src/request.c +++ b/src/request.c @@ -32,6 +32,14 @@ static const char instropection_xml[] = " " " " " " + " " + " " + " " + " " + " " + " " + " " + " " " " " " " " @@ -321,6 +329,87 @@ catch: return ret; } +static int __handle_request_mount_install(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) +{ + uid_t target_uid = (uid_t)-1; + char *pkgtype = NULL; + char *pkgpath = NULL; + char *args = NULL; + char *reqkey = NULL; + gchar **tmp_args = NULL; + gsize args_count; + int ret = -1; + GVariant *value; + int i = 0; + int len = 0; + + g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value); + tmp_args = (gchar **)g_variant_get_strv(value, &args_count); + + for (i = 0; i < args_count; i++) + len = len + strlen(tmp_args[i]) + 1; + + args = (char *)calloc(len, sizeof(char)); + if (args == NULL) { + ERR("calloc failed"); + ret = -1; + goto catch; + } + + for (i = 0; i < args_count; i++) { + strncat(args, tmp_args[i], strlen(tmp_args[i])); + if (i != args_count - 1) + strncat(args, " ", strlen(" ")); + } + + if (target_uid == (uid_t)-1 || pkgtype == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", + PKGMGR_R_ECOMM, "")); + ret = -1; + goto catch; + } + + if (pkgpath == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", + PKGMGR_R_ECOMM, "")); + ret = -1; + goto catch; + } + + reqkey = __generate_reqkey(pkgpath); + if (reqkey == NULL) { + ret = -1; + goto catch; + } + + if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOUNT_INSTALL, + pkgtype, pkgpath, args)) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", + PKGMGR_R_ESYSTEM, "")); + ret = -1; + goto catch; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", + PKGMGR_R_OK, + reqkey)); + ret = 0; + + catch: + if (reqkey) + free(reqkey); + + if (args) + free(args); + + return ret; +} + static int __handle_request_reinstall(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { @@ -1100,6 +1189,8 @@ static void __handle_method_call(GDBusConnection *connection, 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); else if (g_strcmp0(method_name, "reinstall") == 0) ret = __handle_request_reinstall(uid, invocation, parameters); else if (g_strcmp0(method_name, "uninstall") == 0) -- 2.7.4