X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcsftp%2Fsftp_server.c;h=f3bda1d64642d4dcdf1f100be04b07b6272efc4e;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=119dbf1f36d7c58d5886087fb3e20d96d339d6c6;hpb=2dc218143c7859f7529396dc121ae08e2fd78da0;p=silc.git diff --git a/lib/silcsftp/sftp_server.c b/lib/silcsftp/sftp_server.c index 119dbf1f..f3bda1d6 100644 --- a/lib/silcsftp/sftp_server.c +++ b/lib/silcsftp/sftp_server.c @@ -32,37 +32,41 @@ typedef struct { SilcSFTPMonitor monitor; void *monitor_context; SilcSFTPFilesystem fs; + SilcBuffer packet; } *SilcSFTPServer; /* General routine to send SFTP packet to the SFTP client. */ static void silc_sftp_send_packet(SilcSFTPServer 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 client"), packet->data, packet->len); + SILC_LOG_HEXDUMP(("SFTP packet to client"), 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; } /* Sends error to the client */ static void silc_sftp_send_error(SilcSFTPServer sftp, SilcSFTPStatus status, - uint32 id) + SilcUInt32 id) { SILC_LOG_DEBUG(("Send error %d", status)); @@ -83,7 +87,7 @@ static void silc_sftp_server_status(SilcSFTP sftp, void *context) { SilcSFTPServer server = (SilcSFTPServer)sftp; - uint32 id = (uint32)context; + SilcUInt32 id = (SilcUInt32)context; int mlen, llen; SILC_LOG_DEBUG(("Status callback")); @@ -114,9 +118,9 @@ static void silc_sftp_server_handle(SilcSFTP sftp, void *context) { SilcSFTPServer server = (SilcSFTPServer)sftp; - uint32 id = (uint32)context; + SilcUInt32 id = (SilcUInt32)context; unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Handle callback")); SILC_LOG_DEBUG(("Request ID: %d", id)); @@ -145,11 +149,11 @@ static void silc_sftp_server_handle(SilcSFTP sftp, static void silc_sftp_server_data(SilcSFTP sftp, SilcSFTPStatus status, const unsigned char *data, - uint32 data_len, + SilcUInt32 data_len, void *context) { SilcSFTPServer server = (SilcSFTPServer)sftp; - uint32 id = (uint32)context; + SilcUInt32 id = (SilcUInt32)context; SILC_LOG_DEBUG(("Data callback")); SILC_LOG_DEBUG(("Request ID: %d", id)); @@ -174,7 +178,7 @@ static void silc_sftp_server_name(SilcSFTP sftp, void *context) { SilcSFTPServer server = (SilcSFTPServer)sftp; - uint32 id = (uint32)context; + SilcUInt32 id = (SilcUInt32)context; SilcBuffer namebuf; SILC_LOG_DEBUG(("Name callback")); @@ -205,7 +209,7 @@ static void silc_sftp_server_attr(SilcSFTP sftp, void *context) { SilcSFTPServer server = (SilcSFTPServer)sftp; - uint32 id = (uint32)context; + SilcUInt32 id = (SilcUInt32)context; SilcBuffer attr_buf; SILC_LOG_DEBUG(("Attr callback")); @@ -231,11 +235,11 @@ static void silc_sftp_server_attr(SilcSFTP sftp, static void silc_sftp_server_extended(SilcSFTP sftp, SilcSFTPStatus status, const unsigned char *data, - uint32 data_len, + SilcUInt32 data_len, void *context) { SilcSFTPServer server = (SilcSFTPServer)sftp; - uint32 id = (uint32)context; + SilcUInt32 id = (SilcUInt32)context; SILC_LOG_DEBUG(("Extended callback")); SILC_LOG_DEBUG(("Request ID: %d", id)); @@ -285,6 +289,8 @@ void silc_sftp_server_shutdown(SilcSFTP sftp) SILC_LOG_DEBUG(("Stopping SFTP server %p", server)); + if (server->packet) + silc_buffer_free(server->packet); silc_free(server); } @@ -313,10 +319,10 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, SilcSFTPPacket type; char *filename = NULL, *path = NULL; const unsigned char *payload = NULL; - uint32 payload_len; + SilcUInt32 payload_len; int ret; SilcBufferStruct buf; - uint32 id; + SilcUInt32 id; SilcSFTPAttributes attrs; SilcSFTPHandle handle; SilcSFTPMonitorDataStruct mdata; @@ -363,7 +369,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, { SilcSFTPFileOperation pflags; unsigned char *attr_buf; - uint32 attr_len = 0; + SilcUInt32 attr_len = 0; SilcBufferStruct tmpbuf; SILC_LOG_DEBUG(("Open request")); @@ -405,7 +411,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_CLOSE: { unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Close request")); @@ -441,9 +447,9 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_READ: { unsigned char *hdata; - uint32 hdata_len; - uint64 offset; - uint32 len; + SilcUInt32 hdata_len; + SilcUInt64 offset; + SilcUInt32 len; SILC_LOG_DEBUG(("Read request")); @@ -484,10 +490,10 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_WRITE: { unsigned char *hdata; - uint32 hdata_len; - uint64 offset; + SilcUInt32 hdata_len; + SilcUInt64 offset; unsigned char *data; - uint32 data_len; + SilcUInt32 data_len; SILC_LOG_DEBUG(("Read request")); @@ -587,7 +593,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_MKDIR: { unsigned char *attr_buf; - uint32 attr_len = 0; + SilcUInt32 attr_len = 0; SilcBufferStruct tmpbuf; SILC_LOG_DEBUG(("Mkdir request")); @@ -679,7 +685,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_READDIR: { unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Readdir request")); @@ -767,7 +773,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_FSTAT: { unsigned char *hdata; - uint32 hdata_len; + SilcUInt32 hdata_len; SILC_LOG_DEBUG(("Fstat request")); @@ -803,7 +809,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_SETSTAT: { unsigned char *attr_buf; - uint32 attr_len = 0; + SilcUInt32 attr_len = 0; SilcBufferStruct tmpbuf; SILC_LOG_DEBUG(("Setstat request")); @@ -843,7 +849,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, case SILC_SFTP_FSETSTAT: { unsigned char *hdata, *attr_buf; - uint32 hdata_len, attr_len = 0; + SilcUInt32 hdata_len, attr_len = 0; SilcBufferStruct tmpbuf; SILC_LOG_DEBUG(("Fsetstat request")); @@ -976,7 +982,7 @@ void silc_sftp_server_receive_process(SilcSFTP sftp, { char *request = NULL; unsigned char *data; - uint32 data_len; + SilcUInt32 data_len; SILC_LOG_DEBUG(("Extended request"));