diff options
author | insun.pyo <insun.pyo@samsung.com> | 2018-03-02 00:57:28 +0900 |
---|---|---|
committer | INSUN PYO <insun.pyo@samsung.com> | 2018-03-06 17:33:27 +0900 |
commit | c214a862ff4bc251d77faa444230e1c3ca54afe5 (patch) | |
tree | 73f38189ff3934f66d5dddf4060e55bb1d5b2cc5 | |
parent | 4321bf040bb53a155a4bcc2282a26a84769a963f (diff) | |
download | deviced-c214a862ff4bc251d77faa444230e1c3ca54afe5.tar.gz deviced-c214a862ff4bc251d77faa444230e1c3ca54afe5.tar.bz2 deviced-c214a862ff4bc251d77faa444230e1c3ca54afe5.zip |
tzip: add async call
Signed-off-by: insun.pyo <insun.pyo@samsung.com>
Change-Id: I3431b65612b22ca6a8c66ca9263286ddfa5a9178
-rw-r--r-- | src/tzip/tzip.c | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/src/tzip/tzip.c b/src/tzip/tzip.c index b73fe985..9541e034 100644 --- a/src/tzip/tzip.c +++ b/src/tzip/tzip.c @@ -758,15 +758,15 @@ out_unlock: return ret; } -static GVariant *dbus_request_mount_tzip(GDBusConnection *conn, - const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, - GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +static GVariant *dbus_request_mount_tzip_internal(GDBusConnection *conn, const gchar *sender, GVariant *param, + GDBusMethodInvocation *invocation, bool sync) { int ret; pid_t pid; char *smack; char *zippath; char *mountpath; + GVariant *result; struct tzip_msg_data *msgdata = NULL; tzip_server_init(); @@ -808,32 +808,38 @@ static GVariant *dbus_request_mount_tzip(GDBusConnection *conn, msgdata->smack = strdup(smack); msgdata->zippath = strdup(zippath); msgdata->mountpath = strdup(mountpath); - msgdata->invocation = invocation; if (!msgdata->smack || !msgdata->zippath || !msgdata->mountpath) { _E("Malloc failed"); ret = -ENOMEM; goto out; } - g_async_queue_push(async_queue, (gpointer)msgdata); ret = 0; + if (sync) { + result = NULL; + msgdata->invocation = invocation; + } else + result = g_variant_new("(i)", ret); + + g_async_queue_push(async_queue, (gpointer)msgdata); + out: if (ret < 0) { free_tzip_msg_data(msgdata); - return g_variant_new("(i)", ret); + result = g_variant_new("(i)", ret); } - return NULL; + return result; } -static GVariant *dbus_request_unmount_tzip(GDBusConnection *conn, - const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, - GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +static GVariant *dbus_request_unmount_tzip_internal(GDBusConnection *conn, const gchar *sender, GVariant *param, + GDBusMethodInvocation *invocation, bool sync) { int ret; pid_t pid; char *mountpath; + GVariant *result; struct tzip_msg_data *msgdata = NULL; tzip_server_init(); @@ -873,23 +879,57 @@ static GVariant *dbus_request_unmount_tzip(GDBusConnection *conn, msgdata->type = 'u'; msgdata->mountpath = strdup(mountpath); - msgdata->invocation = invocation; if (!msgdata->mountpath) { _E("Malloc failed"); ret = -ENOMEM; goto out; } - g_async_queue_push(async_queue, (gpointer)msgdata); ret = 0; + if (sync) { + result = NULL; + msgdata->invocation = invocation; + } else + result = g_variant_new("(i)", ret); + + g_async_queue_push(async_queue, (gpointer)msgdata); + out: if (ret < 0) { free_tzip_msg_data(msgdata); - return g_variant_new("(i)", ret); + result = g_variant_new("(i)", ret); } - return NULL; + return result; +} + +static GVariant *dbus_request_mount_tzip(GDBusConnection *conn, + const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, + GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +{ + return dbus_request_mount_tzip_internal(conn, sender, param, invocation, false); +} + +static GVariant *dbus_request_unmount_tzip(GDBusConnection *conn, + const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, + GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +{ + return dbus_request_unmount_tzip_internal(conn, sender, param, invocation, false); +} + +static GVariant *dbus_request_mount_sync_tzip(GDBusConnection *conn, + const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, + GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +{ + return dbus_request_mount_tzip_internal(conn, sender, param, invocation, true); +} + +static GVariant *dbus_request_unmount_sync_tzip(GDBusConnection *conn, + const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, + GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +{ + return dbus_request_unmount_tzip_internal(conn, sender, param, invocation, true); } static GVariant *dbus_request_ismounted_tzip(GDBusConnection *conn, @@ -951,6 +991,8 @@ out: static const dbus_method_s dbus_methods[] = { { "Mount", "sss", "i", dbus_request_mount_tzip }, { "Unmount", "s", "i", dbus_request_unmount_tzip }, + { "MountSync", "sss", "i", dbus_request_mount_sync_tzip }, + { "UnmountSync", "s", "i", dbus_request_unmount_sync_tzip }, { "IsMounted", "s", "i", dbus_request_ismounted_tzip }, /* Add methods here */ }; |