X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcsftp%2Fsftp_client.c;h=a4b671e46fa36b43b55fa782f9b21d2d06b979b1;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=6835e626f3e7758d025538a5d2872bea0b33eb5b;hpb=e5d8d3db6caa344b3d419b884556c21b15e7d123;p=silc.git diff --git a/lib/silcsftp/sftp_client.c b/lib/silcsftp/sftp_client.c index 6835e626..a4b671e4 100644 --- a/lib/silcsftp/sftp_client.c +++ b/lib/silcsftp/sftp_client.c @@ -16,6 +16,7 @@ GNU General Public License for more details. */ +/* $Id$ */ #include "silcincludes.h" #include "silcsftp.h" @@ -23,8 +24,8 @@ /* Request context. Every request will allocate this context and set the correct callback function according the `type' field. */ -typedef struct { - uint32 id; +typedef struct SilcSFTPRequestStruct { + SilcUInt32 id; SilcSFTPPacket type; SilcSFTPStatusCallback status; SilcSFTPHandleCallback handle; @@ -33,6 +34,7 @@ typedef struct { SilcSFTPAttrCallback attr; SilcSFTPExtendedCallback extended; void *context; + struct SilcSFTPRequestStruct *next; } *SilcSFTPRequest; /* SFTP client context */ @@ -42,21 +44,22 @@ typedef struct { void *send_context; SilcSFTPVersionCallback version; void *version_context; - uint32 id; - SilcDList requests; + SilcUInt32 id; + SilcList requests; + SilcBuffer packet; } *SilcSFTPClient; /* File handle */ struct SilcSFTPHandleStruct { unsigned char *data; - uint32 data_len; + SilcUInt32 data_len; }; /* Creates SilcSFTPHandle and returns pointer to it. The caller must free the context. */ static SilcSFTPHandle silc_sftp_handle_create(unsigned char *data, - uint32 data_len) + SilcUInt32 data_len) { SilcSFTPHandle handle; @@ -80,7 +83,7 @@ static void silc_sftp_handle_delete(SilcSFTPHandle handle) static void silc_sftp_handle_get(SilcSFTPHandle handle, const unsigned char **data, - uint32 *data_len) + SilcUInt32 *data_len) { *data = (const unsigned char *)handle->data; *data_len = handle->data_len; @@ -90,36 +93,39 @@ static void silc_sftp_handle_get(SilcSFTPHandle handle, static void silc_sftp_send_packet(SilcSFTPClient sftp, SilcSFTPPacket type, - uint32 len, ...) + SilcUInt32 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. */ -static SilcSFTPRequest silc_sftp_find_request(SilcSFTPClient sftp, uint32 id) +static SilcSFTPRequest silc_sftp_find_request(SilcSFTPClient sftp, SilcUInt32 id) { SilcSFTPRequest req; 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; } @@ -150,7 +156,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, { /* Data returned */ unsigned char *data; - uint32 data_len; + SilcUInt32 data_len; if (status != SILC_SFTP_STATUS_OK) { if (req->data) @@ -159,7 +165,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, } data = (unsigned char *)va_arg(vp, unsigned char *); - data_len = (uint32)va_arg(vp, uint32); + data_len = (SilcUInt32)va_arg(vp, SilcUInt32); if (req->data) (*req->data)((SilcSFTP)sftp, status, (const unsigned char *)data, @@ -173,7 +179,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, /* Handle returned */ SilcSFTPHandle handle; unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; if (status != SILC_SFTP_STATUS_OK) { if (req->handle) @@ -182,7 +188,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, } hdata = (unsigned char *)va_arg(vp, unsigned char *); - hdata_len = (uint32)va_arg(vp, uint32); + hdata_len = (SilcUInt32)va_arg(vp, SilcUInt32); handle = silc_sftp_handle_create(hdata, hdata_len); if (req->handle) @@ -257,7 +263,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, { /* Extended reply returned */ unsigned char *data; - uint32 data_len; + SilcUInt32 data_len; if (status != SILC_SFTP_STATUS_OK) { if (req->extended) @@ -266,7 +272,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, } data = (unsigned char *)va_arg(vp, unsigned char *); - data_len = (uint32)va_arg(vp, uint32); + data_len = (SilcUInt32)va_arg(vp, SilcUInt32); if (req->extended) (*req->extended)((SilcSFTP)sftp, status, (const unsigned char *)data, @@ -279,7 +285,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, } /* Remove this request */ - silc_dlist_del(sftp->requests, req); + silc_list_del(sftp->requests, req); silc_free(req); va_end(vp); @@ -309,7 +315,7 @@ SilcSFTP silc_sftp_client_start(SilcSocketConnection sock, 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, @@ -327,7 +333,8 @@ void silc_sftp_client_shutdown(SilcSFTP context) { SilcSFTPClient sftp = (SilcSFTPClient)context; - silc_dlist_uninit(sftp->requests); + if (sftp->packet) + silc_buffer_free(sftp->packet); silc_free(sftp); } @@ -343,10 +350,10 @@ void silc_sftp_client_receive_process(SilcSFTP context, SilcSFTPRequest req; SilcSFTPPacket type; const unsigned char *payload = NULL; - uint32 payload_len; + SilcUInt32 payload_len; int ret; SilcBufferStruct buf; - uint32 id; + SilcUInt32 id; SILC_LOG_DEBUG(("Start")); @@ -382,7 +389,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, case SILC_SFTP_STATUS: { - uint32 status; + SilcUInt32 status; char *message = NULL, *language_tag = NULL; SILC_LOG_DEBUG(("Status packet")); @@ -425,7 +432,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, case SILC_SFTP_HANDLE: { unsigned char *handle = NULL; - uint32 handle_len; + SilcUInt32 handle_len; SILC_LOG_DEBUG(("Handle packet")); @@ -451,7 +458,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, case SILC_SFTP_DATA: { unsigned char *data = NULL; - uint32 data_len = 0; + SilcUInt32 data_len = 0; SILC_LOG_DEBUG(("Data packet")); @@ -475,7 +482,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, case SILC_SFTP_NAME: { - uint32 count; + SilcUInt32 count; SilcSFTPName name = NULL; SILC_LOG_DEBUG(("Name packet")); @@ -573,7 +580,7 @@ void silc_sftp_open(SilcSFTP sftp, SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; SilcBuffer attrs_buf; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Open request")); @@ -582,7 +589,7 @@ void silc_sftp_open(SilcSFTP 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; @@ -606,9 +613,9 @@ void silc_sftp_close(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; const unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Close request")); @@ -617,7 +624,7 @@ void silc_sftp_close(SilcSFTP sftp, 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; @@ -631,16 +638,16 @@ void silc_sftp_close(SilcSFTP sftp, void silc_sftp_read(SilcSFTP sftp, SilcSFTPHandle handle, - uint64 offset, - uint32 len, + SilcUInt64 offset, + SilcUInt32 len, SilcSFTPDataCallback callback, void *context) { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len2 = 0; + SilcUInt32 len2 = 0; const unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Read request")); @@ -649,7 +656,7 @@ void silc_sftp_read(SilcSFTP sftp, 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; @@ -665,17 +672,17 @@ void silc_sftp_read(SilcSFTP sftp, void silc_sftp_write(SilcSFTP sftp, SilcSFTPHandle handle, - uint64 offset, + SilcUInt64 offset, const unsigned char *data, - uint32 data_len, + SilcUInt32 data_len, SilcSFTPStatusCallback callback, void *context) { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; const unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Write request")); @@ -684,7 +691,7 @@ void silc_sftp_write(SilcSFTP sftp, 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; @@ -706,7 +713,7 @@ void silc_sftp_remove(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Remove request")); @@ -715,7 +722,7 @@ void silc_sftp_remove(SilcSFTP sftp, 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); @@ -734,7 +741,7 @@ void silc_sftp_rename(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Rename request")); @@ -743,7 +750,7 @@ void silc_sftp_rename(SilcSFTP sftp, 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); @@ -764,7 +771,7 @@ void silc_sftp_mkdir(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SilcBuffer attrs_buf; SILC_LOG_DEBUG(("Mkdir request")); @@ -774,7 +781,7 @@ void silc_sftp_mkdir(SilcSFTP sftp, 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; @@ -797,7 +804,7 @@ void silc_sftp_rmdir(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Rmdir request")); @@ -806,7 +813,7 @@ void silc_sftp_rmdir(SilcSFTP sftp, 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); @@ -824,7 +831,7 @@ void silc_sftp_opendir(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Opendir request")); @@ -833,7 +840,7 @@ void silc_sftp_opendir(SilcSFTP sftp, 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); @@ -851,9 +858,9 @@ void silc_sftp_readdir(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; const unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Readdir request")); @@ -862,7 +869,7 @@ void silc_sftp_readdir(SilcSFTP sftp, 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; @@ -881,7 +888,7 @@ void silc_sftp_stat(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Stat request")); @@ -890,7 +897,7 @@ void silc_sftp_stat(SilcSFTP sftp, 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); @@ -908,7 +915,7 @@ void silc_sftp_lstat(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Lstat request")); @@ -917,7 +924,7 @@ void silc_sftp_lstat(SilcSFTP sftp, 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); @@ -935,9 +942,9 @@ void silc_sftp_fstat(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; const unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Fstat request")); @@ -946,7 +953,7 @@ void silc_sftp_fstat(SilcSFTP sftp, 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; @@ -966,7 +973,7 @@ void silc_sftp_setstat(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SilcBuffer attrs_buf; SILC_LOG_DEBUG(("Setstat request")); @@ -976,7 +983,7 @@ void silc_sftp_setstat(SilcSFTP sftp, 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; @@ -1000,10 +1007,10 @@ void silc_sftp_fsetstat(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SilcBuffer attrs_buf; const unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Fsetstat request")); @@ -1012,7 +1019,7 @@ void silc_sftp_fsetstat(SilcSFTP sftp, 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); @@ -1036,7 +1043,7 @@ void silc_sftp_readlink(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Readlink request")); @@ -1045,7 +1052,7 @@ void silc_sftp_readlink(SilcSFTP sftp, 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); @@ -1064,7 +1071,7 @@ void silc_sftp_symlink(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Symlink request")); @@ -1073,7 +1080,7 @@ void silc_sftp_symlink(SilcSFTP sftp, 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); @@ -1093,7 +1100,7 @@ void silc_sftp_realpath(SilcSFTP sftp, { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Realpath request")); @@ -1102,7 +1109,7 @@ void silc_sftp_realpath(SilcSFTP sftp, 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); @@ -1116,13 +1123,13 @@ void silc_sftp_realpath(SilcSFTP sftp, void silc_sftp_extended(SilcSFTP sftp, const char *request, const unsigned char *data, - uint32 data_len, + SilcUInt32 data_len, SilcSFTPExtendedCallback callback, void *context) { SilcSFTPClient client = (SilcSFTPClient)sftp; SilcSFTPRequest req; - uint32 len = 0; + SilcUInt32 len = 0; SILC_LOG_DEBUG(("Extended request")); @@ -1131,7 +1138,7 @@ void silc_sftp_extended(SilcSFTP sftp, 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;