diff options
author | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 10:36:34 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 10:36:34 +0000 |
commit | a9784aaf042b61102e1b311ec9a4e2f33d771bd7 (patch) | |
tree | 6ccf05e119376c22f5839ceec631b865ef7d9d8d /daemon | |
parent | 4311de34b4e46bdca9c650f235fb0ab015a0847f (diff) | |
download | gvfs-a9784aaf042b61102e1b311ec9a4e2f33d771bd7.tar.gz |
Add mountpoint tracker
Original git commit by Alexander Larsson <alex@greebo.(none)> at 1165504619 +0100
svn path=/trunk/; revision=220
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gvfsdaemon.c | 128 | ||||
-rw-r--r-- | daemon/gvfsdaemonprotocol.h | 4 | ||||
-rw-r--r-- | daemon/gvfsdaemonutils.c | 4 | ||||
-rw-r--r-- | daemon/gvfsmountpoint.c | 60 | ||||
-rw-r--r-- | daemon/gvfsmountpoint.h | 7 |
5 files changed, 199 insertions, 4 deletions
diff --git a/daemon/gvfsdaemon.c b/daemon/gvfsdaemon.c index 2fc08dbf..3c594168 100644 --- a/daemon/gvfsdaemon.c +++ b/daemon/gvfsdaemon.c @@ -14,6 +14,7 @@ #include <gvfsdaemonprotocol.h> #include <gvfsdaemonutils.h> #include <gvfsjobopenforread.h> +#include <gvfsmountpoint.h> G_DEFINE_TYPE (GVfsDaemon, g_vfs_daemon, G_TYPE_OBJECT); @@ -27,6 +28,12 @@ typedef struct { gpointer data; } RegisteredPath; +typedef struct { + char *owner; + char *path; + GVfsMountpoint *mountpoint; +} MountpointData; + struct _GVfsDaemonPrivate { GMutex *lock; @@ -39,6 +46,7 @@ struct _GVfsDaemonPrivate GQueue *jobs; guint queued_job_start; GList *job_sources; + GList *tracked_mountpoints; /* Only accessed from main thread */ }; typedef struct { @@ -199,6 +207,23 @@ g_vfs_daemon_new (gboolean main_daemon, gboolean replace) dbus_error_free (&error); return NULL; } + + + if (main_daemon) + { + dbus_bus_add_match (conn, + "interface='"G_VFS_DBUS_MOUNTPOINT_INTERFACE"'," + "member='"G_VFS_DBUS_ANNOUNCE_MOUNTPOINT"'", + &error); + if (dbus_error_is_set (&error)) + { + g_printerr ("Failed to connect to add dbus match: %s\n", + error.message); + dbus_error_free (&error); + return NULL; + } + } + dbus_connection_setup_with_g_main (conn, NULL); @@ -793,9 +818,46 @@ daemon_message_func (DBusConnection *conn, gpointer data) { GVfsDaemon *daemon = data; - GVfsJob *job; + GList *l, *next; RegisteredPath *registered_path; + MountpointData *mount_data; + if (daemon->priv->main_daemon && + dbus_message_is_signal (message, G_VFS_DBUS_MOUNTPOINT_INTERFACE, + G_VFS_DBUS_ANNOUNCE_MOUNTPOINT)) + { + const char *path = dbus_message_get_path (message); + const char *sender = dbus_message_get_sender (message); + DBusMessageIter iter; + + for (l = daemon->priv->tracked_mountpoints; l != NULL; l = l->next) + { + mount_data = l->data; + if (strcmp (mount_data->owner, sender) == 0 && + strcmp (mount_data->path, path) == 0) + break; + } + + if (l == NULL) + { + GVfsMountpoint *mountpoint; + + if (dbus_message_iter_init (message, &iter) && + (mountpoint = g_vfs_mountpoint_from_dbus (&iter)) != NULL) + { + mount_data = g_new0 (MountpointData, 1); + mount_data->mountpoint = mountpoint; + mount_data->owner = g_strdup (sender); + mount_data->path = g_strdup (path); + + g_print ("Added mountpoint: %s, %s, %s\n", mount_data->owner, mount_data->path, mount_data->mountpoint->method); + + daemon->priv->tracked_mountpoints = + g_list_prepend (daemon->priv->tracked_mountpoints, mount_data); + } + } + } + if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { char *name, *from, *to; @@ -830,10 +892,72 @@ daemon_message_func (DBusConnection *conn, g_mutex_unlock (daemon->priv->lock); } } + + if (*name == ':' && *to == 0) + { + /* Sender died */ + + l = daemon->priv->tracked_mountpoints; + while (l != NULL) + { + mount_data = l->data; + next = l->next; + + if (strcmp (mount_data->owner, name) == 0) + { + g_print ("Removed mountpoint: %s, %s, %s\n", mount_data->owner, mount_data->path, mount_data->mountpoint->method); + g_vfs_mountpoint_free (mount_data->mountpoint); + g_free (mount_data->owner); + g_free (mount_data->path); + g_free (mount_data); + daemon->priv->tracked_mountpoints = + g_list_delete_link (daemon->priv->tracked_mountpoints, l); + } + + l = next; + } + } + } + } + + if (daemon->priv->main_daemon && + dbus_message_is_method_call (message, + G_VFS_DBUS_MOUNTPOINT_TRACKER_INTERFACE, + G_VFS_DBUS_LIST_MOUNT_POINTS)) + { + DBusMessage *reply; + DBusMessageIter iter, array; + + reply = dbus_message_new_method_return (message); + + dbus_message_iter_init_append (reply, &iter); + + + if (dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_STRING_AS_STRING + G_VFS_MOUNTPOINT_SIGNATURE, + &array)) + { + for (l = daemon->priv->tracked_mountpoints; l != NULL; l = l->next) + { + mount_data = l->data; + + dbus_message_iter_append_basic (&array, DBUS_TYPE_STRING, + mount_data->owner); + dbus_message_iter_append_basic (&array, DBUS_TYPE_STRING, + mount_data->path); + + g_vfs_mountpoint_to_dbus (mount_data->mountpoint, &array); + } + + dbus_message_iter_close_container (&iter, &array); + + dbus_connection_send (conn, reply, NULL); + dbus_message_unref (reply); } } - job = NULL; if (dbus_message_is_method_call (message, G_VFS_DBUS_DAEMON_INTERFACE, G_VFS_DBUS_OP_GET_CONNECTION)) diff --git a/daemon/gvfsdaemonprotocol.h b/daemon/gvfsdaemonprotocol.h index a265c5fb..75892583 100644 --- a/daemon/gvfsdaemonprotocol.h +++ b/daemon/gvfsdaemonprotocol.h @@ -8,6 +8,10 @@ G_BEGIN_DECLS #define G_VFS_DBUS_MOUNTPOINT_INTERFACE "org.gtk.vfs.Mountpoint" #define G_VFS_DBUS_ANNOUNCE_MOUNTPOINT "AnnounceMountpoint" +#define G_VFS_DBUS_MOUNTPOINT_TRACKER_INTERFACE "org.gtk.vfs.MountpointTracker" +#define G_VFS_DBUS_LIST_MOUNT_POINTS "ListMountpoints" + + #define G_VFS_DBUS_MOUNTPOINT_NAME "org.gtk.vfs.mount." #define G_VFS_DBUS_ERROR_SOCKET_FAILED "org.gtk.vfs.Error.SocketFailed" diff --git a/daemon/gvfsdaemonutils.c b/daemon/gvfsdaemonutils.c index d8b62853..abb35a2f 100644 --- a/daemon/gvfsdaemonutils.c +++ b/daemon/gvfsdaemonutils.c @@ -275,12 +275,12 @@ _g_dbus_message_iter_append_filename (DBusMessageIter *iter, const char *filenam DBUS_TYPE_BYTE_AS_STRING, &array)) return FALSE; - + if (!dbus_message_iter_append_fixed_array (&array, DBUS_TYPE_BYTE, &filename, strlen (filename))) return FALSE; - + if (!dbus_message_iter_close_container (iter, &array)) return FALSE; diff --git a/daemon/gvfsmountpoint.c b/daemon/gvfsmountpoint.c index 1ac35dc7..cf635bc1 100644 --- a/daemon/gvfsmountpoint.c +++ b/daemon/gvfsmountpoint.c @@ -30,6 +30,66 @@ g_vfs_mountpoint_free (GVfsMountpoint *mountpoint) GVfsMountpoint * g_vfs_mountpoint_from_dbus (DBusMessageIter *iter) { + GVfsMountpoint *mountpoint; + dbus_int32_t port; + char *str; + char *path_data; + int path_len; + DBusMessageIter array; + + mountpoint = g_new0 (GVfsMountpoint, 1); + + if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_STRING) + goto out; + + dbus_message_iter_get_basic (iter, &str); + mountpoint->method = g_strdup (str); + + if (!dbus_message_iter_next (iter)) + goto out; + + if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_STRING) + goto out; + + dbus_message_iter_get_basic (iter, &str); + mountpoint->user = g_strdup (str); + + if (!dbus_message_iter_next (iter)) + goto out; + + if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_STRING) + goto out; + + dbus_message_iter_get_basic (iter, &str); + mountpoint->host = g_strdup (str); + + if (!dbus_message_iter_next (iter)) + goto out; + + if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INT32) + goto out; + + dbus_message_iter_get_basic (iter, &port); + mountpoint->port = port; + + if (!dbus_message_iter_next (iter)) + goto out; + + if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_ARRAY || + dbus_message_iter_get_element_type (iter) != DBUS_TYPE_BYTE) + goto out; + + dbus_message_iter_recurse (iter, &array); + dbus_message_iter_get_fixed_array (&array, &path_data, &path_len); + + mountpoint->port = port; + mountpoint->path = g_strndup (path_data, path_len); + g_free (path_data); + + return mountpoint; + + out: + g_vfs_mountpoint_free (mountpoint); return NULL; } diff --git a/daemon/gvfsmountpoint.h b/daemon/gvfsmountpoint.h index 12459fe9..1059e794 100644 --- a/daemon/gvfsmountpoint.h +++ b/daemon/gvfsmountpoint.h @@ -4,6 +4,13 @@ #include <glib.h> #include <dbus/dbus.h> +#define G_VFS_MOUNTPOINT_SIGNATURE \ + DBUS_TYPE_STRING_AS_STRING \ + DBUS_TYPE_STRING_AS_STRING \ + DBUS_TYPE_STRING_AS_STRING \ + DBUS_TYPE_INT32_AS_STRING \ + DBUS_TYPE_ARRAY_AS_STRING \ + DBUS_TYPE_BYTE_AS_STRING \ typedef struct { char *method; |