[gvfs] daemon: Implement proper org.gtk.vfs.MountTracker.UnregisterMount()
- From: Tomas Bzatek <tbzatek src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] daemon: Implement proper org.gtk.vfs.MountTracker.UnregisterMount()
- Date: Tue, 5 Feb 2013 17:29:45 +0000 (UTC)
commit 62ba3def657a053c0a8aa805e7e3fe3a25d3759d
Author: Tomas Bzatek <tbzatek redhat com>
Date: Tue Feb 5 18:23:52 2013 +0100
daemon: Implement proper org.gtk.vfs.MountTracker.UnregisterMount()
A proper unmount method was missing from the daemon interface as it was
basically not needed. The mount tracker was watching mounts on the bus
and if child disappeared, that event was treated as unmount.
With recent introduction of gvfs test suite we started using
man-in-the-middle program for connecting to private SMB server. However,
certain libsmbclient versions are forking gvfs backends (gvfsd-smb in
this case) which makes d-bus confused and name owner tracking doesn't
work as expected.
Moreover the forked process got stuck due to internal samba LIBSMB_PROG
handling after the original process did its job and unmount was triggered
from user side. The original process exited just fine but the forked one
was blocking the name on the bus probably and gvfs mount tracker was fooled.
Eventually the stuck libsmbclient call times out and exits gracefully.
This happens with samba-3.6.9
This patch adds proper unmount call to indicate the backend is going away
so even if there are leftovers, user is indicated a proper unmount.
https://bugzilla.gnome.org/show_bug.cgi?id=691568
daemon/mount.c | 27 ++++++++++++++++++++++++++-
1 files changed, 26 insertions(+), 1 deletions(-)
---
diff --git a/daemon/mount.c b/daemon/mount.c
index d1341f5..54b694b 100644
--- a/daemon/mount.c
+++ b/daemon/mount.c
@@ -956,6 +956,31 @@ handle_register_fuse (GVfsDBusMountTracker *object,
return TRUE;
}
+static gboolean
+handle_unregister_mount (GVfsDBusMountTracker *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_obj_path,
+ gpointer user_data)
+{
+ VfsMount *mount;
+ const char *id;
+
+ id = g_dbus_method_invocation_get_sender (invocation);
+
+ if (find_vfs_mount (id, arg_obj_path) == NULL) {
+ g_dbus_method_invocation_return_error_literal (invocation,
+ G_IO_ERROR,
+ G_IO_ERROR_NOT_MOUNTED,
+ "Mountpoint not registered");
+ return TRUE;
+ }
+
+ dbus_client_disconnected (id);
+
+ gvfs_dbus_mount_tracker_complete_unregister_mount (object, invocation);
+
+ return TRUE;
+}
static int reload_pipes[2];
@@ -1026,7 +1051,7 @@ mount_init (void)
g_signal_connect (mount_tracker, "handle-list-mounts", G_CALLBACK (handle_list_mounts), NULL);
g_signal_connect (mount_tracker, "handle-list-mountable-info", G_CALLBACK (handle_list_mountable_info), NULL);
g_signal_connect (mount_tracker, "handle-list-mount-types", G_CALLBACK (handle_list_mount_types), NULL);
- /* FIXME: handle unregisterMount() */
+ g_signal_connect (mount_tracker, "handle-unregister-mount", G_CALLBACK (handle_unregister_mount), NULL);
error = NULL;
if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (mount_tracker), conn,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]