]> git.sesse.net Git - betaftpd/blob - ftpd.h
Now does setegid() before seteuid(), since you can't setegid() if you aren't root.
[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.
23  */
24 #if WANT_NONROOT
25 #define FTP_PORT 12121
26 #else
27 #define FTP_PORT 21
28 #endif
29
30 /*
31  * This is the number of seconds an idle connection is allowed to
32  * remain idle (`idle' is defined as `no activity on the data socket',
33  * more or less) without getting shut down. This is not accurate,
34  * as such delays are only checked for every 60 seconds.
35  *
36  * The default (15 minutes) should be OK for most people.
37  */
38 #define TIMEOUT_SECS 900
39
40 /*
41  * This is the maximum block size you think you need. (This will most
42  * likely be the block size of your filesystem, and you're not likely
43  * to need a bigger number than this, unless your TCP stack likes
44  * big send()s better than small ones, and still manages to `interleave'
45  * the framents.) If this value is too small, your performance would be
46  * slightly worse, but it would still work. Try to keep it at a power of
47  * two -- most (read: all) FS block sizes _are_ powers of two. If you
48  * set it too high, it won't affect performance much -- you would just
49  * use a bit more memory.
50  */
51 #define MAX_BLOCK_SIZE 4096
52
53 #if HAVE_PWD_H
54 #include <pwd.h>
55 #endif
56
57 #if HAVE_SYS_TYPES_H
58 #include <sys/types.h>
59 #endif
60
61 #if HAVE_NETINET_IN_H
62 #include <netinet/in.h>
63 #endif
64
65 #if HAVE_SYS_SOCKET_H
66 #include <sys/socket.h>
67 #endif
68
69 #if HAVE_LINUX_SENDFILE && !HAVE_MMAP
70 #warning sendfile() without mmap() is not supported -- disabling sendfile()
71 #undef HAVE_LINUX_SENDFILE
72 #endif
73
74 #if WANT_DCACHE && !HAVE_MMAP
75 #warning directory cache requires use of mmap() -- disabling directory cache
76 #undef WANT_DCACHE
77 #endif
78
79 struct list_options {
80         int recursive;
81         int long_listing;
82         int classify;
83 };
84
85 /*
86  * General structure for the doubly linked lists (conn, ftran, dcache).
87  * This is used only by the generic linked list code (which inserts and
88  * removes elements from the lists).
89  */
90 struct list_element {
91         struct list_element *prev;
92         struct list_element *next;
93
94         /* structure specific data here */
95 };
96
97 /* doubly linked list of active connections */
98 struct conn {
99         struct conn *prev_conn;
100         struct conn *next_conn;
101
102         int sock;
103 #if WANT_STAT
104         struct sockaddr addr;
105 #endif
106         char recv_buf[256];
107 #if WANT_FULLSCREEN
108         char last_cmd[256];
109 #endif
110         char rename_from[256];
111
112         int buf_len;
113         int auth;
114
115         char username[17];
116
117         uid_t uid;
118         gid_t gid;
119
120         char root_dir[256];
121         char curr_dir[256];
122
123         struct ftran *transfer;
124
125         int rest_pos;
126 #if WANT_ASCII
127         int ascii_mode;
128 #endif
129
130         time_t last_transfer;
131 };
132
133 /* doubly linked list of file transfers */
134 struct ftran {
135         struct ftran *prev_ftran;
136         struct ftran *next_ftran;
137         struct conn *owner;
138
139         int state;              /*
140                                  * 0 = none, 1 = got PASV addr,
141                                  * 2 = waiting on PASV socket,  
142                                  * 3 = got PORT addr, 4 = waiting for
143                                  *     PORT connect, 
144                                  * 5 = transferring file (or waiting 
145                                  *     for PORT connect)
146                                  */
147         struct sockaddr_in sin;
148         int sock;
149         int dir_listing;
150 #if WANT_DCACHE
151         struct dcache *dir_cache;
152 #endif
153 #if WANT_ASCII
154         int ascii_mode;
155 #endif
156         char filename[256];
157         time_t tran_start;
158         long int size;
159
160         int local_file;
161         int block_size;
162
163 #if HAVE_MMAP
164         char *file_data;        /* mmap'ed */
165 #endif
166         long int pos;
167
168 #if WANT_UPLOAD
169         int upload;
170         int append;
171 #endif
172 };
173
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);
177
178 struct conn *alloc_new_conn(const int sock);
179 struct ftran *alloc_new_ftran(const int sock, const struct conn * const c);
180
181 int add_fd(const int fd, const int events);
182 void del_fd(const int fd);
183
184 void destroy_conn(struct conn * const c);
185 void destroy_ftran(struct ftran * const f);
186
187 void finish_transfer(struct ftran * const f);
188
189 #if HAVE_POLL
190 int process_all_clients(const int num_ac);
191 int process_all_sendfiles(const int num_ac);
192 #else
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);
195 #endif
196
197 int do_upload(struct ftran *f);
198 int do_download(struct ftran *f);
199 void write_xferlog(struct ftran *f);
200 int main(void);
201
202 RETSIGTYPE handle_alarm(int signum);
203
204 void accept_new_client(int * const server_sock);
205 void time_out_sockets();
206
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();
211
212 #if !HAVE_POLL
213 void clear_bad_fds(int * const server_sock);
214 #endif
215
216 #if HAVE_BSD_SENDFILE || HAVE_LINUX_SENDFILE
217 int mysendfile(int sock, int fd, off_t *offset, size_t count);
218 #endif  
219
220 #if WANT_MESSAGE
221 void dump_file(struct conn * const c, const int num, const char * const filename);
222 void list_readmes(struct conn * const c);
223 #endif
224
225 #endif