-*- indented-text -*-

FEATURES ------------------------------------------------------------
Use chroot only if supported
Allow supplementary groups in rsyncd.conf			2002/04/09
Handling IPv6 on old machines
Other IPv6 stuff
Add ACL support							2001/12/02
proxy authentication						2002/01/23
SOCKS								2002/01/23
FAT support
--diff						david.e.sewell	2002/03/15
Add daemon --no-fork option
Create more granular verbosity					2003/05/15

DOCUMENTATION --------------------------------------------------------
Keep list of open issues and todos on the web site
Perhaps redo manual as SGML

LOGGING --------------------------------------------------------------
Memory accounting
Improve error messages
Better statistics					Rasmus	2002/03/08
Perhaps flush stdout like syslog
Log child death on signal
verbose output					David Stein	2001/12/20
internationalization

DEVELOPMENT --------------------------------------------------------
Handling duplicate names
Use generic zlib						2002/02/25
TDB								2002/03/12
Splint								2002/03/12

PERFORMANCE ----------------------------------------------------------
Traverse just one directory at a time
Allow skipping MD4 file_sum					2002/04/08
Accelerate MD4

TESTING --------------------------------------------------------------
Torture test
Cross-test versions						2001/08/22
Test on kernel source
Test large files
Create mutator program for testing
Create configure option to enable dangerous tests
Create pipe program for testing
Create test makefile target for some tests

RELATED PROJECTS -----------------------------------------------------
rsyncsh
http://rsync.samba.org/rsync-and-debian/
rsyncable gzip patch
rsyncsplit as alternative to real integration with gzip?
reverse rsync over HTTP Range



FEATURES ------------------------------------------------------------


Use chroot only if supported

  If the platform doesn't support it, then don't even try.

  If running as non-root, then don't fail, just give a warning.
  (There was a thread about this a while ago?)

    http://lists.samba.org/pipermail/rsync/2001-August/thread.html
    http://lists.samba.org/pipermail/rsync/2001-September/thread.html

                      --          --


Allow supplementary groups in rsyncd.conf			2002/04/09

  Perhaps allow supplementary groups to be specified in rsyncd.conf;
  then make the first one the primary gid and all the rest be
  supplementary gids.

                      --          --


Handling IPv6 on old machines

  The KAME IPv6 patch is nice in theory but has proved a bit of a
  nightmare in practice.  The basic idea of their patch is that rsync
  is rewritten to use the new getaddrinfo()/getnameinfo() interface,
  rather than gethostbyname()/gethostbyaddr() as in rsync 2.4.6.
  Systems that don't have the new interface are handled by providing
  our own implementation in lib/, which is selectively linked in.

  The problem with this is that it is really hard to get right on
  platforms that have a half-working implementation, so redefining
  these functions clashes with system headers, and leaving them out
  breaks.  This affects at least OSF/1, RedHat 5, and Cobalt, which
  are moderately improtant.

  Perhaps the simplest solution would be to have two different files
  implementing the same interface, and choose either the new or the
  old API.  This is probably necessary for systems that e.g. have
  IPv6, but gethostbyaddr() can't handle it.  The Linux manpage claims
  this is currently the case.

  In fact, our internal sockets interface (things like
  open_socket_out(), etc) is much narrower than the getaddrinfo()
  interface, and so probably simpler to get right.  In addition, the
  old code is known to work well on old machines.

  We could drop the rather large lib/getaddrinfo files.

                      --          --


Other IPv6 stuff
  
  Implement suggestions from http://www.kame.net/newsletter/19980604/
  and ftp://ftp.iij.ad.jp/pub/RFC/rfc2553.txt

  If a host has multiple addresses, then listen try to connect to all
  in order until we get through.  (getaddrinfo may return multiple
  addresses.)  This is kind of implemented already.

  Possibly also when starting as a server we may need to listen on
  multiple passive addresses.  This might be a bit harder, because we
  may need to select on all of them.  Hm.

                      --          --


Add ACL support							2001/12/02

  Transfer ACLs.  Need to think of a standard representation.
  Probably better not to even try to convert between NT and POSIX.
  Possibly can share some code with Samba.
  NOTE: there is a patch that implements this in the "patches" subdir.

                      --          --


proxy authentication						2002/01/23

  Allow RSYNC_PROXY to be http://user:pass@proxy.foo:3128/, and do
  HTTP Basic Proxy-Authentication.

  Multiple schemes are possible, up to and including the insanity that
  is NTLM, but Basic probably covers most cases.

                      --          --


SOCKS								2002/01/23

  Add --with-socks, and then perhaps a command-line option to put them
  on or off.  This might be more reliable than LD_PRELOAD hacks.

                      --          --


FAT support

  rsync to a FAT partition on a Unix machine doesn't work very well at
  the moment.  I think we get errors about invalid filenames and
  perhaps also trying to do atomic renames.

  I guess the code to do this is currently #ifdef'd on Windows;
  perhaps we ought to intelligently fall back to it on Unix too.

                      --          --


--diff						david.e.sewell	2002/03/15

  Allow people to specify the diff command.  (Might want to use wdiff,
  gnudiff, etc.)

  Just diff the temporary file with the destination file, and delete
  the tmp file rather than moving it into place.

  Interaction with --partial.

  Security interactions with daemon mode?

                      --          --


Add daemon --no-fork option

  Very useful for debugging.  Also good when running under a
  daemon-monitoring process that tries to restart the service when the
  parent exits.

                      --          --


Create more granular verbosity					2003/05/15

  Control output with the --report option.

  The option takes as a single argument (no whitespace) a
  comma delimited lists of keywords.

  This would separate debugging from "logging" as well as
  fine grained selection of statistical reporting and what
  actions are logged.

  http://lists.samba.org/archive/rsync/2003-May/006059.html

                      --          --

DOCUMENTATION --------------------------------------------------------


Keep list of open issues and todos on the web site

                      --          --


Perhaps redo manual as SGML

  The man page is getting rather large, and there is more information
  that ought to be added.

  TexInfo source is probably a dying format.

  Linuxdoc looks like the most likely contender.  I know DocBook is
  favoured by some people, but it's so bloody verbose, even with emacs
  support.

                      --          --

LOGGING --------------------------------------------------------------


Memory accounting

  At exit, show how much memory was used for the file list, etc.

  Also we do a wierd exponential-growth allocation in flist.c.  I'm
  not sure this makes sense with modern mallocs.  At any rate it will
  make us allocate a huge amount of memory for large file lists.

                      --          --


Improve error messages

  If we hang or get SIGINT, then explain where we were up to.  Perhaps
  have a static buffer that contains the current function name, or
  some kind of description of what we were trying to do.  This is a
  little easier on people than needing to run strace/truss.

  "The dungeon collapses!  You are killed."  Rather than "unexpected
  eof" give a message that is more detailed if possible and also more
  helpful.

  If we get an error writing to a socket, then we should perhaps
  continue trying to read to see if an error message comes across
  explaining why the socket is closed.  I'm not sure if this would
  work, but it would certainly make our messages more helpful.

  What happens if a directory is missing -x attributes.  Do we lose
  our load?  (Debian #28416) Probably fixed now, but a test case would
  be good.

                      --          --


Better statistics					Rasmus	2002/03/08

  <Rasmus>
      hey, how about an rsync option that just gives you the
      summary without the list of files?  And perhaps gives
      more information like the number of new files, number
      of changed, deleted, etc. ?

  <mbp>
      nice idea there is --stats but at the moment it's very
      tridge-oriented rather than user-friendly it would be
      nice to improve it that would also work well with
      --dryrun

                      --          --


Perhaps flush stdout like syslog

  Perhaps flush stdout after each filename, so that people trying to
  monitor progress in a log file can do so more easily.  See
  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=48108

                      --          --


Log child death on signal

  If a child of the rsync daemon dies with a signal, we should notice
  that when we reap it and log a message.

                      --          --


verbose output					David Stein	2001/12/20
  
  At end of transfer, show how many files were or were not transferred
  correctly.

                      --          --


internationalization

  Change to using gettext().  Probably need to ship this for platforms
  that don't have it.

  Solicit translations.

  Does anyone care?  Before we bother modifying the code, we ought to
  get the manual translated first, because that's possibly more useful
  and at any rate demonstrates desire.

                      --          --

DEVELOPMENT --------------------------------------------------------

Handling duplicate names

  Some folks would like rsync to be deterministic in how it handles
  duplicate names that come from mering multiple source directories
  into a single destination directory; e.g. the last name wins.  We
  could do this by switching our sort algorithm to one that will
  guarantee that the names won't be reordered.  Alternately, we could
  assign an ever-increasing number to each item as we insert it into
  the list and then make sure that we leave the largest number when
  cleaning the file list (see clean_flist()).  Another solution would
  be to add a hash table, and thus never put any duplicate names into
  the file list (and bump the protocol to handle this).

                      --          --


Use generic zlib						2002/02/25

  Perhaps don't use our own zlib.

  Advantages:
   
    - will automatically be up to date with bugfixes in zlib

    - can leave it out for small rsync on e.g. recovery disks

    - can use a shared library

    - avoids people breaking rsync by trying to do this themselves and
      messing up

  Should we ship zlib for systems that don't have it, or require
  people to install it separately?

  Apparently this will make us incompatible with versions of rsync
  that use the patched version of rsync.  Probably the simplest way to
  do this is to just disable gzip (with a warning) when talking to old
  versions.

                      --          --


Splint								2002/03/12

  Build rsync with SPLINT to try to find security holes.  Add
  annotations as necessary.  Keep track of the number of warnings
  found initially, and see how many of them are real bugs, or real
  security bugs.  Knowing the percentage of likely hits would be
  really interesting for other projects.

                      --          --

PERFORMANCE ----------------------------------------------------------

Allow skipping MD4 file_sum					2002/04/08

  If we're doing a local transfer, or using -W, then perhaps don't
  send the file checksum.  If we're doing a local transfer, then
  calculating MD4 checksums uses 90% of CPU and is unlikely to be
  useful.

  We should not allow it to be disabled separately from -W, though
  as it is the only thing that lets us know when the rsync algorithm
  got out of sync and messed the file up (i.e. if the basis file
  changed between checksum generation and reception).

                      --          --


Accelerate MD4

  Perhaps borrow an assembler MD4 from someone?

  Make sure we call MD4 with properly-sized blocks whenever possible
  to avoid copying into the residue region?

                      --          --

TESTING --------------------------------------------------------------

Torture test

  Something that just keeps running rsync continuously over a data set
  likely to generate problems.

                      --          --


Cross-test versions						2001/08/22

  Part of the regression suite should be making sure that we
  don't break backwards compatibility: old clients vs new
  servers and so on.  Ideally we would test both up and down
  from the current release to all old versions.

  Run current rsync versions against significant past releases.

  We might need to omit broken old versions, or versions in which
  particular functionality is broken

  It might be sufficient to test downloads from well-known public
  rsync servers running different versions of rsync.  This will give
  some testing and also be the most common case for having different
  versions and not being able to upgrade.

  The new --protocol option may help in this.

                      --          --


Test on kernel source

  Download all versions of kernel; unpack, sync between them.  Also
  sync between uncompressed tarballs.  Compare directories after
  transfer.

  Use local mode; ssh; daemon; --whole-file and --no-whole-file.

  Use awk to pull out the 'speedup' number for each transfer.  Make
  sure it is >= x.

                      --          --


Test large files

  Sparse and non-sparse

                      --          --


Create mutator program for testing

  Insert bytes, delete bytes, swap blocks, ...

                      --          --


Create configure option to enable dangerous tests

                      --          --


Create pipe program for testing

  Create pipe program that makes slow/jerky connections for
  testing Versions of read() and write() that corrupt the
  stream, or abruptly fail

                      --          --


Create test makefile target for some tests

  Separate makefile target to run rough tests -- or perhaps
  just run them every time?

                      --          --

RELATED PROJECTS -----------------------------------------------------

rsyncsh

   Write a small emulation of interactive ftp as a Pythonn program
   that calls rsync.  Commands such as "cd", "ls", "ls *.c" etc map
   fairly directly into rsync commands: it just needs to remember the
   current host, directory and so on.  We can probably even do
   completion of remote filenames.

                      --          --


http://rsync.samba.org/rsync-and-debian/


                      --          --


rsyncable gzip patch

  Exhaustive, tortuous testing

  Cleanups?

                      --          --


rsyncsplit as alternative to real integration with gzip?

                      --          --


reverse rsync over HTTP Range

  Goswin Brederlow suggested this on Debian; I think tridge and I
  talked about it previous in relation to rproxy.

  Addendum:  It looks like someone is working on a version of this:

    http://zsync.moria.org.uk/

                      --          --

