Merged silc_1_1_branch to trunk.
[silc.git] / lib / silcsftp / sftp_client.c
index 7227d33c596e3f043efb0e4489b2140292146f72..59f7dfb61a29ce9ad9d9d8df216d3a45c31967df 100644 (file)
@@ -40,6 +40,7 @@ typedef struct SilcSFTPRequestStruct {
 /* SFTP client context */
 typedef struct {
   SilcStream stream;
+  SilcSchedule schedule;
   SilcSFTPVersionCallback version;
   SilcSFTPErrorCallback error;
   void *context;
@@ -121,10 +122,19 @@ static void silc_sftp_send_packet(SilcSFTPClient sftp,
                            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);
   }
 
@@ -303,6 +313,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp,
     break;
 
   default:
+    SILC_LOG_DEBUG(("Unknown request type %d", req->type));
     break;
   }
 
@@ -319,7 +330,7 @@ static void silc_sftp_client_io(SilcStream stream, SilcStreamStatus status,
                                void *context)
 {
   SilcSFTPClient sftp = context;
-  unsigned char inbuf[30720];
+  unsigned char inbuf[65536];
   SilcBufferStruct packet;
   int ret;
 
@@ -337,6 +348,8 @@ static void silc_sftp_client_io(SilcStream stream, SilcStreamStatus status,
       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);
@@ -400,6 +413,7 @@ SilcSFTP silc_sftp_client_start(SilcStream stream,
   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 */
@@ -421,7 +435,7 @@ void silc_sftp_client_shutdown(SilcSFTP context)
 {
   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);
@@ -434,7 +448,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SilcBuffer buffer)
   SilcSFTPClient sftp = (SilcSFTPClient)context;
   SilcSFTPRequest req;
   SilcSFTPPacket type;
-  const unsigned char *payload = NULL;
+  unsigned char *payload = NULL;
   SilcUInt32 payload_len;
   int ret;
   SilcBufferStruct buf;
@@ -443,12 +457,11 @@ void silc_sftp_client_receive_process(SilcSFTP context, SilcBuffer buffer)
   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:
@@ -607,8 +620,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SilcBuffer buffer)
       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;
@@ -636,7 +648,8 @@ void silc_sftp_client_receive_process(SilcSFTP context, SilcBuffer buffer)
 
       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;