diff options
author | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2012-08-09 20:22:17 +0200 |
---|---|---|
committer | Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com> | 2012-08-09 21:06:05 +0200 |
commit | 01fd300d7a015031827ba947c6cf38416ed8dd1a (patch) | |
tree | ad1bddf793821d7c448d5d589a12cefd1a24eaea | |
parent | f3763b24a33bbfb557ec32e1ef4e5e326b03d397 (diff) | |
download | gvfs-01fd300d7a015031827ba947c6cf38416ed8dd1a.tar.gz |
afp: Don't create write requests bigger than the maximum request size.
-rw-r--r-- | daemon/gvfsafpconnection.c | 6 | ||||
-rw-r--r-- | daemon/gvfsafpconnection.h | 4 | ||||
-rw-r--r-- | daemon/gvfsafpserver.c | 30 | ||||
-rw-r--r-- | daemon/gvfsafpserver.h | 2 | ||||
-rw-r--r-- | daemon/gvfsafpvolume.c | 6 |
5 files changed, 39 insertions, 9 deletions
diff --git a/daemon/gvfsafpconnection.c b/daemon/gvfsafpconnection.c index 34b7b31b..e35dae32 100644 --- a/daemon/gvfsafpconnection.c +++ b/daemon/gvfsafpconnection.c @@ -1920,3 +1920,9 @@ g_vfs_afp_query_server_info (GSocketConnectable *addr, return g_vfs_afp_reply_new (dsi_header.errorCode, data, dsi_header.totalDataLength, TRUE); } + +guint32 +g_vfs_afp_connection_get_max_request_size (GVfsAfpConnection *afp_connection) +{ + g_return_val_if_fail (G_VFS_IS_AFP_CONNECTION (afp_connection), 0); +} diff --git a/daemon/gvfsafpconnection.h b/daemon/gvfsafpconnection.h index a524447d..367f983c 100644 --- a/daemon/gvfsafpconnection.h +++ b/daemon/gvfsafpconnection.h @@ -366,6 +366,10 @@ void g_vfs_afp_connection_send_command (GVfsAfpConnection *a GAsyncReadyCallback callback, GCancellable *cancellable, gpointer user_data); + + +guint32 g_vfs_afp_connection_get_max_request_size (GVfsAfpConnection *afp_connection); + G_END_DECLS #endif /* _GVFSAFPCONNECTION_H_ */ diff --git a/daemon/gvfsafpserver.c b/daemon/gvfsafpserver.c index ec50c300..a2242493 100644 --- a/daemon/gvfsafpserver.c +++ b/daemon/gvfsafpserver.c @@ -1183,7 +1183,7 @@ done: return res; } -/* +/** * g_vfs_afp_server_get_info: * * @server: a #GVfsAfpServer @@ -1205,7 +1205,23 @@ g_vfs_afp_server_get_info (GVfsAfpServer *server) return &priv->info; } -/* +/** + * g_vfs_afp_server_get_max_request_size: + * @server: a #GVfsAfpServer + * + * Get the maximum request size the server supports. + * + * Returns: The maximum request size the server supports. + */ +guint32 +g_vfs_afp_server_get_max_request_size (GVfsAfpServer *server) +{ + g_return_val_if_fail (G_VFS_IS_AFP_SERVER (server), 0); + + return g_vfs_afp_connection_get_max_request_size (server->priv->conn); +} + +/** * g_vfs_afp_server_time_to_local_time: * * @server: a #GVfsAfpServer @@ -1301,7 +1317,7 @@ invalid_reply: goto done; } -/* +/** * g_vfs_afp_server_get_volumes: * * @server: a #GVfsAfpServer @@ -1332,7 +1348,7 @@ g_vfs_afp_server_get_volumes (GVfsAfpServer *server, cancellable, simple); } -/* +/** * g_vfs_afp_server_get_volumes_finish: * * @server: a #GVfsAfpServer. @@ -1503,7 +1519,7 @@ g_vfs_afp_server_fill_info (GVfsAfpServer *server, { guint16 offspring_count; - g_vfs_afp_reply_read_uint16 (reply, &offspring_count); + REPLY_READ_UINT16 (reply, &offspring_count); g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_AFP_CHILDREN_COUNT, offspring_count); } @@ -1692,7 +1708,7 @@ invalid_reply: goto done; } -/* +/** * g_vfs_afp_server_map_id: * * @server: a #GVfsAfpServer. @@ -1746,7 +1762,7 @@ g_vfs_afp_server_map_id (GVfsAfpServer *server, g_object_unref (comm); } -/* +/** * g_vfs_afp_server_map_id_finish: * * @server: a #GVfsAfpServer. diff --git a/daemon/gvfsafpserver.h b/daemon/gvfsafpserver.h index 2a57f99e..9cb1426a 100644 --- a/daemon/gvfsafpserver.h +++ b/daemon/gvfsafpserver.h @@ -94,6 +94,8 @@ gint64 g_vfs_afp_server_time_to_local_time (GVfsAfpServer *server, const GVfsAfpServerInfo* g_vfs_afp_server_get_info (GVfsAfpServer *server); +guint32 g_vfs_afp_server_get_max_request_size (GVfsAfpServer *server); + typedef struct _GVfsAfpVolumeData GVfsAfpVolumeData; struct _GVfsAfpVolumeData { diff --git a/daemon/gvfsafpvolume.c b/daemon/gvfsafpvolume.c index fe9eacb7..1a2eac0a 100644 --- a/daemon/gvfsafpvolume.c +++ b/daemon/gvfsafpvolume.c @@ -2691,7 +2691,7 @@ g_vfs_afp_volume_write_to_fork (GVfsAfpVolume *volume, gpointer user_data) { GVfsAfpCommand *comm; - guint32 req_count; + guint32 max_req_count, req_count; GSimpleAsyncResult *simple; g_return_if_fail (G_VFS_IS_AFP_VOLUME (volume)); @@ -2704,11 +2704,13 @@ g_vfs_afp_volume_write_to_fork (GVfsAfpVolume *volume, g_vfs_afp_command_put_int16 (comm, fork_refnum); /* Offset */ g_vfs_afp_command_put_int64 (comm, offset); + /* ReqCount */ + max_req_count = g_vfs_afp_server_get_max_request_size (volume->priv->server) - 20; req_count = MIN (buffer_size, G_MAXUINT32); g_vfs_afp_command_put_int64 (comm, req_count); - g_vfs_afp_command_set_buffer (comm, buffer, buffer_size); + g_vfs_afp_command_set_buffer (comm, buffer, req_count); simple = g_simple_async_result_new (G_OBJECT (volume), callback, user_data, g_vfs_afp_volume_write_to_fork); |