5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2001 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
24 SilcSocketConnection sock;
29 SilcSchedule schedule;
31 SilcSFTPFilesystem fs;
32 ServerSession sessions[100];
36 static void send_packet(SilcBuffer packet, void *context)
38 ServerSession session = context;
39 Server server = session->server;
40 SilcPacketContext packetdata;
41 const SilcBufferStruct p;
44 memset(&packetdata, 0, sizeof(packetdata));
45 packetdata.type = SILC_PACKET_FTP;
46 packetdata.truelen = packet->len + SILC_PACKET_HEADER_LEN;
47 SILC_PACKET_PADLEN(packetdata.truelen, 0, packetdata.padlen);
48 silc_packet_assemble(&packetdata, NULL, NULL, NULL, session->sock,
49 packet->data, packet->len, (const SilcBuffer)&p);
50 ret = silc_packet_send(session->sock, TRUE);
54 silc_schedule_set_listen_fd(server->schedule, session->sock->sock,
55 (SILC_TASK_READ | SILC_TASK_WRITE), FALSE);
56 SILC_SET_OUTBUF_PENDING(session->sock);
59 static bool packet_parse(SilcPacketParserContext *parser, void *context)
61 Server server = (Server)parser->context;
62 SilcSocketConnection sock = parser->sock;
63 SilcPacketContext *packet = parser->packet;
66 ret = silc_packet_parse(packet, NULL);
67 assert(packet->type == SILC_PACKET_FTP);
69 silc_sftp_server_receive_process(server->sftp[sock->sock], sock, packet);
74 SILC_TASK_CALLBACK(packet_process)
76 Server server = context;
77 ServerSession session = server->sessions[fd];
78 SilcSocketConnection sock;
85 if (type == SILC_TASK_WRITE) {
86 if (sock->outbuf->data - sock->outbuf->head)
87 silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
89 ret = silc_packet_send(sock, TRUE);
93 silc_schedule_set_listen_fd(server->schedule, fd, SILC_TASK_READ, FALSE);
94 SILC_UNSET_OUTBUF_PENDING(sock);
95 silc_buffer_clear(sock->outbuf);
99 if (type == SILC_TASK_READ) {
100 ret = silc_packet_receive(sock);
105 silc_net_close_connection(sock->sock);
106 silc_schedule_unset_listen_fd(server->schedule, sock->sock);
107 silc_free(server->sessions[sock->sock]);
108 server->sessions[sock->sock] = NULL;
109 silc_socket_free(sock);
113 silc_packet_receive_process(sock, FALSE, NULL, NULL, 0, packet_parse,
118 SILC_TASK_CALLBACK(accept_connection)
120 Server server = (Server)context;
121 SilcSocketConnection sc;
124 sock = silc_net_accept_connection(server->sock);
128 silc_net_set_socket_nonblock(sock);
129 silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
131 silc_socket_alloc(sock, 0, NULL, &sc);
132 server->sessions[sock] = silc_calloc(1, sizeof(server->sessions[0]));
133 server->sessions[sock]->sock = sc;
134 server->sessions[sock]->server = server;
136 silc_sftp_server_start(send_packet, server->sessions[sock],
138 silc_schedule_task_add(server->schedule, sock, packet_process,
139 server, 0, 0, SILC_TASK_GENERIC,
140 SILC_TASK_PRI_NORMAL);
145 Server server = silc_calloc(1, sizeof(*server));
149 silc_debug_hexdump = 1;
150 silc_log_set_debug_string("*sftp*");
152 server->schedule = silc_schedule_init(100, NULL);
153 if (!server->schedule)
156 server->sock = silc_net_create_server(5000, NULL);
157 if (server->sock < 0)
160 /* Make test filesystem hierarchy */
162 server->fs = silc_sftp_fs_memory_alloc((SILC_SFTP_FS_PERM_READ |
163 SILC_SFTP_FS_PERM_WRITE));
165 silc_sftp_fs_memory_add_dir(server->fs, NULL, (SILC_SFTP_FS_PERM_READ |
166 SILC_SFTP_FS_PERM_WRITE |
167 SILC_SFTP_FS_PERM_EXEC),
169 silc_sftp_fs_memory_add_file(server->fs, NULL, SILC_SFTP_FS_PERM_READ,
170 "passwd", "file:///etc/passwd");
171 silc_sftp_fs_memory_add_file(server->fs, NULL, (SILC_SFTP_FS_PERM_READ |
172 SILC_SFTP_FS_PERM_WRITE),
173 "writeme", "file://./writeme-test");
174 silc_sftp_fs_memory_add_file(server->fs, dir, SILC_SFTP_FS_PERM_READ,
175 "shadow", "file:///etc/shadow");
176 silc_sftp_fs_memory_add_file(server->fs, dir, SILC_SFTP_FS_PERM_READ,
177 "sftp_server.c", "file://sftp_server.c");
178 silc_sftp_fs_memory_add_dir(server->fs, dir, (SILC_SFTP_FS_PERM_READ |
179 SILC_SFTP_FS_PERM_WRITE |
180 SILC_SFTP_FS_PERM_EXEC),
182 silc_sftp_fs_memory_add_file(server->fs, NULL, SILC_SFTP_FS_PERM_EXEC,
183 "testi", "file://sftp_client.c");
185 silc_schedule_task_add(server->schedule, server->sock,
186 accept_connection, server, 0, 0,
187 SILC_TASK_FD, SILC_TASK_PRI_NORMAL);
188 silc_schedule(server->schedule);