#include "silcincludes.h"
#include "silcsftp.h"
+#include "silcsftp_fs.h"
#include "sftp_util.h"
/* SFTP Server context */
SilcSFTPSendPacketCallback send_packet;
void *send_context;
SilcSFTPFilesystem fs;
- void *fs_context;
} *SilcSFTPServer;
/* General routine to send SFTP packet to the SFTP client. */
return;
}
- hdata = server->fs->sftp_encode_handle(server->fs_context, sftp,
- handle, &hdata_len);
+ hdata = server->fs->fs->sftp_encode_handle(server->fs->fs_context, sftp,
+ handle, &hdata_len);
if (!hdata) {
silc_sftp_send_error(server, SILC_SFTP_STATUS_FAILURE, id);
return;
SilcSFTP silc_sftp_server_start(SilcSocketConnection sock,
SilcSFTPSendPacketCallback send_packet,
void *send_context,
- SilcSFTPFilesystem fs,
- void *fs_context)
+ SilcSFTPFilesystem fs)
{
SilcSFTPServer server;
server->send_packet = send_packet;
server->send_context = send_context;
server->fs = fs;
- server->fs_context = fs_context;
SILC_LOG_DEBUG(("Starting SFTP server %p", server));
}
/* Open operation */
- server->fs->sftp_open(server->fs_context, sftp, filename, pflags,
- attrs, silc_sftp_server_handle, (void *)id);
+ server->fs->fs->sftp_open(server->fs->fs_context, sftp, filename, pflags,
+ attrs, silc_sftp_server_handle, (void *)id);
silc_free(filename);
silc_sftp_attr_free(attrs);
goto failure;
/* Get the handle */
- handle = server->fs->sftp_get_handle(server->fs_context, sftp,
- (const unsigned char *)hdata,
- hdata_len);
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
if (!handle) {
silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
break;
}
/* Close operation */
- server->fs->sftp_close(server->fs_context, sftp, handle,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_close(server->fs->fs_context, sftp, handle,
+ silc_sftp_server_status, (void *)id);
}
break;
goto failure;
/* Get the handle */
- handle = server->fs->sftp_get_handle(server->fs_context, sftp,
- (const unsigned char *)hdata,
- hdata_len);
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
if (!handle) {
silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
break;
}
/* Read operation */
- server->fs->sftp_read(server->fs_context, sftp, handle, offset, len,
- silc_sftp_server_data, (void *)id);
+ server->fs->fs->sftp_read(server->fs->fs_context, sftp,
+ handle, offset, len,
+ silc_sftp_server_data, (void *)id);
}
break;
goto failure;
/* Get the handle */
- handle = server->fs->sftp_get_handle(server->fs_context, sftp,
- (const unsigned char *)hdata,
- hdata_len);
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
if (!handle) {
silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
break;
}
/* Write operation */
- server->fs->sftp_write(server->fs_context, sftp, handle, offset,
- (const unsigned char *)data, data_len,
- silc_sftp_server_status, (void *)id);
+ 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;
goto failure;
/* Remove operation */
- server->fs->sftp_remove(server->fs_context, sftp, filename,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_remove(server->fs->fs_context, sftp, filename,
+ silc_sftp_server_status, (void *)id);
silc_free(filename);
}
goto failure;
/* Rename operation */
- server->fs->sftp_rename(server->fs_context, sftp, filename, newname,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_rename(server->fs->fs_context, sftp, filename, newname,
+ silc_sftp_server_status, (void *)id);
silc_free(filename);
silc_free(newname);
}
/* Mkdir operation */
- server->fs->sftp_mkdir(server->fs_context, sftp, path, attrs,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_mkdir(server->fs->fs_context, sftp, path, attrs,
+ silc_sftp_server_status, (void *)id);
silc_sftp_attr_free(attrs);
silc_free(path);
goto failure;
/* Rmdir operation */
- server->fs->sftp_rmdir(server->fs_context, sftp, path,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_rmdir(server->fs->fs_context, sftp, path,
+ silc_sftp_server_status, (void *)id);
silc_free(path);
}
goto failure;
/* Opendir operation */
- server->fs->sftp_opendir(server->fs_context, sftp, path,
- silc_sftp_server_handle, (void *)id);
+ server->fs->fs->sftp_opendir(server->fs->fs_context, sftp, path,
+ silc_sftp_server_handle, (void *)id);
silc_free(path);
}
goto failure;
/* Get the handle */
- handle = server->fs->sftp_get_handle(server->fs_context, sftp,
- (const unsigned char *)hdata,
- hdata_len);
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
if (!handle) {
silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
break;
}
/* Readdir operation */
- server->fs->sftp_readdir(server->fs_context, sftp, handle,
- silc_sftp_server_name, (void *)id);
+ server->fs->fs->sftp_readdir(server->fs->fs_context, sftp, handle,
+ silc_sftp_server_name, (void *)id);
}
break;
goto failure;
/* Stat operation */
- server->fs->sftp_stat(server->fs_context, sftp, path,
- silc_sftp_server_attr, (void *)id);
+ server->fs->fs->sftp_stat(server->fs->fs_context, sftp, path,
+ silc_sftp_server_attr, (void *)id);
silc_free(path);
}
goto failure;
/* Lstat operation */
- server->fs->sftp_lstat(server->fs_context, sftp, path,
- silc_sftp_server_attr, (void *)id);
+ server->fs->fs->sftp_lstat(server->fs->fs_context, sftp, path,
+ silc_sftp_server_attr, (void *)id);
silc_free(path);
}
goto failure;
/* Get the handle */
- handle = server->fs->sftp_get_handle(server->fs_context, sftp,
- (const unsigned char *)hdata,
- hdata_len);
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
if (!handle) {
silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
break;
}
/* Fstat operation */
- server->fs->sftp_fstat(server->fs_context, sftp, handle,
- silc_sftp_server_attr, (void *)id);
+ server->fs->fs->sftp_fstat(server->fs->fs_context, sftp, handle,
+ silc_sftp_server_attr, (void *)id);
}
break;
}
/* Setstat operation */
- server->fs->sftp_setstat(server->fs_context, sftp, path, attrs,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_setstat(server->fs->fs_context, sftp, path, attrs,
+ silc_sftp_server_status, (void *)id);
silc_sftp_attr_free(attrs);
silc_free(path);
}
/* Get the handle */
- handle = server->fs->sftp_get_handle(server->fs_context, sftp,
- (const unsigned char *)hdata,
- hdata_len);
+ handle = server->fs->fs->sftp_get_handle(server->fs->fs_context, sftp,
+ (const unsigned char *)hdata,
+ hdata_len);
if (!handle) {
silc_sftp_send_error(server, SILC_SFTP_STATUS_NO_SUCH_FILE, id);
break;
}
/* Fsetstat operation */
- server->fs->sftp_fsetstat(server->fs_context, sftp, handle, attrs,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_fsetstat(server->fs->fs_context, sftp, handle, attrs,
+ silc_sftp_server_status, (void *)id);
silc_sftp_attr_free(attrs);
}
goto failure;
/* Readlink operation */
- server->fs->sftp_readlink(server->fs_context, sftp, path,
- silc_sftp_server_name, (void *)id);
+ server->fs->fs->sftp_readlink(server->fs->fs_context, sftp, path,
+ silc_sftp_server_name, (void *)id);
silc_free(path);
}
goto failure;
/* Symlink operation */
- server->fs->sftp_symlink(server->fs_context, sftp, path, target,
- silc_sftp_server_status, (void *)id);
+ server->fs->fs->sftp_symlink(server->fs->fs_context, sftp, path, target,
+ silc_sftp_server_status, (void *)id);
silc_free(path);
silc_free(target);
goto failure;
/* Realpath operation */
- server->fs->sftp_realpath(server->fs_context, sftp, path,
- silc_sftp_server_name, (void *)id);
+ server->fs->fs->sftp_realpath(server->fs->fs_context, sftp, path,
+ silc_sftp_server_name, (void *)id);
silc_free(path);
}
data_len = buf.len;
/* Extended operation */
- server->fs->sftp_extended(server->fs_context, sftp,
- request, data, data_len,
- silc_sftp_server_extended, (void *)id);
+ server->fs->fs->sftp_extended(server->fs->fs_context, sftp,
+ request, data, data_len,
+ silc_sftp_server_extended, (void *)id);
silc_free(request);
}