[gvfs] afp: logout from server on unmount



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]