*/
+/* Tests:
+ silc_sftp_client_start();
+ silc_sftp_client_receive_process();
+ silc_sftp_opendir();
+ silc_sftp_readdir();
+ silc_sftp_open();
+ silc_sftp_read();
+ silc_sftp_fstat();
+ silc_sftp_lstat();
+ silc_sftp_close();
+*/
+
#include "silcincludes.h"
#include "silcsftp.h"
char *file;
bool opendir;
SilcUInt64 offset;
+bool success = FALSE;
static void sftp_name(SilcSFTP sftp, SilcSFTPStatus status,
const SilcSFTPName name, void *context);
static void sftp_data(SilcSFTP sftp, SilcSFTPStatus status,
const unsigned char *data, SilcUInt32 data_len,
void *context);
+static void end_test(void);
-static void send_packet(SilcSocketConnection sock,
- SilcBuffer packet, void *context)
+static void send_packet(SilcBuffer packet, void *context)
{
Client client = (Client)context;
+ SilcSocketConnection sock = client->sock;
SilcPacketContext packetdata;
+ const SilcBufferStruct p;
int ret;
memset(&packetdata, 0, sizeof(packetdata));
packetdata.type = SILC_PACKET_FTP;
packetdata.truelen = packet->len + SILC_PACKET_HEADER_LEN;
- packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen, 0);
- silc_packet_send_prepare(sock,
- SILC_PACKET_HEADER_LEN,
- packetdata.padlen,
- packet->len);
- packetdata.buffer = sock->outbuf;
- silc_buffer_put(sock->outbuf, packet->data, packet->len);
- silc_packet_assemble(&packetdata, NULL);
+ SILC_PACKET_PADLEN(packetdata.truelen, 0, packetdata.padlen);
+ silc_packet_assemble(&packetdata, NULL, NULL, NULL, sock,
+ packet->data, packet->len, (const SilcBuffer)&p);
ret = silc_packet_send(sock, TRUE);
if (ret != -2)
return;
-
+
silc_schedule_set_listen_fd(client->schedule, sock->sock,
(SILC_TASK_READ | SILC_TASK_WRITE), FALSE);
SILC_SET_OUTBUF_PENDING(sock);
assert(packet->type == SILC_PACKET_FTP);
silc_sftp_client_receive_process(client->sftp, sock, packet);
-
+
return TRUE;
}
if (type == SILC_TASK_WRITE) {
if (sock->outbuf->data - sock->outbuf->head)
- silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
+ silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
ret = silc_packet_send(sock, TRUE);
if (ret < 0)
return;
-
+
silc_schedule_set_listen_fd(client->schedule, fd, SILC_TASK_READ, FALSE);
SILC_UNSET_OUTBUF_PENDING(sock);
silc_buffer_clear(sock->outbuf);
return;
+
}
if (type == SILC_TASK_READ) {
ret = silc_packet_receive(sock);
if (ret < 0)
return;
-
+
if (ret == 0) {
silc_net_close_connection(sock->sock);
silc_socket_free(sock);
}
}
+static void sftp_status(SilcSFTP sftp, SilcSFTPStatus status,
+ const char *message, const char *lang_tag,
+ void *context)
+{
+ fprintf(stderr, "Status %d\n", status);
+ if (status != SILC_SFTP_STATUS_OK) {
+ SILC_LOG_DEBUG(("Error status"));
+ success = FALSE;
+ end_test();
+ return;
+ }
+
+ success = TRUE;
+ end_test();
+}
+
+static void sftp_attr(SilcSFTP sftp, SilcSFTPStatus status,
+ const SilcSFTPAttributes attrs, void *context)
+{
+ SilcSFTPHandle handle = (SilcSFTPHandle)context;
+ int debug = silc_debug;
+ int i;
+
+ fprintf(stderr, "Status %d\n", status);
+ if (status != SILC_SFTP_STATUS_OK) {
+ SILC_LOG_DEBUG(("Error status"));
+ success = FALSE;
+ end_test();
+ return;
+ }
+
+ if (!debug)
+ silc_debug = 1;
+
+ SILC_LOG_DEBUG(("Attr.flags: %d", attrs->flags));
+ SILC_LOG_DEBUG(("Attr.size: %lu", attrs->size));
+ SILC_LOG_DEBUG(("Attr.uid: %d", attrs->uid));
+ SILC_LOG_DEBUG(("Attr.gid: %d", attrs->gid));
+ SILC_LOG_DEBUG(("Attr.permissions: %d", attrs->permissions));
+ SILC_LOG_DEBUG(("Attr.atime: %d", attrs->atime));
+ SILC_LOG_DEBUG(("Attr.mtime: %d", attrs->mtime));
+ SILC_LOG_DEBUG(("Attr.extended count: %d", attrs->extended_count));
+ for (i = 0; i < attrs->extended_count; i++) {
+ SILC_LOG_HEXDUMP(("Attr.extended_type[i]:", i),
+ attrs->extended_type[i]->data,
+ attrs->extended_type[i]->len);
+ SILC_LOG_HEXDUMP(("Attr.extended_data[i]:", i),
+ attrs->extended_data[i]->data,
+ attrs->extended_data[i]->len);
+ }
+
+ silc_debug = debug;
+
+ if (!file) {
+ fprintf(stderr, "Closing file\n");
+ silc_sftp_close(sftp, handle, sftp_status, context);
+ return;
+ }
+
+ fprintf(stderr, "LStatting file %s\n", file);
+ silc_sftp_lstat(sftp, file, sftp_attr, context);
+ file = NULL;
+}
+
static void sftp_data(SilcSFTP sftp, SilcSFTPStatus status,
const unsigned char *data, SilcUInt32 data_len,
void *context)
fprintf(stderr, "Status %d\n", status);
- if (!strcmp(file, "/sftp/sftp_server.c"))
+ if (status != SILC_SFTP_STATUS_EOF) {
+ SILC_LOG_DEBUG(("Error status"));
+ success = FALSE;
+ end_test();
return;
-
+ }
+
+ if (!strcmp(file, "/sftp/sftp_server.c")) {
+ fprintf(stderr, "FStatting file handle %s\n", file);
+ silc_sftp_fstat(sftp, handle, sftp_attr, context);
+ return;
+ }
+
/* Open another file */
opendir = FALSE;
memset(&attrs, 0, sizeof(attrs));
SILC_LOG_DEBUG(("Name"));
fprintf(stderr, "Status %d\n", status);
+ if (status != SILC_SFTP_STATUS_OK) {
+ SILC_LOG_DEBUG(("Error status"));
+ success = FALSE;
+ end_test();
+ return;
+ }
+
fprintf(stderr, "Directory: %s\n", dir);
for (i = 0; i < name->count; i++) {
fprintf(stderr, "%s\n", name->long_filename[i]);
SILC_LOG_DEBUG(("Handle"));
fprintf(stderr, "Status %d\n", status);
- if (status != SILC_SFTP_STATUS_OK)
+ if (status != SILC_SFTP_STATUS_OK) {
+ SILC_LOG_DEBUG(("Error status"));
+ success = FALSE;
+ end_test();
return;
-
+ }
+
if (opendir) {
fprintf(stderr, "Reading %s\n", dir);
/* Readdir */
SILC_LOG_DEBUG(("Version"));
fprintf(stderr, "Status %d\n", status);
+ if (status != SILC_SFTP_STATUS_OK) {
+ SILC_LOG_DEBUG(("Error status"));
+ success = FALSE;
+ end_test();
+ return;
+ }
/* opendir */
dir = "/";
if (argc > 1 && !strcmp(argv[1], "-d")) {
silc_debug = 1;
silc_debug_hexdump = 1;
- silc_log_set_debug_string("");
+ silc_log_set_debug_string("*sftp*");
}
- client->schedule = silc_schedule_init(100);
+ client->schedule = silc_schedule_init(100, NULL);
if (!client->schedule)
return -1;
SILC_TASK_GENERIC, SILC_TASK_PRI_NORMAL);
/* Start SFTP session */
- client->sftp = silc_sftp_client_start(client->sock, send_packet, client,
+ client->sftp = silc_sftp_client_start(send_packet, client,
sftp_version, client);
silc_schedule(client->schedule);
return 0;
}
+
+static void end_test(void)
+{
+ SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
+ fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
+ exit(success);
+}
#include "silcincludes.h"
#include "silcsftp.h"
+typedef struct {
+ SilcSocketConnection sock;
+ void *server;
+} *ServerSession;
+
typedef struct {
SilcSchedule schedule;
int sock;
SilcSFTPFilesystem fs;
- SilcSocketConnection socks[100];
+ ServerSession sessions[100];
SilcSFTP sftp[100];
} *Server;
-static void send_packet(SilcSocketConnection sock,
- SilcBuffer packet, void *context)
+static void send_packet(SilcBuffer packet, void *context)
{
- Server server = (Server)context;
+ ServerSession session = context;
+ Server server = session->server;
SilcPacketContext packetdata;
+ const SilcBufferStruct p;
int ret;
memset(&packetdata, 0, sizeof(packetdata));
packetdata.type = SILC_PACKET_FTP;
packetdata.truelen = packet->len + SILC_PACKET_HEADER_LEN;
- packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen, 0);
- silc_packet_send_prepare(sock,
- SILC_PACKET_HEADER_LEN,
- packetdata.padlen,
- packet->len);
- packetdata.buffer = sock->outbuf;
- silc_buffer_put(sock->outbuf, packet->data, packet->len);
- silc_packet_assemble(&packetdata, NULL);
- ret = silc_packet_send(sock, TRUE);
+ SILC_PACKET_PADLEN(packetdata.truelen, 0, packetdata.padlen);
+ silc_packet_assemble(&packetdata, NULL, NULL, NULL, session->sock,
+ packet->data, packet->len, (const SilcBuffer)&p);
+ ret = silc_packet_send(session->sock, TRUE);
if (ret != -2)
return;
- silc_schedule_set_listen_fd(server->schedule, sock->sock,
+ silc_schedule_set_listen_fd(server->schedule, session->sock->sock,
(SILC_TASK_READ | SILC_TASK_WRITE), FALSE);
- SILC_SET_OUTBUF_PENDING(sock);
+ SILC_SET_OUTBUF_PENDING(session->sock);
}
static bool packet_parse(SilcPacketParserContext *parser, void *context)
SILC_TASK_CALLBACK(packet_process)
{
- Server server = (Server)context;
- SilcSocketConnection sock = server->socks[fd];
+ Server server = context;
+ ServerSession session = server->sessions[fd];
+ SilcSocketConnection sock;
int ret;
- if (!sock)
+ if (!session)
return;
+ sock = session->sock;
if (type == SILC_TASK_WRITE) {
if (sock->outbuf->data - sock->outbuf->head)
if (ret == 0) {
silc_net_close_connection(sock->sock);
silc_schedule_unset_listen_fd(server->schedule, sock->sock);
- server->socks[sock->sock] = NULL;
+ silc_free(server->sessions[sock->sock]);
+ server->sessions[sock->sock] = NULL;
silc_socket_free(sock);
return;
}
silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
silc_socket_alloc(sock, 0, NULL, &sc);
- server->socks[sock] = sc;
+ server->sessions[sock] = silc_calloc(1, sizeof(server->sessions[0]));
+ server->sessions[sock]->sock = sc;
+ server->sessions[sock]->server = server;
server->sftp[sock] =
- silc_sftp_server_start(sc, send_packet, server,
+ silc_sftp_server_start(send_packet, server->sessions[sock],
server->fs);
silc_schedule_task_add(server->schedule, sock, packet_process,
server, 0, 0, SILC_TASK_GENERIC,
void *dir;
silc_debug = 1;
-
- server->schedule = silc_schedule_init(100);
+ silc_debug_hexdump = 1;
+ silc_log_set_debug_string("*sftp*");
+
+ server->schedule = silc_schedule_init(100, NULL);
if (!server->schedule)
return -1;
silc_channel_key_payload_encode @ 278 ;
silc_channel_key_payload_free @ 279 ;
silc_channel_key_payload_parse @ 280 ;
- silc_channel_message_get_mac @ 281 ;
- silc_channel_message_get_data @ 282 ;
- silc_channel_message_get_flags @ 283 ;
- silc_channel_message_get_iv @ 284 ;
- silc_channel_message_payload_decrypt @ 285 ;
- silc_channel_message_payload_encode @ 286 ;
- silc_channel_message_payload_free @ 287 ;
- silc_channel_message_payload_parse @ 288 ;
silc_channel_payload_encode @ 289 ;
silc_channel_payload_free @ 290 ;
silc_channel_payload_list_free @ 291 ;
silc_pkcs_unregister @ 594 ;
silc_pkcs_verify @ 595 ;
silc_pkcs_verify_with_hash @ 596 ;
- silc_private_message_get_flags @ 597 ;
- silc_private_message_get_message @ 598 ;
- silc_private_message_payload_encode @ 599 ;
- silc_private_message_payload_free @ 600 ;
- silc_private_message_payload_parse @ 601 ;
silc_protocol_alloc @ 602 ;
silc_protocol_cancel @ 603 ;
silc_protocol_execute @ 604 ;
silc_load_key_pair @ 882 ;
silc_show_public_key @ 883 ;
silc_change_private_key_passphrase @ 884 ;
+ silc_argument_payload_encode_one @ 885 ;
+ silc_message_payload_decrypt @ 886 ;
+ silc_message_payload_parse @ 887 ;
+ silc_message_payload_encrypt @ 888 ;
+ silc_message_payload_encode @ 889 ;
+ silc_message_payload_free @ 890 ;
+ silc_message_get_flags @ 891 ;
+ silc_message_get_data @ 892 ;
+ silc_message_get_mac @ 893 ;
+ silc_message_get_iv @ 894 ;
+ silc_message_signed_payload_parse @ 895 ;
+ silc_message_signed_payload_encode @ 896 ;
+ silc_message_signed_payload_free @ 897 ;
+ silc_message_signed_verify @ 898 ;
+ silc_message_signed_get_public_key @ 899 ;