/*
- sftp_server.c
+ sftp_server.c
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 Pekka Riikonen
+ Copyright (C) 2001 - 2004 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* General routine to send SFTP packet to the SFTP client. */
static void silc_sftp_send_packet(SilcSFTPServer sftp,
- SilcSFTPPacket type,
+ SilcSFTPPacket type,
SilcUInt32 len, ...)
{
SilcBuffer tmp;
return;
sftp->packet = tmp;
- SILC_LOG_HEXDUMP(("SFTP packet to client"), sftp->packet->data,
+ SILC_LOG_HEXDUMP(("SFTP packet to client"), sftp->packet->data,
sftp->packet->len);
/* Send the packet */
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
- SilcUInt32 id = (SilcUInt32)context;
+ SilcUInt32 id = SILC_PTR_TO_32(context);
int mlen, llen;
SILC_LOG_DEBUG(("Status callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
-
+
if (!message)
message = "";
if (!language_tag)
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
- SilcUInt32 id = (SilcUInt32)context;
+ SilcUInt32 id = SILC_PTR_TO_32(context);
unsigned char *hdata;
SilcUInt32 hdata_len;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
- SilcUInt32 id = (SilcUInt32)context;
+ SilcUInt32 id = SILC_PTR_TO_32(context);
SILC_LOG_DEBUG(("Data callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
- SilcUInt32 id = (SilcUInt32)context;
+ SilcUInt32 id = SILC_PTR_TO_32(context);
SilcBuffer namebuf;
SILC_LOG_DEBUG(("Name callback"));
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
- SilcUInt32 id = (SilcUInt32)context;
+ SilcUInt32 id = SILC_PTR_TO_32(context);
SilcBuffer attr_buf;
SILC_LOG_DEBUG(("Attr callback"));
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
- SilcUInt32 id = (SilcUInt32)context;
+ SilcUInt32 id = SILC_PTR_TO_32(context);
SILC_LOG_DEBUG(("Extended callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
void silc_sftp_server_set_monitor(SilcSFTP sftp,
SilcSFTPMonitors monitors,
- SilcSFTPMonitor monitor,
+ SilcSFTPMonitor monitor,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
SILC_LOG_DEBUG(("Start"));
/* Parse the packet */
- type = silc_sftp_packet_decode(packet->buffer, (unsigned char **)&payload,
+ type = silc_sftp_packet_decode(packet->buffer, (unsigned char **)&payload,
&payload_len);
if (!type)
return;
SILC_STR_UI_INT(&id),
SILC_STR_UI32_STRING_ALLOC(&filename),
SILC_STR_UI_INT(&pflags),
- SILC_STR_UI32_NSTRING(&attr_buf,
+ SILC_STR_UI32_NSTRING(&attr_buf,
&attr_len),
SILC_STR_END);
if (ret < 0)
/* Open operation */
server->fs->fs->sftp_open(server->fs->fs_context, sftp, filename, pflags,
- attrs, silc_sftp_server_handle, (void *)id);
+ attrs, silc_sftp_server_handle,
+ SILC_32_TO_PTR(id));
silc_free(filename);
silc_sftp_attr_free(attrs);
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_END);
if (ret < 0)
/* Close operation */
server->fs->fs->sftp_close(server->fs->fs_context, sftp, handle,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
+
}
break;
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_UI_INT64(&offset),
SILC_STR_UI_INT(&len),
break;
}
+ /* Read operation */
+ server->fs->fs->sftp_read(server->fs->fs_context, sftp,
+ handle, offset, len,
+ silc_sftp_server_data, SILC_32_TO_PTR(id));
+
/* Call monitor */
if (server->monitors & SILC_SFTP_MONITOR_READ && server->monitor) {
mdata.offset = offset;
(*server->monitor)(sftp, SILC_SFTP_MONITOR_READ, &mdata,
server->monitor_context);
}
-
- /* Read operation */
- server->fs->fs->sftp_read(server->fs->fs_context, sftp,
- handle, offset, len,
- silc_sftp_server_data, (void *)id);
}
break;
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_UI_INT64(&offset),
- SILC_STR_UI32_NSTRING(&data,
+ SILC_STR_UI32_NSTRING(&data,
&data_len),
SILC_STR_END);
if (ret < 0)
break;
}
+ /* Write operation */
+ server->fs->fs->sftp_write(server->fs->fs_context, sftp, handle, offset,
+ (const unsigned char *)data, data_len,
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
+
/* Call monitor */
if (server->monitors & SILC_SFTP_MONITOR_WRITE && server->monitor) {
mdata.offset = offset;
(*server->monitor)(sftp, SILC_SFTP_MONITOR_WRITE, &mdata,
server->monitor_context);
}
-
- /* Write operation */
- server->fs->fs->sftp_write(server->fs->fs_context, sftp, handle, offset,
- (const unsigned char *)data, data_len,
- silc_sftp_server_status, (void *)id);
}
break;
/* Remove operation */
server->fs->fs->sftp_remove(server->fs->fs_context, sftp, filename,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
silc_free(filename);
}
}
/* Rename operation */
- server->fs->fs->sftp_rename(server->fs->fs_context, sftp,
+ server->fs->fs->sftp_rename(server->fs->fs_context, sftp,
filename, newname,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
silc_free(filename);
silc_free(newname);
/* Mkdir operation */
server->fs->fs->sftp_mkdir(server->fs->fs_context, sftp, path, attrs,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
silc_sftp_attr_free(attrs);
silc_free(path);
/* Rmdir operation */
server->fs->fs->sftp_rmdir(server->fs->fs_context, sftp, path,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
silc_free(path);
}
/* Opendir operation */
server->fs->fs->sftp_opendir(server->fs->fs_context, sftp, path,
- silc_sftp_server_handle, (void *)id);
+ silc_sftp_server_handle, SILC_32_TO_PTR(id));
silc_free(path);
}
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_END);
if (ret < 0)
/* Readdir operation */
server->fs->fs->sftp_readdir(server->fs->fs_context, sftp, handle,
- silc_sftp_server_name, (void *)id);
+ silc_sftp_server_name, SILC_32_TO_PTR(id));
}
break;
/* Stat operation */
server->fs->fs->sftp_stat(server->fs->fs_context, sftp, path,
- silc_sftp_server_attr, (void *)id);
+ silc_sftp_server_attr, SILC_32_TO_PTR(id));
silc_free(path);
}
/* Lstat operation */
server->fs->fs->sftp_lstat(server->fs->fs_context, sftp, path,
- silc_sftp_server_attr, (void *)id);
+ silc_sftp_server_attr, SILC_32_TO_PTR(id));
silc_free(path);
}
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_END);
if (ret < 0)
/* Fstat operation */
server->fs->fs->sftp_fstat(server->fs->fs_context, sftp, handle,
- silc_sftp_server_attr, (void *)id);
+ silc_sftp_server_attr, SILC_32_TO_PTR(id));
}
break;
/* Setstat operation */
server->fs->fs->sftp_setstat(server->fs->fs_context, sftp, path, attrs,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
silc_sftp_attr_free(attrs);
silc_free(path);
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_UI32_NSTRING(&attr_buf,
&attr_len),
}
/* Fsetstat operation */
- server->fs->fs->sftp_fsetstat(server->fs->fs_context, sftp,
+ server->fs->fs->sftp_fsetstat(server->fs->fs_context, sftp,
handle, attrs,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status,
+ SILC_32_TO_PTR(id));
silc_sftp_attr_free(attrs);
}
/* Readlink operation */
server->fs->fs->sftp_readlink(server->fs->fs_context, sftp, path,
- silc_sftp_server_name, (void *)id);
+ silc_sftp_server_name, SILC_32_TO_PTR(id));
silc_free(path);
}
/* Symlink operation */
server->fs->fs->sftp_symlink(server->fs->fs_context, sftp, path, target,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
silc_free(path);
silc_free(target);
/* Realpath operation */
server->fs->fs->sftp_realpath(server->fs->fs_context, sftp, path,
- silc_sftp_server_name, (void *)id);
+ silc_sftp_server_name, SILC_32_TO_PTR(id));
silc_free(path);
}
}
/* Extended operation */
- server->fs->fs->sftp_extended(server->fs->fs_context, sftp,
+ server->fs->fs->sftp_extended(server->fs->fs_context, sftp,
request, data, data_len,
- silc_sftp_server_extended, (void *)id);
+ silc_sftp_server_extended,
+ SILC_32_TO_PTR(id));
silc_free(request);
}