/* SFTP client context */
typedef struct {
SilcStream stream;
+ SilcSchedule schedule;
SilcSFTPVersionCallback version;
SilcSFTPErrorCallback error;
void *context;
silc_buffer_len(sftp->packet));
if (ret == -2) {
SILC_LOG_ERROR(("Error sending SFTP packet type %d", type));
- break;
+ sftp->error((SilcSFTP)sftp, SILC_SFTP_STATUS_NO_CONNECTION,
+ sftp->context);
+ silc_buffer_reset(sftp->packet);
+ return;
+ }
+ if (ret == 0) {
+ sftp->error((SilcSFTP)sftp, SILC_SFTP_STATUS_EOF, sftp->context);
+ silc_buffer_reset(sftp->packet);
+ return;
}
- if (ret <= 0)
- break;
+ if (ret == -1)
+ return;
+
silc_buffer_pull(sftp->packet, ret);
}
break;
default:
+ SILC_LOG_DEBUG(("Unknown request type %d", req->type));
break;
}
void *context)
{
SilcSFTPClient sftp = context;
- unsigned char inbuf[30720];
+ unsigned char inbuf[65536];
SilcBufferStruct packet;
int ret;
return;
}
+ SILC_LOG_DEBUG(("Read %d bytes", ret));
+
/* Now process the SFTP packet */
silc_buffer_set(&packet, inbuf, ret);
silc_sftp_client_receive_process(context, &packet);
SILC_LOG_DEBUG(("Starting SFTP client"));
+ if (!schedule)
+ schedule = silc_schedule_get_global();
+
if (!stream)
return NULL;
sftp->version = version_cb;
sftp->error = error_cb;
sftp->context = context;
+ sftp->schedule = schedule;
silc_list_init(sftp->requests, struct SilcSFTPRequestStruct, next);
/* We handle the stream now */
{
SilcSFTPClient sftp = (SilcSFTPClient)context;
- silc_stream_set_notifier(sftp->stream, NULL, NULL, NULL);
+ silc_stream_set_notifier(sftp->stream, sftp->schedule, NULL, NULL);
if (sftp->packet)
silc_buffer_free(sftp->packet);
silc_free(sftp);
SilcSFTPClient sftp = (SilcSFTPClient)context;
SilcSFTPRequest req;
SilcSFTPPacket type;
- const unsigned char *payload = NULL;
+ unsigned char *payload = NULL;
SilcUInt32 payload_len;
int ret;
SilcBufferStruct buf;
SILC_LOG_DEBUG(("Process SFTP packet"));
/* Parse the packet */
- type = silc_sftp_packet_decode(buffer, (unsigned char **)&payload,
- &payload_len);
- if (!type)
+ type = silc_sftp_packet_decode(buffer, &payload, &payload_len);
+ if (type <= 0)
return;
- silc_buffer_set(&buf, (unsigned char *)payload, payload_len);
+ silc_buffer_set(&buf, payload, payload_len);
switch (type) {
case SILC_SFTP_DATA:
ret =
silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI_XNSTRING(&data,
- silc_buffer_len(&buf) - 4),
+ SILC_STR_DATA(&data, silc_buffer_len(&buf) - 4),
SILC_STR_END);
if (ret < 0)
break;
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI_XNSTRING(&data, silc_buffer_len(&buf) - 4),
+ SILC_STR_DATA(&data,
+ silc_buffer_len(&buf) - 4),
SILC_STR_END);
if (ret < 0)
break;