1 Complete list of all changes from 0.0.7 to 0.0.8, encompassing 17 prerelases:
3 - Support for not running as root. This implies using its own database of
4 rights and users. Give --enable-nonroot to configure to enable it. Users
5 running BetaFTPD as root are not affected by this support in any way.
6 BetaFTPD is still small with this feature, expect about 1 kB (6%) extra
7 for database routines and hooks in the main code.
9 This is still very experimental. Do not expect this to be better until
11 - Fixed a segfaulting bug. (Freeing a malloc'ed pointer that had been
12 incremented obviously wasn't a very good idea...)
13 - Some autoconf checks (fixes) for libc5.
14 - Now shows the sticky bit in directory listings.
15 - Cleaned up error cleanup :-)
16 - Some changes to compile better under Debian GNU/Linux. A .deb-file was
17 ready, but due to lost access of a Debian-system, this was discontinued :-(
18 - BetaFTPD will now try to install itself (wow! (not)) in the same directory
19 as the file called `ftpd', if you have that file.
20 - A little better checking for uid (at configure time).
21 - Support for non-Linux platforms! (For now, SunOS 5.5/SVR4 only. If this
22 is name confusion, sorry, but the machine belongs to the University
23 of Oslo, where I don't study, but still have a shell account...) These
24 changes should help out a _lot_ when it comes to general portability.
25 (Every single system header file BetaFTPD uses is now checked for. Didn't
26 have stdio.h? I didn't guess so either... :-) I could probably have used
27 AC_HEADER_STDC, but I decided to be on the safe side.)
29 Still, sadly, only Linux is really supported and working.
30 - Added README.platforms file.
31 - Gave the version its own name, like Samba does :-)
32 - If you have mmap() (it is not strictly needed, but a _lot_ of code
33 needed was only in place if you used mmap, and I decided to leave it
34 that way), BetaFTPD will no longer generate temporary files for directory
35 listings, but generate them in-place in memory.
36 - Completely restructured the internal listing functions, to make them more
37 standards-compliant and smaller. (-l and -F flags now supported, but not
39 - Implemented the APPE command, on user request.
40 - Minor speedups (and I do mean minor).
41 - The Makefile now uses CFLAGS in linking as well.
42 - Make an EXIT command (must be manually enabled -- NEVER use it on a
43 production machine, ANYONE will be able to halt your server!) to stop
44 the server -- useful for profiling, which requires an exit() to generate
45 profile data. (Be aware that gmon.out will be where the server last did
46 a chdir() to, though. In a debugging server, you'll know where that is
48 - Fixed a segfaulting bug in handling select() errors. The most common case
49 for this was at loads around 30-40 megabytes/sec :-)
50 - Fullscreen mode now looks OK for those with more than 80 columns too.
51 - Fixed some -pedantic warnings.
52 - Made mwrite() a function instead of just a #define (well, it's still a
53 define, but code is now shared), to save 30-40 bytes (and perhaps a
54 tiny bit of speed as well) :-)
55 - strip-exec now has a warning. In addition, it gives -D__OPTIMIZE_SIZE__
56 to keep glibc2 (libc6) from adding some inlines. It also kills
57 -fomit-frame-pointer. So now strip-exec gives a 20 kB executable instead
58 of 21 kB (one extra kB goes to new functionality) :-)
59 - Now strips out any non-ASCII chars from the commands (not any parameters),
60 to fix the ABOR problems.
61 - Documentation changes.
62 - MDTM and SIZE commands do no longer need read access (this is one of the
63 benefits of some modularization in the code). This is more in line with
64 other FTP servers' behaviour.
65 - Commented all the functions in cmds.c and ftpd.c, to make it easier to get
67 - Implemented the DELE, MKD, RMD, ABOR, REIN, ACCT, HELP and STAT commands. Note
68 that ABOR was previously noted as `fully RFC compliant', but due to an
69 error, it was not included until now.
70 - Added makefile dependencies.
71 - `make clean' and `make distclean' now also cleans up after `strip-exec'.
72 - NOOP can now be executed without the user being logged in.
73 - Fixed an autoconf bug, where --enable-shadow could sometimes be mistaken
75 - Fixed a stupid performance bug, which hit in on systems with slightly
76 lower MTUs than 1500 (actually some with 1500 as well) -- I was telling
77 the kernel _not_ to delay, and thus ended up sending out 12-byte packets
78 and other stupidness. BetaFTPD now uses TCP_CORK when available (read:
79 Linux 2.2.x and up, perhaps some 2.1.x kernels as well), which actually
80 makes it _better_ than wu-ftpd and most other implementations out there
81 (I believe those who use sendfile() also get this done right). BIG thanks
82 to Alan Cox for informing me of this flag, and to the rest of the
83 linux-kernel mailing list for being generally helpful.
84 - Fixed some bugs in getting the filesystem block size: Any value over 4096
85 would have segfaulted (rather unlikely on most systems). Any blocksize
86 over 4096 is now simply set to 4096. This value is customizable, by
87 changing MAX_BLOCK_SIZE in ftpd.h.
88 - accept() error handling should be more persistent now, before trying to
89 recreate the server socket.
90 - server_sock is now non-blocking, just in case.
91 - Changes (and ideas for changes) by Beau Kuiper <ekuiperba@cc.curtin.edu.au>:
92 Fixed an overflow bug (I'm unsure if this was exploitable or not), BetaFTPD
93 can now handle non-DES crypt()s and a minor optimization was made.
94 - Fixed a bug where listing would fail after uploading.
95 - A minor fix for fullscreen mode.
96 - non-DES crypt() is actually _working_ now (I hope)...
97 - Memory savings (and slight performance improvements) for non-fullscreen mode
98 (thanks to Ryan Cumming <bodnar42@bodnar42.dhs.org>).
99 - ASCII mode added, once again thanks to Beau Kuiper <ekuiperba@cc.curtin.edu.au>.
100 - SIZE is now disabled for ASCII mode, as the standards say we can't do an
102 - Fixes for 64-bit platforms.
103 - A patch for authentication, saving a few bytes per connection and removing crypt()
104 DES/non-DES problems for ever, by Beau Kuiper (I think you've got his e-mail
106 - More ftpext compliant REST code, together with some duplicate code removal.
107 - BetaFTPD no longer crashes if /usr/adm doesn't exist, and xferlog support
108 is enabled. Also, it will try /var/log before /usr/adm.
109 - Added CREDITS file.
110 - The entire do_download function was rewritten, which resulted in a much
111 smaller and simpler function. In the process, some bugs were also fixed.
112 - Fixed a bug, where nonroot users couldn't use PORT...
113 - Added a debugging version of the TRAP_ERROR macro.
114 - SO_LINGER is no longer set at all. This removes a major performance problem.
115 - fd -2 is no longer attempted closed.
116 - Sockets are now only checked for timeouts every minute (at most), which
117 can reduce spent CPU time a lot (with 200 clients connected, it used to
118 need 70-80% of the total CPU time for BetaFTPD, now it is close to zero).
119 - Closes fd 0 on startup.
120 - Now doesn't hang if fd 0 is assigned to server_sock (aaaaaaaargh).
121 - Linux sendfile() support (only for mmap()-able machines -- I don't think
122 any machine has sendfile() but not mmap()). Other systems will be added
124 - More FreeBSD fixes. sendfile() _soon_ works on FreeBSD :-)
126 - The reading of the control connection is now done with one syscall (recv)
127 instead of three (recv, ioctl, recv).
128 - More do_openfile() fixes, for lynx.
129 - The PASV socket is now set in listening mode _before_ announcing its
130 address and port number.
131 - Moved all documentation (except README) into a separate doc/ directory.
132 - The internal lister now prints years more according to POSIX (dates older
133 than 6 months or in the future are printed with years instead of
134 timestamps -- IMHO this is unneccessary, but it's nice to do the same
136 - ascii.h is now included (you could still compile ASCII support without
137 it, it just fixes some warnings) in the distribution.
138 - The internal ls now can cache the listings (--enable-dcache to configure).
139 Please see the README file for some problems that still exist. This
140 option requires quite a bit of code (1028 bytes compiled, on my
141 system), and some RAM for the directory listings and support structure.
142 I think, however, that the increased performance is worth it.
143 - The 64-bit check is dropped in favour of a simple truncate. Sorry, you
144 can't list files >2GB correctly anymore ;-)
145 - BetaFTPD can now use poll() if you have it. This removes the old 1024-
146 socket limit, as well as reducing the code size by 496 bytes (on my
148 - Many bugfixes and cleanups, by Dan Kegel (see CREDITS).
149 - Internal changes -- no more ugly `late freeing'.
150 - If you don't have list access and try to list, `permission denied' is
151 printed instead of the previous error message being repeated. (This is
152 actually a workaround for glob()'s weird error handling.)
153 - Uploading no longer gives weird permissions on the uploaded files.
154 - Listing a symbolic link now gives the attributes (especially size) of the
155 file itself, not the link. This is /bin/ls-incompatible, but can be useful
156 anyways, especially when it comes to anonymous FTP. (I can't think of any
157 real-life situations where it would break anything either.)
158 - You can no longer give a negative number to REST. (Thanks to Marten
159 <martbo@dds.nl> for bringing this bug to my attention.)
160 - Fixed a possible bug in the internal listing code, triggered only if listing
161 a file with a 16-character username.
162 - If a file in a directory can't be stat()'ed, the internal ls will continue
163 instead of just returning.
164 - #ifdef'ed out some recursion-specific code, since the internal ls doesn't
165 support recursion as a whole.
166 - Added renaming support. (Whee! Almost full RFC1123 compliance!)
167 - Changed all copyright strings to say `1999-2000' (well, it only got to
168 May 2000 before I remembered it...) instead of just `1999'.
169 - Changed the timeout value from a hardcoded number into a #define'd constant
171 - Even more recursive-listing code-outcommenting...
172 - Much of the linked list code is now reused, which saves 60-70 bytes and
173 increases code simplicity. A very positive side effect is that the dcache now
174 uses the same, bug-fixed linked list code as connections and file transfers.
175 - Fixed a few warnings in the configure program, and some in BetaFTPD itself.
176 - The poll() version now also closes standard input on startup (previously only the
177 select() version did).
178 - The code for accepting new clients has been moved into its own function.
179 - A new option, --enable-message, makes the server show info about README files,
180 as well as printing any .message or welcome.msg files that may be available.
181 (This is a quite standard function in other ftpds.)
182 - Fixed a bug that made shadow passwords not working at all (AGAIN!). Thanks
183 to Thor Bernhardsen <oscar@comports.com> for notifying me of this bug.
184 - The server didn't clean up connections properly on all errors -- fixed. This
185 led to all sorts of problems. Thanks to Andre Luiz dos Santos
186 <andre@netvision.com.br> for bringing this bug (and others, in fact, most of
187 those fixed in 0.0.8pre14 and 0.0.8pre15) to my attention.
188 - Fixed a compilation bug on machines without GLOB_NOMATCH defined.
189 - Fixed more ABOR bugs.
190 - Made a simple FTP server test suite (not included, since it's really not good
191 enough to live its own life as a standalone product), used in testing.
192 - Fixed a bug where multiple successful PORTs or PASVs would leave stale, unused
193 file descriptors that would never be cleaned up. (Well, previously multiple
194 PORTs wouldn't work at all -- again, thanks to Andre for mentioning this.)
195 - Sometimes, when using poll(), the highest-numbered fd would not be checked at
196 all, leaving a client just waiting for a reply.
197 - More RFC-compliant MKD handling.
198 - Removed a non-used variable (port_allocated) from ftpd.h. Also fixed some code
199 in cmd_pass() that could overwrite the last byte in that variable.
200 - Fixed a fatal PORT bug (I have no clue at all how this could have gone unnoticed --
201 that bug must have been there since 0.0.1, but probably not exposed until now
202 due to other smaller bugs (?)).
203 - BetaFTPD writes only to the logfile if it already exists now -- this is so you
204 can use --enable-xferlog and not create an xferlog file until you really need
205 logging. Thanks to kromJx <kromJx@crosswinds.net> for the idea.
206 - BetaFTPD now listens on port 21.
207 - Uploading mode made quicker, by eliminating a syscall. Uploading should be
208 optimal with respect to syscalls now (only a poll/select, a recv and a write
209 per loop iteration). This also reduces the code size by a few bytes.
210 - More improvements to upload code. Data received in an upload now goes to a
211 static buffer (which also has been shrunk) instead of to the stack.
212 - A fix for poll()-less system.
213 - Homepage moved to SourceForge (http://betaftpd.sourceforge.net/).