Integer type name change.
[silc.git] / lib / silcsftp / sftp_util.c
index 349f8a0fdbe5446702478cacf17725d1a67303a7..574f884173f15710f321f24b1e363f6e18ac57bf 100644 (file)
@@ -16,6 +16,7 @@
   GNU General Public License for more details.
 
 */
+/* $Id$ */
 
 #include "silcincludes.h"
 #include "silcsftp.h"
 /* Encodes a SFTP packet of type `packet' of length `len'. The variable
    argument list is encoded as data payload to the buffer. Returns the
    encoded packet or NULL on error. The caller must free the returned
-   buffer. */
+   buffer. If `packet_buf' is non-NULL then the new packet data is put
+   to that buffer instead of allocating new one.  If the new data cannot
+   fit to `packet_buf' will be reallocated. */
 
-SilcBuffer silc_sftp_packet_encode(SilcSFTPPacket packet, uint32 len, ...)
+SilcBuffer silc_sftp_packet_encode(SilcSFTPPacket packet, 
+                                  SilcBuffer packet_buf, SilcUInt32 len, ...)
 {
   SilcBuffer buffer;
   va_list vp;
 
   va_start(vp, len);
-  buffer = silc_sftp_packet_encode_vp(packet, len, vp);
+  buffer = silc_sftp_packet_encode_vp(packet, packet_buf, len, vp);
   va_end(vp);
 
   return buffer;
@@ -41,13 +45,25 @@ SilcBuffer silc_sftp_packet_encode(SilcSFTPPacket packet, uint32 len, ...)
 /* Same as silc_sftp_packet_encode but takes the variable argument list
    pointer as argument. */
 
-SilcBuffer silc_sftp_packet_encode_vp(SilcSFTPPacket packet, uint32 len, 
+SilcBuffer silc_sftp_packet_encode_vp(SilcSFTPPacket packet, 
+                                     SilcBuffer packet_buf, SilcUInt32 len, 
                                      va_list vp)
 {
   SilcBuffer buffer;
+  bool dyn;
   int ret;
 
-  buffer = silc_buffer_alloc(4 + 1 + len);
+  if (packet_buf) {
+    if (packet_buf->truelen < 4 + 1 + len)
+      packet_buf = silc_buffer_realloc(packet_buf, 4 + 1 + len);
+
+    buffer = packet_buf;
+    dyn = FALSE;
+  } else {
+    buffer = silc_buffer_alloc(4 + 1 + len);
+    dyn = TRUE;
+  }
+
   silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer));
   silc_buffer_format(buffer, 
                     SILC_STR_UI_INT(len),
@@ -57,7 +73,8 @@ SilcBuffer silc_sftp_packet_encode_vp(SilcSFTPPacket packet, uint32 len,
 
   ret = silc_buffer_format_vp(buffer, vp);
   if (ret < 0) {
-    silc_buffer_free(buffer);
+    if (dyn)
+      silc_buffer_free(buffer);
     return NULL;
   }
 
@@ -72,10 +89,10 @@ SilcBuffer silc_sftp_packet_encode_vp(SilcSFTPPacket packet, uint32 len,
 
 SilcSFTPPacket silc_sftp_packet_decode(SilcBuffer packet,
                                       unsigned char **payload,
-                                      uint32 *payload_len)
+                                      SilcUInt32 *payload_len)
 {
-  uint32 len;
-  uint8 type;
+  SilcUInt32 len;
+  SilcUInt8 type;
   int ret;
 
   ret = silc_buffer_unformat(packet,
@@ -263,7 +280,7 @@ SilcSFTPAttributes silc_sftp_attr_decode(SilcBuffer buffer)
                                      sizeof(*attr->extended_data));
     for (i = 0; i < attr->extended_count; i++) {
       unsigned char *tmp, *tmp2;
-      uint32 tmp_len, tmp2_len;
+      SilcUInt32 tmp_len, tmp2_len;
 
       if (silc_buffer_unformat(buffer, 
                               SILC_STR_UI32_NSTRING(&tmp, &tmp_len),
@@ -370,7 +387,7 @@ SilcBuffer silc_sftp_name_encode(SilcSFTPName name)
    `count' many name, longname and attribute values. Returns the allocated
    structure or NULL on error. */
 
-SilcSFTPName silc_sftp_name_decode(uint32 count, SilcBuffer buffer)
+SilcSFTPName silc_sftp_name_decode(SilcUInt32 count, SilcBuffer buffer)
 {
   SilcSFTPName name;
   int i;
@@ -434,7 +451,6 @@ SilcSFTPStatus silc_sftp_map_errno(int err)
   case ENOENT:
   case ENOTDIR:
   case EBADF:
-  case ELOOP:
     ret = SILC_SFTP_STATUS_NO_SUCH_FILE;
     break;
   case EPERM: