/* Request context. Every request will allocate this context and set
the correct callback function according the `type' field. */
-typedef struct {
+typedef struct SilcSFTPRequestStruct {
uint32 id;
SilcSFTPPacket type;
SilcSFTPStatusCallback status;
SilcSFTPAttrCallback attr;
SilcSFTPExtendedCallback extended;
void *context;
+ struct SilcSFTPRequestStruct *next;
} *SilcSFTPRequest;
/* SFTP client context */
SilcSFTPVersionCallback version;
void *version_context;
uint32 id;
- SilcDList requests;
+ SilcList requests;
+ SilcBuffer packet;
} *SilcSFTPClient;
/* File handle */
SilcSFTPPacket type,
uint32 len, ...)
{
- SilcBuffer packet;
+ SilcBuffer tmp;
va_list vp;
va_start(vp, len);
- packet = silc_sftp_packet_encode_vp(type, len, vp);
+ tmp = silc_sftp_packet_encode_vp(type, sftp->packet, len, vp);
va_end(vp);
-
- if (!packet)
+ if (!tmp)
return;
+ sftp->packet = tmp;
- SILC_LOG_HEXDUMP(("SFTP packet to server"), packet->data, packet->len);
+ SILC_LOG_HEXDUMP(("SFTP packet to server"), sftp->packet->data,
+ sftp->packet->len);
/* Send the packet */
- (*sftp->send_packet)(sftp->sock, packet, sftp->send_context);
+ (*sftp->send_packet)(sftp->sock, sftp->packet, sftp->send_context);
- silc_buffer_free(packet);
+ /* Clear packet */
+ sftp->packet->data = sftp->packet->tail = sftp->packet->head;
+ sftp->packet->len = 0;
}
/* Finds request by request ID. */
SILC_LOG_DEBUG(("Finding request ID: %d", id));
- silc_dlist_start(sftp->requests);
- while ((req = silc_dlist_get(sftp->requests)) != SILC_LIST_END) {
+ silc_list_start(sftp->requests);
+ while ((req = silc_list_get(sftp->requests)) != SILC_LIST_END) {
if (req->id == id)
return req;
}
}
/* Remove this request */
- silc_dlist_del(sftp->requests, req);
+ silc_list_del(sftp->requests, req);
silc_free(req);
va_end(vp);
sftp->send_context = send_context;
sftp->version = callback;
sftp->version_context = context;
- sftp->requests = silc_dlist_init();
+ silc_list_init(sftp->requests, struct SilcSFTPRequestStruct, next);
/* Send the SFTP session initialization to the server */
silc_sftp_send_packet(sftp, SILC_SFTP_INIT, 4,
{
SilcSFTPClient sftp = (SilcSFTPClient)context;
- silc_dlist_uninit(sftp->requests);
+ silc_list_uninit(sftp->requests);
+ if (sftp->packet)
+ silc_buffer_free(sftp->packet);
silc_free(sftp);
}
req->type = SILC_SFTP_OPEN;
req->handle = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
attrs_buf = silc_sftp_attr_encode(attrs);
len = 4 + 4 + strlen(filename) + 4 + attrs_buf->len;
req->type = SILC_SFTP_CLOSE;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
silc_sftp_handle_get(handle, &hdata, &hdata_len);
len = 4 + 4 + hdata_len;
req->type = SILC_SFTP_READ;
req->data = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
silc_sftp_handle_get(handle, &hdata, &hdata_len);
len2 = 4 + 4 + hdata_len + 8 + 4;
req->type = SILC_SFTP_WRITE;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
silc_sftp_handle_get(handle, &hdata, &hdata_len);
len = 4 + 4 + hdata_len + 8 + 4 + data_len;
req->type = SILC_SFTP_REMOVE;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(filename);
req->type = SILC_SFTP_RENAME;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(oldname) + 4 + strlen(newname);
req->type = SILC_SFTP_MKDIR;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
attrs_buf = silc_sftp_attr_encode(attrs);
len = 4 + 4 + strlen(path) + attrs_buf->len;
req->type = SILC_SFTP_RMDIR;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(path);
req->type = SILC_SFTP_OPENDIR;
req->handle = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(path);
req->type = SILC_SFTP_READDIR;
req->name = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
silc_sftp_handle_get(handle, &hdata, &hdata_len);
len = 4 + 4 + hdata_len;
req->type = SILC_SFTP_STAT;
req->attr = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(path);
req->type = SILC_SFTP_LSTAT;
req->attr = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(path);
req->type = SILC_SFTP_FSTAT;
req->attr = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
silc_sftp_handle_get(handle, &hdata, &hdata_len);
len = 4 + 4 + hdata_len;
req->type = SILC_SFTP_SETSTAT;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
attrs_buf = silc_sftp_attr_encode(attrs);
len = 4 + 4 + strlen(path) + attrs_buf->len;
req->type = SILC_SFTP_FSETSTAT;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
silc_sftp_handle_get(handle, &hdata, &hdata_len);
attrs_buf = silc_sftp_attr_encode(attrs);
req->type = SILC_SFTP_READLINK;
req->name = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(path);
req->type = SILC_SFTP_SYMLINK;
req->status = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(linkpath) + 4 + strlen(targetpath);
req->type = SILC_SFTP_REALPATH;
req->name = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(path);
req->type = SILC_SFTP_WRITE;
req->extended = callback;
req->context = context;
- silc_dlist_add(client->requests, req);
+ silc_list_add(client->requests, req);
len = 4 + 4 + strlen(request) + data_len;