Since my editor writes downward this Changes file is written downward, too, i.e. the latest change is noticed in the last paragraph.

Version 0.2.7

The first version was released on 1996-09-01.

Version 0.4.X

A quite small bug was detected. But to fix this bug meant to make this version incompatible with all minor versions. pftp is now able to send/receive directories recursively. pftp can send standard input on origin host to standard output on destination host.

Version 0.5.X

Since the client reconnected to the server every time it sent a file, the whole program was revised in order to send all files / directories within the same connection. The increase of velocity was incredible! Next the mechanism of logging all errors has been included, a manual page was written, and hopefully all bugs have been fixed ;^)
Option handling was much improved: now options may be given as you want as long as they are given behind the port number, if there is any, and before the host name, if there is any given by name and not by number. Improvement of the interactive handling with existing files implied to deal with the tty modes. Introducing a new feature: a resource file is read in, if it exists: The default port number is taken from the resource files, but can be overwritten with a given port number on command line.

Version 0.6.X

The Makefile was then simplified: the Macro CDEF2=-DCTLC is now, hopefully correct, automaticly recognized.
The source file system was rearranged in order to get a better overview. Bug fixing.
The buffer size is set to zero for standard input/output. The listing was a little bit fastened using some vt100 compatible settings. In order to have a little more security I introduce a mechanism that allows the server to accept specified clients only(see option '-c').
This is the break through for pftp! pftp is now able to filter all files before sending them over the network, i.e. you may use a compression program or an encryption program or what ever you like. :)
Adding the ability to send the rest of a file (see option '-o'). Now pftp shows some statistic when files are received.

Version 0.7.X

The server was modified in order to receive more than one file at once. Since the server has to create a new subprocess for each connection the load average increased. Thus made it necessary to find a more convenient way to handle it. Introducing POSIX Threads was the best way.
pftp is slightly faster than ftp--if compiled with USE_POSIX_THREAD and files are sent without a compression filter. The socket buffer size is adjusted to each file before the file is sent--which increased the velocity once more and reduced the lack.
Option `-b' controls the net buffer size manually when stdin is sent. This increases the velocity when sending data from stdin. `-c' had a little bug when specifying multiple hosts. This was fixed now.
Ported pftp to FreeBSD. By now pftp runs on many Un*xes like AIX, FreeBSD (new), IRIX, Linux, NEXTSTEP, SunOS and ULTRIX. Variables may also be set in the resource file after the first line and before the host name list. All lines beginning with a hash or new line character are ignored now.
Added some more error checking and fixed some bugs. Since the statistical values were incorrect, there is now only an overall statistical output for a connection.
Option `-B' is an alias to `-b32767'. Ported pftp to HP-UX. Added silent mode with `-q' which enables pftp to run from shell skripts and the like.

Version 0.8.X

Since normal ftp rarely offers a chance to transfer files compressed or encrypted and even not to transfer directories, I added to pftp a capability to be started by inetd with `-i'. pftp may also run as a daemon with `-d' started by a normal user or by root. The destination directory and the filter programm if any is chosen by the client. Files and directories may also be uploaded in a directory that is set by `PFTPRECEIVE' from any user with `-n'. The maximum amount of bytes in that directory is given by `PFTPUPLIMIT'. If `PFTPRECEIVE' is not set no data can be uploaded.
The via `-n' uploaded files and directories may be saved with the simple pftp file and directory manager. Also a message file and a subject line can be added to the files with the client. The message file name can be given on command line or the file can interactively be edited with an editor specified by PFTPEDITOR. Files in the upload directory can be viewed with the internal pftp pager or an external pager specified by PFTPPAGER.
The maximum package size can now manually be given with the variable PFTPNETBUF.
Added optional sorting order within the pfm. You may peek for new data in the upload directory with option `-N'.
Ported pftp to unicos. pftp was ported to OpenBSD (see CREDITS file). Bandwith may be set with `-W' given by variable PFTPBANDWID. Fixed a bug caused by an unreachable nameserver which resulted in segmentation fault. Port to OSF1. Fixed the Zombie-Bug on FreeBSD completely and on SunOS partially.
The host name on command line may look like a host name list entry without the following port number. If it contains a user name pftp contacts the remote's pftp server started by inetd.
Added a patch for the Makefile which is necessary for the latest RedHat Linux version. Added a patch for glibc2.1 which is necessary for 'other' Linux architectures like Sparc. This patch was produced by Christian Meder (see CREDITS).
File names may now be read from stdin using option `-j'. Fixed a service denial bug which occured when a user send an empty file.

Version 0.9.X

If no pftp resource files exists pftp may create one if the user agrees. Symbolic link names may be written to a script which is sent after all files have been sent. The script is a normal shell script. Now the value for the bandwidth and the send resp. receive buffer size can be given along with the options on command line. Made pftp fit for its front end. Though there is no front end by now. Added the capability to perform a tcp based network performance test. Introduced support for the next Internet protocol IPv6. Restructured the whole program a little bit to gain more speed. `-v' outputs buffer sizes. Former `-o' is now `-a' whereas `-o' now means to allow only one connection at a time.
In order to send AUDIO and VIDEO streams over the net I developed a code fragment to support sending datagrams, i.e. udps. On Linux it is posible to interactively increase or decrease the bandwidth, interactively drop datagrams periodically, and turn on and off of displaying the number of bytes received. The network performance test can also be done based on udp. The bandwidth checking mechanism was improved. Now the daemon no longer accepts streams since the size of files is just checked once. The client gets the timing info from the server. What is a program capable of sending and receiving UDP datagrams if it could not send and receive multicasted datagrams? Well, pftp is able to send and receive multicasted datagrams now. Changed the default port for `-n' to 26 since it is unassigned. Now the Solaris binary works fine.

Version 1.0.X

Made extensive tests on most supported platforms and decided to release now version 1 of pftp. Fixed a bug that occured on SunOS 4.1.x when sending datagrams and added a little more error handlings. Fixed a bug which occured when stopping and continuing UDP datagrams. The POSIX thread version exited with segmentation fault when more than three client were connected at once. Fixed the zombie bug on SunOS 4.1.x. pftp now offers the possibility to specify the maximum number of accepted clients on command line. Improved signal handling and included more error handling. Fixed a bug in the daemon which occured when sending filtered data followed by not filtered data. Fixed a bug that occured when pftp asks for overwrite. Implemented a simple mechanism to determine the avarage bitrate of mpeg audio files. For UDP based data transfer on Linux files may be skipped by typing `n'. PFTPAUSER may be used to set an alias name for a login name. pftp may change to a different directory before receiving data. Fixed a bug that occured when reading file and directory names from standard input(`-j'). Improved pfm's handling of incoming data. Found and fixed a security hole--sorry, my fault! Switch to a complete low level I/O mechanism for data transfer. This reduces usage of system resources. Made pftp's daemon and server much more stable to be an alternative for an ftp upload directory. Improved sending and pfm's handling of the additional message file. Fixed a timing bug and some minor bugs too. Now it is possible to send just a message without files.
pftp has now 662 as its officially assigned system port. This was possible due to the nice people from the Internet Assigned Numbers Authority (IANA). Updated the source code and the manual page accordingly.
Made a small work around a bug in FreeBSD which caused an ugly file listing in the pfm.
Fixed a bug that occured when sending files recursively and another that occured when sending in quiet mode.
Accepted host names are converted to numbers-and-dots notation to be compared with remote host IPs in numbers-and-dots notation. Furthermore you can specify nets in numbers-and-dots notation from which hosts are to be accepted. Introduced a mechanism of host name specific variable checking. Environment variables can be set for the filter program via PFTPCFVARnum respectively PFTPSFVARnum. Corrected some mistakes in the manual and added new ones.

Version 1.1.X

Option `-nl' can be used to browse through the different upload directories. Option `-N[NUM]' is useful to peek for new data in the different upload directories. Added different return statuses in order to let pftp be more manageable for scripts using it. Since chdir() is not thread safe at the moment I created a work around. Added an interactive help for the internal pager which is called by typing `?'. Exchanged initgroups() with setgroups() since memory was not freed after the process exited. New files can optionally automatically be renamed if there are already existing files with the same names. The net performance test can now be done with random character strings. Option `-I' can be used to copy directory permissions, the user and the group ids, and the time of last modification of files and directories as long as the remote server supports it (> version 1.1.0); otherwise `-I' it is just ignored. To use `-I' by default the variable PFTPSINFO can be set. If PFTPAINFO is set to `0' the file information being sent is ignored by the daemon on the server side.
There was a bug which prevented the pfm from listing directories with more than 126 entries. This was fixed and in addition the number of the current file is displayed now in the lower left corner. Another bug that caused incompatibility of `-T' with `R' was fixed. Improved calculation of the maximum upload limit. Setting PFTPUPLIMIT to zero means that the upload limit is limited to the size of your hard disk space. Setting PFTPPERCENT to one will permanently show the number of bytes sent to the local network device. Fixed a bug that occurred when creating a new resource file.
Fixed a bug that occured if pftp was just started with option `-M'. Since glibc 2.1 is IPv6 capable I adjusted the Makefile. Changed the comparison mechanism of IP numbers a little bit. Added some more helpful error handling. Made some adjustments for Gigabit Ethernet links. I managed to make the source code compilable with the cygwin package.
Made some adjustments for kpftp, which is a KDE frontend for pftp's TCP based client features.
Removed a bug that prevents you from compiling pftp on non-IPv6 systems.
Fixed a minor bug that results in a wrong default port number under some complex conditions. Fixed a bug that caused malfunctioning on the Linux operating system when using option `-aNUM': introducing `sendfile' the file offset had not been correctly adjusted. Substituted bubble sort with quick sort within the pfm. Now pftp also supports long files on the Linux operating system if the kernel supports it too. Function sending() is no longer called recursively because glibc's POSIX threads are unfortunately still too unstable. Changed the mechanism of calculating the random string. Thus it is now for times faster using a new random string for every loop.