summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2012-08-09 20:22:17 +0200
committerCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2012-08-09 21:06:05 +0200
commit01fd300d7a015031827ba947c6cf38416ed8dd1a (patch)
treead1bddf793821d7c448d5d589a12cefd1a24eaea
parentf3763b24a33bbfb557ec32e1ef4e5e326b03d397 (diff)
downloadgvfs-01fd300d7a015031827ba947c6cf38416ed8dd1a.tar.gz
afp: Don't create write requests bigger than the maximum request size.
-rw-r--r--daemon/gvfsafpconnection.c6
-rw-r--r--daemon/gvfsafpconnection.h4
-rw-r--r--daemon/gvfsafpserver.c30
-rw-r--r--daemon/gvfsafpserver.h2
-rw-r--r--daemon/gvfsafpvolume.c6
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);