return ret;
}
+static int __process_migrate_external_image(struct backend_job *job)
+{
+ char *backend_cmd;
+ char **argv;
+ char args[MAX_PKG_ARGS_LEN];
+ int pid;
+
+ backend_cmd = job->backend_path;
+ if (backend_cmd == NULL)
+ return -1;
+
+ snprintf(args, sizeof(args), "%s -k %s --migrate-extimg %s -u %d %s",
+ backend_cmd, job->req_id, job->pkgid,
+ (int)job->target_uid, job->args);
+
+ argv = __generate_argv(args);
+
+ pid = __fork_and_exec_with_args(argv, APPFW_UID);
+ g_strfreev(argv);
+
+ return pid;
+}
+
static int __post_process(int ret, int x, struct backend_job *job)
{
if (ret < 0) {
ret = __process_set_app_label(job);
_free_backend_job(job);
break;
+ case REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE:
+ __set_backend_busy(x);
+ ret = __process_migrate_external_image(job);
+ __post_process(ret, x, job);
+ break;
default:
ret = -1;
break;
" <arg type='s' name='label' 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;
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)) {
+ 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;
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, "migrate_external_image") == 0)
+ ret = __handle_request_migrate_external_image(uid, invocation,
+ parameters);
else
ret = -1;