75d4e56a08f35f501758cfeac3a62896c5eb6308
[rsync/rsync.git] / TODO
1 -*- indented-text -*-
2
3 URGENT ---------------------------------------------------------------
4
5
6 IMPORTANT ------------------------------------------------------------
7
8 Cross-test versions
9
10   Part of the regression suite should be making sure that we don't
11   break backwards compatibility: old clients vs new servers and so
12   on.  Ideally we would test the cross product of versions.  
13
14   It might be sufficient to test downloads from well-known public
15   rsync servers running different versions of rsync.  This will give
16   some testing and also be the most common case for having different
17   versions and not being able to upgrade.
18
19 use chroot
20
21   If the platform doesn't support it, then don't even try.
22
23   If running as non-root, then don't fail, just give a warning.
24   (There was a thread about this a while ago?)
25
26     http://lists.samba.org/pipermail/rsync/2001-August/thread.html
27     http://lists.samba.org/pipermail/rsync/2001-September/thread.html
28
29 --files-from
30
31   Avoids traversal.  Better option than a pile of --include statements
32   for people who want to generate the file list using a find(1)
33   command or a script.
34
35 Performance
36
37   Traverse just one directory at a time.  Tridge says it's possible.
38
39   At the moment rsync reads the whole file list into memory at the
40   start, which makes us use a lot of memory and also not pipeline
41   network access as much as we could.
42
43 Memory accounting
44
45   At exit, show how much memory was used for the file list, etc.
46
47 Hard-link handling
48
49   At the moment hardlink handling is very expensive, so it's off by
50   default.  It does not need to be so.  
51
52   We can rule out hardlinked directories since they will probably
53   screw us up in all kinds of ways.  They simply should not be used.
54
55   At the moment rsync only cares about hardlinks to regular files.  I
56   guess you could also use them for sockets, devices and other beasts,
57   but I have not seen them.
58
59   When trying to reproduce hard links, we only need to worry about
60   files that have more than one name (nlinks>1 && !S_ISDIR). 
61
62   The basic point of this is to discover alternate names that refer to
63   the same file.  All operations, including creating the file and
64   writing modifications to it need only to be done for the first name.
65   For all later names, we just create the link and then leave it
66   alone.
67
68   If hard links are to be preserved:
69
70     Before the generator/receiver fork, the list of files is received
71     from the sender (recv_file_list), and a table for detecting hard
72     links is built.
73
74     The generator looks for hard links within the file list and does
75     not send checksums for them, though it does send other metadata.
76
77     The sender sends the device number and inode with file entries, so
78     that files are uniquely identified.
79
80     The receiver goes through and creates hard links (do_hard_links)
81     after all data has been written, but before directory permissions
82     are set.
83
84   At the moment device and inum are sent as 4-byte integers, which
85   will probably cause problems on large filesystems.  On Linux the
86   kernel uses 64-bit ino_t's internally, and people will soon have
87   filesystems big enough to use them.  We ought to follow NFS4 in
88   using 64-bit device and inode identification, perhaps with a
89   protocol version bump.
90
91   Once we've seen all the names for a particular file, we no longer
92   need to think about it and we can deallocate the memory.
93
94   We can also have the case where there are links to a file that are
95   not in the tree being transferred.  There's nothing we can do about
96   that.  Because we rename the destination into place after writing,
97   any hardlinks to the old file are always going to be orphaned.  In
98   fact that is almost necessary because otherwise we'd get really
99   confused if we were generating checksums for one name of a file and
100   modifying another.
101
102   At the moment the code seems to make a whole second copy of the file
103   list, which seems unnecessary.
104
105   We should have a test case that exercises hard links.  Since it
106   might be hard to compare ./tls output where the inodes change we
107   might need a little program to check whether several names refer to
108   the same file.
109
110 IPv6
111
112   Implement suggestions from http://www.kame.net/newsletter/19980604/
113   and ftp://ftp.iij.ad.jp/pub/RFC/rfc2553.txt
114
115   If a host has multiple addresses, then listen try to connect to all
116   in order until we get through.  (getaddrinfo may return multiple
117   addresses.)  This is kind of implemented already.
118
119   Possibly also when starting as a server we may need to listen on
120   multiple passive addresses.  This might be a bit harder, because we
121   may need to select on all of them.  Hm.
122
123   Define a syntax for IPv6 literal addresses.  Since they include
124   colons, they tend to break most naming systems, including ours.
125   Based on the HTTP IPv6 syntax, I think we should use
126  
127      rsync://[::1]/foo/bar
128      [::1]::bar
129
130   which should just take a small change to the parser code.
131
132 Errors
133
134   If we hang or get SIGINT, then explain where we were up to.  Perhaps
135   have a static buffer that contains the current function name, or
136   some kind of description of what we were trying to do.  This is a
137   little easier on people than needing to run strace/truss.
138
139   "The dungeon collapses!  You are killed."  Rather than "unexpected
140   eof" give a message that is more detailed if possible and also more
141   helpful.  
142
143 File attributes
144
145   Device major/minor numbers should be at least 32 bits each.  See
146   http://lists.samba.org/pipermail/rsync/2001-November/005357.html
147
148   Transfer ACLs.  Need to think of a standard representation.
149   Probably better not to even try to convert between NT and POSIX.
150   Possibly can share some code with Samba.
151
152 Empty directories
153
154   With the current common --include '*/' --exclude '*' pattern, people
155   can end up with many empty directories.  We might avoid this by
156   lazily creating such directories.
157
158 zlib
159
160   Perhaps don't use our own zlib.  Will we actually be incompatible,
161   or just be slightly less efficient?
162
163 logging
164
165   Perhaps flush stdout after each filename, so that people trying to
166   monitor progress in a log file can do so more easily.  See
167   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=48108
168
169 rsyncd over ssh
170
171   There are already some patches to do this.
172
173 PLATFORMS ------------------------------------------------------------
174
175 Win32
176
177   Don't detach, because this messes up --srvany.
178
179   http://sources.redhat.com/ml/cygwin/2001-08/msg00234.html
180
181   According to "Effective TCP/IP Programming" (??) close() on a socket
182   has incorrect behaviour on Windows -- it sends a RST packet to the
183   other side, which gives a "connection reset by peer" error.  On that
184   platform we should probably do shutdown() instead.  However, on Unix
185   we are correct to call close(), because shutdown() discards
186   untransmitted data.
187
188 DOCUMENTATION --------------------------------------------------------
189
190 Update README
191
192 BUILD FARM -----------------------------------------------------------
193
194 Add machines
195
196   AMDAHL UTS (Dave Dykstra)
197
198   Cygwin (on different versions of Win32?)
199
200   HP-UX variants (via HP?)
201
202   SCO
203
204 NICE -----------------------------------------------------------------
205
206 SIGHUP
207
208   Re-read config file (just exec() ourselves) rather than exiting.
209
210 --no-detach and --no-fork options
211
212   Very useful for debugging.  Also good when running under a
213   daemon-monitoring process that tries to restart the service when the
214   parent exits.
215
216 hang/timeout friendliness
217
218   On 
219
220 verbose output
221   
222   Indicate whether files are new, updated, or deleted
223
224 internationalization
225
226   Change to using gettext().  Probably need to ship this for platforms
227   that don't have it.  
228
229   Solicit translations.
230
231   Does anyone care?
232
233 rsyncsh 
234
235    Write a small emulation of interactive ftp as a Pythonn program
236    that calls rsync.  Commands such as "cd", "ls", "ls *.c" etc map
237    fairly directly into rsync commands: it just needs to remember the
238    current host, directory and so on.  We can probably even do
239    completion of remote filenames.
240