]> git.sesse.net Git - betaftpd/blob - ftpd.h
BetaFTPD now switches group ID properly, not just user ID (also fixed a microscopic...
[betaftpd] / ftpd.h
1 /*  ftpd.h: Prototypes for BetaFTPD
2     Copyright (C) 1999-2000 Steinar H. Gunderson
3
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 of the
6     License as published by the Free Software Foundation.
7
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.
12
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.
16 */
17
18 #ifndef _FTPD_H
19 #define _FTPD_H 1
20
21 /*
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.
25  */
26 #if WANT_NONROOT
27 #define FTP_PORT 12121
28 #else
29 #define FTP_PORT 21
30 #endif
31
32 /*
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.
37  *
38  * The default (15 minutes) should be OK for most people.
39  */
40 #define TIMEOUT_SECS 900
41
42 /*
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.
52  */
53 #define MAX_BLOCK_SIZE 4096
54
55 #if HAVE_PWD_H
56 #include <pwd.h>
57 #endif
58
59 #if HAVE_SYS_TYPES_H
60 #include <sys/types.h>
61 #endif
62
63 #if HAVE_NETINET_IN_H
64 #include <netinet/in.h>
65 #endif
66
67 #if HAVE_SYS_SOCKET_H
68 #include <sys/socket.h>
69 #endif
70
71 #if HAVE_LINUX_SENDFILE && !HAVE_MMAP
72 #warning sendfile() without mmap() is not supported -- disabling sendfile()
73 #undef HAVE_LINUX_SENDFILE
74 #endif
75
76 #if WANT_DCACHE && !HAVE_MMAP
77 #warning directory cache requires use of mmap() -- disabling directory cache
78 #undef WANT_DCACHE
79 #endif
80
81 struct list_options {
82         int recursive;
83         int long_listing;
84         int classify;
85 };
86
87 /*
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).
91  */
92 struct list_element {
93         struct list_element *prev;
94         struct list_element *next;
95
96         /* structure specific data here */
97 };
98
99 /* doubly linked list of active connections */
100 struct conn {
101         struct conn *prev_conn;
102         struct conn *next_conn;
103
104         int sock;
105 #if WANT_STAT
106         struct sockaddr addr;
107 #endif
108         char recv_buf[256];
109 #if WANT_FULLSCREEN
110         char last_cmd[256];
111 #endif
112         char rename_from[256];
113
114         int buf_len;
115         int auth;
116
117         char username[17];
118
119         uid_t uid;
120         gid_t gid;
121
122         char root_dir[256];
123         char curr_dir[256];
124
125         struct ftran *transfer;
126
127         int rest_pos;
128 #if WANT_ASCII
129         int ascii_mode;
130 #endif
131
132         time_t last_transfer;
133 };
134
135 /* doubly linked list of file transfers */
136 struct ftran {
137         struct ftran *prev_ftran;
138         struct ftran *next_ftran;
139         struct conn *owner;
140
141         int state;              /*
142                                  * 0 = none, 1 = got PASV addr,
143                                  * 2 = waiting on PASV socket,  
144                                  * 3 = got PORT addr, 4 = waiting for
145                                  *     PORT connect, 
146                                  * 5 = transferring file (or waiting 
147                                  *     for PORT connect)
148                                  */
149         struct sockaddr_in sin;
150         int sock;
151         int dir_listing;
152 #if WANT_DCACHE
153         struct dcache *dir_cache;
154 #endif
155 #if WANT_ASCII
156         int ascii_mode;
157 #endif
158         char filename[256];
159         time_t tran_start;
160         long int size;
161
162         int local_file;
163         int block_size;
164
165 #if HAVE_MMAP
166         char *file_data;        /* mmap'ed */
167 #endif
168         long int pos;
169
170 #if WANT_UPLOAD
171         int upload;
172         int append;
173 #endif
174 };
175
176 void add_to_linked_list(struct list_element * const first,
177                         struct list_element * const elem);
178 void remove_from_linked_list(struct list_element * const elem);
179
180 struct conn *alloc_new_conn(const int sock);
181 struct ftran *alloc_new_ftran(const int sock, const struct conn * const c);
182
183 int add_fd(const int fd, const int events);
184 void del_fd(const int fd);
185
186 void destroy_conn(struct conn * const c);
187 void destroy_ftran(struct ftran * const f);
188
189 void finish_transfer(struct ftran * const f);
190
191 #if HAVE_POLL
192 int process_all_clients(const int num_ac);
193 int process_all_sendfiles(const int num_ac);
194 #else
195 int process_all_clients(const fd_set * const active_clients, const int num_ac);
196 int process_all_sendfiles(fd_set * const active_clients, const int num_ac);
197 #endif
198
199 int do_upload(struct ftran *f);
200 int do_download(struct ftran *f);
201 void write_xferlog(struct ftran *f);
202 int main(void);
203
204 RETSIGTYPE handle_alarm(int signum);
205
206 void accept_new_client(int * const server_sock);
207 void time_out_sockets();
208
209 void remove_bytes(struct conn * const c, const int i);
210 void numeric(struct conn * const c, const int numeric, const char * const format, ...);
211 void init_file_transfer(struct ftran * const f);
212 int create_server_socket();
213
214 #if !HAVE_POLL
215 void clear_bad_fds(int * const server_sock);
216 #endif
217
218 #if WANT_MESSAGE
219 void dump_file(struct conn * const c, const int num, const char * const filename);
220 void list_readmes(struct conn * const c);
221 #endif
222
223 #endif