+ case SILC_SFTP_READ:
+ {
+ unsigned char *hdata;
+ SilcUInt32 hdata_len;
+ SilcUInt64 offset;
+ SilcUInt32 len;
+
+ SILC_LOG_DEBUG(("Read request"));
+
+ ret = silc_buffer_unformat(&buf,
+ SILC_STR_UI_INT(&id),
+ SILC_STR_UI32_NSTRING(&hdata,
+ &hdata_len),
+ SILC_STR_UI_INT64(&offset),
+ SILC_STR_UI_INT(&len),
+ SILC_STR_END);
+ if (ret < 0)
+ goto failure;
+
+ /* Get the handle */
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
+ if (!handle) {
+ silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
+ break;
+ }
+
+ /* Read operation */
+ server->fs->fs->sftp_read(server->fs->fs_context, sftp,
+ handle, offset, len,
+ silc_sftp_server_data, SILC_32_TO_PTR(id));
+
+ /* Call monitor */
+ if (server->monitors & SILC_SFTP_MONITOR_READ && server->monitor) {
+ mdata.offset = offset;
+ mdata.data_len = len;
+ (*server->monitor)(sftp, SILC_SFTP_MONITOR_READ, &mdata,
+ server->monitor_context);
+ }
+ }
+ break;
+
+ case SILC_SFTP_WRITE:
+ {
+ unsigned char *hdata;
+ SilcUInt32 hdata_len;
+ SilcUInt64 offset;
+ unsigned char *data;
+ SilcUInt32 data_len;
+
+ SILC_LOG_DEBUG(("Read request"));
+
+ ret = silc_buffer_unformat(&buf,
+ SILC_STR_UI_INT(&id),
+ SILC_STR_UI32_NSTRING(&hdata,
+ &hdata_len),
+ SILC_STR_UI_INT64(&offset),
+ SILC_STR_UI32_NSTRING(&data,
+ &data_len),
+ SILC_STR_END);
+ if (ret < 0)
+ goto failure;
+
+ /* Get the handle */
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
+ if (!handle) {
+ silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
+ break;
+ }
+
+ /* Write operation */
+ server->fs->fs->sftp_write(server->fs->fs_context, sftp, handle, offset,
+ (const unsigned char *)data, data_len,
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
+
+ /* Call monitor */
+ if (server->monitors & SILC_SFTP_MONITOR_WRITE && server->monitor) {
+ mdata.offset = offset;
+ mdata.data_len = data_len;
+ (*server->monitor)(sftp, SILC_SFTP_MONITOR_WRITE, &mdata,
+ server->monitor_context);
+ }
+ }
+ break;
+