[gvfs] afp: logout from server on unmount
- From: Carl-Anton Ingmarsson <carlantoni src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] afp: logout from server on unmount
- Date: Thu, 9 Aug 2012 20:16:23 +0000 (UTC)
commit ef8d81602b01cecf0c9cab8b54c0f9e65486dc57
Author: Carl-Anton Ingmarsson <ca ingmarsson gmail com>
Date: Mon Mar 12 17:27:13 2012 +0100
afp: logout from server on unmount
daemon/gvfsafpconnection.h | 1 +
daemon/gvfsafpserver.c | 38 ++++++++++++++++++++++++++++++++++++++
daemon/gvfsafpserver.h | 4 ++++
daemon/gvfsafpvolume.c | 1 -
daemon/gvfsbackendafp.c | 19 +++++++++++++++++++
daemon/gvfsbackendafpbrowse.c | 19 +++++++++++++++++++
6 files changed, 81 insertions(+), 1 deletions(-)
---
diff --git a/daemon/gvfsafpconnection.h b/daemon/gvfsafpconnection.h
index 924a47c..caea152 100644
--- a/daemon/gvfsafpconnection.h
+++ b/daemon/gvfsafpconnection.h
@@ -203,6 +203,7 @@ typedef enum
AFP_COMMAND_GET_VOL_PARMS = 17,
AFP_COMMAND_LOGIN = 18,
AFP_COMMAND_LOGIN_CONT = 19,
+ AFP_COMMAND_LOGOUT = 20,
AFP_COMMAND_MAP_ID = 21,
AFP_COMMAND_MAP_NAME = 22,
AFP_COMMAND_MOVE_AND_RENAME = 23,
diff --git a/daemon/gvfsafpserver.c b/daemon/gvfsafpserver.c
index 9acc2b1..9631f9a 100644
--- a/daemon/gvfsafpserver.c
+++ b/daemon/gvfsafpserver.c
@@ -67,6 +67,9 @@ g_vfs_afp_server_finalize (GObject *object)
{
GVfsAfpServer *afp_serv = G_VFS_AFP_SERVER (object);
+ g_clear_object (&afp_serv->addr);
+ g_clear_object (&afp_serv->conn);
+
g_free (afp_serv->machine_type);
g_free (afp_serv->server_name);
g_free (afp_serv->utf8_server_name);
@@ -1073,6 +1076,41 @@ error:
}
/*
+ * g_vfs_afp_server_logout_sync:
+ *
+ * Terminates and closes the connection to the server
+ */
+gboolean
+g_vfs_afp_server_logout_sync (GVfsAfpServer *server,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVfsAfpCommand *comm;
+ GVfsAfpReply *reply;
+ gint32 res_code;
+
+ comm = g_vfs_afp_command_new (AFP_COMMAND_LOGOUT);
+ /* pad byte */
+ g_vfs_afp_command_put_byte (comm, 0);
+
+ reply = g_vfs_afp_connection_send_command_sync (server->conn, comm, cancellable, error);
+ if (!reply) {
+ g_vfs_afp_connection_close_sync (server->conn, cancellable, NULL);
+ return FALSE;
+ }
+
+ res_code = g_vfs_afp_reply_get_result_code (reply);
+ g_object_unref (reply);
+ if (res_code != AFP_RESULT_NO_ERROR) {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Failed to logout from server"));
+ g_vfs_afp_connection_close_sync (server->conn, cancellable, NULL);
+ return FALSE;
+ }
+
+ return g_vfs_afp_connection_close_sync (server->conn, cancellable, error);
+}
+
+/*
* g_vfs_server_time_to_local_time:
*
* @server: a #GVfsAfpServer
diff --git a/daemon/gvfsafpserver.h b/daemon/gvfsafpserver.h
index f341450..d528850 100644
--- a/daemon/gvfsafpserver.h
+++ b/daemon/gvfsafpserver.h
@@ -85,6 +85,10 @@ gboolean g_vfs_afp_server_login (GVfsAfpServer *afp_ser
GCancellable *cancellable,
GError **error);
+gboolean g_vfs_afp_server_logout_sync (GVfsAfpServer *server,
+ GCancellable *cancellable,
+ GError **error);
+
gint64 g_vfs_afp_server_time_to_local_time (GVfsAfpServer *afp_serv,
gint32 server_time);
diff --git a/daemon/gvfsafpvolume.c b/daemon/gvfsafpvolume.c
index e257b01..4329aaf 100644
--- a/daemon/gvfsafpvolume.c
+++ b/daemon/gvfsafpvolume.c
@@ -92,7 +92,6 @@ g_vfs_afp_volume_mount_sync (GVfsAfpVolume *volume,
GVfsAfpVolumePrivate *priv;
GVfsAfpCommand *comm;
GVfsAfpReply *reply;
- gboolean res;
AfpResultCode res_code;
g_return_val_if_fail (G_VFS_IS_AFP_VOLUME (volume), FALSE);
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c
index 24f5cd2..003a696 100644
--- a/daemon/gvfsbackendafp.c
+++ b/daemon/gvfsbackendafp.c
@@ -33,6 +33,7 @@
#endif
#include "gvfsjobmount.h"
+#include "gvfsjobunmount.h"
#include "gvfsjobenumerate.h"
#include "gvfsjobqueryinfo.h"
#include "gvfsjobqueryfsinfo.h"
@@ -1995,6 +1996,23 @@ try_query_info (GVfsBackend *backend,
}
static void
+do_unmount (GVfsBackend *backend,
+ GVfsJobUnmount *job,
+ GMountUnmountFlags flags,
+ GMountSource *mount_source)
+{
+ GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
+
+ if (!(flags & G_MOUNT_UNMOUNT_FORCE))
+ {
+ g_vfs_afp_server_logout_sync (afp_backend->server, G_VFS_JOB (job)->cancellable,
+ NULL);
+ }
+
+ g_vfs_job_succeeded (G_VFS_JOB (job));
+}
+
+static void
do_mount (GVfsBackend *backend,
GVfsJobMount *job,
GMountSpec *mount_spec,
@@ -2145,6 +2163,7 @@ g_vfs_backend_afp_class_init (GVfsBackendAfpClass *klass)
backend_class->try_mount = try_mount;
backend_class->mount = do_mount;
+ backend_class->unmount = do_unmount;
backend_class->try_query_info = try_query_info;
backend_class->try_query_fs_info = try_query_fs_info;
backend_class->try_set_attribute = try_set_attribute;
diff --git a/daemon/gvfsbackendafpbrowse.c b/daemon/gvfsbackendafpbrowse.c
index 31aaa07..f597cc6 100644
--- a/daemon/gvfsbackendafpbrowse.c
+++ b/daemon/gvfsbackendafpbrowse.c
@@ -32,6 +32,7 @@
#endif
#include "gvfsjobmount.h"
+#include "gvfsjobunmount.h"
#include "gvfsjobqueryinfo.h"
#include "gvfsjobenumerate.h"
#include "gvfsjobmountmountable.h"
@@ -388,6 +389,23 @@ try_query_info (GVfsBackend *backend,
}
static void
+do_unmount (GVfsBackend *backend,
+ GVfsJobUnmount *job,
+ GMountUnmountFlags flags,
+ GMountSource *mount_source)
+{
+ GVfsBackendAfpBrowse *afp_backend = G_VFS_BACKEND_AFP_BROWSE (backend);
+
+ if (!(flags & G_MOUNT_UNMOUNT_FORCE))
+ {
+ g_vfs_afp_server_logout_sync (afp_backend->server, G_VFS_JOB (job)->cancellable,
+ NULL);
+ }
+
+ g_vfs_job_succeeded (G_VFS_JOB (job));
+}
+
+static void
do_mount (GVfsBackend *backend,
GVfsJobMount *job,
GMountSpec *mount_spec,
@@ -526,6 +544,7 @@ g_vfs_backend_afp_browse_class_init (GVfsBackendAfpBrowseClass *klass)
backend_class->try_mount = try_mount;
backend_class->mount = do_mount;
+ backend_class->unmount = do_unmount;
backend_class->try_query_info = try_query_info;
backend_class->try_enumerate = try_enumerate;
backend_class->try_mount_mountable = try_mount_mountable;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]