summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2012-03-12 17:27:13 +0100
committerCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2012-08-09 21:06:05 +0200
commitef8d81602b01cecf0c9cab8b54c0f9e65486dc57 (patch)
treefaa74c39882e57459a923320b546b8dc01ed6d68
parentc1b3b8a3e3d979a4857587b57026d91f56ff1627 (diff)
downloadgvfs-ef8d81602b01cecf0c9cab8b54c0f9e65486dc57.tar.gz
afp: logout from server on unmount
-rw-r--r--daemon/gvfsafpconnection.h1
-rw-r--r--daemon/gvfsafpserver.c38
-rw-r--r--daemon/gvfsafpserver.h4
-rw-r--r--daemon/gvfsafpvolume.c1
-rw-r--r--daemon/gvfsbackendafp.c19
-rw-r--r--daemon/gvfsbackendafpbrowse.c19
6 files changed, 81 insertions, 1 deletions
diff --git a/daemon/gvfsafpconnection.h b/daemon/gvfsafpconnection.h
index 924a47c0..caea1526 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 9acc2b18..9631f9ae 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 f3414500..d528850a 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 e257b015..4329aaf4 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 24f5cd20..003a6965 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 31aaa07f..f597cc6e 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;