diff options
author | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2012-03-12 17:27:13 +0100 |
---|---|---|
committer | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2012-08-09 21:06:05 +0200 |
commit | ef8d81602b01cecf0c9cab8b54c0f9e65486dc57 (patch) | |
tree | faa74c39882e57459a923320b546b8dc01ed6d68 | |
parent | c1b3b8a3e3d979a4857587b57026d91f56ff1627 (diff) | |
download | gvfs-ef8d81602b01cecf0c9cab8b54c0f9e65486dc57.tar.gz |
afp: logout from server on unmount
-rw-r--r-- | daemon/gvfsafpconnection.h | 1 | ||||
-rw-r--r-- | daemon/gvfsafpserver.c | 38 | ||||
-rw-r--r-- | daemon/gvfsafpserver.h | 4 | ||||
-rw-r--r-- | daemon/gvfsafpvolume.c | 1 | ||||
-rw-r--r-- | daemon/gvfsbackendafp.c | 19 | ||||
-rw-r--r-- | daemon/gvfsbackendafpbrowse.c | 19 |
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; |