1 /* ftpd.h: Prototypes for BetaFTPD
2 Copyright (C) 1999-2000 Steinar H. Gunderson
4 This program is is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2 if the
6 License as published by the Free Software Foundation.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 * This is the port you want BetaFTPD to listen on. The standard
23 * FTP port is 21 -- if you really want to use BetaFTPD as your
24 * primary FTP server, change FTP_PORT.
27 #define FTP_PORT 12121
33 * This is the number of seconds an idle connection is allowed to
34 * remain idle (`idle' is defined as `no activity on the data socket',
35 * more or less) without getting shut down. This is not accurate,
36 * as such delays are only checked for every 60 seconds.
38 * The default (15 minutes) should be OK for most people.
40 #define TIMEOUT_SECS 900
43 * This is the maximum block size you think you need. (This will most
44 * likely be the block size of your filesystem, and you're not likely
45 * to need a bigger number than this, unless your TCP stack likes
46 * big send()s better than small ones, and still manages to `interleave'
47 * the framents.) If this value is too small, your performance would be
48 * slightly worse, but it would still work. Try to keep it at a power of
49 * two -- most (read: all) FS block sizes _are_ powers of two. If you
50 * set it too high, it won't affect performance much -- you would just
51 * use a bit more memory.
53 #define MAX_BLOCK_SIZE 4096
60 #include <sys/types.h>
64 #include <netinet/in.h>
68 #include <sys/socket.h>
71 #if HAVE_LINUX_SENDFILE && !HAVE_MMAP
72 #warning sendfile() without mmap() is not supported -- disabling sendfile()
73 #undef HAVE_LINUX_SENDFILE
76 #if WANT_DCACHE && !HAVE_MMAP
77 #warning directory cache requires use of mmap() -- disabling directory cache
88 * General structure for the doubly linked lists (conn, ftran, dcache).
89 * This is used only by the generic linked list code (which inserts and
90 * removes elements from the lists).
93 struct list_element *prev;
94 struct list_element *next;
96 /* structure specific data here */
99 /* doubly linked list of active connections */
101 struct conn *prev_conn;
102 struct conn *next_conn;
106 struct sockaddr addr;
112 char rename_from[256];
123 struct ftran *transfer;
130 time_t last_transfer;
133 /* doubly linked list of file transfers */
135 struct ftran *prev_ftran;
136 struct ftran *next_ftran;
140 * 0 = none, 1 = got PASV addr,
141 * 2 = waiting on PASV socket,
142 * 3 = got PORT addr, 4 = waiting for
144 * 5 = transferring file (or waiting
147 struct sockaddr_in sin;
151 struct dcache *dir_cache;
164 char *file_data; /* mmap'ed */
174 void add_to_linked_list(struct list_element * const first,
175 struct list_element * const elem);
176 void remove_from_linked_list(struct list_element * const elem);
178 struct conn *alloc_new_conn(const int sock);
179 struct ftran *alloc_new_ftran(const int sock, const struct conn * const c);
181 int add_fd(const int fd, const int events);
182 void del_fd(const int fd);
184 void destroy_conn(struct conn * const c);
185 void destroy_ftran(struct ftran * const f);
187 void finish_transfer(struct ftran * const f);
190 int process_all_clients(const int num_ac);
191 int process_all_sendfiles(const int num_ac);
193 int process_all_clients(const fd_set * const active_clients, const int num_ac);
194 int process_all_sendfiles(fd_set * const active_clients, const int num_ac);
197 int do_upload(struct ftran *f);
198 int do_download(struct ftran *f);
199 void write_xferlog(struct ftran *f);
202 RETSIGTYPE handle_alarm(int signum);
204 void accept_new_client(int * const server_sock);
205 void time_out_sockets();
207 void remove_bytes(struct conn * const c, const int i);
208 void numeric(struct conn * const c, const int numeric, const char * const format, ...);
209 void init_file_transfer(struct ftran * const f);
210 int create_server_socket();
213 void clear_bad_fds(int * const server_sock);
217 void dump_file(struct conn * const c, const int num, const char * const filename);
218 void list_readmes(struct conn * const c);