mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-05-27 08:22:52 -04:00
Compare commits
123 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16b49716d5 | ||
|
|
58faa1e8b9 | ||
|
|
9250e9ac23 | ||
|
|
3623d94fe7 | ||
|
|
cbc42b9c16 | ||
|
|
6ff5824c25 | ||
|
|
32de6b7cb4 | ||
|
|
bb853b3205 | ||
|
|
cce44865c1 | ||
|
|
1983198097 | ||
|
|
2a7355fb56 | ||
|
|
3da1dc4d18 | ||
|
|
abfb41e63e | ||
|
|
9d1cd2437c | ||
|
|
f8d2ecd223 | ||
|
|
453914e35b | ||
|
|
3f26e38f86 | ||
|
|
81d1ca0683 | ||
|
|
289ccbd02f | ||
|
|
85d3877be9 | ||
|
|
e203245d76 | ||
|
|
dfbcc4f7ec | ||
|
|
0bcb8b639a | ||
|
|
77f750f167 | ||
|
|
23afe20780 | ||
|
|
e12a6c087c | ||
|
|
6feb7d37df | ||
|
|
81ff413bb0 | ||
|
|
eac858085e | ||
|
|
2ac35b4507 | ||
|
|
3bc319766d | ||
|
|
a689fb1f5f | ||
|
|
b560a96b2c | ||
|
|
51e3c3da85 | ||
|
|
461086bbe7 | ||
|
|
00694610a6 | ||
|
|
8e3a6db842 | ||
|
|
8354cad53e | ||
|
|
317a0e8ca5 | ||
|
|
066ad8c719 | ||
|
|
ec4f644d2f | ||
|
|
4bf342c60f | ||
|
|
a2f733c664 | ||
|
|
3ea74eb388 | ||
|
|
962f8b9004 | ||
|
|
ae189e18de | ||
|
|
5b34561cf7 | ||
|
|
5546dab329 | ||
|
|
6128f56694 | ||
|
|
743f5a30d5 | ||
|
|
a955e93316 | ||
|
|
aca7dd3bff | ||
|
|
bc55aa04df | ||
|
|
f438d5abe0 | ||
|
|
6fe798392b | ||
|
|
6ceb9ea012 | ||
|
|
6900d35cce | ||
|
|
7cb0de6326 | ||
|
|
61e74afc42 | ||
|
|
0466e46b9f | ||
|
|
aa4c6db043 | ||
|
|
edb0d9c792 | ||
|
|
6ffd8f2169 | ||
|
|
ba43e88527 | ||
|
|
ff08acd4f2 | ||
|
|
03bb593f81 | ||
|
|
4c8eb5f951 | ||
|
|
f491d17352 | ||
|
|
288e64a79f | ||
|
|
0872dff60c | ||
|
|
3ce7a65c11 | ||
|
|
de8ec0b309 | ||
|
|
677c6e14cc | ||
|
|
7665ba5b36 | ||
|
|
adc600cbe2 | ||
|
|
43d6d0c5ba | ||
|
|
22a3ac0b55 | ||
|
|
1524c2e5c7 | ||
|
|
0dedfbce2c | ||
|
|
4cad402ea8 | ||
|
|
306d112730 | ||
|
|
371242e4e8 | ||
|
|
e1bfdf67f3 | ||
|
|
3fe686b577 | ||
|
|
783611707b | ||
|
|
cd909fde87 | ||
|
|
4dfe7c9f3e | ||
|
|
7fb4c08c24 | ||
|
|
8946cfc6f8 | ||
|
|
dfa5b49110 | ||
|
|
1bf6203616 | ||
|
|
a3f852bd78 | ||
|
|
72e7fb5b92 | ||
|
|
740551d657 | ||
|
|
a106ed78d5 | ||
|
|
bba31ddf12 | ||
|
|
31825a94b3 | ||
|
|
5dcef7c6dd | ||
|
|
72e0c45078 | ||
|
|
0593471e99 | ||
|
|
1b29458ea4 | ||
|
|
d3414a7d23 | ||
|
|
9e2e7a1b2d | ||
|
|
d34eaa8183 | ||
|
|
b4ea93c676 | ||
|
|
6df5d81ce2 | ||
|
|
0e3152febd | ||
|
|
e9398b1dc5 | ||
|
|
83792c1cbf | ||
|
|
32540aa091 | ||
|
|
836e0c5df4 | ||
|
|
2cd87086f0 | ||
|
|
eaa4e2d1ee | ||
|
|
e461cefbab | ||
|
|
18217a94c4 | ||
|
|
090ef59b29 | ||
|
|
708db6f772 | ||
|
|
63f9197611 | ||
|
|
f643330eb1 | ||
|
|
bc0d094d2a | ||
|
|
64dff88db9 | ||
|
|
637ebad048 | ||
|
|
487bf9290c |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -12,6 +12,7 @@ config.h.in
|
||||
config.h.in.old
|
||||
config.log
|
||||
config.status
|
||||
aclocal.m4
|
||||
/proto.h
|
||||
/proto.h-tstamp
|
||||
/rsync.1
|
||||
@@ -44,3 +45,4 @@ config.status
|
||||
/testsuite/devices-fake.test
|
||||
/testsuite/xattrs-hlink.test
|
||||
/patches
|
||||
.deps
|
||||
|
||||
27
Makefile.in
27
Makefile.in
@@ -14,6 +14,7 @@ CFLAGS=@CFLAGS@
|
||||
CPPFLAGS=@CPPFLAGS@
|
||||
EXEEXT=@EXEEXT@
|
||||
LDFLAGS=@LDFLAGS@
|
||||
LIBOBJDIR=lib/
|
||||
|
||||
INSTALLCMD=@INSTALL@
|
||||
INSTALLMAN=@INSTALL@
|
||||
@@ -28,7 +29,7 @@ VERSION=@RSYNC_VERSION@
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .o
|
||||
|
||||
GENFILES=configure.sh config.h.in proto.h proto.h-tstamp rsync.1 rsyncd.conf.5
|
||||
GENFILES=configure.sh aclocal.m4 config.h.in proto.h proto.h-tstamp rsync.1 rsyncd.conf.5
|
||||
HEADERS=byteorder.h config.h errcode.h proto.h rsync.h ifuncs.h itypes.h inums.h \
|
||||
lib/pool_alloc.h
|
||||
LIBOBJ=lib/wildmatch.o lib/compat.o lib/snprintf.o lib/mdfour.o lib/md5.o \
|
||||
@@ -74,12 +75,12 @@ install: all
|
||||
|
||||
install-ssl-client: rsync-ssl stunnel-rsync
|
||||
-${MKDIR_P} ${DESTDIR}${bindir}
|
||||
${INSTALLCMD} ${INSTALL_STRIP} -m 755 rsync-ssl ${DESTDIR}${bindir}
|
||||
${INSTALLCMD} ${INSTALL_STRIP} -m 755 stunnel-rsync ${DESTDIR}${bindir}
|
||||
${INSTALLCMD} -m 755 rsync-ssl ${DESTDIR}${bindir}
|
||||
${INSTALLCMD} -m 755 stunnel-rsync ${DESTDIR}${bindir}
|
||||
|
||||
install-ssl-daemon: stunnel-rsyncd.conf
|
||||
-${MKDIR_P} ${DESTDIR}/etc/stunnel
|
||||
${INSTALLCMD} ${INSTALL_STRIP} -m 644 stunnel-rsyncd.conf ${DESTDIR}/etc/stunnel/rsyncd.conf
|
||||
${INSTALLCMD} -m 644 stunnel-rsyncd.conf ${DESTDIR}/etc/stunnel/rsyncd.conf
|
||||
@if ! ls /etc/rsync-ssl/certs/server.* >/dev/null 2>/dev/null; then \
|
||||
echo "Note that you'll need to install the certificate used by /etc/stunnel/rsyncd.conf"; \
|
||||
fi
|
||||
@@ -138,11 +139,14 @@ t_unsafe$(EXEEXT): $(T_UNSAFE_OBJ)
|
||||
gen: conf proto.h man
|
||||
|
||||
gensend: gen
|
||||
rsync -aivzc $(GENFILES) samba.org:/home/ftp/pub/rsync/generated-files/
|
||||
rsync -aivzc $(GENFILES) $${SAMBA_HOST-samba.org}:/home/ftp/pub/rsync/generated-files/
|
||||
|
||||
conf:
|
||||
cd $(srcdir) && $(MAKE) -f prepare-source.mak conf
|
||||
|
||||
aclocal.m4: $(srcdir)/m4/*.m4
|
||||
aclocal -I $(srcdir)/m4
|
||||
|
||||
configure.sh config.h.in: configure.ac aclocal.m4
|
||||
@if test -f configure.sh; then cp -p configure.sh configure.sh.old; else touch configure.sh.old; fi
|
||||
@if test -f config.h.in; then cp -p config.h.in config.h.in.old; else touch config.h.in.old; fi
|
||||
@@ -303,21 +307,10 @@ installcheck: $(CHECK_PROGS) $(CHECK_SYMLINKS)
|
||||
splint:
|
||||
splint +unixlib +gnuextensions -weak rsync.c
|
||||
|
||||
|
||||
rsync.dvi: doc/rsync.texinfo
|
||||
texi2dvi -o $@ $<
|
||||
|
||||
rsync.ps: rsync.dvi
|
||||
dvips -ta4 -o $@ $<
|
||||
|
||||
rsync.pdf: doc/rsync.texinfo
|
||||
texi2dvi -o $@ --pdf $<
|
||||
|
||||
|
||||
doxygen:
|
||||
cd $(srcdir) && rm dox/html/* && doxygen
|
||||
|
||||
# for maintainers only
|
||||
doxygen-upload:
|
||||
rsync -avzv $(srcdir)/dox/html/ --delete \
|
||||
samba.org:/home/httpd/html/rsync/doxygen/head/
|
||||
$${SAMBA_HOST-samba.org}:/home/httpd/html/rsync/doxygen/head/
|
||||
|
||||
268
NEWS
268
NEWS
@@ -1,243 +1,47 @@
|
||||
NEWS for rsync 3.1.0 (28 Sep 2013)
|
||||
Protocol: 31 (changed)
|
||||
Changes since 3.0.9:
|
||||
NEWS for rsync 3.1.2 (21 Dec 2015)
|
||||
Protocol: 31 (unchanged)
|
||||
Changes since 3.1.1:
|
||||
|
||||
OUTPUT CHANGES:
|
||||
SECURITY FIXES:
|
||||
|
||||
- Output numbers in 3-digit groups by default (e.g. 1,234,567). See the
|
||||
--human-readable option for a way to turn it off. See also the daemon's
|
||||
"log format" parameter and related command-line options (including
|
||||
--out-format) for a modifier that can be used to request digit-grouping
|
||||
or human-readable output in log escapes. (Note that log output is
|
||||
unchanged by default.)
|
||||
|
||||
- The --list-only option is now affected by the --human-readable setting.
|
||||
It will display digit groupings by default, and unit suffixes if higher
|
||||
levels of readability are requested. Also, the column width for the size
|
||||
output has increased from 11 to 14 characters when human readability is
|
||||
enabled. Use --no-h to get the old-style output and column size.
|
||||
|
||||
- The output of the --progress option has changed: the string "xfer" was
|
||||
shortened to "xfr", and the string "to-check" was shortened to "to-chk",
|
||||
both designed to make room for the (by default) wider display of file
|
||||
size numbers without making the total line-length longer. Also, when
|
||||
incremental recursion is enabled, the string "ir-chk" will be used
|
||||
instead of "to-chk" up until the incremental-recursion scan is done,
|
||||
letting you know that the value to check and the total value will still
|
||||
be increasing as new files are found.
|
||||
|
||||
- Enhanced the --stats output: 1) to mention how many files were created
|
||||
(protocol >= 28), 2) to mention how many files were deleted (a new line
|
||||
for protocol 31, but only output when --delete is in effect), and 3) to
|
||||
follow the file-count, created-count, and deleted-count with a subcount
|
||||
list that shows the counts by type. The wording of the transferred count
|
||||
has also changed so that it is clearer that it is only a count of regular
|
||||
files.
|
||||
- Make sure that all transferred files use only path names from inside the
|
||||
transfer. This makes it impossible for a malicious sender to try to make
|
||||
the receiver use an unsafe destination path for a transferred file, such
|
||||
as a just-sent symlink.
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
- Fixed a bug in the iconv code when EINVAL or EILSEQ is returned with a
|
||||
full output buffer.
|
||||
|
||||
- Fixed some rare bugs in --iconv processing that might cause a multibyte
|
||||
character to get translated incorrectly.
|
||||
|
||||
- Fixed a bogus "vanished file" error if some files were specified with
|
||||
"./" prefixes and others were not.
|
||||
|
||||
- Fixed a bug in --sparse where an extra gap could get inserted after a
|
||||
partial write.
|
||||
|
||||
- Changed the way --progress overwrites its prior output in order to make
|
||||
it nearly impossible for the progress to get overwritten by an error.
|
||||
|
||||
- Improved the propagation of abnormal-exit error messages. This should
|
||||
help the client side to receive errors from the server when it is exiting
|
||||
abnormally, and should also avoid dying with an "connection unexpectedly
|
||||
closed" exit when the closed connection is really expected.
|
||||
|
||||
- The sender now checks each file it plans to remove to ensure that it
|
||||
hasn't changed from the first stat's info. This helps to avoid losing
|
||||
file data when the user is not using the option in a safe manner.
|
||||
|
||||
- Fixed a data-duplication bug in the compress option that made compression
|
||||
less efficient. This improves protocol 31 onward, while behaving in a
|
||||
compatible (buggy) manner with older rsync protocols.
|
||||
|
||||
- When creating a temp-file, rsync is now a bit smarter about it dot-char
|
||||
choices, which can fix a problem on OS X with names that start with "..".
|
||||
|
||||
- Rsync now sets a cleanup flag for --inplace and --append transfers that
|
||||
will flush the write buffer if the transfer aborts. This ensures that
|
||||
more received data gets written out to the disk on an aborted transfer
|
||||
(which is quite helpful on a slow, flaky connection).
|
||||
|
||||
- The reads that map_ptr() now does are aligned on 1K boundaries. This
|
||||
helps some filesystems and/or files that don't like unaligned reads.
|
||||
|
||||
- Fix an issue in the msleep() function if time jumps backwards.
|
||||
|
||||
- Fix daemon-server module-name splitting bug where an arg would get split
|
||||
even if --protect-args was used.
|
||||
- Change the checksum seed order in the per-block checksums. This prevents
|
||||
someone from trying to create checksum blocks that match in sum but not
|
||||
content.
|
||||
- Fixed a with the per-dir filter files (using -FF) that could trigger an
|
||||
assert failure.
|
||||
- Only skip set_modtime() on a transferred file if the time is exactly
|
||||
right.
|
||||
- Don't create an empty backup dir for a transferred file that doesn't
|
||||
exist yet.
|
||||
- Fixed a bug where --link-dest and --xattrs could cause rsync to exit if
|
||||
a filename had a matching dir of the same name in the alt-dest area.
|
||||
- Allow more than 32 group IDs per user in the daemon's gid=LIST config.
|
||||
- Fix the logging of %b & %c via --log-file (daemon logging was already
|
||||
correct, as was --out-format='%b/%c').
|
||||
- Fix erroneous acceptance of --info=5 & --debug=5 (an empty flag name is
|
||||
not valid).
|
||||
|
||||
ENHANCEMENTS:
|
||||
|
||||
- Added the --remote-option=OPT (-M OPT) command-line option that is useful
|
||||
for things like sending a remote --log-file=FILE or --fake-super option.
|
||||
|
||||
- Added the --info=FLAGS and --debug=FLAGS options to allow finer-grained
|
||||
control over what is output. Added an extra type of --progress output
|
||||
using --info=progress2.
|
||||
|
||||
- The --msgs2stderr option can help with debugging rsync by allowing the
|
||||
debug messages to get output to stderr rather than travel via the socket
|
||||
protocol.
|
||||
|
||||
- Added the --delete-missing-args and --ignore-missing-args options to
|
||||
either delete or ignore user-specified files on the receiver that are
|
||||
missing on the sender (normally the absence of user-specified files
|
||||
generates an error).
|
||||
|
||||
- Added a "T" (terabyte) category to the --human-readable size suffixes.
|
||||
|
||||
- Added the --usermap/--groupmap/--chown options for manipulating file
|
||||
ownership during the copy.
|
||||
|
||||
- Added the "%C" escape to the log-output handling, which will output the
|
||||
MD5 checksum of any transferred file, or all files if --checksum was
|
||||
specified (when protocol 30 or above is in effect).
|
||||
|
||||
- Added the "reverse lookup" parameter to the rsync daemon config file to
|
||||
allow reverse-DNS lookups to be disabled.
|
||||
|
||||
- Added a forward-DNS lookup for the daemon's hosts allow/deny config. Can
|
||||
be disabled via "forward lookup" parameter (defaults to enabled).
|
||||
|
||||
- Added a way for more than one group to be specified in the daemon's
|
||||
config file, including a way to specify that you want all of the
|
||||
specified user's groups without having to name them. Also changed the
|
||||
daemon to complain about an inability to set explicitly-specified uid/gid
|
||||
values, even when not run by a super-user.
|
||||
|
||||
- The daemon now tries to send the user the error messages from the
|
||||
pre-xfer exec script when it fails.
|
||||
|
||||
- Improved the use of alt-dest options into an existing hierarchy of files:
|
||||
If a match is found in an alt-dir, it takes precedence over an existing
|
||||
file. (We'll need to wait for a future version before attribute-changes
|
||||
on otherwise unchanged files are safe when using an existing hierarchy.)
|
||||
|
||||
- Added per-user authorization options and group-authorization support to
|
||||
the daemon's "auth users" parameter.
|
||||
|
||||
- Added a way to reference environment variables in a daemon's config file
|
||||
(using %VAR% references).
|
||||
|
||||
- When replacing a non-dir with a symlink/hard-link/device/special-file,
|
||||
the update should now be done in an atomic manner.
|
||||
|
||||
- Avoid re-sending xattr info for hard-linked files w/the same xattrs
|
||||
(protocol 31).
|
||||
|
||||
- The backup code was improved to use better logic maintaining the backup
|
||||
directory hierarchy. Also, when a file is being backed up, rsync tries
|
||||
to hard-link it into place so that the upcoming replacement of the
|
||||
destination file will be atomic (for the normal, non-inplace logic).
|
||||
|
||||
- Added the ability to synchronize nano-second modified times.
|
||||
|
||||
- Added a few more default suffixes for the "dont compress" settings.
|
||||
|
||||
- Added the checking of the RSYNC_PROTECT_ARGS environment variable to allow
|
||||
the default for the --protect-args command-line option to be overridden.
|
||||
|
||||
- Added the --preallocate command-line option.
|
||||
|
||||
- Allow --password-file=- to read the password from stdin (filename "-").
|
||||
|
||||
- Rsync now comes packaged with an rsync-ssl helper script that can be
|
||||
used to contact a remote rsync daemon using a piped-stunnel command.
|
||||
It also includes an stunnel config file to run the server side to
|
||||
support ssl daemon connections. See the packaging/lsb/rsync.spec
|
||||
file for one way to package the resulting files. (Suggestions for
|
||||
how to make this even easier to install & use are welcomed.)
|
||||
|
||||
- Improved the speed of some --inplace updates when there are lots of
|
||||
identical checksum blocks that end up being unusable.
|
||||
|
||||
- Added the --outbuf=N|L|B option for choosing the output buffering.
|
||||
|
||||
- Repeating the --fuzzy option now causes the code to look for fuzzy
|
||||
matches inside alt-dest directories too.
|
||||
|
||||
- The --chmod option now supports numeric modes, e.g. --chmod=644,D755
|
||||
|
||||
- Added some Solaris xattr code.
|
||||
|
||||
- Made an rsync daemon (the listening process) exit with a 0 status when
|
||||
it was signaled to die. This helps launchd.
|
||||
|
||||
- Improved the RSYNC_* environment variables for the pre-xfer exec script:
|
||||
when a daemon is sent multiple request args, they are now joined into a
|
||||
single return value (separated by spaces) so that the RSYNC_REQUEST
|
||||
environment variable is accurate for any "pre-xfer exec". The values in
|
||||
RSYNC_ARG# vars are no longer truncated at the "." arg (prior to the
|
||||
request dirs/files), so that all the requested values are also listed
|
||||
(separately) in RSYNC_ARG# variables.
|
||||
|
||||
EXTRAS:
|
||||
|
||||
- Added an "instant-rsyncd" script to the support directory, which makes
|
||||
it easy to configure a simple rsync daemon in the current directory.
|
||||
|
||||
- Added the "mapfrom" and "mapto" scripts to the support directory, which
|
||||
makes it easier to do user/group mapping in a local transfer based on
|
||||
passwd/group files from another machine.
|
||||
|
||||
- There's a new, improved version of the lsh script in the support dir:
|
||||
it's written in perl and supports -u without resorting to using sudo
|
||||
(when run as root). The old shell version is now named lsh.sh.
|
||||
|
||||
- There is a helper script named rsync-slash-strip in the support directory
|
||||
for anyone that wants to change the way rsync handles args with trailing
|
||||
slashes. (e.g. arg/ would get stripped to arg while arg/. would turn into
|
||||
arg/).
|
||||
|
||||
INTERNAL:
|
||||
|
||||
- The I/O code was rewritten to be simpler and do bigger buffered reads
|
||||
over the socket. The I/O between the receiver and the generator was
|
||||
changed to be standard multiplexed-I/O (like that over the socket).
|
||||
|
||||
- The sender tries to use any dead time while the generator is looking for
|
||||
files to transfer in order to do sender-side directory scanning in a more
|
||||
parallel manner.
|
||||
|
||||
- A daemon can now inform a client about a daemon-configured timeout value
|
||||
so that the client can assist in the keep-alive activity (protocol 31).
|
||||
|
||||
- The filter code received some refactoring to make it more extendible, to
|
||||
read better, and do better sanity checking.
|
||||
|
||||
- Really big numbers are now output using our own big-num routine rather
|
||||
than casting them to a double and using a %.0f conversion.
|
||||
|
||||
- The pool_alloc library has received some minor improvements in alignment
|
||||
handling.
|
||||
|
||||
- Added init_stat_x() function to avoid duplication of acl/xattr init code.
|
||||
|
||||
- The included zlib was upgraded from 1.2.3 to 1.2.8.
|
||||
|
||||
- Rsync can now be compiled to use an unmodified zlib library instead of
|
||||
the tweaked one that is included with rsync. This will eventually
|
||||
become the default, at which point we'll start the countdown to removing
|
||||
the included zlib. Until then, feel free to configure using:
|
||||
|
||||
./configure --with-included-zlib=no
|
||||
- Added "(DRY RUN)" info to the --debug=exit output line.
|
||||
- Use usleep() for our msleep() function if it is available.
|
||||
- Added a few extra long-option names to rrsync script, which will make
|
||||
BackupPC happier.
|
||||
- Made configure choose to use linux xattrs on netbsd (rather than not
|
||||
supporting xattrs).
|
||||
- Added -wo (write-only) option to rrsync support script.
|
||||
- Misc. manpage tweaks.
|
||||
|
||||
DEVELOPER RELATED:
|
||||
|
||||
- Added more conditional debug output.
|
||||
|
||||
- Fixed some build issues for android and minix.
|
||||
- Fixed a bug with the Makefile's use of INSTALL_STRIP.
|
||||
- Improve a test in the suite that could get an erroneous timestamp error.
|
||||
- Tweaks for newer versions of git in the packaging tools.
|
||||
- Improved the m4 generation rules and some autoconf idioms.
|
||||
|
||||
362
OLDNEWS
362
OLDNEWS
@@ -1,3 +1,363 @@
|
||||
NEWS for rsync 3.1.1 (22 Jun 2014)
|
||||
Protocol: 31 (unchanged)
|
||||
Changes since 3.1.0:
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
- If the receiver gets bogus filenames from the sender (an unexpected
|
||||
leading slash or a ".." infix dir), exit with an error. This prevents a
|
||||
malicious sender from trying to inject filenames that would affect an
|
||||
area outside the destination directories.
|
||||
|
||||
- Fixed a failure to remove the partial-transfer temp file when interrupted
|
||||
(and rsync is not saving the partial files).
|
||||
|
||||
- Changed the chown/group/xattr-set order to avoid losing some security-
|
||||
related xattr info (that would get cleared by a chown).
|
||||
|
||||
- Fixed a bug in the xattr-finding code that could make a non-root-run
|
||||
receiver not able to find some xattr numbers.
|
||||
|
||||
- Fixed a bug in the early daemon protocol where a timeout failed to be
|
||||
honored (e.g. if the remote side fails to send us the initial protocol
|
||||
greeting).
|
||||
|
||||
- Fixed unintended inclusion of commas in file numbers in the daemon log.
|
||||
|
||||
- We once again send the 'f' sub-flag (of -e) to the server side so it
|
||||
knows that we can handle incremental-recursion directory errors properly
|
||||
in older protocols.
|
||||
|
||||
- Fixed an issue with too-aggressive keep-alive messages causing a problem
|
||||
for older rsync versions early in the transfer.
|
||||
|
||||
- Fixed an incorrect message about backup-directory-creation when using
|
||||
--dry-run and the backup dir is not an absolute path.
|
||||
|
||||
- Fixed a bug where a failed deletion and/or a failed sender-side removal
|
||||
would not affect the exit code.
|
||||
|
||||
- Fixed a bug that caused a failure when combining --delete-missing-args
|
||||
with --xattrs and/or --acls.
|
||||
|
||||
- Fixed a strange dir_depth assertion error that was caused by empty-dir
|
||||
removals and/or duplicate files in the transfer.
|
||||
|
||||
- Fixed a problem with --info=progress2's output stats where rsync would
|
||||
only update the stats at the end of each file's transfer. It now uses
|
||||
the data that is flowing for the current file, making the stats more
|
||||
accurate and less jumpy.
|
||||
|
||||
- Fixed an itemize bug that affected the combo of --link-dest, -X, and -n.
|
||||
|
||||
- Fixed a problem with delete messages not appearing in the log file when
|
||||
the user didn't use --verbose.
|
||||
|
||||
- Improve chunked xattr reading for OS X.
|
||||
|
||||
- Removed an attempted hard-link xattr optimization that was causing a
|
||||
transfer failure. This removal is flagged in the compatibility code, so
|
||||
if a better fix can be discovered, we have a way to flip it on again.
|
||||
|
||||
- Fixed a bug when the receiver is not configured to be able to hard link
|
||||
symlimks/devices/special-file items but the sender sent some of these
|
||||
items flagged as hard-linked.
|
||||
|
||||
- We now generate a better error if the buffer overflows in do_mknod().
|
||||
|
||||
- Fixed a problem reading more than 16 ACLs on some OSes.
|
||||
|
||||
- Fixed the reading of the secrets file to avoid an infinite wait when
|
||||
the username is missing.
|
||||
|
||||
- Fixed a parsing problem in the --usermap/--groupmap options when using
|
||||
MIN-MAX numbers.
|
||||
|
||||
- Switched Cygwin back to using socketpair "pipes" to try to speed it up.
|
||||
|
||||
- Added knowledge of a few new options to rrsync.
|
||||
|
||||
ENHANCEMENTS:
|
||||
|
||||
- Tweaked the temp-file naming when --temp-dir=DIR is used: the temp-file
|
||||
names will not get a '.' prepended.
|
||||
|
||||
- Added support for a new-compression idiom that does not compress all the
|
||||
matching data in a transfer. This can help rsync to use less cpu when a
|
||||
transfer has a lot of matching data, and also makes rsync compatible with
|
||||
a non-bundled zlib. See the --new-compress and --old-compress options in
|
||||
the manpage.
|
||||
|
||||
- Added the support/rsync-no-vanished wrapper script.
|
||||
|
||||
- Made configure more prominently mention when we failed to find yodl (in
|
||||
case the user wants to be able to generate manpages from *.yo files).
|
||||
|
||||
- Have manpage mention how a daemon's max-verbosity setting affects info
|
||||
and debug options. Also added more clarification on backslash removals
|
||||
for excludes that contain wildcards.
|
||||
|
||||
- Have configure check if for the attr lib (for getxattr) for those systems
|
||||
that need to link against it explicitly.
|
||||
|
||||
- Change the early dir-creation logic to only use that idiom in an
|
||||
inc-recursive copy that is preserving directory times. e.g. using
|
||||
--omit-dir-times will avoid these early directories being created.
|
||||
|
||||
- Fix a bug in cmp_time() that would return a wrong result if the 2 times
|
||||
differed by an amount greater than what a time_t can hold.
|
||||
|
||||
DEVELOPER RELATED:
|
||||
|
||||
- We now include an example systemd file (in packaging/systemd).
|
||||
|
||||
- Tweaked configure to make sure that any intended use of the included popt
|
||||
and/or zlib code is put early in the CFLAGS.
|
||||
|
||||
NEWS for rsync 3.1.0 (28 Sep 2013)
|
||||
Protocol: 31 (changed)
|
||||
Changes since 3.0.9:
|
||||
|
||||
OUTPUT CHANGES:
|
||||
|
||||
- Output numbers in 3-digit groups by default (e.g. 1,234,567). See the
|
||||
--human-readable option for a way to turn it off. See also the daemon's
|
||||
"log format" parameter and related command-line options (including
|
||||
--out-format) for a modifier that can be used to request digit-grouping
|
||||
or human-readable output in log escapes. (Note that log output is
|
||||
unchanged by default.)
|
||||
|
||||
- The --list-only option is now affected by the --human-readable setting.
|
||||
It will display digit groupings by default, and unit suffixes if higher
|
||||
levels of readability are requested. Also, the column width for the size
|
||||
output has increased from 11 to 14 characters when human readability is
|
||||
enabled. Use --no-h to get the old-style output and column size.
|
||||
|
||||
- The output of the --progress option has changed: the string "xfer" was
|
||||
shortened to "xfr", and the string "to-check" was shortened to "to-chk",
|
||||
both designed to make room for the (by default) wider display of file
|
||||
size numbers without making the total line-length longer. Also, when
|
||||
incremental recursion is enabled, the string "ir-chk" will be used
|
||||
instead of "to-chk" up until the incremental-recursion scan is done,
|
||||
letting you know that the value to check and the total value will still
|
||||
be increasing as new files are found.
|
||||
|
||||
- Enhanced the --stats output: 1) to mention how many files were created
|
||||
(protocol >= 28), 2) to mention how many files were deleted (a new line
|
||||
for protocol 31, but only output when --delete is in effect), and 3) to
|
||||
follow the file-count, created-count, and deleted-count with a subcount
|
||||
list that shows the counts by type. The wording of the transferred count
|
||||
has also changed so that it is clearer that it is only a count of regular
|
||||
files.
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
- Fixed a bug in the iconv code when EINVAL or EILSEQ is returned with a
|
||||
full output buffer.
|
||||
|
||||
- Fixed some rare bugs in --iconv processing that might cause a multibyte
|
||||
character to get translated incorrectly.
|
||||
|
||||
- Fixed a bogus "vanished file" error if some files were specified with
|
||||
"./" prefixes and others were not.
|
||||
|
||||
- Fixed a bug in --sparse where an extra gap could get inserted after a
|
||||
partial write.
|
||||
|
||||
- Changed the way --progress overwrites its prior output in order to make
|
||||
it nearly impossible for the progress to get overwritten by an error.
|
||||
|
||||
- Improved the propagation of abnormal-exit error messages. This should
|
||||
help the client side to receive errors from the server when it is exiting
|
||||
abnormally, and should also avoid dying with an "connection unexpectedly
|
||||
closed" exit when the closed connection is really expected.
|
||||
|
||||
- The sender now checks each file it plans to remove to ensure that it
|
||||
hasn't changed from the first stat's info. This helps to avoid losing
|
||||
file data when the user is not using the option in a safe manner.
|
||||
|
||||
- Fixed a data-duplication bug in the compress option that made compression
|
||||
less efficient. This improves protocol 31 onward, while behaving in a
|
||||
compatible (buggy) manner with older rsync protocols.
|
||||
|
||||
- When creating a temp-file, rsync is now a bit smarter about it dot-char
|
||||
choices, which can fix a problem on OS X with names that start with "..".
|
||||
|
||||
- Rsync now sets a cleanup flag for --inplace and --append transfers that
|
||||
will flush the write buffer if the transfer aborts. This ensures that
|
||||
more received data gets written out to the disk on an aborted transfer
|
||||
(which is quite helpful on a slow, flaky connection).
|
||||
|
||||
- The reads that map_ptr() now does are aligned on 1K boundaries. This
|
||||
helps some filesystems and/or files that don't like unaligned reads.
|
||||
|
||||
- Fix an issue in the msleep() function if time jumps backwards.
|
||||
|
||||
- Fix daemon-server module-name splitting bug where an arg would get split
|
||||
even if --protect-args was used.
|
||||
|
||||
ENHANCEMENTS:
|
||||
|
||||
- Added the --remote-option=OPT (-M OPT) command-line option that is useful
|
||||
for things like sending a remote --log-file=FILE or --fake-super option.
|
||||
|
||||
- Added the --info=FLAGS and --debug=FLAGS options to allow finer-grained
|
||||
control over what is output. Added an extra type of --progress output
|
||||
using --info=progress2.
|
||||
|
||||
- The --msgs2stderr option can help with debugging rsync by allowing the
|
||||
debug messages to get output to stderr rather than travel via the socket
|
||||
protocol.
|
||||
|
||||
- Added the --delete-missing-args and --ignore-missing-args options to
|
||||
either delete or ignore user-specified files on the receiver that are
|
||||
missing on the sender (normally the absence of user-specified files
|
||||
generates an error).
|
||||
|
||||
- Added a "T" (terabyte) category to the --human-readable size suffixes.
|
||||
|
||||
- Added the --usermap/--groupmap/--chown options for manipulating file
|
||||
ownership during the copy.
|
||||
|
||||
- Added the "%C" escape to the log-output handling, which will output the
|
||||
MD5 checksum of any transferred file, or all files if --checksum was
|
||||
specified (when protocol 30 or above is in effect).
|
||||
|
||||
- Added the "reverse lookup" parameter to the rsync daemon config file to
|
||||
allow reverse-DNS lookups to be disabled.
|
||||
|
||||
- Added a forward-DNS lookup for the daemon's hosts allow/deny config. Can
|
||||
be disabled via "forward lookup" parameter (defaults to enabled).
|
||||
|
||||
- Added a way for more than one group to be specified in the daemon's
|
||||
config file, including a way to specify that you want all of the
|
||||
specified user's groups without having to name them. Also changed the
|
||||
daemon to complain about an inability to set explicitly-specified uid/gid
|
||||
values, even when not run by a super-user.
|
||||
|
||||
- The daemon now tries to send the user the error messages from the
|
||||
pre-xfer exec script when it fails.
|
||||
|
||||
- Improved the use of alt-dest options into an existing hierarchy of files:
|
||||
If a match is found in an alt-dir, it takes precedence over an existing
|
||||
file. (We'll need to wait for a future version before attribute-changes
|
||||
on otherwise unchanged files are safe when using an existing hierarchy.)
|
||||
|
||||
- Added per-user authorization options and group-authorization support to
|
||||
the daemon's "auth users" parameter.
|
||||
|
||||
- Added a way to reference environment variables in a daemon's config file
|
||||
(using %VAR% references).
|
||||
|
||||
- When replacing a non-dir with a symlink/hard-link/device/special-file,
|
||||
the update should now be done in an atomic manner.
|
||||
|
||||
- Avoid re-sending xattr info for hard-linked files w/the same xattrs
|
||||
(protocol 31).
|
||||
|
||||
- The backup code was improved to use better logic maintaining the backup
|
||||
directory hierarchy. Also, when a file is being backed up, rsync tries
|
||||
to hard-link it into place so that the upcoming replacement of the
|
||||
destination file will be atomic (for the normal, non-inplace logic).
|
||||
|
||||
- Added the ability to synchronize nano-second modified times.
|
||||
|
||||
- Added a few more default suffixes for the "dont compress" settings.
|
||||
|
||||
- Added the checking of the RSYNC_PROTECT_ARGS environment variable to allow
|
||||
the default for the --protect-args command-line option to be overridden.
|
||||
|
||||
- Added the --preallocate command-line option.
|
||||
|
||||
- Allow --password-file=- to read the password from stdin (filename "-").
|
||||
|
||||
- Rsync now comes packaged with an rsync-ssl helper script that can be
|
||||
used to contact a remote rsync daemon using a piped-stunnel command.
|
||||
It also includes an stunnel config file to run the server side to
|
||||
support ssl daemon connections. See the packaging/lsb/rsync.spec
|
||||
file for one way to package the resulting files. (Suggestions for
|
||||
how to make this even easier to install & use are welcomed.)
|
||||
|
||||
- Improved the speed of some --inplace updates when there are lots of
|
||||
identical checksum blocks that end up being unusable.
|
||||
|
||||
- Added the --outbuf=N|L|B option for choosing the output buffering.
|
||||
|
||||
- Repeating the --fuzzy option now causes the code to look for fuzzy
|
||||
matches inside alt-dest directories too.
|
||||
|
||||
- The --chmod option now supports numeric modes, e.g. --chmod=644,D755
|
||||
|
||||
- Added some Solaris xattr code.
|
||||
|
||||
- Made an rsync daemon (the listening process) exit with a 0 status when
|
||||
it was signaled to die. This helps launchd.
|
||||
|
||||
- Improved the RSYNC_* environment variables for the pre-xfer exec script:
|
||||
when a daemon is sent multiple request args, they are now joined into a
|
||||
single return value (separated by spaces) so that the RSYNC_REQUEST
|
||||
environment variable is accurate for any "pre-xfer exec". The values in
|
||||
RSYNC_ARG# vars are no longer truncated at the "." arg (prior to the
|
||||
request dirs/files), so that all the requested values are also listed
|
||||
(separately) in RSYNC_ARG# variables.
|
||||
|
||||
EXTRAS:
|
||||
|
||||
- Added an "instant-rsyncd" script to the support directory, which makes
|
||||
it easy to configure a simple rsync daemon in the current directory.
|
||||
|
||||
- Added the "mapfrom" and "mapto" scripts to the support directory, which
|
||||
makes it easier to do user/group mapping in a local transfer based on
|
||||
passwd/group files from another machine.
|
||||
|
||||
- There's a new, improved version of the lsh script in the support dir:
|
||||
it's written in perl and supports -u without resorting to using sudo
|
||||
(when run as root). The old shell version is now named lsh.sh.
|
||||
|
||||
- There is a helper script named rsync-slash-strip in the support directory
|
||||
for anyone that wants to change the way rsync handles args with trailing
|
||||
slashes. (e.g. arg/ would get stripped to arg while arg/. would turn into
|
||||
arg/).
|
||||
|
||||
INTERNAL:
|
||||
|
||||
- The I/O code was rewritten to be simpler and do bigger buffered reads
|
||||
over the socket. The I/O between the receiver and the generator was
|
||||
changed to be standard multiplexed-I/O (like that over the socket).
|
||||
|
||||
- The sender tries to use any dead time while the generator is looking for
|
||||
files to transfer in order to do sender-side directory scanning in a more
|
||||
parallel manner.
|
||||
|
||||
- A daemon can now inform a client about a daemon-configured timeout value
|
||||
so that the client can assist in the keep-alive activity (protocol 31).
|
||||
|
||||
- The filter code received some refactoring to make it more extendible, to
|
||||
read better, and do better sanity checking.
|
||||
|
||||
- Really big numbers are now output using our own big-num routine rather
|
||||
than casting them to a double and using a %.0f conversion.
|
||||
|
||||
- The pool_alloc library has received some minor improvements in alignment
|
||||
handling.
|
||||
|
||||
- Added init_stat_x() function to avoid duplication of acl/xattr init code.
|
||||
|
||||
- The included zlib was upgraded from 1.2.3 to 1.2.8.
|
||||
|
||||
- Rsync can now be compiled to use an unmodified zlib library instead of
|
||||
the tweaked one that is included with rsync. This will eventually
|
||||
become the default, at which point we'll start the countdown to removing
|
||||
the included zlib. Until then, feel free to configure using:
|
||||
|
||||
./configure --with-included-zlib=no
|
||||
|
||||
DEVELOPER RELATED:
|
||||
|
||||
- Added more conditional debug output.
|
||||
|
||||
- Fixed some build issues for android and minix.
|
||||
|
||||
NEWS for rsync 3.0.9 (23 Sep 2011)
|
||||
Protocol: 30 (unchanged)
|
||||
Changes since 3.0.8:
|
||||
@@ -3290,6 +3650,8 @@ Changes since 2.4.6:
|
||||
|
||||
Partial Protocol History
|
||||
RELEASE DATE VER. DATE OF COMMIT* PROTOCOL
|
||||
21 Dec 2015 3.1.2 31
|
||||
22 Jun 2014 3.1.1 31
|
||||
28 Sep 2013 3.1.0 31 Aug 2008 31
|
||||
23 Sep 2011 3.0.9 30
|
||||
26 Mar 2011 3.0.8 30
|
||||
|
||||
2
access.c
2
access.c
@@ -2,7 +2,7 @@
|
||||
* Routines to authenticate access to a daemon (hosts allow/deny).
|
||||
*
|
||||
* Copyright (C) 1998 Andrew Tridgell
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
7
acls.c
7
acls.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2006-2013 Wayne Davison
|
||||
* Copyright (C) 2006-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -423,7 +423,7 @@ static BOOL pack_smb_acl(SMB_ACL_T *smb_acl, const rsync_acl *racl)
|
||||
#ifdef ACLS_NEED_MASK
|
||||
mask_bits = racl->mask_obj == NO_ENTRY ? racl->group_obj & ~NO_ENTRY : racl->mask_obj;
|
||||
COE( sys_acl_create_entry,(smb_acl, &entry) );
|
||||
COE( sys_acl_set_info,(entry, SMB_ACL_MASK, mask_bits, NULL) );
|
||||
COE( sys_acl_set_info,(entry, SMB_ACL_MASK, mask_bits, 0) );
|
||||
#else
|
||||
if (racl->mask_obj != NO_ENTRY) {
|
||||
COE( sys_acl_create_entry,(smb_acl, &entry) );
|
||||
@@ -560,7 +560,8 @@ int get_acl(const char *fname, stat_x *sxp)
|
||||
if (!preserve_devices)
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
} else if (IS_MISSING_FILE(sxp->st))
|
||||
return 0;
|
||||
|
||||
if (get_rsync_acl(fname, sxp->acc_acl, SMB_ACL_TYPE_ACCESS,
|
||||
sxp->st.st_mode) < 0) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Support rsync daemon authentication.
|
||||
*
|
||||
* Copyright (C) 1998-2000 Andrew Tridgell
|
||||
* Copyright (C) 2002-2013 Wayne Davison
|
||||
* Copyright (C) 2002-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -102,15 +102,16 @@ static const char *check_secret(int module, const char *user, const char *group,
|
||||
char pass2[MAX_DIGEST_LEN*2];
|
||||
const char *fname = lp_secrets_file(module);
|
||||
STRUCT_STAT st;
|
||||
int fd, ok = 1;
|
||||
int ok = 1;
|
||||
int user_len = strlen(user);
|
||||
int group_len = group ? strlen(group) : 0;
|
||||
char *err;
|
||||
FILE *fh;
|
||||
|
||||
if (!fname || !*fname || (fd = open(fname, O_RDONLY)) < 0)
|
||||
if (!fname || !*fname || (fh = fopen(fname, "r")) == NULL)
|
||||
return "no secrets file";
|
||||
|
||||
if (do_fstat(fd, &st) == -1) {
|
||||
if (do_fstat(fileno(fh), &st) == -1) {
|
||||
rsyserr(FLOG, errno, "fstat(%s)", fname);
|
||||
ok = 0;
|
||||
} else if (lp_strict_modes(module)) {
|
||||
@@ -123,29 +124,30 @@ static const char *check_secret(int module, const char *user, const char *group,
|
||||
}
|
||||
}
|
||||
if (!ok) {
|
||||
close(fd);
|
||||
fclose(fh);
|
||||
return "ignoring secrets file";
|
||||
}
|
||||
|
||||
if (*user == '#') {
|
||||
/* Reject attempt to match a comment. */
|
||||
close(fd);
|
||||
fclose(fh);
|
||||
return "invalid username";
|
||||
}
|
||||
|
||||
/* Try to find a line that starts with the user (or @group) name and a ':'. */
|
||||
err = "secret not found";
|
||||
while ((user || group) && read_line_old(fd, line, sizeof line, 1)) {
|
||||
const char **ptr, *s;
|
||||
while ((user || group) && fgets(line, sizeof line, fh) != NULL) {
|
||||
const char **ptr, *s = strtok(line, "\n\r");
|
||||
int len;
|
||||
if (*line == '@') {
|
||||
if (!s)
|
||||
continue;
|
||||
if (*s == '@') {
|
||||
ptr = &group;
|
||||
len = group_len;
|
||||
s = line+1;
|
||||
s++;
|
||||
} else {
|
||||
ptr = &user;
|
||||
len = user_len;
|
||||
s = line;
|
||||
}
|
||||
if (!*ptr || strncmp(s, *ptr, len) != 0 || s[len] != ':')
|
||||
continue;
|
||||
@@ -158,7 +160,7 @@ static const char *check_secret(int module, const char *user, const char *group,
|
||||
*ptr = NULL; /* Don't look for name again. */
|
||||
}
|
||||
|
||||
close(fd);
|
||||
fclose(fh);
|
||||
|
||||
memset(line, 0, sizeof line);
|
||||
memset(pass2, 0, sizeof pass2);
|
||||
@@ -277,17 +279,18 @@ char *auth_server(int f_in, int f_out, int module, const char *host,
|
||||
/* See if authorizing user is a real user, and if so, see
|
||||
* if it is in a group that matches tok+1 wildmat. */
|
||||
if (auth_uid_groups_cnt < 0) {
|
||||
gid_t gid_list[64];
|
||||
item_list gid_list = EMPTY_ITEM_LIST;
|
||||
uid_t auth_uid;
|
||||
auth_uid_groups_cnt = sizeof gid_list / sizeof (gid_t);
|
||||
if (!user_to_uid(line, &auth_uid, False)
|
||||
|| getallgroups(auth_uid, gid_list, &auth_uid_groups_cnt) != NULL)
|
||||
|| getallgroups(auth_uid, &gid_list) != NULL)
|
||||
auth_uid_groups_cnt = 0;
|
||||
else {
|
||||
gid_t *gid_array = gid_list.items;
|
||||
auth_uid_groups_cnt = gid_list.count;
|
||||
if ((auth_uid_groups = new_array(char *, auth_uid_groups_cnt)) == NULL)
|
||||
out_of_memory("auth_server");
|
||||
for (j = 0; j < auth_uid_groups_cnt; j++)
|
||||
auth_uid_groups[j] = gid_to_group(gid_list[j]);
|
||||
auth_uid_groups[j] = gid_to_group(gid_array[j]);
|
||||
}
|
||||
}
|
||||
for (j = 0; j < auth_uid_groups_cnt; j++) {
|
||||
|
||||
33
backup.c
33
backup.c
@@ -2,7 +2,7 @@
|
||||
* Backup handling code.
|
||||
*
|
||||
* Copyright (C) 1999 Andrew Tridgell
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -157,6 +157,18 @@ static BOOL copy_valid_path(const char *fname)
|
||||
char *get_backup_name(const char *fname)
|
||||
{
|
||||
if (backup_dir) {
|
||||
static int initialized = 0;
|
||||
if (!initialized) {
|
||||
int ret;
|
||||
if (backup_dir_len > 1)
|
||||
backup_dir_buf[backup_dir_len-1] = '\0';
|
||||
ret = make_path(backup_dir_buf, 0);
|
||||
if (backup_dir_len > 1)
|
||||
backup_dir_buf[backup_dir_len-1] = '/';
|
||||
if (ret < 0)
|
||||
return NULL;
|
||||
initialized = 1;
|
||||
}
|
||||
/* copy fname into backup_dir_buf while validating the dirs. */
|
||||
if (copy_valid_path(fname))
|
||||
return backup_dir_buf;
|
||||
@@ -208,23 +220,24 @@ static inline int link_or_rename(const char *from, const char *to,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Hard-link, rename, or copy an item to the backup name. Returns 2 if item
|
||||
* was duplicated into backup area, 1 if item was moved, or 0 for failure.*/
|
||||
/* Hard-link, rename, or copy an item to the backup name. Returns 0 for
|
||||
* failure, 1 if item was moved, 2 if item was duplicated or hard linked
|
||||
* into backup area, or 3 if item doesn't exist or isn't a regular file. */
|
||||
int make_backup(const char *fname, BOOL prefer_rename)
|
||||
{
|
||||
stat_x sx;
|
||||
struct file_struct *file;
|
||||
int save_preserve_xattrs;
|
||||
char *buf = get_backup_name(fname);
|
||||
char *buf;
|
||||
int ret = 0;
|
||||
|
||||
if (!buf)
|
||||
return 0;
|
||||
|
||||
init_stat_x(&sx);
|
||||
/* Return success if no file to keep. */
|
||||
if (x_lstat(fname, &sx.st, NULL) < 0)
|
||||
return 1;
|
||||
return 3;
|
||||
|
||||
if (!(buf = get_backup_name(fname)))
|
||||
return 0;
|
||||
|
||||
/* Try a hard-link or a rename first. Using rename is not atomic, but
|
||||
* is more efficient than forcing a copy for larger files when no hard-
|
||||
@@ -244,7 +257,7 @@ int make_backup(const char *fname, BOOL prefer_rename)
|
||||
|
||||
/* Fall back to making a copy. */
|
||||
if (!(file = make_file(fname, NULL, &sx.st, 0, NO_FILTERS)))
|
||||
return 1; /* the file could have disappeared */
|
||||
return 3; /* the file could have disappeared */
|
||||
|
||||
#ifdef SUPPORT_ACLS
|
||||
if (preserve_acls && !S_ISLNK(file->mode)) {
|
||||
@@ -299,7 +312,7 @@ int make_backup(const char *fname, BOOL prefer_rename)
|
||||
#ifdef SUPPORT_XATTRS
|
||||
uncache_tmp_xattrs();
|
||||
#endif
|
||||
return 2;
|
||||
return 3;
|
||||
}
|
||||
|
||||
/* Copy to backup tree if a file. */
|
||||
|
||||
2
batch.c
2
batch.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1999 Weiss
|
||||
* Copyright (C) 2004 Chris Shoemaker
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
30
byteorder.h
30
byteorder.h
@@ -2,7 +2,7 @@
|
||||
* Simple byteorder handling.
|
||||
*
|
||||
* Copyright (C) 1992-1995 Andrew Tridgell
|
||||
* Copyright (C) 2007-2013 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
/* We know that the x86 can handle misalignment and has the same
|
||||
* byte order (LSB-first) as the 32-bit numbers we transmit. */
|
||||
#ifdef __i386__
|
||||
#if defined __i386__ || defined __i486__ || defined __i586__ || defined __i686__ || __amd64
|
||||
#define CAREFUL_ALIGNMENT 0
|
||||
#endif
|
||||
|
||||
@@ -38,9 +38,11 @@
|
||||
|
||||
#define PVAL(buf,pos) (UVAL(buf,pos)|UVAL(buf,(pos)+1)<<8)
|
||||
#define IVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+2)<<16)
|
||||
#define IVAL64(buf,pos) (IVAL(buf,pos)|(int64)IVAL(buf,(pos)+4)<<32)
|
||||
#define SSVALX(buf,pos,val) (CVAL(buf,pos)=(val)&0xFF,CVAL(buf,pos+1)=(val)>>8)
|
||||
#define SIVALX(buf,pos,val) (SSVALX(buf,pos,val&0xFFFF),SSVALX(buf,pos+2,val>>16))
|
||||
#define SIVAL(buf,pos,val) SIVALX((buf),(pos),((uint32)(val)))
|
||||
#define SIVAL(buf,pos,val) SIVALX(buf,pos,(uint32)(val))
|
||||
#define SIVAL64(buf,pos,val) (SIVAL(buf,pos,val),SIVAL(buf,(pos)+4,(val)>>32))
|
||||
|
||||
#define IVALu(buf,pos) IVAL(buf,pos)
|
||||
#define SIVALu(buf,pos,val) SIVAL(buf,pos,val)
|
||||
@@ -95,6 +97,28 @@ SIVAL(char *buf, int pos, uint32 val)
|
||||
SIVALu((uchar*)buf, pos, val);
|
||||
}
|
||||
|
||||
static inline int64
|
||||
IVAL64(const char *buf, int pos)
|
||||
{
|
||||
union {
|
||||
const char *b;
|
||||
const int64 *num;
|
||||
} u;
|
||||
u.b = buf + pos;
|
||||
return *u.num;
|
||||
}
|
||||
|
||||
static inline void
|
||||
SIVAL64(char *buf, int pos, int64 val)
|
||||
{
|
||||
union {
|
||||
char *b;
|
||||
int64 *num;
|
||||
} u;
|
||||
u.b = buf + pos;
|
||||
*u.num = val;
|
||||
}
|
||||
|
||||
# endif /* !AVOID_BYTEORDER_INLINE */
|
||||
|
||||
#endif /* !CAREFUL_ALIGNMENT */
|
||||
|
||||
2
case_N.h
2
case_N.h
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Allow an arbitrary sequence of case labels.
|
||||
*
|
||||
* Copyright (C) 2006-2013 Wayne Davison
|
||||
* Copyright (C) 2006-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
25
checksum.c
25
checksum.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
extern int checksum_seed;
|
||||
extern int protocol_version;
|
||||
extern int proper_seed_order;
|
||||
|
||||
/*
|
||||
a simple 32 bit checksum that can be upadted from either end
|
||||
@@ -54,10 +55,18 @@ void get_checksum2(char *buf, int32 len, char *sum)
|
||||
if (protocol_version >= 30) {
|
||||
uchar seedbuf[4];
|
||||
md5_begin(&m);
|
||||
md5_update(&m, (uchar *)buf, len);
|
||||
if (checksum_seed) {
|
||||
SIVALu(seedbuf, 0, checksum_seed);
|
||||
md5_update(&m, seedbuf, 4);
|
||||
if (proper_seed_order) {
|
||||
if (checksum_seed) {
|
||||
SIVALu(seedbuf, 0, checksum_seed);
|
||||
md5_update(&m, seedbuf, 4);
|
||||
}
|
||||
md5_update(&m, (uchar *)buf, len);
|
||||
} else {
|
||||
md5_update(&m, (uchar *)buf, len);
|
||||
if (checksum_seed) {
|
||||
SIVALu(seedbuf, 0, checksum_seed);
|
||||
md5_update(&m, seedbuf, 4);
|
||||
}
|
||||
}
|
||||
md5_result(&m, (uchar *)sum);
|
||||
} else {
|
||||
@@ -98,10 +107,10 @@ void get_checksum2(char *buf, int32 len, char *sum)
|
||||
}
|
||||
}
|
||||
|
||||
void file_checksum(char *fname, char *sum, OFF_T size)
|
||||
void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
|
||||
{
|
||||
struct map_struct *buf;
|
||||
OFF_T i, len = size;
|
||||
OFF_T i, len = st_p->st_size;
|
||||
md_context m;
|
||||
int32 remainder;
|
||||
int fd;
|
||||
@@ -112,7 +121,7 @@ void file_checksum(char *fname, char *sum, OFF_T size)
|
||||
if (fd == -1)
|
||||
return;
|
||||
|
||||
buf = map_file(fd, size, MAX_MAP_SIZE, CSUM_CHUNK);
|
||||
buf = map_file(fd, len, MAX_MAP_SIZE, CSUM_CHUNK);
|
||||
|
||||
if (protocol_version >= 30) {
|
||||
md5_begin(&m);
|
||||
|
||||
2
chmod.c
2
chmod.c
@@ -2,7 +2,7 @@
|
||||
* Implement the core of the --chmod option.
|
||||
*
|
||||
* Copyright (C) 2002 Scott Howard
|
||||
* Copyright (C) 2005-2013 Wayne Davison
|
||||
* Copyright (C) 2005-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
14
cleanup.c
14
cleanup.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "rsync.h"
|
||||
|
||||
extern int dry_run;
|
||||
extern int am_server;
|
||||
extern int am_daemon;
|
||||
extern int am_receiver;
|
||||
@@ -156,8 +157,6 @@ NORETURN void _exit_cleanup(int code, const char *file, int line)
|
||||
switch_step++;
|
||||
|
||||
if (cleanup_got_literal && (cleanup_fname || cleanup_fd_w != -1)) {
|
||||
const char *fname = cleanup_fname;
|
||||
cleanup_fname = NULL;
|
||||
if (cleanup_fd_r != -1) {
|
||||
close(cleanup_fd_r);
|
||||
cleanup_fd_r = -1;
|
||||
@@ -167,9 +166,11 @@ NORETURN void _exit_cleanup(int code, const char *file, int line)
|
||||
close(cleanup_fd_w);
|
||||
cleanup_fd_w = -1;
|
||||
}
|
||||
if (fname && cleanup_new_fname && keep_partial
|
||||
if (cleanup_fname && cleanup_new_fname && keep_partial
|
||||
&& handle_partial_dir(cleanup_new_fname, PDIR_CREATE)) {
|
||||
int tweak_modtime = 0;
|
||||
const char *fname = cleanup_fname;
|
||||
cleanup_fname = NULL;
|
||||
if (!partial_dir) {
|
||||
/* We don't want to leave a partial file with a modern time or it
|
||||
* could be skipped via --update. Setting the time to something
|
||||
@@ -232,8 +233,9 @@ NORETURN void _exit_cleanup(int code, const char *file, int line)
|
||||
if (DEBUG_GTE(EXIT, 1)) {
|
||||
rprintf(FINFO,
|
||||
"[%s] _exit_cleanup(code=%d, file=%s, line=%d): "
|
||||
"about to call exit(%d)\n",
|
||||
who_am_i(), first_code, exit_file, exit_line, exit_code);
|
||||
"about to call exit(%d)%s\n",
|
||||
who_am_i(), first_code, exit_file, exit_line, exit_code,
|
||||
dry_run ? " (DRY RUN)" : "");
|
||||
}
|
||||
|
||||
/* FALLTHROUGH */
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1992-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2002-2013 Wayne Davison
|
||||
* Copyright (C) 2002-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 2001-2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2002-2013 Wayne Davison
|
||||
* Copyright (C) 2002-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -60,8 +60,6 @@ extern char *iconv_opt;
|
||||
extern iconv_t ic_send, ic_recv;
|
||||
#endif
|
||||
|
||||
#define MAX_GID_LIST 32
|
||||
|
||||
char *auth_user;
|
||||
int read_only = 0;
|
||||
int module_id = -1;
|
||||
@@ -81,8 +79,7 @@ static int rl_nulls = 0;
|
||||
static struct sigaction sigact;
|
||||
#endif
|
||||
|
||||
static gid_t gid_list[MAX_GID_LIST];
|
||||
static int gid_count = 0;
|
||||
static item_list gid_list = EMPTY_ITEM_LIST;
|
||||
|
||||
/* Used when "reverse lookup" is off. */
|
||||
const char undetermined_hostname[] = "UNDETERMINED";
|
||||
@@ -438,18 +435,14 @@ static int path_failure(int f_out, const char *dir, BOOL was_chdir)
|
||||
|
||||
static int add_a_group(int f_out, const char *gname)
|
||||
{
|
||||
gid_t gid;
|
||||
gid_t gid, *gid_p;
|
||||
if (!group_to_gid(gname, &gid, True)) {
|
||||
rprintf(FLOG, "Invalid gid %s\n", gname);
|
||||
io_printf(f_out, "@ERROR: invalid gid %s\n", gname);
|
||||
return -1;
|
||||
}
|
||||
if (gid_count == MAX_GID_LIST) {
|
||||
rprintf(FLOG, "Too many groups specified via gid parameter.\n");
|
||||
io_printf(f_out, "@ERROR: too many groups\n");
|
||||
return -1;
|
||||
}
|
||||
gid_list[gid_count++] = gid;
|
||||
gid_p = EXPAND_ITEM_LIST(&gid_list, gid_t, -32);
|
||||
*gid_p = gid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -457,8 +450,7 @@ static int add_a_group(int f_out, const char *gname)
|
||||
static int want_all_groups(int f_out, uid_t uid)
|
||||
{
|
||||
const char *err;
|
||||
gid_count = MAX_GID_LIST;
|
||||
if ((err = getallgroups(uid, gid_list, &gid_count)) != NULL) {
|
||||
if ((err = getallgroups(uid, &gid_list)) != NULL) {
|
||||
rsyserr(FLOG, errno, "%s", err);
|
||||
io_printf(f_out, "@ERROR: %s\n", err);
|
||||
return -1;
|
||||
@@ -469,14 +461,15 @@ static int want_all_groups(int f_out, uid_t uid)
|
||||
static struct passwd *want_all_groups(int f_out, uid_t uid)
|
||||
{
|
||||
struct passwd *pw;
|
||||
gid_t *gid_p;
|
||||
if ((pw = getpwuid(uid)) == NULL) {
|
||||
rsyserr(FLOG, errno, "getpwuid failed");
|
||||
io_printf(f_out, "@ERROR: getpwuid failed\n");
|
||||
return NULL;
|
||||
}
|
||||
/* Start with the default group and initgroups() will add the reset. */
|
||||
gid_count = 1;
|
||||
gid_list[0] = pw->pw_gid;
|
||||
/* Start with the default group and initgroups() will add the rest. */
|
||||
gid_p = EXPAND_ITEM_LIST(&gid_list, gid_t, -32);
|
||||
*gid_p = pw->pw_gid;
|
||||
return pw;
|
||||
}
|
||||
#endif
|
||||
@@ -818,15 +811,16 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
|
||||
}
|
||||
}
|
||||
|
||||
if (gid_count) {
|
||||
if (setgid(gid_list[0])) {
|
||||
rsyserr(FLOG, errno, "setgid %ld failed", (long)gid_list[0]);
|
||||
if (gid_list.count) {
|
||||
gid_t *gid_array = gid_list.items;
|
||||
if (setgid(gid_array[0])) {
|
||||
rsyserr(FLOG, errno, "setgid %ld failed", (long)gid_array[0]);
|
||||
io_printf(f_out, "@ERROR: setgid failed\n");
|
||||
return -1;
|
||||
}
|
||||
#ifdef HAVE_SETGROUPS
|
||||
/* Set the group(s) we want to be active. */
|
||||
if (setgroups(gid_count, gid_list)) {
|
||||
if (setgroups(gid_list.count, gid_array)) {
|
||||
rsyserr(FLOG, errno, "setgroups failed");
|
||||
io_printf(f_out, "@ERROR: setgroups failed\n");
|
||||
return -1;
|
||||
|
||||
14
compat.c
14
compat.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) Andrew Tridgell 1996
|
||||
* Copyright (C) Paul Mackerras 1996
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -26,6 +26,8 @@ int file_extra_cnt = 0; /* count of file-list extras that everyone gets */
|
||||
int inc_recurse = 0;
|
||||
int compat_flags = 0;
|
||||
int use_safe_inc_flist = 0;
|
||||
int want_xattr_optim = 0;
|
||||
int proper_seed_order = 0;
|
||||
|
||||
extern int am_server;
|
||||
extern int am_sender;
|
||||
@@ -76,6 +78,8 @@ int filesfrom_convert = 0;
|
||||
#define CF_SYMLINK_TIMES (1<<1)
|
||||
#define CF_SYMLINK_ICONV (1<<2)
|
||||
#define CF_SAFE_FLIST (1<<3)
|
||||
#define CF_AVOID_XATTR_OPTIM (1<<4)
|
||||
#define CF_CHKSUM_SEED_FIX (1<<5)
|
||||
|
||||
static const char *client_info;
|
||||
|
||||
@@ -267,11 +271,17 @@ void setup_protocol(int f_out,int f_in)
|
||||
#endif
|
||||
if (local_server || strchr(client_info, 'f') != NULL)
|
||||
compat_flags |= CF_SAFE_FLIST;
|
||||
if (local_server || strchr(client_info, 'x') != NULL)
|
||||
compat_flags |= CF_AVOID_XATTR_OPTIM;
|
||||
if (local_server || strchr(client_info, 'C') != NULL)
|
||||
compat_flags |= CF_CHKSUM_SEED_FIX;
|
||||
write_byte(f_out, compat_flags);
|
||||
} else
|
||||
compat_flags = read_byte(f_in);
|
||||
/* The inc_recurse var MUST be set to 0 or 1. */
|
||||
inc_recurse = compat_flags & CF_INC_RECURSE ? 1 : 0;
|
||||
want_xattr_optim = protocol_version >= 31 && !(compat_flags & CF_AVOID_XATTR_OPTIM);
|
||||
proper_seed_order = compat_flags & CF_CHKSUM_SEED_FIX ? 1 : 0;
|
||||
if (am_sender) {
|
||||
receiver_symlink_times = am_server
|
||||
? strchr(client_info, 'L') != NULL
|
||||
@@ -323,7 +333,7 @@ void setup_protocol(int f_out,int f_in)
|
||||
|
||||
if (am_server) {
|
||||
if (!checksum_seed)
|
||||
checksum_seed = time(NULL);
|
||||
checksum_seed = time(NULL) ^ (getpid() << 6);
|
||||
write_int(f_out, checksum_seed);
|
||||
} else {
|
||||
checksum_seed = read_int(f_in);
|
||||
|
||||
219
configure.ac
219
configure.ac
@@ -1,20 +1,25 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_INIT()
|
||||
AC_INIT([rsync],[3.1.2],[http://rsync.samba.org/bugzilla.html])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_SRCDIR([byteorder.h])
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_PREREQ(2.59)
|
||||
AC_PREREQ([2.69])
|
||||
|
||||
RSYNC_VERSION=3.1.0
|
||||
AC_SUBST(RSYNC_VERSION)
|
||||
AC_MSG_NOTICE([Configuring rsync $RSYNC_VERSION])
|
||||
AC_SUBST(RSYNC_VERSION, $PACKAGE_VERSION)
|
||||
AC_MSG_NOTICE([Configuring rsync $PACKAGE_VERSION])
|
||||
|
||||
AC_DEFINE_UNQUOTED(RSYNC_VERSION, ["$RSYNC_VERSION"], [rsync release version])
|
||||
AC_DEFINE_UNQUOTED(RSYNC_VERSION, ["$PACKAGE_VERSION"], [rsync release version])
|
||||
|
||||
LDFLAGS=${LDFLAGS-""}
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
dnl define the directory for replacement function since AC_LIBOBJ does not
|
||||
dnl officially support subdirs and fails with automake
|
||||
AC_CONFIG_LIBOBJ_DIR([lib])
|
||||
|
||||
# We must decide this before testing the compiler.
|
||||
|
||||
# Please allow this to default to yes, so that your users have more
|
||||
@@ -22,8 +27,7 @@ AC_CANONICAL_HOST
|
||||
|
||||
AC_MSG_CHECKING([whether to include debugging symbols])
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--disable-debug],
|
||||
[disable debugging symbols and features]))
|
||||
AS_HELP_STRING([--disable-debug],[disable debugging symbols and features]))
|
||||
|
||||
if test x"$enable_debug" = x"no"; then
|
||||
AC_MSG_RESULT(no)
|
||||
@@ -42,6 +46,7 @@ AC_PROG_INSTALL
|
||||
AC_PROG_MKDIR_P
|
||||
AC_PROG_CC_STDC
|
||||
AC_SUBST(SHELL)
|
||||
AC_PATH_PROG([PERL], [perl])
|
||||
|
||||
AC_DEFINE([_GNU_SOURCE], 1,
|
||||
[Define _GNU_SOURCE so that we get all necessary prototypes])
|
||||
@@ -51,8 +56,7 @@ if test x"$ac_cv_prog_cc_stdc" = x"no"; then
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(profile,
|
||||
AC_HELP_STRING([--enable-profile],
|
||||
[turn on CPU profiling]))
|
||||
AS_HELP_STRING([--enable-profile],[turn on CPU profiling]))
|
||||
if test x"$enable_profile" = x"yes"; then
|
||||
CFLAGS="$CFLAGS -pg"
|
||||
fi
|
||||
@@ -60,8 +64,7 @@ fi
|
||||
|
||||
# Specifically, this turns on panic_action handling.
|
||||
AC_ARG_ENABLE(maintainer-mode,
|
||||
AC_HELP_STRING([--enable-maintainer-mode],
|
||||
[turn on extra debug features]))
|
||||
AS_HELP_STRING([--enable-maintainer-mode],[turn on extra debug features]))
|
||||
if test x"$enable_maintainer_mode" = x"yes"; then
|
||||
CFLAGS="$CFLAGS -DMAINTAINER_MODE"
|
||||
fi
|
||||
@@ -77,26 +80,26 @@ if test x"$GCC" = x"yes"; then
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(included-popt,
|
||||
AC_HELP_STRING([--with-included-popt], [use bundled popt library, not from system]))
|
||||
AS_HELP_STRING([--with-included-popt],[use bundled popt library, not from system]))
|
||||
|
||||
AC_ARG_WITH(included-zlib,
|
||||
AC_HELP_STRING([--with-included-zlib], [use bundled zlib library, not from system]))
|
||||
AS_HELP_STRING([--with-included-zlib],[use bundled zlib library, not from system]))
|
||||
|
||||
AC_ARG_WITH(protected-args,
|
||||
AC_HELP_STRING([--with-protected-args], [make --protected-args option the default]))
|
||||
AS_HELP_STRING([--with-protected-args],[make --protected-args option the default]))
|
||||
if test x"$with_protected_args" = x"yes"; then
|
||||
AC_DEFINE_UNQUOTED(RSYNC_USE_PROTECTED_ARGS, 1, [Define to 1 if --protected-args should be the default])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(rsync-path,
|
||||
AC_HELP_STRING([--with-rsync-path=PATH], [set default --rsync-path to PATH (default: rsync)]),
|
||||
AS_HELP_STRING([--with-rsync-path=PATH],[set default --rsync-path to PATH (default: rsync)]),
|
||||
[ RSYNC_PATH="$with_rsync_path" ],
|
||||
[ RSYNC_PATH="rsync" ])
|
||||
|
||||
AC_DEFINE_UNQUOTED(RSYNC_PATH, "$RSYNC_PATH", [location of rsync on remote machine])
|
||||
|
||||
AC_ARG_WITH(rsyncd-conf,
|
||||
AC_HELP_STRING([--with-rsyncd-conf=PATH], [set configuration file for rsync server to PATH (default: /etc/rsyncd.conf)]),
|
||||
AS_HELP_STRING([--with-rsyncd-conf=PATH],[set configuration file for rsync server to PATH (default: /etc/rsyncd.conf)]),
|
||||
[ if test ! -z "$with_rsyncd_conf" ; then
|
||||
case $with_rsyncd_conf in
|
||||
yes|no)
|
||||
@@ -117,7 +120,7 @@ AC_ARG_WITH(rsyncd-conf,
|
||||
AC_DEFINE_UNQUOTED(RSYNCD_SYSCONF, "$RSYNCD_SYSCONF", [location of configuration file for rsync server])
|
||||
|
||||
AC_ARG_WITH(rsh,
|
||||
AC_HELP_STRING([--with-rsh=CMD], [set remote shell command to CMD (default: ssh)]))
|
||||
AS_HELP_STRING([--with-rsh=CMD],[set remote shell command to CMD (default: ssh)]))
|
||||
|
||||
AC_CHECK_PROG(HAVE_REMSH, remsh, 1, 0)
|
||||
if test x$HAVE_REMSH = x1; then
|
||||
@@ -143,8 +146,7 @@ AC_PATH_PROG(SHELL_PATH, sh, /bin/sh, [/usr/xpg4/bin$PATH_SEPARATOR$PATH])
|
||||
AC_PATH_PROG(FAKEROOT_PATH, fakeroot, /usr/bin/fakeroot, [/usr/xpg4/bin$PATH_SEPARATOR$PATH])
|
||||
|
||||
AC_ARG_WITH(nobody-group,
|
||||
AC_HELP_STRING([--with-nobody-group=GROUP],
|
||||
[set the default unprivileged group (default nobody or nogroup)]),
|
||||
AS_HELP_STRING([--with-nobody-group=GROUP],[set the default unprivileged group (default nobody or nogroup)]),
|
||||
[ NOBODY_GROUP="$with_nobody_group" ])
|
||||
|
||||
if test x"$with_nobody_group" = x; then
|
||||
@@ -165,7 +167,7 @@ AC_DEFINE_UNQUOTED(NOBODY_GROUP, "$NOBODY_GROUP", [unprivileged group for unpriv
|
||||
# arrgh. libc in some old debian version screwed up the largefile
|
||||
# stuff, getting byte range locking wrong
|
||||
AC_CACHE_CHECK([for broken largefile support],rsync_cv_HAVE_BROKEN_LARGEFILE,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
@@ -197,8 +199,7 @@ int main(void)
|
||||
unlink(tpl);
|
||||
exit(WEXITSTATUS(status));
|
||||
}
|
||||
],
|
||||
rsync_cv_HAVE_BROKEN_LARGEFILE=yes,rsync_cv_HAVE_BROKEN_LARGEFILE=no,rsync_cv_HAVE_BROKEN_LARGEFILE=cross)])
|
||||
]])],[rsync_cv_HAVE_BROKEN_LARGEFILE=yes],[rsync_cv_HAVE_BROKEN_LARGEFILE=no],[rsync_cv_HAVE_BROKEN_LARGEFILE=cross])])
|
||||
if test x"$rsync_cv_HAVE_BROKEN_LARGEFILE" != x"yes"; then
|
||||
AC_SYS_LARGEFILE
|
||||
fi
|
||||
@@ -208,8 +209,7 @@ ipv6lib=none
|
||||
ipv6trylibc=yes
|
||||
|
||||
AC_ARG_ENABLE(ipv6,
|
||||
AC_HELP_STRING([--disable-ipv6],
|
||||
[do not even try to use IPv6]))
|
||||
AS_HELP_STRING([--disable-ipv6],[do not even try to use IPv6]))
|
||||
if test x"$enable_ipv6" != x"no"; then
|
||||
AC_MSG_CHECKING([ipv6 stack type])
|
||||
for i in inria kame linux-glibc linux-inet6 solaris toshiba v6d zeta cygwin; do
|
||||
@@ -320,8 +320,7 @@ fi
|
||||
|
||||
dnl Do you want to disable use of locale functions
|
||||
AC_ARG_ENABLE([locale],
|
||||
AC_HELP_STRING([--disable-locale],
|
||||
[disable locale features]))
|
||||
AS_HELP_STRING([--disable-locale],[disable locale features]))
|
||||
AH_TEMPLATE([CONFIG_LOCALE],
|
||||
[Undefine if you do not want locale features. By default this is defined.])
|
||||
if test x"$enable_locale" != x"no"; then
|
||||
@@ -352,7 +351,7 @@ AC_CHECK_HEADERS(sys/fcntl.h sys/select.h fcntl.h sys/time.h sys/unistd.h \
|
||||
AC_HEADER_MAJOR
|
||||
|
||||
AC_CACHE_CHECK([if makedev takes 3 args],rsync_cv_MAKEDEV_TAKES_3_ARGS,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <sys/types.h>
|
||||
#ifdef MAJOR_IN_MKDEV
|
||||
#include <sys/mkdev.h>
|
||||
@@ -370,8 +369,7 @@ int main(void)
|
||||
exit(1);
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
rsync_cv_MAKEDEV_TAKES_3_ARGS=yes,rsync_cv_MAKEDEV_TAKES_3_ARGS=no,rsync_cv_MAKEDEV_TAKES_3_ARGS=no)])
|
||||
]])],[rsync_cv_MAKEDEV_TAKES_3_ARGS=yes],[rsync_cv_MAKEDEV_TAKES_3_ARGS=no],[rsync_cv_MAKEDEV_TAKES_3_ARGS=no])])
|
||||
if test x"$rsync_cv_MAKEDEV_TAKES_3_ARGS" = x"yes"; then
|
||||
AC_DEFINE(MAKEDEV_TAKES_3_ARGS, 1, [Define to 1 if makedev() takes 3 args])
|
||||
fi
|
||||
@@ -390,9 +388,13 @@ AC_CHECK_SIZEOF(off64_t)
|
||||
AC_CHECK_SIZEOF(time_t)
|
||||
|
||||
AC_C_INLINE
|
||||
AC_C_LONG_DOUBLE
|
||||
|
||||
AC_TYPE_SIGNAL
|
||||
AC_TYPE_LONG_DOUBLE_WIDER
|
||||
ac_cv_c_long_double=$ac_cv_type_long_double_wider
|
||||
if test $ac_cv_c_long_double = yes; then
|
||||
AC_DEFINE([HAVE_LONG_DOUBLE],[1],[Define to 1 if the type `long double' works and has more range or precision than `double'.])
|
||||
fi
|
||||
|
||||
AC_TYPE_UID_T
|
||||
AC_CHECK_TYPES([mode_t,off_t,size_t,pid_t,id_t])
|
||||
AC_TYPE_GETGROUPS
|
||||
@@ -412,8 +414,7 @@ AC_CHECK_MEMBERS([struct stat.st_rdev,
|
||||
TYPE_SOCKLEN_T
|
||||
|
||||
AC_CACHE_CHECK([for errno in errno.h],rsync_cv_errno, [
|
||||
AC_TRY_COMPILE([#include <errno.h>],[int i = errno],
|
||||
rsync_cv_errno=yes,rsync_cv_have_errno_decl=no)])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <errno.h>]], [[int i = errno]])],[rsync_cv_errno=yes],[rsync_cv_have_errno_decl=no])])
|
||||
if test x"$rsync_cv_errno" = x"yes"; then
|
||||
AC_DEFINE(HAVE_ERRNO_DECL, 1, [Define to 1 if errno is declared in errno.h])
|
||||
fi
|
||||
@@ -464,7 +465,7 @@ AC_SEARCH_LIBS(libiconv_open, iconv)
|
||||
|
||||
AC_MSG_CHECKING([for iconv declaration])
|
||||
AC_CACHE_VAL(am_cv_proto_iconv, [
|
||||
AC_TRY_COMPILE([
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <stdlib.h>
|
||||
#include <iconv.h>
|
||||
extern
|
||||
@@ -476,7 +477,7 @@ size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, si
|
||||
#else
|
||||
size_t iconv();
|
||||
#endif
|
||||
], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
|
||||
]], [[]])],[am_cv_proto_iconv_arg1=""],[am_cv_proto_iconv_arg1="const"])
|
||||
am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
|
||||
am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
|
||||
AC_MSG_RESULT([$]{ac_t:-
|
||||
@@ -486,8 +487,7 @@ AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
|
||||
|
||||
dnl AC_MSG_NOTICE([Looking in libraries: $LIBS])
|
||||
|
||||
AC_CHECK_FUNCS(inet_ntop, , [AC_LIBOBJ(lib/inet_ntop)])
|
||||
AC_CHECK_FUNCS(inet_pton, , [AC_LIBOBJ(lib/inet_pton)])
|
||||
AC_REPLACE_FUNCS([inet_ntop inet_pton])
|
||||
|
||||
AC_HAVE_TYPE([struct addrinfo], [#include <netdb.h>])
|
||||
AC_HAVE_TYPE([struct sockaddr_storage], [#include <sys/types.h>
|
||||
@@ -506,23 +506,19 @@ AC_CACHE_CHECK([whether defines needed by getaddrinfo exist],
|
||||
#endif],
|
||||
rsync_cv_HAVE_GETADDR_DEFINES=yes,
|
||||
rsync_cv_HAVE_GETADDR_DEFINES=no)])
|
||||
if test x"$rsync_cv_HAVE_GETADDR_DEFINES" = x"yes" -a x"$ac_cv_type_struct_addrinfo" = x"yes"; then
|
||||
AS_IF([test x"$rsync_cv_HAVE_GETADDR_DEFINES" = x"yes" -a x"$ac_cv_type_struct_addrinfo" = x"yes"],[
|
||||
# Tru64 UNIX has getaddrinfo() but has it renamed in libc as
|
||||
# something else so we must include <netdb.h> to get the
|
||||
# redefinition.
|
||||
AC_CHECK_FUNCS(getaddrinfo, ,
|
||||
[AC_MSG_CHECKING([for getaddrinfo by including <netdb.h>])
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>],[getaddrinfo(NULL, NULL, NULL, NULL);],
|
||||
[AC_MSG_RESULT([yes])
|
||||
#include <netdb.h>]], [[getaddrinfo(NULL, NULL, NULL, NULL);]])],[AC_MSG_RESULT([yes])
|
||||
AC_DEFINE(HAVE_GETADDRINFO, 1,
|
||||
[Define to 1 if you have the "getaddrinfo" function and required types.])],
|
||||
[AC_MSG_RESULT([no])
|
||||
AC_LIBOBJ(lib/getaddrinfo)])])
|
||||
else
|
||||
AC_LIBOBJ(lib/getaddrinfo)
|
||||
fi
|
||||
[Define to 1 if you have the "getaddrinfo" function and required types.])],[AC_MSG_RESULT([no])
|
||||
AC_LIBOBJ([getaddrinfo])])])
|
||||
],[AC_LIBOBJ([getaddrinfo])])
|
||||
|
||||
AC_CHECK_MEMBER([struct sockaddr.sa_len],
|
||||
[ AC_DEFINE(HAVE_SOCKADDR_LEN, 1, [Do we have sockaddr.sa_len?]) ],
|
||||
@@ -602,7 +598,7 @@ AC_CHECK_FUNCS(waitpid wait4 getcwd strdup chown chmod lchmod mknod mkfifo \
|
||||
setlocale setmode open64 lseek64 mkstemp64 mtrace va_copy __va_copy \
|
||||
seteuid strerror putenv iconv_open locale_charset nl_langinfo getxattr \
|
||||
extattr_get_link sigaction sigprocmask setattrlist getgrouplist \
|
||||
initgroups utimensat posix_fallocate attropen setvbuf)
|
||||
initgroups utimensat posix_fallocate attropen setvbuf usleep)
|
||||
|
||||
dnl cygwin iconv.h defines iconv_open as libiconv_open
|
||||
if test x"$ac_cv_func_iconv_open" != x"yes"; then
|
||||
@@ -612,19 +608,15 @@ fi
|
||||
dnl Preallocation stuff (also fallocate, posix_fallocate function tests above):
|
||||
|
||||
AC_CACHE_CHECK([for useable fallocate],rsync_cv_have_fallocate,[
|
||||
AC_TRY_LINK([#include <fcntl.h>
|
||||
#include <sys/types.h>],
|
||||
[fallocate(0, 0, 0, 0);],
|
||||
rsync_cv_have_fallocate=yes,rsync_cv_have_fallocate=no)])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <fcntl.h>
|
||||
#include <sys/types.h>]], [[fallocate(0, 0, 0, 0);]])],[rsync_cv_have_fallocate=yes],[rsync_cv_have_fallocate=no])])
|
||||
if test x"$rsync_cv_have_fallocate" = x"yes"; then
|
||||
AC_DEFINE(HAVE_FALLOCATE, 1, [Define to 1 if you have the fallocate function and it compiles and links without error])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for SYS_fallocate],rsync_cv_have_sys_fallocate,[
|
||||
AC_TRY_COMPILE([#include <sys/syscall.h>
|
||||
#include <sys/types.h>],
|
||||
[syscall(SYS_fallocate, 0, 0, (loff_t)0, (loff_t)0);],
|
||||
rsync_cv_have_sys_fallocate=yes,rsync_cv_have_sys_fallocate=no)])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/syscall.h>
|
||||
#include <sys/types.h>]], [[syscall(SYS_fallocate, 0, 0, (loff_t)0, (loff_t)0);]])],[rsync_cv_have_sys_fallocate=yes],[rsync_cv_have_sys_fallocate=no])])
|
||||
if test x"$rsync_cv_have_sys_fallocate" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SYS_FALLOCATE, 1, [Define to 1 if you have the SYS_fallocate syscall number])
|
||||
fi
|
||||
@@ -651,8 +643,7 @@ if test $ac_cv_func_getpgrp = yes; then
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(iconv-open,
|
||||
AC_HELP_STRING([--disable-iconv-open],
|
||||
[disable all use of iconv_open() function]),
|
||||
AS_HELP_STRING([--disable-iconv-open],[disable all use of iconv_open() function]),
|
||||
[], [enable_iconv_open=$ac_cv_func_iconv_open])
|
||||
|
||||
if test x"$enable_iconv_open" != x"no"; then
|
||||
@@ -660,8 +651,7 @@ if test x"$enable_iconv_open" != x"no"; then
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(iconv,
|
||||
AC_HELP_STRING([--disable-iconv],
|
||||
[disable rsync's --iconv option]),
|
||||
AS_HELP_STRING([--disable-iconv],[disable rsync's --iconv option]),
|
||||
[], [enable_iconv=$enable_iconv_open])
|
||||
AH_TEMPLATE([ICONV_OPTION],
|
||||
[Define if you want the --iconv option. Specifing a value will set the
|
||||
@@ -676,7 +666,7 @@ if test x"$enable_iconv" != x"no"; then
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([whether chown() modifies symlinks],rsync_cv_chown_modifies_symlink,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
@@ -688,14 +678,13 @@ AC_CACHE_CHECK([whether chown() modifies symlinks],rsync_cv_chown_modifies_symli
|
||||
if (symlink("conftest.no-such", dangling_symlink) < 0) abort();
|
||||
if (chown(dangling_symlink, getuid(), getgid()) < 0 && errno == ENOENT) exit(1);
|
||||
exit(0);
|
||||
}],
|
||||
rsync_cv_chown_modifies_symlink=yes,rsync_cv_chown_modifies_symlink=no,rsync_cv_chown_modifies_symlink=no)])
|
||||
}]])],[rsync_cv_chown_modifies_symlink=yes],[rsync_cv_chown_modifies_symlink=no],[rsync_cv_chown_modifies_symlink=no])])
|
||||
if test $rsync_cv_chown_modifies_symlink = yes; then
|
||||
AC_DEFINE(CHOWN_MODIFIES_SYMLINK, 1, [Define to 1 if chown modifies symlinks.])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([whether link() can hard-link symlinks],rsync_cv_can_hardlink_symlink,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
@@ -705,16 +694,16 @@ AC_CACHE_CHECK([whether link() can hard-link symlinks],rsync_cv_can_hardlink_sym
|
||||
main() {
|
||||
unlink(FILENAME);
|
||||
if (symlink("conftest.no-such", FILENAME) < 0) abort();
|
||||
unlink(FILENAME "2");
|
||||
if (link(FILENAME, FILENAME "2") < 0) exit(1);
|
||||
exit(0);
|
||||
}],
|
||||
rsync_cv_can_hardlink_symlink=yes,rsync_cv_can_hardlink_symlink=no,rsync_cv_can_hardlink_symlink=no)])
|
||||
}]])],[rsync_cv_can_hardlink_symlink=yes],[rsync_cv_can_hardlink_symlink=no],[rsync_cv_can_hardlink_symlink=no])])
|
||||
if test $rsync_cv_can_hardlink_symlink = yes; then
|
||||
AC_DEFINE(CAN_HARDLINK_SYMLINK, 1, [Define to 1 if link() can hard-link symlinks.])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([whether link() can hard-link special files],rsync_cv_can_hardlink_special,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
@@ -724,33 +713,28 @@ AC_CACHE_CHECK([whether link() can hard-link special files],rsync_cv_can_hardlin
|
||||
main() {
|
||||
unlink(FILENAME);
|
||||
if (mkfifo(FILENAME, 0777) < 0) abort();
|
||||
unlink(FILENAME "2");
|
||||
if (link(FILENAME, FILENAME "2") < 0) exit(1);
|
||||
exit(0);
|
||||
}],
|
||||
rsync_cv_can_hardlink_special=yes,rsync_cv_can_hardlink_special=no,rsync_cv_can_hardlink_special=no)])
|
||||
}]])],[rsync_cv_can_hardlink_special=yes],[rsync_cv_can_hardlink_special=no],[rsync_cv_can_hardlink_special=no])])
|
||||
if test $rsync_cv_can_hardlink_special = yes; then
|
||||
AC_DEFINE(CAN_HARDLINK_SPECIAL, 1, [Define to 1 if link() can hard-link special files.])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for working socketpair],rsync_cv_HAVE_SOCKETPAIR,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
main() {
|
||||
int fd[2];
|
||||
#ifdef __CYGWIN__
|
||||
exit(1);
|
||||
#else
|
||||
exit((socketpair(AF_UNIX, SOCK_STREAM, 0, fd) != -1) ? 0 : 1);
|
||||
#endif
|
||||
}],
|
||||
rsync_cv_HAVE_SOCKETPAIR=yes,rsync_cv_HAVE_SOCKETPAIR=no,rsync_cv_HAVE_SOCKETPAIR=cross)])
|
||||
}]])],[rsync_cv_HAVE_SOCKETPAIR=yes],[rsync_cv_HAVE_SOCKETPAIR=no],[rsync_cv_HAVE_SOCKETPAIR=cross])])
|
||||
if test x"$rsync_cv_HAVE_SOCKETPAIR" = x"yes"; then
|
||||
AC_DEFINE(HAVE_SOCKETPAIR, 1, [Define to 1 if you have the "socketpair" function])
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(getpass, , [AC_LIBOBJ(lib/getpass)])
|
||||
AC_REPLACE_FUNCS([getpass])
|
||||
|
||||
if test x"$with_included_popt" != x"yes"; then
|
||||
AC_CHECK_LIB(popt, poptGetContext, , [with_included_popt=yes])
|
||||
@@ -769,7 +753,7 @@ AC_MSG_CHECKING([whether to use included libpopt])
|
||||
if test x"$with_included_popt" = x"yes"; then
|
||||
AC_MSG_RESULT($srcdir/popt)
|
||||
BUILD_POPT='$(popt_OBJS)'
|
||||
CFLAGS="$CFLAGS -I$srcdir/popt"
|
||||
CFLAGS="-I$srcdir/popt $CFLAGS"
|
||||
if test x"$ALLOCA" != x
|
||||
then
|
||||
# this can be removed when/if we add an included alloca.c;
|
||||
@@ -794,49 +778,44 @@ AC_MSG_CHECKING([whether to use included zlib])
|
||||
if test x"$with_included_zlib" = x"yes"; then
|
||||
AC_MSG_RESULT($srcdir/zlib)
|
||||
BUILD_ZLIB='$(zlib_OBJS)'
|
||||
CFLAGS="$CFLAGS -I$srcdir/zlib"
|
||||
CFLAGS="-I$srcdir/zlib $CFLAGS"
|
||||
else
|
||||
AC_DEFINE(EXTERNAL_ZLIB, 1, [Define to 1 if using external zlib])
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for unsigned char],rsync_cv_SIGNED_CHAR_OK,[
|
||||
AC_TRY_COMPILE([],[signed char *s = ""],
|
||||
rsync_cv_SIGNED_CHAR_OK=yes,rsync_cv_SIGNED_CHAR_OK=no)])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[signed char *s = ""]])],[rsync_cv_SIGNED_CHAR_OK=yes],[rsync_cv_SIGNED_CHAR_OK=no])])
|
||||
if test x"$rsync_cv_SIGNED_CHAR_OK" = x"yes"; then
|
||||
AC_DEFINE(SIGNED_CHAR_OK, 1, [Define to 1 if "signed char" is a valid type])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for broken readdir],rsync_cv_HAVE_BROKEN_READDIR,[
|
||||
AC_TRY_RUN([#include <sys/types.h>
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
main() { struct dirent *di; DIR *d = opendir("."); di = readdir(d);
|
||||
if (di && di->d_name[-2] == '.' && di->d_name[-1] == 0 &&
|
||||
di->d_name[0] == 0) exit(0); exit(1);} ],
|
||||
rsync_cv_HAVE_BROKEN_READDIR=yes,rsync_cv_HAVE_BROKEN_READDIR=no,rsync_cv_HAVE_BROKEN_READDIR=cross)])
|
||||
di->d_name[0] == 0) exit(0); exit(1);} ]])],[rsync_cv_HAVE_BROKEN_READDIR=yes],[rsync_cv_HAVE_BROKEN_READDIR=no],[rsync_cv_HAVE_BROKEN_READDIR=cross])])
|
||||
if test x"$rsync_cv_HAVE_BROKEN_READDIR" = x"yes"; then
|
||||
AC_DEFINE(HAVE_BROKEN_READDIR, 1, [Define to 1 if readdir() is broken])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for utimbuf],rsync_cv_HAVE_STRUCT_UTIMBUF,[
|
||||
AC_TRY_COMPILE([#include <sys/types.h>
|
||||
#include <utime.h>],
|
||||
[struct utimbuf tbuf; tbuf.actime = 0; tbuf.modtime = 1; exit(utime("foo.c",&tbuf));],
|
||||
rsync_cv_HAVE_STRUCT_UTIMBUF=yes,rsync_cv_HAVE_STRUCT_UTIMBUF=no)])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
|
||||
#include <utime.h>]], [[struct utimbuf tbuf; tbuf.actime = 0; tbuf.modtime = 1; exit(utime("foo.c",&tbuf));]])],[rsync_cv_HAVE_STRUCT_UTIMBUF=yes],[rsync_cv_HAVE_STRUCT_UTIMBUF=no])])
|
||||
if test x"$rsync_cv_HAVE_STRUCT_UTIMBUF" = x"yes"; then
|
||||
AC_DEFINE(HAVE_STRUCT_UTIMBUF, 1, [Define to 1 if you have the "struct utimbuf" type])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([if gettimeofday takes tz argument],rsync_cv_HAVE_GETTIMEOFDAY_TZ,[
|
||||
AC_TRY_COMPILE([#include <sys/time.h>
|
||||
#include <unistd.h>],
|
||||
[struct timeval tv; exit(gettimeofday(&tv, NULL));],
|
||||
rsync_cv_HAVE_GETTIMEOFDAY_TZ=yes,rsync_cv_HAVE_GETTIMEOFDAY_TZ=no)])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/time.h>
|
||||
#include <unistd.h>]], [[struct timeval tv; exit(gettimeofday(&tv, NULL));]])],[rsync_cv_HAVE_GETTIMEOFDAY_TZ=yes],[rsync_cv_HAVE_GETTIMEOFDAY_TZ=no])])
|
||||
if test x"$rsync_cv_HAVE_GETTIMEOFDAY_TZ" != x"no"; then
|
||||
AC_DEFINE(HAVE_GETTIMEOFDAY_TZ, 1, [Define to 1 if gettimeofday() takes a time-zone arg])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([for C99 vsnprintf],rsync_cv_HAVE_C99_VSNPRINTF,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <sys/types.h>
|
||||
#include <stdarg.h>
|
||||
void foo(const char *format, ...) {
|
||||
@@ -854,15 +833,14 @@ void foo(const char *format, ...) {
|
||||
exit(0);
|
||||
}
|
||||
main() { foo("hello"); }
|
||||
],
|
||||
rsync_cv_HAVE_C99_VSNPRINTF=yes,rsync_cv_HAVE_C99_VSNPRINTF=no,rsync_cv_HAVE_C99_VSNPRINTF=cross)])
|
||||
]])],[rsync_cv_HAVE_C99_VSNPRINTF=yes],[rsync_cv_HAVE_C99_VSNPRINTF=no],[rsync_cv_HAVE_C99_VSNPRINTF=cross])])
|
||||
if test x"$rsync_cv_HAVE_C99_VSNPRINTF" = x"yes"; then
|
||||
AC_DEFINE(HAVE_C99_VSNPRINTF, 1, [Define to 1 if vsprintf has a C99-compatible return value])
|
||||
fi
|
||||
|
||||
|
||||
AC_CACHE_CHECK([for secure mkstemp],rsync_cv_HAVE_SECURE_MKSTEMP,[
|
||||
AC_TRY_RUN([#include <stdlib.h>
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
@@ -875,10 +853,7 @@ main() {
|
||||
if (fstat(fd, &st) != 0) exit(1);
|
||||
if ((st.st_mode & 0777) != 0600) exit(1);
|
||||
exit(0);
|
||||
}],
|
||||
rsync_cv_HAVE_SECURE_MKSTEMP=yes,
|
||||
rsync_cv_HAVE_SECURE_MKSTEMP=no,
|
||||
rsync_cv_HAVE_SECURE_MKSTEMP=cross)])
|
||||
}]])],[rsync_cv_HAVE_SECURE_MKSTEMP=yes],[rsync_cv_HAVE_SECURE_MKSTEMP=no],[rsync_cv_HAVE_SECURE_MKSTEMP=cross])])
|
||||
if test x"$rsync_cv_HAVE_SECURE_MKSTEMP" = x"yes"; then
|
||||
case $host_os in
|
||||
hpux*)
|
||||
@@ -895,29 +870,27 @@ fi
|
||||
|
||||
|
||||
AC_CACHE_CHECK([if mknod creates FIFOs],rsync_cv_MKNOD_CREATES_FIFOS,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
main() { int rc, ec; char *fn = "fifo-test";
|
||||
unlink(fn); rc = mknod(fn,S_IFIFO,0600); ec = errno; unlink(fn);
|
||||
if (rc) {printf("(%d %d) ",rc,ec); return ec;}
|
||||
return 0;}],
|
||||
rsync_cv_MKNOD_CREATES_FIFOS=yes,rsync_cv_MKNOD_CREATES_FIFOS=no,rsync_cv_MKNOD_CREATES_FIFOS=cross)])
|
||||
return 0;}]])],[rsync_cv_MKNOD_CREATES_FIFOS=yes],[rsync_cv_MKNOD_CREATES_FIFOS=no],[rsync_cv_MKNOD_CREATES_FIFOS=cross])])
|
||||
if test x"$rsync_cv_MKNOD_CREATES_FIFOS" = x"yes"; then
|
||||
AC_DEFINE(MKNOD_CREATES_FIFOS, 1, [Define to 1 if mknod() can create FIFOs.])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([if mknod creates sockets],rsync_cv_MKNOD_CREATES_SOCKETS,[
|
||||
AC_TRY_RUN([
|
||||
AC_RUN_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
main() { int rc, ec; char *fn = "sock-test";
|
||||
unlink(fn); rc = mknod(fn,S_IFSOCK,0600); ec = errno; unlink(fn);
|
||||
if (rc) {printf("(%d %d) ",rc,ec); return ec;}
|
||||
return 0;}],
|
||||
rsync_cv_MKNOD_CREATES_SOCKETS=yes,rsync_cv_MKNOD_CREATES_SOCKETS=no,rsync_cv_MKNOD_CREATES_SOCKETS=cross)])
|
||||
return 0;}]])],[rsync_cv_MKNOD_CREATES_SOCKETS=yes],[rsync_cv_MKNOD_CREATES_SOCKETS=no],[rsync_cv_MKNOD_CREATES_SOCKETS=cross])])
|
||||
if test x"$rsync_cv_MKNOD_CREATES_SOCKETS" = x"yes"; then
|
||||
AC_DEFINE(MKNOD_CREATES_SOCKETS, 1, [Define to 1 if mknod() can create sockets.])
|
||||
fi
|
||||
@@ -964,8 +937,7 @@ AC_CHECK_FUNCS(_acl __acl _facl __facl)
|
||||
|
||||
AC_MSG_CHECKING([whether to support ACLs])
|
||||
AC_ARG_ENABLE(acl-support,
|
||||
AC_HELP_STRING([--disable-acl-support],
|
||||
[disable ACL support]))
|
||||
AS_HELP_STRING([--disable-acl-support],[disable ACL support]))
|
||||
|
||||
if test x"$enable_acl_support" = x"no"; then
|
||||
AC_MSG_RESULT(no)
|
||||
@@ -1010,21 +982,17 @@ else
|
||||
*)
|
||||
AC_MSG_RESULT(running tests:)
|
||||
AC_CHECK_LIB(acl,acl_get_file)
|
||||
AC_CACHE_CHECK([for ACL support],samba_cv_HAVE_POSIX_ACLS,[
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <sys/acl.h>],
|
||||
[ acl_t acl; int entry_id; acl_entry_t *entry_p; return acl_get_entry( acl, entry_id, entry_p);],
|
||||
samba_cv_HAVE_POSIX_ACLS=yes,samba_cv_HAVE_POSIX_ACLS=no)])
|
||||
AC_CACHE_CHECK([for ACL support],samba_cv_HAVE_POSIX_ACLS,[
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
|
||||
#include <sys/acl.h>]], [[ acl_t acl; int entry_id; acl_entry_t *entry_p; return acl_get_entry( acl, entry_id, entry_p);]])],[samba_cv_HAVE_POSIX_ACLS=yes],[samba_cv_HAVE_POSIX_ACLS=no])])
|
||||
AC_MSG_CHECKING(ACL test results)
|
||||
if test x"$samba_cv_HAVE_POSIX_ACLS" = x"yes"; then
|
||||
AC_MSG_RESULT(Using posix ACLs)
|
||||
AC_DEFINE(HAVE_POSIX_ACLS, 1, [true if you have posix ACLs])
|
||||
AC_DEFINE(SUPPORT_ACLS, 1)
|
||||
AC_CACHE_CHECK([for acl_get_perm_np],samba_cv_HAVE_ACL_GET_PERM_NP,[
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <sys/acl.h>],
|
||||
[ acl_permset_t permset_d; acl_perm_t perm; return acl_get_perm_np( permset_d, perm);],
|
||||
samba_cv_HAVE_ACL_GET_PERM_NP=yes,samba_cv_HAVE_ACL_GET_PERM_NP=no)])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
|
||||
#include <sys/acl.h>]], [[ acl_permset_t permset_d; acl_perm_t perm; return acl_get_perm_np( permset_d, perm);]])],[samba_cv_HAVE_ACL_GET_PERM_NP=yes],[samba_cv_HAVE_ACL_GET_PERM_NP=no])])
|
||||
if test x"$samba_cv_HAVE_ACL_GET_PERM_NP" = x"yes"; then
|
||||
AC_DEFINE(HAVE_ACL_GET_PERM_NP, 1, [true if you have acl_get_perm_np])
|
||||
fi
|
||||
@@ -1043,8 +1011,7 @@ fi
|
||||
# check for extended attribute support
|
||||
AC_MSG_CHECKING(whether to support extended attributes)
|
||||
AC_ARG_ENABLE(xattr-support,
|
||||
AC_HELP_STRING([--disable-xattr-support],
|
||||
[disable extended attributes]),
|
||||
AS_HELP_STRING([--disable-xattr-support],[disable extended attributes]),
|
||||
[], [case "$ac_cv_func_getxattr$ac_cv_func_extattr_get_link$ac_cv_func_attropen" in
|
||||
*yes*) enable_xattr_support=maybe ;;
|
||||
*) enable_xattr_support=no ;;
|
||||
@@ -1055,11 +1022,12 @@ if test x"$enable_xattr_support" = x"no"; then
|
||||
AC_MSG_RESULT(no)
|
||||
else
|
||||
case "$host_os" in
|
||||
*linux*)
|
||||
*linux*|*netbsd*)
|
||||
AC_MSG_RESULT(Using Linux xattrs)
|
||||
AC_DEFINE(HAVE_LINUX_XATTRS, 1, [True if you have Linux xattrs])
|
||||
AC_DEFINE(HAVE_LINUX_XATTRS, 1, [True if you have Linux xattrs (or equivalent)])
|
||||
AC_DEFINE(SUPPORT_XATTRS, 1)
|
||||
AC_DEFINE(NO_SYMLINK_USER_XATTRS, 1, [True if symlinks do not support user xattrs])
|
||||
AC_CHECK_LIB(attr,getxattr)
|
||||
;;
|
||||
darwin*)
|
||||
AC_MSG_RESULT(Using OS X xattrs)
|
||||
@@ -1093,7 +1061,7 @@ if test x"$enable_acl_support" = x"no" -o x"$enable_xattr_support" = x"no" -o x"
|
||||
AC_MSG_CHECKING([whether $CC supports -Wno-unused-parameter])
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Wno-unused-parameter"
|
||||
AC_TRY_LINK([#include <stdio.h>], [printf("hello\n");], [rsync_warn_flag=yes], [rsync_warn_flag=no])
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]], [[printf("hello\n");]])],[rsync_warn_flag=yes],[rsync_warn_flag=no])
|
||||
AC_MSG_RESULT([$rsync_warn_flag])
|
||||
if test x"$rsync_warn_flag" = x"no"; then
|
||||
CFLAGS="$OLD_CFLAGS"
|
||||
@@ -1112,3 +1080,8 @@ AC_OUTPUT
|
||||
AC_MSG_RESULT()
|
||||
AC_MSG_RESULT([ rsync ${RSYNC_VERSION} configuration successful])
|
||||
AC_MSG_RESULT()
|
||||
if test x$HAVE_YODL2MAN != x1; then
|
||||
AC_MSG_RESULT([ Note that yodl2man was not found, so pre-existing manpage files will be])
|
||||
AC_MSG_RESULT([ used w/o change (if available) -- no .yo file changes will be used.])
|
||||
AC_MSG_RESULT()
|
||||
fi
|
||||
|
||||
4
delete.c
4
delete.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -199,7 +199,7 @@ enum delret delete_item(char *fbuf, uint16 mode, uint16 flags)
|
||||
fbuf);
|
||||
ret = DR_NOT_EMPTY;
|
||||
} else if (errno != ENOENT) {
|
||||
rsyserr(FERROR, errno, "delete_file: %s(%s) failed",
|
||||
rsyserr(FERROR_XFER, errno, "delete_file: %s(%s) failed",
|
||||
what, fbuf);
|
||||
ret = DR_FAILURE;
|
||||
} else
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Error codes returned by rsync.
|
||||
*
|
||||
* Copyright (C) 1998-2000 Andrew Tridgell
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
145
exclude.c
145
exclude.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -100,52 +100,44 @@ static int mergelist_size = 0;
|
||||
|
||||
static void teardown_mergelist(filter_rule *ex)
|
||||
{
|
||||
int j;
|
||||
|
||||
if (!ex->u.mergelist)
|
||||
return;
|
||||
|
||||
if (DEBUG_GTE(FILTER, 2)) {
|
||||
rprintf(FINFO, "[%s] deactivating mergelist #%d%s\n",
|
||||
who_am_i(), mergelist_cnt - 1,
|
||||
ex->u.mergelist->debug_type);
|
||||
}
|
||||
|
||||
/* We should deactivate mergelists in LIFO order. */
|
||||
assert(mergelist_cnt > 0);
|
||||
assert(ex == mergelist_parents[mergelist_cnt - 1]);
|
||||
|
||||
/* The parent_dirscan filters should have been freed. */
|
||||
assert(ex->u.mergelist->parent_dirscan_head == NULL);
|
||||
|
||||
free(ex->u.mergelist->debug_type);
|
||||
free(ex->u.mergelist);
|
||||
mergelist_cnt--;
|
||||
|
||||
for (j = 0; j < mergelist_cnt; j++) {
|
||||
if (mergelist_parents[j] == ex) {
|
||||
mergelist_parents[j] = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (mergelist_cnt && mergelist_parents[mergelist_cnt-1] == NULL)
|
||||
mergelist_cnt--;
|
||||
}
|
||||
|
||||
static void free_filter(filter_rule *ex)
|
||||
{
|
||||
if (ex->rflags & FILTRULE_PERDIR_MERGE)
|
||||
teardown_mergelist(ex);
|
||||
free(ex->pattern);
|
||||
free(ex);
|
||||
}
|
||||
|
||||
static void free_filters(filter_rule *head)
|
||||
static void free_filters(filter_rule *ent)
|
||||
{
|
||||
filter_rule *rev_head = NULL;
|
||||
|
||||
/* Reverse the list so we deactivate mergelists in the proper LIFO
|
||||
* order. */
|
||||
while (head) {
|
||||
filter_rule *next = head->next;
|
||||
head->next = rev_head;
|
||||
rev_head = head;
|
||||
head = next;
|
||||
}
|
||||
|
||||
while (rev_head) {
|
||||
filter_rule *prev = rev_head->next;
|
||||
/* Tear down mergelists here, not in free_filter, so that we
|
||||
* affect only real filter lists and not temporarily allocated
|
||||
* filters. */
|
||||
if (rev_head->rflags & FILTRULE_PERDIR_MERGE)
|
||||
teardown_mergelist(rev_head);
|
||||
free_filter(rev_head);
|
||||
rev_head = prev;
|
||||
while (ent) {
|
||||
filter_rule *next = ent->next;
|
||||
free_filter(ent);
|
||||
ent = next;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +244,10 @@ static void add_rule(filter_rule_list *listp, const char *pat, unsigned int pat_
|
||||
* add it again. */
|
||||
for (i = 0; i < mergelist_cnt; i++) {
|
||||
filter_rule *ex = mergelist_parents[i];
|
||||
const char *s = strrchr(ex->pattern, '/');
|
||||
const char *s;
|
||||
if (!ex)
|
||||
continue;
|
||||
s = strrchr(ex->pattern, '/');
|
||||
if (s)
|
||||
s++;
|
||||
else
|
||||
@@ -264,9 +259,8 @@ static void add_rule(filter_rule_list *listp, const char *pat, unsigned int pat_
|
||||
}
|
||||
}
|
||||
|
||||
if (!(lp = new_array(filter_rule_list, 1)))
|
||||
if (!(lp = new_array0(filter_rule_list, 1)))
|
||||
out_of_memory("add_rule");
|
||||
lp->head = lp->tail = lp->parent_dirscan_head = NULL;
|
||||
if (asprintf(&lp->debug_type, " [per-dir %s]", cp) < 0)
|
||||
out_of_memory("add_rule");
|
||||
rule->u.mergelist = lp;
|
||||
@@ -297,16 +291,23 @@ static void add_rule(filter_rule_list *listp, const char *pat, unsigned int pat_
|
||||
}
|
||||
}
|
||||
|
||||
static void clear_filter_list(filter_rule_list *listp)
|
||||
/* This frees any non-inherited items, leaving just inherited items on the list. */
|
||||
static void pop_filter_list(filter_rule_list *listp)
|
||||
{
|
||||
if (listp->tail) {
|
||||
/* Truncate any inherited items from the local list. */
|
||||
listp->tail->next = NULL;
|
||||
/* Now free everything that is left. */
|
||||
free_filters(listp->head);
|
||||
}
|
||||
filter_rule *inherited;
|
||||
|
||||
listp->head = listp->tail = NULL;
|
||||
if (!listp->tail)
|
||||
return;
|
||||
|
||||
inherited = listp->tail->next;
|
||||
|
||||
/* Truncate any inherited items from the local list. */
|
||||
listp->tail->next = NULL;
|
||||
/* Now free everything that is left. */
|
||||
free_filters(listp->head);
|
||||
|
||||
listp->head = inherited;
|
||||
listp->tail = NULL;
|
||||
}
|
||||
|
||||
/* This returns an expanded (absolute) filename for the merge-file name if
|
||||
@@ -356,7 +357,7 @@ static char *parse_merge_name(const char *merge_file, unsigned int *len_ptr,
|
||||
fn_len = clean_fname(fn, CFN_COLLAPSE_DOT_DOT_DIRS);
|
||||
}
|
||||
|
||||
/* If the name isn't in buf yet, it's wasn't absolute. */
|
||||
/* If the name isn't in buf yet, it wasn't absolute. */
|
||||
if (fn != buf) {
|
||||
int d_len = dirbuf_len - prefix_skip;
|
||||
if (d_len + fn_len >= MAXPATHLEN) {
|
||||
@@ -457,8 +458,6 @@ static BOOL setup_merge_file(int mergelist_num, filter_rule *ex,
|
||||
strlcpy(y, save, MAXPATHLEN);
|
||||
while ((*x++ = *y++) != '/') {}
|
||||
}
|
||||
/* Save current head for freeing when the mergelist becomes inactive. */
|
||||
lp->parent_dirscan_head = lp->head;
|
||||
parent_dirscan = False;
|
||||
if (DEBUG_GTE(FILTER, 2)) {
|
||||
rprintf(FINFO, "[%s] completed parent_dirscan for mergelist #%d%s\n",
|
||||
@@ -501,15 +500,20 @@ void *push_local_filters(const char *dir, unsigned int dirlen)
|
||||
|
||||
push->mergelist_cnt = mergelist_cnt;
|
||||
for (i = 0; i < mergelist_cnt; i++) {
|
||||
memcpy(&push->mergelists[i], mergelist_parents[i]->u.mergelist,
|
||||
sizeof (filter_rule_list));
|
||||
filter_rule *ex = mergelist_parents[i];
|
||||
if (!ex)
|
||||
continue;
|
||||
memcpy(&push->mergelists[i], ex->u.mergelist, sizeof (filter_rule_list));
|
||||
}
|
||||
|
||||
/* Note: parse_filter_file() might increase mergelist_cnt, so keep
|
||||
* this loop separate from the above loop. */
|
||||
for (i = 0; i < mergelist_cnt; i++) {
|
||||
filter_rule *ex = mergelist_parents[i];
|
||||
filter_rule_list *lp = ex->u.mergelist;
|
||||
filter_rule_list *lp;
|
||||
if (!ex)
|
||||
continue;
|
||||
lp = ex->u.mergelist;
|
||||
|
||||
if (DEBUG_GTE(FILTER, 2)) {
|
||||
rprintf(FINFO, "[%s] pushing mergelist #%d%s\n",
|
||||
@@ -553,44 +557,38 @@ void pop_local_filters(void *mem)
|
||||
|
||||
for (i = mergelist_cnt; i-- > 0; ) {
|
||||
filter_rule *ex = mergelist_parents[i];
|
||||
filter_rule_list *lp = ex->u.mergelist;
|
||||
filter_rule_list *lp;
|
||||
if (!ex)
|
||||
continue;
|
||||
lp = ex->u.mergelist;
|
||||
|
||||
if (DEBUG_GTE(FILTER, 2)) {
|
||||
rprintf(FINFO, "[%s] popping mergelist #%d%s\n",
|
||||
who_am_i(), i, lp->debug_type);
|
||||
}
|
||||
|
||||
clear_filter_list(lp);
|
||||
|
||||
if (i >= old_mergelist_cnt) {
|
||||
/* This mergelist does not exist in the state to be
|
||||
* restored. Free its parent_dirscan list to clean up
|
||||
* any per-dir mergelists defined there so we don't
|
||||
* crash trying to restore nonexistent state for them
|
||||
* below. (Counterpart to setup_merge_file call in
|
||||
* push_local_filters. Must be done here, not in
|
||||
* free_filter, for LIFO order.) */
|
||||
pop_filter_list(lp);
|
||||
if (i >= old_mergelist_cnt && lp->head) {
|
||||
/* This mergelist does not exist in the state to be restored, but it
|
||||
* still has inherited rules. This can sometimes happen if a per-dir
|
||||
* merge file calls setup_merge_file() in push_local_filters() and that
|
||||
* leaves some inherited rules that aren't in the pushed list state. */
|
||||
if (DEBUG_GTE(FILTER, 2)) {
|
||||
rprintf(FINFO, "[%s] freeing parent_dirscan filters of mergelist #%d%s\n",
|
||||
who_am_i(), i, ex->u.mergelist->debug_type);
|
||||
}
|
||||
free_filters(lp->parent_dirscan_head);
|
||||
lp->parent_dirscan_head = NULL;
|
||||
pop_filter_list(lp);
|
||||
}
|
||||
}
|
||||
|
||||
/* If we cleaned things up properly, the only still-active mergelists
|
||||
* should be those with a state to be restored. */
|
||||
assert(mergelist_cnt == old_mergelist_cnt);
|
||||
if (!pop)
|
||||
return; /* No state to restore. */
|
||||
|
||||
if (!pop) {
|
||||
/* No state to restore. */
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < mergelist_cnt; i++) {
|
||||
memcpy(mergelist_parents[i]->u.mergelist, &pop->mergelists[i],
|
||||
sizeof (filter_rule_list));
|
||||
for (i = 0; i < old_mergelist_cnt; i++) {
|
||||
filter_rule *ex = mergelist_parents[i];
|
||||
if (!ex)
|
||||
continue;
|
||||
memcpy(ex->u.mergelist, &pop->mergelists[i], sizeof (filter_rule_list));
|
||||
}
|
||||
|
||||
free(pop);
|
||||
@@ -872,7 +870,7 @@ static filter_rule *parse_rule_tok(const char **rulestr_ptr,
|
||||
switch (ch) {
|
||||
case ':':
|
||||
rule->rflags |= FILTRULE_PERDIR_MERGE
|
||||
| FILTRULE_FINISH_SETUP;
|
||||
| FILTRULE_FINISH_SETUP;
|
||||
/* FALL THROUGH */
|
||||
case '.':
|
||||
rule->rflags |= FILTRULE_MERGE_FILE;
|
||||
@@ -1093,7 +1091,8 @@ void parse_filter_str(filter_rule_list *listp, const char *rulestr,
|
||||
"[%s] clearing filter list%s\n",
|
||||
who_am_i(), listp->debug_type);
|
||||
}
|
||||
clear_filter_list(listp);
|
||||
pop_filter_list(listp);
|
||||
listp->head = NULL;
|
||||
goto free_continue;
|
||||
}
|
||||
|
||||
|
||||
2
fileio.c
2
fileio.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1998 Andrew Tridgell
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
79
flist.c
79
flist.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2002-2013 Wayne Davison
|
||||
* Copyright (C) 2002-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -736,8 +736,11 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
|
||||
}
|
||||
#endif
|
||||
|
||||
if (*thisname)
|
||||
clean_fname(thisname, 0);
|
||||
if (*thisname
|
||||
&& (clean_fname(thisname, CFN_REFUSE_DOT_DOT_DIRS) < 0 || (!relative_paths && *thisname == '/'))) {
|
||||
rprintf(FERROR, "ABORTING due to unsafe pathname from sender: %s\n", thisname);
|
||||
exit_cleanup(RERR_PROTOCOL);
|
||||
}
|
||||
|
||||
if (sanitize_paths)
|
||||
sanitize_path(thisname, thisname, "", 0, SP_DEFAULT);
|
||||
@@ -945,7 +948,14 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
|
||||
memcpy(bp, basename, basename_len);
|
||||
|
||||
#ifdef SUPPORT_HARD_LINKS
|
||||
if (xflags & XMIT_HLINKED)
|
||||
if (xflags & XMIT_HLINKED
|
||||
#ifndef CAN_HARDLINK_SYMLINK
|
||||
&& !S_ISLNK(mode)
|
||||
#endif
|
||||
#ifndef CAN_HARDLINK_SPECIAL
|
||||
&& !IS_SPECIAL(mode) && !IS_DEVICE(mode)
|
||||
#endif
|
||||
)
|
||||
file->flags |= FLAG_HLINKED;
|
||||
#endif
|
||||
file->modtime = (time_t)modtime;
|
||||
@@ -1156,7 +1166,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
|
||||
if (sanitize_paths)
|
||||
sanitize_path(thisname, thisname, "", 0, SP_DEFAULT);
|
||||
|
||||
if (stp && (S_ISDIR(stp->st_mode) || stp->st_mode == 0)) {
|
||||
if (stp && (S_ISDIR(stp->st_mode) || IS_MISSING_FILE(*stp))) {
|
||||
/* This is needed to handle a "symlink/." with a --relative
|
||||
* dir, or a request to delete a specific file. */
|
||||
st = *stp;
|
||||
@@ -1200,7 +1210,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
|
||||
full_fname(thisname));
|
||||
}
|
||||
return NULL;
|
||||
} else if (st.st_mode == 0) {
|
||||
} else if (IS_MISSING_FILE(st)) {
|
||||
io_error |= IOERR_GENERAL;
|
||||
rprintf(FINFO, "skipping file with bogus (zero) st_mode: %s\n",
|
||||
full_fname(thisname));
|
||||
@@ -1303,7 +1313,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
|
||||
#endif
|
||||
|
||||
if (always_checksum && am_sender && S_ISREG(st.st_mode)) {
|
||||
file_checksum(thisname, tmp_sum, st.st_size);
|
||||
file_checksum(thisname, &st, tmp_sum);
|
||||
if (sender_keeps_checksum)
|
||||
extra_len += SUM_EXTRA_CNT * EXTRA_LEN;
|
||||
}
|
||||
@@ -2290,7 +2300,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
} else
|
||||
fn = p;
|
||||
send_implied_dirs(f, flist, fbuf, fbuf, p, flags,
|
||||
st.st_mode == 0 ? MISSING_NAME : name_type);
|
||||
IS_MISSING_FILE(st) ? MISSING_NAME : name_type);
|
||||
if (fn == p)
|
||||
continue;
|
||||
}
|
||||
@@ -2425,8 +2435,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
return flist;
|
||||
}
|
||||
|
||||
struct file_list *recv_file_list(int f)
|
||||
struct file_list *recv_file_list(int f, int dir_ndx)
|
||||
{
|
||||
const char *good_dirname = NULL;
|
||||
struct file_list *flist;
|
||||
int dstart, flags;
|
||||
int64 start_read;
|
||||
@@ -2482,6 +2493,23 @@ struct file_list *recv_file_list(int f)
|
||||
flist_expand(flist, 1);
|
||||
file = recv_file_entry(f, flist, flags);
|
||||
|
||||
if (inc_recurse) {
|
||||
static const char empty_dir[] = "\0";
|
||||
const char *cur_dir = file->dirname ? file->dirname : empty_dir;
|
||||
if (relative_paths && *cur_dir == '/')
|
||||
cur_dir++;
|
||||
if (cur_dir != good_dirname) {
|
||||
const char *d = dir_ndx >= 0 ? f_name(dir_flist->files[dir_ndx], NULL) : empty_dir;
|
||||
if (strcmp(cur_dir, d) != 0) {
|
||||
rprintf(FERROR,
|
||||
"ABORTING due to invalid path from sender: %s/%s\n",
|
||||
cur_dir, file->basename);
|
||||
exit_cleanup(RERR_PROTOCOL);
|
||||
}
|
||||
good_dirname = cur_dir;
|
||||
}
|
||||
}
|
||||
|
||||
if (S_ISREG(file->mode)) {
|
||||
/* Already counted */
|
||||
} else if (S_ISDIR(file->mode)) {
|
||||
@@ -2553,6 +2581,9 @@ struct file_list *recv_file_list(int f)
|
||||
rprintf(FINFO, "[%s] flist_eof=1\n", who_am_i());
|
||||
}
|
||||
|
||||
/* The --relative option sends paths with a leading slash, so we need
|
||||
* to specify the strip_root option here. We rejected leading slashes
|
||||
* for a non-relative transfer in recv_file_entry(). */
|
||||
flist_sort_and_clean(flist, relative_paths);
|
||||
|
||||
if (protocol_version < 30) {
|
||||
@@ -2602,7 +2633,7 @@ void recv_additional_file_list(int f)
|
||||
rprintf(FINFO, "[%s] receiving flist for dir %d\n",
|
||||
who_am_i(), ndx);
|
||||
}
|
||||
flist = recv_file_list(f);
|
||||
flist = recv_file_list(f, ndx);
|
||||
flist->parent_ndx = ndx;
|
||||
}
|
||||
}
|
||||
@@ -2658,6 +2689,34 @@ int flist_find(struct file_list *flist, struct file_struct *f)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Search for a name in the file list. You must specify want_dir_match as:
|
||||
* 1=match directories, 0=match non-directories, or -1=match either. */
|
||||
int flist_find_name(struct file_list *flist, const char *fname, int want_dir_match)
|
||||
{
|
||||
struct { /* We have to create a temporary file_struct for the search. */
|
||||
struct file_struct f;
|
||||
char name_space[MAXPATHLEN];
|
||||
} t;
|
||||
char fbuf[MAXPATHLEN];
|
||||
const char *slash = strrchr(fname, '/');
|
||||
const char *basename = slash ? slash+1 : fname;
|
||||
|
||||
memset(&t.f, 0, FILE_STRUCT_LEN);
|
||||
memcpy((void *)t.f.basename, basename, strlen(basename)+1);
|
||||
|
||||
if (slash) {
|
||||
strlcpy(fbuf, fname, slash - fname + 1);
|
||||
t.f.dirname = fbuf;
|
||||
} else
|
||||
t.f.dirname = NULL;
|
||||
|
||||
t.f.mode = want_dir_match > 0 ? S_IFDIR : S_IFREG;
|
||||
|
||||
if (want_dir_match < 0)
|
||||
return flist_find_ignore_dirness(flist, &t.f);
|
||||
return flist_find(flist, &t.f);
|
||||
}
|
||||
|
||||
/* Search for an identically-named item in the file list. Differs from
|
||||
* flist_find in that an item that agrees with "f" in directory-ness is
|
||||
* preferred but one that does not is still found. */
|
||||
|
||||
116
generator.c
116
generator.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -57,6 +57,7 @@ extern int update_only;
|
||||
extern int human_readable;
|
||||
extern int ignore_existing;
|
||||
extern int ignore_non_existing;
|
||||
extern int want_xattr_optim;
|
||||
extern int inplace;
|
||||
extern int append_mode;
|
||||
extern int make_backups;
|
||||
@@ -356,6 +357,9 @@ static void do_delete_pass(void)
|
||||
for (j = 0; j < cur_flist->used; j++) {
|
||||
struct file_struct *file = cur_flist->sorted[j];
|
||||
|
||||
if (!F_IS_ACTIVE(file))
|
||||
continue;
|
||||
|
||||
f_name(file, fbuf);
|
||||
|
||||
if (!(file->flags & FLAG_CONTENT_DIR)) {
|
||||
@@ -551,7 +555,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
|
||||
if (preserve_xattrs && do_xfers
|
||||
&& iflags & (ITEM_REPORT_XATTR|ITEM_TRANSFER)) {
|
||||
int fd = iflags & ITEM_REPORT_XATTR
|
||||
&& (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE))
|
||||
&& !(want_xattr_optim && BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE))
|
||||
? sock_f_out : -1;
|
||||
send_xattr_request(NULL, file, fd);
|
||||
}
|
||||
@@ -574,7 +578,7 @@ int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
|
||||
of the file time to determine whether to sync */
|
||||
if (always_checksum > 0 && S_ISREG(st->st_mode)) {
|
||||
char sum[MAX_DIGEST_LEN];
|
||||
file_checksum(fn, sum, st->st_size);
|
||||
file_checksum(fn, st, sum);
|
||||
return memcmp(sum, F_SUM(file), checksum_len) == 0;
|
||||
}
|
||||
|
||||
@@ -755,6 +759,9 @@ static struct file_struct *find_fuzzy(struct file_struct *file, struct file_list
|
||||
for (j = 0; j < dirlist->used; j++) {
|
||||
struct file_struct *fp = dirlist->files[j];
|
||||
|
||||
if (!F_IS_ACTIVE(fp))
|
||||
continue;
|
||||
|
||||
if (!S_ISREG(fp->mode) || !F_LENGTH(fp) || fp->flags & FLAG_FILE_SENT)
|
||||
continue;
|
||||
|
||||
@@ -780,6 +787,9 @@ static struct file_struct *find_fuzzy(struct file_struct *file, struct file_list
|
||||
int len, suf_len;
|
||||
uint32 dist;
|
||||
|
||||
if (!F_IS_ACTIVE(fp))
|
||||
continue;
|
||||
|
||||
if (!S_ISREG(fp->mode) || !F_LENGTH(fp) || fp->flags & FLAG_FILE_SENT)
|
||||
continue;
|
||||
|
||||
@@ -885,23 +895,21 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
|
||||
} while (basis_dir[++j] != NULL);
|
||||
|
||||
if (!match_level)
|
||||
return -1;
|
||||
goto got_nothing_for_ya;
|
||||
|
||||
if (j != best_match) {
|
||||
j = best_match;
|
||||
pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
|
||||
if (link_stat(cmpbuf, &sxp->st, 0) < 0)
|
||||
return -1;
|
||||
goto got_nothing_for_ya;
|
||||
}
|
||||
|
||||
if (match_level == 3 && !copy_dest) {
|
||||
if (find_exact_for_existing) {
|
||||
if (link_dest && real_st.st_dev == sxp->st.st_dev && real_st.st_ino == sxp->st.st_ino)
|
||||
return -1;
|
||||
if (do_unlink(fname) < 0 && errno != ENOENT) {
|
||||
sxp->st = real_st;
|
||||
return -1;
|
||||
}
|
||||
if (do_unlink(fname) < 0 && errno != ENOENT)
|
||||
goto got_nothing_for_ya;
|
||||
}
|
||||
#ifdef SUPPORT_HARD_LINKS
|
||||
if (link_dest) {
|
||||
@@ -925,10 +933,8 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (find_exact_for_existing) {
|
||||
sxp->st = real_st;
|
||||
return -1;
|
||||
}
|
||||
if (find_exact_for_existing)
|
||||
goto got_nothing_for_ya;
|
||||
|
||||
if (match_level >= 2) {
|
||||
#ifdef SUPPORT_HARD_LINKS
|
||||
@@ -936,7 +942,7 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
|
||||
#endif
|
||||
if (!dry_run && copy_altdest_file(cmpbuf, fname, file) < 0) {
|
||||
if (find_exact_for_existing) /* Can get here via hard-link failure */
|
||||
sxp->st = real_st;
|
||||
goto got_nothing_for_ya;
|
||||
return -1;
|
||||
}
|
||||
if (itemizing)
|
||||
@@ -956,6 +962,10 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
|
||||
}
|
||||
|
||||
return FNAMECMP_BASIS_DIR_LOW + j;
|
||||
|
||||
got_nothing_for_ya:
|
||||
sxp->st = real_st;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* This is only called for non-regular files. We return -2 if we've finished
|
||||
@@ -1167,6 +1177,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
int itemizing, enum logcode code, int f_out)
|
||||
{
|
||||
static const char *parent_dirname = "";
|
||||
static struct file_struct *prior_dir_file = NULL;
|
||||
/* Missing dir not created due to --dry-run; will still be scanned. */
|
||||
static struct file_struct *dry_missing_dir = NULL;
|
||||
/* Missing dir whose contents are skipped altogether due to
|
||||
@@ -1246,6 +1257,18 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
const char *dn = file->dirname ? file->dirname : ".";
|
||||
dry_missing_dir = NULL;
|
||||
if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
|
||||
/* Each parent dir must be in the file list or the flist data is bad.
|
||||
* Optimization: most of the time the parent dir will be the last dir
|
||||
* this function was asked to process in the file list. */
|
||||
if (!inc_recurse
|
||||
&& (*dn != '.' || dn[1]) /* Avoid an issue with --relative and the "." dir. */
|
||||
&& (prior_dir_file && strcmp(dn, f_name(prior_dir_file, NULL)) != 0)
|
||||
&& flist_find_name(cur_flist, dn, 1) < 0) {
|
||||
rprintf(FERROR,
|
||||
"ABORTING due to invalid path from sender: %s/%s\n",
|
||||
dn, file->basename);
|
||||
exit_cleanup(RERR_PROTOCOL);
|
||||
}
|
||||
if (relative_paths && !implied_dirs
|
||||
&& do_stat(dn, &sx.st) < 0) {
|
||||
if (dry_run)
|
||||
@@ -1346,6 +1369,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
} else
|
||||
added_perms = 0;
|
||||
if (is_dir < 0) {
|
||||
if (!(preserve_times & PRESERVE_DIR_TIMES))
|
||||
return;
|
||||
/* In inc_recurse mode we want to make sure any missing
|
||||
* directories get created while we're still processing
|
||||
* the parent dir (which allows us to touch the parent
|
||||
@@ -1455,6 +1480,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
else
|
||||
change_local_filter_dir(fname, strlen(fname), F_DEPTH(file));
|
||||
}
|
||||
prior_dir_file = file;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@@ -1499,7 +1525,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT);
|
||||
if (itemizing)
|
||||
itemize(fname, file, ndx, 0, &sx, 0, 0, NULL);
|
||||
#if defined SUPPORT_HARD_LINKS && defined CAN_HARDLINK_SYMLINK
|
||||
#ifdef SUPPORT_HARD_LINKS
|
||||
if (preserve_hard_links && F_IS_HLINKED(file))
|
||||
finish_hard_link(file, fname, ndx, &sx.st, itemizing, code, -1);
|
||||
#endif
|
||||
@@ -1520,15 +1546,17 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
goto cleanup;
|
||||
itemizing = 0;
|
||||
code = FNONE;
|
||||
} else if (j >= 0)
|
||||
} else if (j >= 0) {
|
||||
statret = 1;
|
||||
fnamecmp = fnamecmpbuf;
|
||||
}
|
||||
}
|
||||
if (atomic_create(file, fname, sl, MAKEDEV(0, 0), &sx, statret == 0 ? DEL_FOR_SYMLINK : 0)) {
|
||||
if (atomic_create(file, fname, sl, NULL, MAKEDEV(0, 0), &sx, statret == 0 ? DEL_FOR_SYMLINK : 0)) {
|
||||
set_file_attrs(fname, file, NULL, NULL, 0);
|
||||
if (itemizing) {
|
||||
if (statret == 0 && !S_ISLNK(sx.st.st_mode))
|
||||
statret = -1;
|
||||
itemize(fname, file, ndx, statret, &sx,
|
||||
itemize(fnamecmp, file, ndx, statret, &sx,
|
||||
ITEM_LOCAL_CHANGE|ITEM_REPORT_CHANGE, 0, NULL);
|
||||
}
|
||||
if (code != FNONE && INFO_GTE(NAME, 1))
|
||||
@@ -1594,18 +1622,20 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
goto cleanup;
|
||||
itemizing = 0;
|
||||
code = FNONE;
|
||||
} else if (j >= 0)
|
||||
} else if (j >= 0) {
|
||||
statret = 1;
|
||||
fnamecmp = fnamecmpbuf;
|
||||
}
|
||||
}
|
||||
if (DEBUG_GTE(GENR, 1)) {
|
||||
rprintf(FINFO, "mknod(%s, 0%o, [%ld,%ld])\n",
|
||||
fname, (int)file->mode,
|
||||
(long)major(rdev), (long)minor(rdev));
|
||||
}
|
||||
if (atomic_create(file, fname, NULL, rdev, &sx, del_for_flag)) {
|
||||
if (atomic_create(file, fname, NULL, NULL, rdev, &sx, del_for_flag)) {
|
||||
set_file_attrs(fname, file, NULL, NULL, 0);
|
||||
if (itemizing) {
|
||||
itemize(fname, file, ndx, statret, &sx,
|
||||
itemize(fnamecmp, file, ndx, statret, &sx,
|
||||
ITEM_LOCAL_CHANGE|ITEM_REPORT_CHANGE, 0, NULL);
|
||||
}
|
||||
if (code != FNONE && INFO_GTE(NAME, 1))
|
||||
@@ -1907,11 +1937,11 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
}
|
||||
|
||||
/* If we are replacing an existing hard link, symlink, device, or special file,
|
||||
* create a temp-name item and rename it into place. Only a symlink or hard
|
||||
* link puts a non-NULL value into the lnk arg. Only a device puts a non-0
|
||||
* value into the rdev arg. Specify 0 for the del_for_flag if there is not a
|
||||
* file to replace. This returns 1 on success and 0 on failure. */
|
||||
int atomic_create(struct file_struct *file, char *fname, const char *lnk,
|
||||
* create a temp-name item and rename it into place. A symlimk specifies slnk,
|
||||
* a hard link specifies hlnk, otherwise we create a device based on rdev.
|
||||
* Specify 0 for the del_for_flag if there is not a file to replace. This
|
||||
* returns 1 on success and 0 on failure. */
|
||||
int atomic_create(struct file_struct *file, char *fname, const char *slnk, const char *hlnk,
|
||||
dev_t rdev, stat_x *sxp, int del_for_flag)
|
||||
{
|
||||
char tmpname[MAXPATHLEN];
|
||||
@@ -1936,23 +1966,22 @@ int atomic_create(struct file_struct *file, char *fname, const char *lnk,
|
||||
|
||||
create_name = skip_atomic ? fname : tmpname;
|
||||
|
||||
if (lnk) {
|
||||
if (slnk) {
|
||||
#ifdef SUPPORT_LINKS
|
||||
if (S_ISLNK(file->mode)
|
||||
#ifdef SUPPORT_HARD_LINKS /* The first symlink in a hard-linked cluster is always created. */
|
||||
&& (!F_IS_HLINKED(file) || file->flags & FLAG_HLINK_FIRST)
|
||||
#endif
|
||||
) {
|
||||
if (do_symlink(lnk, create_name) < 0) {
|
||||
rsyserr(FERROR_XFER, errno, "symlink %s -> \"%s\" failed",
|
||||
full_fname(create_name), lnk);
|
||||
return 0;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
#ifdef SUPPORT_HARD_LINKS
|
||||
if (!hard_link_one(file, create_name, lnk, 0))
|
||||
if (do_symlink(slnk, create_name) < 0) {
|
||||
rsyserr(FERROR_XFER, errno, "symlink %s -> \"%s\" failed",
|
||||
full_fname(create_name), slnk);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
} else if (hlnk) {
|
||||
#ifdef SUPPORT_HARD_LINKS
|
||||
if (!hard_link_one(file, create_name, hlnk, 0))
|
||||
return 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
} else {
|
||||
if (do_mknod(create_name, file->mode, rdev) < 0) {
|
||||
@@ -2014,6 +2043,8 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
|
||||
* transfer and/or re-set any tweaked modified-time values. */
|
||||
for (i = start; i <= end; i++, counter++) {
|
||||
file = flist->files[i];
|
||||
if (!F_IS_ACTIVE(file))
|
||||
continue;
|
||||
if (!S_ISDIR(file->mode)
|
||||
|| (!implied_dirs && file->flags & FLAG_IMPLIED_DIR))
|
||||
continue;
|
||||
@@ -2024,8 +2055,7 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
|
||||
}
|
||||
/* Be sure not to retouch permissions with --fake-super. */
|
||||
fix_dir_perms = !am_root && !(file->mode & S_IWUSR);
|
||||
if (!F_IS_ACTIVE(file) || file->flags & FLAG_MISSING_DIR
|
||||
|| !(need_retouch_dir_times || fix_dir_perms))
|
||||
if (file->flags & FLAG_MISSING_DIR || !(need_retouch_dir_times || fix_dir_perms))
|
||||
continue;
|
||||
fname = f_name(file, NULL);
|
||||
if (fix_dir_perms)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* `id -G` on Linux, but it's too hard to find a portable equivalent.
|
||||
*
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 3 as
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Routines to provide a memory-efficient hashtable.
|
||||
*
|
||||
* Copyright (C) 2007-2013 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
4
hlink.c
4
hlink.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -231,7 +231,7 @@ static int maybe_hard_link(struct file_struct *file, int ndx,
|
||||
}
|
||||
}
|
||||
|
||||
if (atomic_create(file, fname, oldname, MAKEDEV(0, 0), sxp, statret == 0 ? DEL_FOR_FILE : 0)) {
|
||||
if (atomic_create(file, fname, NULL, oldname, MAKEDEV(0, 0), sxp, statret == 0 ? DEL_FOR_FILE : 0)) {
|
||||
if (itemizing) {
|
||||
itemize(fname, file, ndx, statret, sxp,
|
||||
ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS, 0,
|
||||
|
||||
2
ifuncs.h
2
ifuncs.h
@@ -1,6 +1,6 @@
|
||||
/* Inline functions for rsync.
|
||||
*
|
||||
* Copyright (C) 2007-2013 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
2
inums.h
2
inums.h
@@ -1,6 +1,6 @@
|
||||
/* Inline functions for rsync.
|
||||
*
|
||||
* Copyright (C) 2008 Wayne Davison
|
||||
* Copyright (C) 2008-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
68
io.c
68
io.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2001 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -155,7 +155,7 @@ static void read_a_msg(void);
|
||||
static void drain_multiplex_messages(void);
|
||||
static void sleep_for_bwlimit(int bytes_written);
|
||||
|
||||
static void check_timeout(BOOL allow_keepalive)
|
||||
static void check_timeout(BOOL allow_keepalive, int keepalive_flags)
|
||||
{
|
||||
time_t t, chk;
|
||||
|
||||
@@ -177,7 +177,7 @@ static void check_timeout(BOOL allow_keepalive)
|
||||
|
||||
if (allow_keepalive) {
|
||||
/* This may put data into iobuf.msg w/o flushing. */
|
||||
maybe_send_keepalive(t, 0);
|
||||
maybe_send_keepalive(t, keepalive_flags);
|
||||
}
|
||||
|
||||
if (!last_io_in)
|
||||
@@ -232,28 +232,10 @@ static NORETURN void whine_about_eof(BOOL allow_kluge)
|
||||
* the socket except very early in the transfer. */
|
||||
static size_t safe_read(int fd, char *buf, size_t len)
|
||||
{
|
||||
size_t got;
|
||||
int n;
|
||||
size_t got = 0;
|
||||
|
||||
assert(fd != iobuf.in_fd);
|
||||
|
||||
n = read(fd, buf, len);
|
||||
if ((size_t)n == len || n == 0) {
|
||||
if (DEBUG_GTE(IO, 2))
|
||||
rprintf(FINFO, "[%s] safe_read(%d)=%ld\n", who_am_i(), fd, (long)n);
|
||||
return n;
|
||||
}
|
||||
if (n < 0) {
|
||||
if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) {
|
||||
read_failed:
|
||||
rsyserr(FERROR, errno, "safe_read failed to read %ld bytes [%s]",
|
||||
(long)len, who_am_i());
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
}
|
||||
got = 0;
|
||||
} else
|
||||
got = n;
|
||||
|
||||
while (1) {
|
||||
struct timeval tv;
|
||||
fd_set r_fds, e_fds;
|
||||
@@ -273,8 +255,7 @@ static size_t safe_read(int fd, char *buf, size_t len)
|
||||
who_am_i());
|
||||
exit_cleanup(RERR_FILEIO);
|
||||
}
|
||||
if (io_timeout)
|
||||
maybe_send_keepalive(time(NULL), MSK_ALLOW_FLUSH);
|
||||
check_timeout(1, MSK_ALLOW_FLUSH);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -282,7 +263,7 @@ static size_t safe_read(int fd, char *buf, size_t len)
|
||||
rprintf(FINFO, "select exception on fd %d\n", fd); */
|
||||
|
||||
if (FD_ISSET(fd, &r_fds)) {
|
||||
n = read(fd, buf + got, len - got);
|
||||
int n = read(fd, buf + got, len - got);
|
||||
if (DEBUG_GTE(IO, 2))
|
||||
rprintf(FINFO, "[%s] safe_read(%d)=%ld\n", who_am_i(), fd, (long)n);
|
||||
if (n == 0)
|
||||
@@ -290,7 +271,9 @@ static size_t safe_read(int fd, char *buf, size_t len)
|
||||
if (n < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
goto read_failed;
|
||||
rsyserr(FERROR, errno, "safe_read failed to read %ld bytes [%s]",
|
||||
(long)len, who_am_i());
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
}
|
||||
if ((got += (size_t)n) == len)
|
||||
break;
|
||||
@@ -768,7 +751,7 @@ static char *perform_io(size_t needed, int flags)
|
||||
send_extra_file_list(sock_f_out, -1);
|
||||
extra_flist_sending_enabled = !flist_eof;
|
||||
} else
|
||||
check_timeout((flags & PIO_NEED_INPUT) != 0);
|
||||
check_timeout((flags & PIO_NEED_INPUT) != 0, 0);
|
||||
FD_ZERO(&r_fds); /* Just in case... */
|
||||
FD_ZERO(&w_fds);
|
||||
}
|
||||
@@ -1388,6 +1371,14 @@ void maybe_send_keepalive(time_t now, int flags)
|
||||
if (flags & MSK_ACTIVE_RECEIVER)
|
||||
last_io_in = now; /* Fudge things when we're working hard on the files. */
|
||||
|
||||
/* Early in the transfer (before the receiver forks) the receiving side doesn't
|
||||
* care if it hasn't sent data in a while as long as it is receiving data (in
|
||||
* fact, a pre-3.1.0 rsync would die if we tried to send it a keep alive during
|
||||
* this time). So, if we're an early-receiving proc, just return and let the
|
||||
* incoming data determine if we timeout. */
|
||||
if (!am_sender && !am_receiver && !am_generator)
|
||||
return;
|
||||
|
||||
if (now - last_io_out >= allowed_lull) {
|
||||
/* The receiver is special: it only sends keep-alive messages if it is
|
||||
* actively receiving data. Otherwise, it lets the generator timeout. */
|
||||
@@ -1694,7 +1685,7 @@ void wait_for_receiver(void)
|
||||
rprintf(FINFO, "[%s] receiving flist for dir %d\n",
|
||||
who_am_i(), ndx);
|
||||
}
|
||||
flist = recv_file_list(iobuf.in_fd);
|
||||
flist = recv_file_list(iobuf.in_fd, ndx);
|
||||
flist->parent_ndx = ndx;
|
||||
#ifdef SUPPORT_HARD_LINKS
|
||||
if (preserve_hard_links)
|
||||
@@ -1794,7 +1785,7 @@ int64 read_varlong(int f, uchar min_bytes)
|
||||
#if SIZEOF_INT64 < 8
|
||||
u.x = IVAL(u.b,0);
|
||||
#elif CAREFUL_ALIGNMENT
|
||||
u.x = IVAL(u.b,0) | (((int64)IVAL(u.b,4))<<32);
|
||||
u.x = IVAL64(u.b,0);
|
||||
#endif
|
||||
return u.x;
|
||||
}
|
||||
@@ -2046,10 +2037,10 @@ void write_varlong(int f, int64 x, uchar min_bytes)
|
||||
uchar bit;
|
||||
int cnt = 8;
|
||||
|
||||
SIVAL(b, 1, x);
|
||||
#if SIZEOF_INT64 >= 8
|
||||
SIVAL(b, 5, x >> 32);
|
||||
SIVAL64(b, 1, x);
|
||||
#else
|
||||
SIVAL(b, 1, x);
|
||||
if (x <= 0x7FFFFFFF && x >= 0)
|
||||
memset(b + 5, 0, 4);
|
||||
else {
|
||||
@@ -2096,6 +2087,19 @@ void write_longint(int f, int64 x)
|
||||
#endif
|
||||
}
|
||||
|
||||
void write_bigbuf(int f, const char *buf, size_t len)
|
||||
{
|
||||
size_t half_max = (iobuf.out.size - iobuf.out_empty_len) / 2;
|
||||
|
||||
while (len > half_max + 1024) {
|
||||
write_buf(f, buf, half_max);
|
||||
buf += half_max;
|
||||
len -= half_max;
|
||||
}
|
||||
|
||||
write_buf(f, buf, len);
|
||||
}
|
||||
|
||||
void write_buf(int f, const char *buf, size_t len)
|
||||
{
|
||||
size_t pos, siz;
|
||||
@@ -2279,7 +2283,7 @@ void io_printf(int fd, const char *format, ...)
|
||||
if (len < 0)
|
||||
exit_cleanup(RERR_PROTOCOL);
|
||||
|
||||
if (len > (int)sizeof buf) {
|
||||
if (len >= (int)sizeof buf) {
|
||||
rprintf(FERROR, "io_printf() was too long for the buffer.\n");
|
||||
exit_cleanup(RERR_PROTOCOL);
|
||||
}
|
||||
|
||||
2
io.h
2
io.h
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2007-2013 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
2
itypes.h
2
itypes.h
@@ -1,6 +1,6 @@
|
||||
/* Inline functions for rsync.
|
||||
*
|
||||
* Copyright (C) 2007-2013 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1998 Andrew Tridgell
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2004, 2005, 2006 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* An implementation of MD4 designed for use in the SMB authentication protocol.
|
||||
*
|
||||
* Copyright (C) 1997-1998 Andrew Tridgell
|
||||
* Copyright (C) 2005-2008 Wayne Davison
|
||||
* Copyright (C) 2005-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003, 2006 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Unix SMB/CIFS implementation.
|
||||
* Based on the Samba ACL support code.
|
||||
* Copyright (C) Jeremy Allison 2000.
|
||||
* Copyright (C) 2007-2008 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* The permission functions have been changed to get/set all bits via
|
||||
* one call. Some functions that rsync doesn't need were also removed.
|
||||
@@ -873,6 +873,10 @@ int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *type_p)
|
||||
|
||||
#define INITIAL_ACL_SIZE 16
|
||||
|
||||
#ifndef NACLENTRIES
|
||||
#define NACLENTRIES 0
|
||||
#endif
|
||||
|
||||
SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type)
|
||||
{
|
||||
SMB_ACL_T acl_d;
|
||||
@@ -909,7 +913,7 @@ SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type)
|
||||
|
||||
sys_acl_free_acl(acl_d);
|
||||
|
||||
if ((count = acl(path_p, ACL_CNT, 0, NULL)) < 0) {
|
||||
if ((count = acl(path_p, ACL_CNT, NACLENTRIES, NULL)) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Version 2.2.x
|
||||
* Portable SMB ACL interface
|
||||
* Copyright (C) Jeremy Allison 2000
|
||||
* Copyright (C) 2007-2008 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Extended attribute support for rsync.
|
||||
*
|
||||
* Copyright (C) 2004 Red Hat, Inc.
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
* Written by Jay Fenlason.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -24,6 +24,10 @@
|
||||
|
||||
#ifdef SUPPORT_XATTRS
|
||||
|
||||
#ifdef HAVE_OSX_XATTRS
|
||||
#define GETXATTR_FETCH_LIMIT (64*1024*1024)
|
||||
#endif
|
||||
|
||||
#if defined HAVE_LINUX_XATTRS
|
||||
|
||||
ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size)
|
||||
@@ -55,7 +59,24 @@ ssize_t sys_llistxattr(const char *path, char *list, size_t size)
|
||||
|
||||
ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size)
|
||||
{
|
||||
return getxattr(path, name, value, size, 0, XATTR_NOFOLLOW);
|
||||
ssize_t len = getxattr(path, name, value, size, 0, XATTR_NOFOLLOW);
|
||||
|
||||
/* If we're retrieving data, handle resource forks > 64MB specially */
|
||||
if (value != NULL && len == GETXATTR_FETCH_LIMIT && (size_t)len < size) {
|
||||
/* getxattr will only return 64MB of data at a time, need to call again with a new offset */
|
||||
u_int32_t offset = len;
|
||||
size_t data_retrieved = len;
|
||||
while (data_retrieved < size) {
|
||||
len = getxattr(path, name, value + offset, size - data_retrieved, offset, XATTR_NOFOLLOW);
|
||||
if (len <= 0)
|
||||
break;
|
||||
data_retrieved += len;
|
||||
offset += (u_int32_t)len;
|
||||
}
|
||||
len = data_retrieved;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
ssize_t sys_fgetxattr(int filedes, const char *name, void *value, size_t size)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
* and Karl Auer. Some of the changes are:
|
||||
*
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison <wayned@samba.org>
|
||||
* Copyright (C) 2003-2015 Wayne Davison <wayned@samba.org>
|
||||
*/
|
||||
|
||||
/* Load parameters.
|
||||
|
||||
29
log.c
29
log.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 2000-2001 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -656,21 +656,10 @@ static void log_formatted(enum logcode code, const char *format, const char *op,
|
||||
n = auth_user;
|
||||
break;
|
||||
case 'b':
|
||||
if (!(iflags & ITEM_TRANSFER))
|
||||
b = 0;
|
||||
else if (am_sender)
|
||||
b = total_data_written - initial_data_written;
|
||||
else
|
||||
b = total_data_read - initial_data_read;
|
||||
strlcat(fmt, "s", sizeof fmt);
|
||||
snprintf(buf2, sizeof buf2, fmt,
|
||||
do_big_num(b, humanize, NULL));
|
||||
n = buf2;
|
||||
break;
|
||||
case 'c':
|
||||
if (!(iflags & ITEM_TRANSFER))
|
||||
b = 0;
|
||||
else if (!am_sender)
|
||||
else if ((!!am_sender) ^ (*p == 'c'))
|
||||
b = total_data_written - initial_data_written;
|
||||
else
|
||||
b = total_data_read - initial_data_read;
|
||||
@@ -846,13 +835,13 @@ void log_delete(const char *fname, int mode)
|
||||
|
||||
x.file.mode = mode;
|
||||
|
||||
if (!INFO_GTE(DEL, 1) && !stdout_format)
|
||||
;
|
||||
else if (am_server && protocol_version >= 29 && len < MAXPATHLEN) {
|
||||
if (am_server && protocol_version >= 29 && len < MAXPATHLEN) {
|
||||
if (S_ISDIR(mode))
|
||||
len++; /* directories include trailing null */
|
||||
send_msg(MSG_DELETED, fname, len, am_generator);
|
||||
} else {
|
||||
} else if (!INFO_GTE(DEL, 1) && !stdout_format)
|
||||
;
|
||||
else {
|
||||
fmt = stdout_format_has_o_or_i ? stdout_format : "deleting %n";
|
||||
log_formatted(FCLIENT, fmt, "del.", &x.file, fname, ITEM_DELETED, NULL);
|
||||
}
|
||||
@@ -874,9 +863,9 @@ void log_exit(int code, const char *file, int line)
|
||||
{
|
||||
if (code == 0) {
|
||||
rprintf(FLOG,"sent %s bytes received %s bytes total size %s\n",
|
||||
comma_num(stats.total_written),
|
||||
comma_num(stats.total_read),
|
||||
comma_num(stats.total_size));
|
||||
big_num(stats.total_written),
|
||||
big_num(stats.total_read),
|
||||
big_num(stats.total_size));
|
||||
} else if (am_server != 2) {
|
||||
const char *name;
|
||||
|
||||
|
||||
22
m4/have_type.m4
Normal file
22
m4/have_type.m4
Normal file
@@ -0,0 +1,22 @@
|
||||
dnl AC_HAVE_TYPE(TYPE,INCLUDES)
|
||||
AC_DEFUN([AC_HAVE_TYPE], [
|
||||
AC_REQUIRE([AC_HEADER_STDC])
|
||||
cv=`echo "$1" | sed 'y%./+- %__p__%'`
|
||||
AC_MSG_CHECKING(for $1)
|
||||
AC_CACHE_VAL([ac_cv_type_$cv],
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
AC_INCLUDES_DEFAULT
|
||||
$2]],
|
||||
[[$1 foo;]])],
|
||||
[eval "ac_cv_type_$cv=yes"],
|
||||
[eval "ac_cv_type_$cv=no"]))dnl
|
||||
ac_foo=`eval echo \\$ac_cv_type_$cv`
|
||||
AC_MSG_RESULT($ac_foo)
|
||||
if test "$ac_foo" = yes; then
|
||||
ac_tr_hdr=HAVE_`echo $1 | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'`
|
||||
if false; then
|
||||
AC_CHECK_TYPES($1)
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED($ac_tr_hdr, 1, [Define if you have type `$1'])
|
||||
fi
|
||||
])
|
||||
@@ -1,27 +1,3 @@
|
||||
dnl AC_VALIDATE_CACHE_SYSTEM_TYPE[(cmd)]
|
||||
dnl if the cache file is inconsistent with the current host,
|
||||
dnl target and build system types, execute CMD or print a default
|
||||
dnl error message.
|
||||
AC_DEFUN(AC_VALIDATE_CACHE_SYSTEM_TYPE, [
|
||||
AC_REQUIRE([AC_CANONICAL_SYSTEM])
|
||||
AC_MSG_CHECKING([config.cache system type])
|
||||
if { test x"${ac_cv_host_system_type+set}" = x"set" &&
|
||||
test x"$ac_cv_host_system_type" != x"$host"; } ||
|
||||
{ test x"${ac_cv_build_system_type+set}" = x"set" &&
|
||||
test x"$ac_cv_build_system_type" != x"$build"; } ||
|
||||
{ test x"${ac_cv_target_system_type+set}" = x"set" &&
|
||||
test x"$ac_cv_target_system_type" != x"$target"; }; then
|
||||
AC_MSG_RESULT([different])
|
||||
ifelse($#, 1, [$1],
|
||||
[AC_MSG_ERROR(["you must remove config.cache and restart configure"])])
|
||||
else
|
||||
AC_MSG_RESULT([same])
|
||||
fi
|
||||
ac_cv_host_system_type="$host"
|
||||
ac_cv_build_system_type="$build"
|
||||
ac_cv_target_system_type="$target"
|
||||
])
|
||||
|
||||
dnl Check for socklen_t: historically on BSD it is an int, and in
|
||||
dnl POSIX 1g it is a type of its own, but some platforms use different
|
||||
dnl types for the argument to getsockopt, getpeername, etc. So we
|
||||
@@ -67,26 +43,3 @@ AC_DEFUN([TYPE_SOCKLEN_T],
|
||||
[#include <sys/types.h>
|
||||
#include <sys/socket.h>])
|
||||
])
|
||||
|
||||
dnl AC_HAVE_TYPE(TYPE,INCLUDES)
|
||||
AC_DEFUN([AC_HAVE_TYPE], [
|
||||
AC_REQUIRE([AC_HEADER_STDC])
|
||||
cv=`echo "$1" | sed 'y%./+- %__p__%'`
|
||||
AC_MSG_CHECKING(for $1)
|
||||
AC_CACHE_VAL([ac_cv_type_$cv],
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
AC_INCLUDES_DEFAULT
|
||||
$2]],
|
||||
[[$1 foo;]])],
|
||||
[eval "ac_cv_type_$cv=yes"],
|
||||
[eval "ac_cv_type_$cv=no"]))dnl
|
||||
ac_foo=`eval echo \\$ac_cv_type_$cv`
|
||||
AC_MSG_RESULT($ac_foo)
|
||||
if test "$ac_foo" = yes; then
|
||||
ac_tr_hdr=HAVE_`echo $1 | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'`
|
||||
if false; then
|
||||
AC_CHECK_TYPES($1)
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED($ac_tr_hdr, 1, [Define if you have type `$1'])
|
||||
fi
|
||||
])
|
||||
23
m4/validate_cache_system_type.m4
Normal file
23
m4/validate_cache_system_type.m4
Normal file
@@ -0,0 +1,23 @@
|
||||
dnl AC_VALIDATE_CACHE_SYSTEM_TYPE[(cmd)]
|
||||
dnl if the cache file is inconsistent with the current host,
|
||||
dnl target and build system types, execute CMD or print a default
|
||||
dnl error message.
|
||||
AC_DEFUN([AC_VALIDATE_CACHE_SYSTEM_TYPE], [
|
||||
AC_REQUIRE([AC_CANONICAL_SYSTEM])
|
||||
AC_MSG_CHECKING([config.cache system type])
|
||||
if { test x"${ac_cv_host_system_type+set}" = x"set" &&
|
||||
test x"$ac_cv_host_system_type" != x"$host"; } ||
|
||||
{ test x"${ac_cv_build_system_type+set}" = x"set" &&
|
||||
test x"$ac_cv_build_system_type" != x"$build"; } ||
|
||||
{ test x"${ac_cv_target_system_type+set}" = x"set" &&
|
||||
test x"$ac_cv_target_system_type" != x"$target"; }; then
|
||||
AC_MSG_RESULT([different])
|
||||
ifelse($#, 1, [$1],
|
||||
[AC_MSG_ERROR(["you must remove config.cache and restart configure"])])
|
||||
else
|
||||
AC_MSG_RESULT([same])
|
||||
fi
|
||||
ac_cv_host_system_type="$host"
|
||||
ac_cv_build_system_type="$build"
|
||||
ac_cv_target_system_type="$target"
|
||||
])
|
||||
39
main.c
39
main.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -76,6 +76,7 @@ extern size_t bwlimit_writemax;
|
||||
extern unsigned int module_dirlen;
|
||||
extern BOOL flist_receiving_enabled;
|
||||
extern BOOL shutting_down;
|
||||
extern int backup_dir_len;
|
||||
extern int basis_dir_cnt;
|
||||
extern struct stats stats;
|
||||
extern char *stdout_format;
|
||||
@@ -850,13 +851,25 @@ static int do_recv(int f_in, int f_out, char *local_name)
|
||||
}
|
||||
|
||||
if (backup_dir) {
|
||||
int ret = make_path(backup_dir_buf, MKP_DROP_NAME); /* drops trailing slash */
|
||||
if (ret < 0)
|
||||
exit_cleanup(RERR_SYNTAX);
|
||||
if (ret)
|
||||
rprintf(FINFO, "Created backup_dir %s\n", backup_dir_buf);
|
||||
else if (INFO_GTE(BACKUP, 1))
|
||||
STRUCT_STAT st;
|
||||
int ret;
|
||||
if (backup_dir_len > 1)
|
||||
backup_dir_buf[backup_dir_len-1] = '\0';
|
||||
ret = do_stat(backup_dir_buf, &st);
|
||||
if (ret != 0 || !S_ISDIR(st.st_mode)) {
|
||||
if (ret == 0) {
|
||||
rprintf(FERROR, "The backup-dir is not a directory: %s\n", backup_dir_buf);
|
||||
exit_cleanup(RERR_SYNTAX);
|
||||
}
|
||||
if (errno != ENOENT) {
|
||||
rprintf(FERROR, "Failed to stat %s: %s\n", backup_dir_buf, strerror(errno));
|
||||
exit_cleanup(RERR_FILEIO);
|
||||
}
|
||||
rprintf(FINFO, "(new) backup_dir is %s\n", backup_dir_buf);
|
||||
} else if (INFO_GTE(BACKUP, 1))
|
||||
rprintf(FINFO, "backup_dir is %s\n", backup_dir_buf);
|
||||
if (backup_dir_len > 1)
|
||||
backup_dir_buf[backup_dir_len-1] = '/';
|
||||
}
|
||||
|
||||
io_flush(FULL_FLUSH);
|
||||
@@ -1009,7 +1022,7 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
|
||||
filesfrom_fd = -1;
|
||||
}
|
||||
|
||||
flist = recv_file_list(f_in);
|
||||
flist = recv_file_list(f_in, -1);
|
||||
if (!flist) {
|
||||
rprintf(FERROR,"server_recv: recv_file_list error\n");
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
@@ -1183,7 +1196,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
|
||||
|
||||
if (write_batch && !am_server)
|
||||
start_write_batch(f_in);
|
||||
flist = recv_file_list(f_in);
|
||||
flist = recv_file_list(f_in, -1);
|
||||
if (inc_recurse && file_total == 1)
|
||||
recv_additional_file_list(f_in);
|
||||
|
||||
@@ -1411,12 +1424,12 @@ static int start_client(int argc, char *argv[])
|
||||
}
|
||||
|
||||
|
||||
static RETSIGTYPE sigusr1_handler(UNUSED(int val))
|
||||
static void sigusr1_handler(UNUSED(int val))
|
||||
{
|
||||
exit_cleanup(RERR_SIGNAL1);
|
||||
}
|
||||
|
||||
static RETSIGTYPE sigusr2_handler(UNUSED(int val))
|
||||
static void sigusr2_handler(UNUSED(int val))
|
||||
{
|
||||
if (!am_server)
|
||||
output_summary();
|
||||
@@ -1426,7 +1439,7 @@ static RETSIGTYPE sigusr2_handler(UNUSED(int val))
|
||||
_exit(0);
|
||||
}
|
||||
|
||||
RETSIGTYPE remember_children(UNUSED(int val))
|
||||
void remember_children(UNUSED(int val))
|
||||
{
|
||||
#ifdef WNOHANG
|
||||
int cnt, status;
|
||||
@@ -1487,7 +1500,7 @@ const char *get_panic_action(void)
|
||||
* should just look at the environment variable, but I'm a bit leery
|
||||
* of a signal sending us into a busy loop.
|
||||
**/
|
||||
static RETSIGTYPE rsync_panic_handler(UNUSED(int whatsig))
|
||||
static void rsync_panic_handler(UNUSED(int whatsig))
|
||||
{
|
||||
char cmd_buf[300];
|
||||
int ret, pid_int = getpid();
|
||||
|
||||
2
match.c
2
match.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
93
options.c
93
options.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 2000, 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2002-2013 Wayne Davison
|
||||
* Copyright (C) 2002-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -32,6 +32,8 @@ extern unsigned int module_dirlen;
|
||||
extern filter_rule_list filter_list;
|
||||
extern filter_rule_list daemon_filter_list;
|
||||
|
||||
#define NOT_SPECIFIED (-42)
|
||||
|
||||
int make_backups = 0;
|
||||
|
||||
/**
|
||||
@@ -75,7 +77,7 @@ int protocol_version = PROTOCOL_VERSION;
|
||||
int sparse_files = 0;
|
||||
int preallocate_files = 0;
|
||||
int do_compression = 0;
|
||||
int def_compress_level = Z_DEFAULT_COMPRESSION;
|
||||
int def_compress_level = NOT_SPECIFIED;
|
||||
int am_root = 0; /* 0 = normal, 1 = root, 2 = --super, -1 = --fake-super */
|
||||
int am_server = 0;
|
||||
int am_sender = 0;
|
||||
@@ -409,16 +411,17 @@ static void parse_output_words(struct output_struct *words, short *levels,
|
||||
const char *s;
|
||||
int j, len, lev;
|
||||
|
||||
if (!str)
|
||||
return;
|
||||
|
||||
while (*str) {
|
||||
for ( ; str; str = s) {
|
||||
if ((s = strchr(str, ',')) != NULL)
|
||||
len = s++ - str;
|
||||
else
|
||||
len = strlen(str);
|
||||
while (len && isDigit(str+len-1))
|
||||
len--;
|
||||
if (!len)
|
||||
continue;
|
||||
if (!isDigit(str)) {
|
||||
while (len && isDigit(str+len-1))
|
||||
len--;
|
||||
}
|
||||
lev = isDigit(str+len) ? atoi(str+len) : 1;
|
||||
if (lev > MAX_OUT_LEVEL)
|
||||
lev = MAX_OUT_LEVEL;
|
||||
@@ -446,9 +449,6 @@ static void parse_output_words(struct output_struct *words, short *levels,
|
||||
words[j].help, len, str);
|
||||
exit_cleanup(RERR_SYNTAX);
|
||||
}
|
||||
if (!s)
|
||||
break;
|
||||
str = s;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -611,7 +611,7 @@ static void print_rsync_version(enum logcode f)
|
||||
|
||||
rprintf(f, "%s version %s protocol version %d%s\n",
|
||||
RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION, subprotocol);
|
||||
rprintf(f, "Copyright (C) 1996-2013 by Andrew Tridgell, Wayne Davison, and others.\n");
|
||||
rprintf(f, "Copyright (C) 1996-2015 by Andrew Tridgell, Wayne Davison, and others.\n");
|
||||
rprintf(f, "Web site: http://rsync.samba.org/\n");
|
||||
rprintf(f, "Capabilities:\n");
|
||||
rprintf(f, " %d-bit files, %d-bit inums, %d-bit timestamps, %d-bit long ints,\n",
|
||||
@@ -965,10 +965,12 @@ static struct poptOption long_options[] = {
|
||||
{"no-fuzzy", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
|
||||
{"no-y", 0, POPT_ARG_VAL, &fuzzy_basis, 0, 0, 0 },
|
||||
{"compress", 'z', POPT_ARG_NONE, 0, 'z', 0, 0 },
|
||||
{"old-compress", 0, POPT_ARG_VAL, &do_compression, 1, 0, 0 },
|
||||
{"new-compress", 0, POPT_ARG_VAL, &do_compression, 2, 0, 0 },
|
||||
{"no-compress", 0, POPT_ARG_VAL, &do_compression, 0, 0, 0 },
|
||||
{"no-z", 0, POPT_ARG_VAL, &do_compression, 0, 0, 0 },
|
||||
{"skip-compress", 0, POPT_ARG_STRING, &skip_compress, 0, 0, 0 },
|
||||
{"compress-level", 0, POPT_ARG_INT, &def_compress_level, 'z', 0, 0 },
|
||||
{"compress-level", 0, POPT_ARG_INT, &def_compress_level, 0, 0, 0 },
|
||||
{0, 'P', POPT_ARG_NONE, 0, 'P', 0, 0 },
|
||||
{"progress", 0, POPT_ARG_VAL, &do_progress, 1, 0, 0 },
|
||||
{"no-progress", 0, POPT_ARG_VAL, &do_progress, 0, 0, 0 },
|
||||
@@ -1543,18 +1545,7 @@ int parse_arguments(int *argc_p, const char ***argv_p)
|
||||
break;
|
||||
|
||||
case 'z':
|
||||
if (def_compress_level < Z_DEFAULT_COMPRESSION
|
||||
|| def_compress_level > Z_BEST_COMPRESSION) {
|
||||
snprintf(err_buf, sizeof err_buf,
|
||||
"--compress-level value is invalid: %d\n",
|
||||
def_compress_level);
|
||||
return 0;
|
||||
}
|
||||
do_compression = def_compress_level != Z_NO_COMPRESSION;
|
||||
if (do_compression && refused_compress) {
|
||||
create_refuse_error(refused_compress);
|
||||
return 0;
|
||||
}
|
||||
do_compression++;
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
@@ -1829,6 +1820,33 @@ int parse_arguments(int *argc_p, const char ***argv_p)
|
||||
exit_cleanup(0);
|
||||
}
|
||||
|
||||
if (do_compression || def_compress_level != NOT_SPECIFIED) {
|
||||
if (def_compress_level == NOT_SPECIFIED)
|
||||
def_compress_level = Z_DEFAULT_COMPRESSION;
|
||||
else if (def_compress_level < Z_DEFAULT_COMPRESSION || def_compress_level > Z_BEST_COMPRESSION) {
|
||||
snprintf(err_buf, sizeof err_buf, "--compress-level value is invalid: %d\n",
|
||||
def_compress_level);
|
||||
return 0;
|
||||
} else if (def_compress_level == Z_NO_COMPRESSION)
|
||||
do_compression = 0;
|
||||
else if (!do_compression)
|
||||
do_compression = 1;
|
||||
if (do_compression && refused_compress) {
|
||||
create_refuse_error(refused_compress);
|
||||
return 0;
|
||||
}
|
||||
#ifdef EXTERNAL_ZLIB
|
||||
if (do_compression == 1) {
|
||||
snprintf(err_buf, sizeof err_buf,
|
||||
"This rsync lacks old-style --compress due to its external zlib. Try -zz.\n");
|
||||
if (am_server)
|
||||
return 0;
|
||||
fprintf(stderr, "%s" "Continuing without compression.\n\n", err_buf);
|
||||
do_compression = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAVE_SETVBUF
|
||||
if (outbuf_mode && !am_server) {
|
||||
int mode = *(uchar *)outbuf_mode;
|
||||
@@ -2451,16 +2469,20 @@ void server_options(char **args, int *argc_p)
|
||||
}
|
||||
if (sparse_files)
|
||||
argstr[x++] = 'S';
|
||||
if (do_compression)
|
||||
if (do_compression == 1)
|
||||
argstr[x++] = 'z';
|
||||
|
||||
set_allow_inc_recurse();
|
||||
|
||||
/* Checking the pre-negotiated value allows --protocol=29 override. */
|
||||
/* We don't really know the actual protocol_version at this point,
|
||||
* but checking the pre-negotiated value allows the user to use a
|
||||
* --protocol=29 override to avoid the use of this -eFLAGS opt. */
|
||||
if (protocol_version >= 30) {
|
||||
/* Use "eFlags" alias so that cull_options doesn't think that these are no-arg option letters. */
|
||||
#define eFlags argstr
|
||||
/* We make use of the -e option to let the server know about
|
||||
* any pre-release protocol version && some behavior flags. */
|
||||
argstr[x++] = 'e';
|
||||
eFlags[x++] = 'e';
|
||||
#if SUBPROTOCOL_VERSION != 0
|
||||
if (protocol_version == PROTOCOL_VERSION) {
|
||||
x += snprintf(argstr+x, sizeof argstr - x,
|
||||
@@ -2468,15 +2490,19 @@ void server_options(char **args, int *argc_p)
|
||||
PROTOCOL_VERSION, SUBPROTOCOL_VERSION);
|
||||
} else
|
||||
#endif
|
||||
argstr[x++] = '.';
|
||||
eFlags[x++] = '.';
|
||||
if (allow_inc_recurse)
|
||||
argstr[x++] = 'i';
|
||||
eFlags[x++] = 'i';
|
||||
#ifdef CAN_SET_SYMLINK_TIMES
|
||||
argstr[x++] = 'L';
|
||||
eFlags[x++] = 'L'; /* symlink time-setting support */
|
||||
#endif
|
||||
#ifdef ICONV_OPTION
|
||||
argstr[x++] = 's';
|
||||
eFlags[x++] = 's'; /* symlink iconv translation support */
|
||||
#endif
|
||||
eFlags[x++] = 'f'; /* flist I/O-error safety support */
|
||||
eFlags[x++] = 'x'; /* xattr hardlink optimization not desired */
|
||||
eFlags[x++] = 'C'; /* support checksum seed order fix */
|
||||
#undef eFlags
|
||||
}
|
||||
|
||||
if (x >= (int)sizeof argstr) { /* Not possible... */
|
||||
@@ -2744,6 +2770,9 @@ void server_options(char **args, int *argc_p)
|
||||
exit_cleanup(RERR_MALLOC);
|
||||
}
|
||||
|
||||
if (do_compression > 1)
|
||||
args[ac++] = "--new-compress";
|
||||
|
||||
if (remote_option_cnt) {
|
||||
int j;
|
||||
if (ac + remote_option_cnt > MAX_SERVER_ARGS) {
|
||||
|
||||
@@ -6,10 +6,23 @@ use strict;
|
||||
|
||||
our %short_no_arg;
|
||||
our %short_with_num;
|
||||
our %long_opt = (
|
||||
our %long_opt = ( # These include some extra long-args that BackupPC uses:
|
||||
'block-size' => 1,
|
||||
'daemon' => -1,
|
||||
'debug' => 1,
|
||||
'fake-super' => 0,
|
||||
'fuzzy' => 0,
|
||||
'group' => 0,
|
||||
'hard-links' => 0,
|
||||
'ignore-times' => 0,
|
||||
'info' => 1,
|
||||
'links' => 0,
|
||||
'log-file' => 3,
|
||||
'one-file-system' => 0,
|
||||
'owner' => 0,
|
||||
'perms' => 0,
|
||||
'recursive' => 0,
|
||||
'times' => 0,
|
||||
);
|
||||
our $last_long_opt;
|
||||
|
||||
|
||||
@@ -35,8 +35,8 @@ sub check_git_status
|
||||
my($fatal_unless_clean, $subdir) = @_;
|
||||
$subdir = '.' unless defined $subdir;
|
||||
my $status = `cd '$subdir' && git status`;
|
||||
my $is_clean = $status =~ /\nnothing to commit \(working directory clean\)/;
|
||||
my($cur_branch) = $status =~ /^# On branch (.+)\n/;
|
||||
my $is_clean = $status =~ /\nnothing to commit.+working directory clean/;
|
||||
my($cur_branch) = $status =~ /^(?:# )?On branch (.+)\n/;
|
||||
if ($fatal_unless_clean && !$is_clean) {
|
||||
if ($subdir eq '.') {
|
||||
$subdir = '';
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
Summary: A fast, versatile, remote (and local) file-copying tool
|
||||
Name: rsync
|
||||
Version: 3.1.0
|
||||
Version: 3.1.2
|
||||
%define fullversion %{version}
|
||||
Release: 1
|
||||
%define srcdir src
|
||||
Group: Applications/Internet
|
||||
License: GPL
|
||||
Source0: http://rsync.samba.org/ftp/rsync/%{srcdir}/rsync-%{fullversion}.tar.gz
|
||||
#Source1: http://rsync.samba.org/ftp/rsync/%{srcdir}/rsync-patches-%{fullversion}.tar.gz
|
||||
URL: http://rsync.samba.org/
|
||||
|
||||
Prefix: %{_prefix}
|
||||
BuildRoot: /var/tmp/%{name}-root
|
||||
License: GPL
|
||||
|
||||
%package ssl-client
|
||||
Summary: Provides rsync-ssl
|
||||
Requires: stunnel >= 4
|
||||
Group: Applications/Internet
|
||||
Requires: rsync, stunnel >= 4
|
||||
|
||||
%package ssl-daemon
|
||||
Summary: An stunnel config file to support ssl rsync daemon connections.
|
||||
Requires: stunnel >= 4
|
||||
Group: Applications/Internet
|
||||
Requires: rsync, stunnel >= 4
|
||||
|
||||
%description
|
||||
Rsync is a fast and extraordinarily versatile file copying tool. It can
|
||||
@@ -89,8 +91,8 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%dir /etc/rsync-ssl/certs
|
||||
|
||||
%changelog
|
||||
* Sat Sep 28 2013 Wayne Davison <wayned@samba.org>
|
||||
Released 3.1.0.
|
||||
* Mon Dec 21 2015 Wayne Davison <wayned@samba.org>
|
||||
Released 3.1.2.
|
||||
|
||||
* Fri Mar 21 2008 Wayne Davison <wayned@samba.org>
|
||||
Added installation of /etc/xinetd.d/rsync file and some commented-out
|
||||
|
||||
@@ -16,6 +16,7 @@ use Date::Format;
|
||||
|
||||
# Where the local copy of /home/ftp/pub/rsync/dev/nightly should be updated.
|
||||
our $dest = $ENV{HOME} . '/samba-rsync-ftp/dev/nightly';
|
||||
our $samba_host = $ENV{SAMBA_HOST} || 'samba.org';
|
||||
our $nightly_symlink = "$dest/rsync-HEAD.tar.gz";
|
||||
|
||||
our($make_tar, $upload, $help_opt);
|
||||
@@ -39,8 +40,8 @@ if ($make_tar) {
|
||||
open(IN, '-|', 'git status') or die $!;
|
||||
my $status = join('', <IN>);
|
||||
close IN;
|
||||
die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/;
|
||||
die "The checkout is not on the master branch.\n" unless $status =~ /^# On branch master\n/;
|
||||
die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit.+working directory clean/;
|
||||
die "The checkout is not on the master branch.\n" unless $status =~ /^(?:# )?On branch master\n/;
|
||||
system "make $gen_target" and die "make $gen_target failed!\n";
|
||||
|
||||
my @extra_files;
|
||||
@@ -59,13 +60,13 @@ if ($make_tar) {
|
||||
my $confversion;
|
||||
open(IN, '<', 'configure.ac') or die "Unable to open configure.ac: $!\n";
|
||||
while (<IN>) {
|
||||
if (/^RSYNC_VERSION=(.*)/) {
|
||||
if (/^AC_INIT\(\[rsync\],\s*\[(\d.+?)\]/) {
|
||||
$confversion = $1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
close IN;
|
||||
die "Unable to find RSYNC_VERSION in configure.ac\n" unless defined $confversion;
|
||||
die "Unable to find AC_INIT with version in configure.ac\n" unless defined $confversion;
|
||||
|
||||
open(IN, '<', 'OLDNEWS') or die "Unable to open OLDNEWS: $!\n";
|
||||
$_ = <IN>;
|
||||
@@ -156,7 +157,7 @@ if ($upload) {
|
||||
if (defined $ENV{RSYNC_PARTIAL_DIR}) {
|
||||
$opt = " -f 'R $ENV{RSYNC_PARTIAL_DIR}'";
|
||||
}
|
||||
system "rsync$opt -aviHP --delete-after . samba.org:/home/ftp/pub/rsync/dev/nightly";
|
||||
system "rsync$opt -aviHP --delete-after . $samba_host\:/home/ftp/pub/rsync/dev/nightly";
|
||||
}
|
||||
|
||||
exit;
|
||||
|
||||
@@ -23,6 +23,8 @@ my $make_gen_cmd = 'make -f prepare-source.mak conf && ./config.status && make g
|
||||
);
|
||||
&usage if $help_opt;
|
||||
|
||||
$ENV{GIT_MERGE_AUTOEDIT} = 'no';
|
||||
|
||||
if (defined $incl_generated_files) {
|
||||
$patches_dir = $incl_generated_files if $incl_generated_files ne '';
|
||||
$incl_generated_files = 1;
|
||||
@@ -45,20 +47,8 @@ while (<PIPE>) {
|
||||
close PIPE;
|
||||
die "Unable to determine commit hash for master branch: $master_branch\n" unless defined $master_commit;
|
||||
|
||||
my @extra_files;
|
||||
open(IN, '<', 'Makefile.in') or die "Couldn't open Makefile.in: $!\n";
|
||||
while (<IN>) {
|
||||
if (s/^GENFILES=//) {
|
||||
while (s/\\$//) {
|
||||
$_ .= <IN>;
|
||||
}
|
||||
@extra_files = split(' ', $_);
|
||||
last;
|
||||
}
|
||||
}
|
||||
close IN;
|
||||
|
||||
if ($incl_generated_files) {
|
||||
my @extra_files = get_extra_files();
|
||||
die "'$tmp_dir' must not exist in the current directory.\n" if -e $tmp_dir;
|
||||
mkdir($tmp_dir, 0700) or die "Unable to mkdir($tmp_dir): $!\n";
|
||||
system "$make_gen_cmd && rsync -a @extra_files $tmp_dir/master/" and exit 1;
|
||||
@@ -171,7 +161,9 @@ sub update_patch
|
||||
open(OUT, '>', "$patches_dir/$patch.diff") or die $!;
|
||||
print OUT $description{$patch}, "\nbased-on: $based_on\n";
|
||||
|
||||
my @extra_files;
|
||||
if ($incl_generated_files) {
|
||||
@extra_files = get_extra_files();
|
||||
system "$make_gen_cmd && rsync -a @extra_files $tmp_dir/$patch/" and exit 1;
|
||||
}
|
||||
$last_touch = time;
|
||||
@@ -196,14 +188,15 @@ sub update_patch
|
||||
} else {
|
||||
($parent_dir) = $parent =~ m{([^/]+)$};
|
||||
}
|
||||
open(PIPE, '-|', 'diff', '-up', "$tmp_dir/$parent_dir", "$tmp_dir/$patch") or die $!;
|
||||
open(PIPE, '-|', 'diff', '-Nurp', "$tmp_dir/$parent_dir", "$tmp_dir/$patch") or die $!;
|
||||
while (<PIPE>) {
|
||||
s#^(diff -up) $tmp_dir/[^/]+/(.*?) $tmp_dir/[^/]+/(.*)#$1 a/$2 b/$3#o;
|
||||
s#^(diff -Nurp) $tmp_dir/[^/]+/(.*?) $tmp_dir/[^/]+/(.*)#$1 a/$2 b/$3#o;
|
||||
s#^\Q---\E $tmp_dir/[^/]+/([^\t]+)\t.*#--- a/$1#o;
|
||||
s#^\Q+++\E $tmp_dir/[^/]+/([^\t]+)\t.*#+++ b/$1#o;
|
||||
print OUT $_;
|
||||
}
|
||||
close PIPE;
|
||||
unlink @extra_files;
|
||||
}
|
||||
|
||||
close OUT;
|
||||
@@ -213,6 +206,25 @@ sub update_patch
|
||||
|
||||
exit;
|
||||
|
||||
sub get_extra_files
|
||||
{
|
||||
my @extras;
|
||||
|
||||
open(IN, '<', 'Makefile.in') or die "Couldn't open Makefile.in: $!\n";
|
||||
while (<IN>) {
|
||||
if (s/^GENFILES=//) {
|
||||
while (s/\\$//) {
|
||||
$_ .= <IN>;
|
||||
}
|
||||
@extras = split(' ', $_);
|
||||
last;
|
||||
}
|
||||
}
|
||||
close IN;
|
||||
|
||||
return @extras;
|
||||
}
|
||||
|
||||
sub usage
|
||||
{
|
||||
die <<EOT;
|
||||
|
||||
@@ -67,13 +67,13 @@ check_git_state($master_branch, 1, 1);
|
||||
my $confversion;
|
||||
open(IN, '<', 'configure.ac') or die $!;
|
||||
while (<IN>) {
|
||||
if (/^RSYNC_VERSION=(.*)/) {
|
||||
if (/^AC_INIT\(\[rsync\],\s*\[(\d.+?)\]/) {
|
||||
$confversion = $1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
close IN;
|
||||
die "Unable to find RSYNC_VERSION in configure.ac\n" unless defined $confversion;
|
||||
die "Unable to find AC_INIT with version in configure.ac\n" unless defined $confversion;
|
||||
|
||||
open(IN, '<', 'OLDNEWS') or die $!;
|
||||
$_ = <IN>;
|
||||
@@ -202,8 +202,8 @@ foreach my $fn (@tweak_files) {
|
||||
undef $/; $_ = <IN>; $/ = "\n";
|
||||
close IN;
|
||||
if ($fn =~ /configure/) {
|
||||
s/^RSYNC_VERSION=.*/RSYNC_VERSION=$version/m
|
||||
or die "Unable to update RSYNC_VERSION in $fn\n";
|
||||
s/^(AC_INIT\(\[rsync\],\s*\[)\d.+?(\])/$1$version$2/m
|
||||
or die "Unable to update AC_INIT with version in $fn\n";
|
||||
} elsif ($fn =~ /\.spec/) {
|
||||
while (my($str, $val) = each %specvars) {
|
||||
s/^\Q$str\E .*/$str $val/m
|
||||
|
||||
9
packaging/systemd/rsync.service
Normal file
9
packaging/systemd/rsync.service
Normal file
@@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=fast remote file copy program daemon
|
||||
ConditionPathExists=/etc/rsyncd.conf
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/rsync --daemon --no-detach
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
2
pipe.c
2
pipe.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -27,9 +27,9 @@ for action in "${@}"; do
|
||||
;;
|
||||
fetch)
|
||||
if perl --version >/dev/null 2>/dev/null; then
|
||||
files='c*'
|
||||
files='[ca]*'
|
||||
else
|
||||
files='[cp]*'
|
||||
files='[cap]*'
|
||||
fi
|
||||
rsync -pvz rsync://rsync.samba.org/rsyncftp/generated-files/"$files" .
|
||||
;;
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
conf: configure.sh config.h.in
|
||||
|
||||
aclocal.m4:
|
||||
aclocal -I m4
|
||||
|
||||
configure.sh: configure.ac aclocal.m4
|
||||
autoconf -o configure.sh
|
||||
|
||||
|
||||
13
progress.c
13
progress.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -177,6 +177,11 @@ void show_progress(OFF_T ofs, OFF_T size)
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
|
||||
if (INFO_GTE(PROGRESS, 2)) {
|
||||
ofs = stats.total_transferred_size - size + ofs;
|
||||
size = stats.total_size;
|
||||
}
|
||||
|
||||
if (!ph_start.time.tv_sec) {
|
||||
int i;
|
||||
|
||||
@@ -212,9 +217,5 @@ void show_progress(OFF_T ofs, OFF_T size)
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (INFO_GTE(PROGRESS, 2)) {
|
||||
rprint_progress(stats.total_transferred_size,
|
||||
stats.total_size, &now, False);
|
||||
} else
|
||||
rprint_progress(ofs, size, &now, False);
|
||||
rprint_progress(ofs, size, &now, False);
|
||||
}
|
||||
|
||||
17
receiver.c
17
receiver.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -30,6 +30,7 @@ extern int inc_recurse;
|
||||
extern int log_before_transfer;
|
||||
extern int stdout_format_has_i;
|
||||
extern int logfile_format_has_i;
|
||||
extern int want_xattr_optim;
|
||||
extern int csum_length;
|
||||
extern int read_batch;
|
||||
extern int write_batch;
|
||||
@@ -113,9 +114,12 @@ int get_tmpname(char *fnametmp, const char *fname, BOOL make_unique)
|
||||
}
|
||||
} else
|
||||
f = fname;
|
||||
if (*f == '.') /* avoid an extra leading dot for OS X's sake */
|
||||
f++;
|
||||
fnametmp[length++] = '.';
|
||||
|
||||
if (!tmpdir) { /* using a tmpdir avoids the leading dot on our temp names */
|
||||
if (*f == '.') /* avoid an extra leading dot for OS X's sake */
|
||||
f++;
|
||||
fnametmp[length++] = '.';
|
||||
}
|
||||
|
||||
/* The maxname value is bufsize, and includes space for the '\0'.
|
||||
* NAME_MAX needs an extra -1 for the name's leading dot. */
|
||||
@@ -581,7 +585,7 @@ int recv_files(int f_in, int f_out, char *local_name)
|
||||
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers
|
||||
&& (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
|
||||
&& !(want_xattr_optim && BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
|
||||
recv_xattr_request(file, f_in);
|
||||
#endif
|
||||
|
||||
@@ -668,8 +672,7 @@ int recv_files(int f_in, int f_out, char *local_name)
|
||||
}
|
||||
}
|
||||
|
||||
if (!log_before_transfer)
|
||||
remember_initial_stats();
|
||||
remember_initial_stats();
|
||||
|
||||
if (!do_xfers) { /* log the transfer */
|
||||
log_item(FCLIENT, file, iflags, NULL);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* A pre-compilation helper program to aid in the creation of rounding.h.
|
||||
*
|
||||
* Copyright (C) 2007-2013 Wayne Davison
|
||||
* Copyright (C) 2007-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
60
rsync.c
60
rsync.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -364,7 +364,7 @@ int read_ndx_and_attrs(int f_in, int f_out, int *iflag_ptr, uchar *type_ptr,
|
||||
}
|
||||
/* Send all the data we read for this flist to the generator. */
|
||||
start_flist_forward(ndx);
|
||||
flist = recv_file_list(f_in);
|
||||
flist = recv_file_list(f_in, ndx);
|
||||
flist->parent_ndx = ndx;
|
||||
stop_flist_forward();
|
||||
}
|
||||
@@ -489,31 +489,6 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
|
||||
get_acl(fname, sxp);
|
||||
#endif
|
||||
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (am_root < 0)
|
||||
set_stat_xattr(fname, file, new_mode);
|
||||
if (preserve_xattrs && fnamecmp)
|
||||
set_xattr(fname, file, fnamecmp, sxp);
|
||||
#endif
|
||||
|
||||
if (!preserve_times
|
||||
|| (!(preserve_times & PRESERVE_DIR_TIMES) && S_ISDIR(sxp->st.st_mode))
|
||||
|| (!(preserve_times & PRESERVE_LINK_TIMES) && S_ISLNK(sxp->st.st_mode)))
|
||||
flags |= ATTRS_SKIP_MTIME;
|
||||
if (!(flags & ATTRS_SKIP_MTIME)
|
||||
&& cmp_time(sxp->st.st_mtime, file->modtime) != 0) {
|
||||
int ret = set_modtime(fname, file->modtime, F_MOD_NSEC(file), sxp->st.st_mode);
|
||||
if (ret < 0) {
|
||||
rsyserr(FERROR_XFER, errno, "failed to set times on %s",
|
||||
full_fname(fname));
|
||||
goto cleanup;
|
||||
}
|
||||
if (ret == 0) /* ret == 1 if symlink could not be set */
|
||||
updated = 1;
|
||||
else
|
||||
file->flags |= FLAG_TIME_FAILED;
|
||||
}
|
||||
|
||||
change_uid = am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file);
|
||||
change_gid = gid_ndx && !(file->flags & FLAG_SKIP_GROUP)
|
||||
&& sxp->st.st_gid != (gid_t)F_GROUP(file);
|
||||
@@ -561,6 +536,35 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
|
||||
updated = 1;
|
||||
}
|
||||
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (am_root < 0)
|
||||
set_stat_xattr(fname, file, new_mode);
|
||||
if (preserve_xattrs && fnamecmp)
|
||||
set_xattr(fname, file, fnamecmp, sxp);
|
||||
#endif
|
||||
|
||||
if (!preserve_times
|
||||
|| (!(preserve_times & PRESERVE_DIR_TIMES) && S_ISDIR(sxp->st.st_mode))
|
||||
|| (!(preserve_times & PRESERVE_LINK_TIMES) && S_ISLNK(sxp->st.st_mode)))
|
||||
flags |= ATTRS_SKIP_MTIME;
|
||||
if (!(flags & ATTRS_SKIP_MTIME)
|
||||
&& (sxp->st.st_mtime != file->modtime
|
||||
#ifdef ST_MTIME_NSEC
|
||||
|| (NSEC_BUMP(file) && (uint32)sxp->st.ST_MTIME_NSEC != F_MOD_NSEC(file))
|
||||
#endif
|
||||
)) {
|
||||
int ret = set_modtime(fname, file->modtime, F_MOD_NSEC(file), sxp->st.st_mode);
|
||||
if (ret < 0) {
|
||||
rsyserr(FERROR_XFER, errno, "failed to set times on %s",
|
||||
full_fname(fname));
|
||||
goto cleanup;
|
||||
}
|
||||
if (ret == 0) /* ret == 1 if symlink could not be set */
|
||||
updated = 1;
|
||||
else
|
||||
file->flags |= FLAG_TIME_FAILED;
|
||||
}
|
||||
|
||||
#ifdef SUPPORT_ACLS
|
||||
/* It's OK to call set_acl() now, even for a dir, as the generator
|
||||
* will enable owner-writability using chmod, if necessary.
|
||||
@@ -601,7 +605,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
|
||||
}
|
||||
|
||||
/* This is only called for SIGINT, SIGHUP, and SIGTERM. */
|
||||
RETSIGTYPE sig_int(int sig_num)
|
||||
void sig_int(int sig_num)
|
||||
{
|
||||
/* KLUGE: if the user hits Ctrl-C while ssh is prompting
|
||||
* for a password, then our cleanup's sending of a SIGUSR1
|
||||
|
||||
6
rsync.h
6
rsync.h
@@ -2,7 +2,7 @@
|
||||
* Copyright (C) 1996, 2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -208,6 +208,7 @@
|
||||
#define CFN_KEEP_TRAILING_SLASH (1<<1)
|
||||
#define CFN_DROP_TRAILING_DOT_DIR (1<<2)
|
||||
#define CFN_COLLAPSE_DOT_DOT_DIRS (1<<3)
|
||||
#define CFN_REFUSE_DOT_DOT_DIRS (1<<4)
|
||||
|
||||
#define SP_DEFAULT 0
|
||||
#define SP_KEEP_DOT_DIRS (1<<0)
|
||||
@@ -787,6 +788,8 @@ extern int xattrs_ndx;
|
||||
#define DIR_FIRST_CHILD(a) (a)[1]
|
||||
#define DIR_NEXT_SIBLING(a) (a)[2]
|
||||
|
||||
#define IS_MISSING_FILE(statbuf) ((statbuf).st_mode == 0)
|
||||
|
||||
/*
|
||||
* Start the flist array at FLIST_START entries and grow it
|
||||
* by doubling until FLIST_LINEAR then grow by FLIST_LINEAR
|
||||
@@ -889,7 +892,6 @@ typedef struct filter_struct {
|
||||
typedef struct filter_list_struct {
|
||||
filter_rule *head;
|
||||
filter_rule *tail;
|
||||
filter_rule *parent_dirscan_head;
|
||||
char *debug_type;
|
||||
} filter_rule_list;
|
||||
|
||||
|
||||
63
rsync.yo
63
rsync.yo
@@ -1,5 +1,5 @@
|
||||
mailto(rsync-bugs@samba.org)
|
||||
manpage(rsync)(1)(28 Sep 2013)()()
|
||||
manpage(rsync)(1)(21 Dec 2015)()()
|
||||
manpagename(rsync)(a fast, versatile, remote (and local) file-copying tool)
|
||||
manpagesynopsis()
|
||||
|
||||
@@ -103,7 +103,10 @@ This would transfer all files matching the pattern *.c from the
|
||||
current directory to the directory src on the machine foo. If any of
|
||||
the files already exist on the remote system then the rsync
|
||||
remote-update protocol is used to update the file by sending only the
|
||||
differences. See the tech report for details.
|
||||
differences in the data. Note that the expansion of wildcards on the
|
||||
commandline (*.c) into a list of files is handled by the shell before
|
||||
it runs rsync and not by rsync itself (exactly the same as all other
|
||||
posix-style programs).
|
||||
|
||||
quote(tt(rsync -avz foo:src/bar /data/tmp))
|
||||
|
||||
@@ -513,6 +516,12 @@ fine-grained settings override the implied settings of bf(-v). Both
|
||||
bf(--info) and bf(--debug) have a way to ask for help that tells you
|
||||
exactly what flags are set for each increase in verbosity.
|
||||
|
||||
However, do keep in mind that a daemon's "max verbosity" setting will limit how
|
||||
high of a level the various individual flags can be set on the daemon side.
|
||||
For instance, if the max is 2, then any info and/or debug flag that is set to
|
||||
a higher value than what would be set by bf(-vv) will be downgraded to the
|
||||
bf(-vv) level in the daemon's logging.
|
||||
|
||||
dit(bf(--info=FLAGS))
|
||||
This option lets you have fine-grained control over the
|
||||
information
|
||||
@@ -534,6 +543,7 @@ information on what is output and when.
|
||||
This option was added to 3.1.0, so an older rsync on the server side might
|
||||
reject your attempts at fine-grained control (if one or more flags needed
|
||||
to be send to the server and the server was too old to understand them).
|
||||
See also the "max verbosity" caveat above when dealing with a daemon.
|
||||
|
||||
dit(bf(--debug=FLAGS))
|
||||
This option lets you have fine-grained control over the debug
|
||||
@@ -554,13 +564,16 @@ specified, especially those pertaining to I/O and buffer debugging.
|
||||
This option was added to 3.1.0, so an older rsync on the server side might
|
||||
reject your attempts at fine-grained control (if one or more flags needed
|
||||
to be send to the server and the server was too old to understand them).
|
||||
See also the "max verbosity" caveat above when dealing with a daemon.
|
||||
|
||||
dit(bf(--msgs2stderr)) This option changes rsync to send all its output
|
||||
directly to stderr rather than to send messages to the client side via the
|
||||
protocol (which normally outputs info messages via stdout). This is mainly
|
||||
intended for debugging in order to avoid changing the data sent via the
|
||||
protocol, since the extra protocol data can change what is being tested.
|
||||
Keep in mind that a daemon connection does not have a stderr channel to send
|
||||
The option does not affect the remote side of a transfer without using
|
||||
bf(--remote-option) -- e.g. bf(-M--msgs2stderr).
|
||||
Also keep in mind that a daemon connection does not have a stderr channel to send
|
||||
messages back to the client side, so if you are doing any daemon-transfer
|
||||
debugging using this option, you should start up a daemon using bf(--no-detach)
|
||||
so that you can see the stderr output on the daemon side.
|
||||
@@ -789,7 +802,7 @@ the destination and have a modified time that is newer than the source
|
||||
file. (If an existing destination file has a modification time equal to the
|
||||
source file's, it will be updated if the sizes are different.)
|
||||
|
||||
Note that this does not affect the copying of symlinks or other special
|
||||
Note that this does not affect the copying of dirs, symlinks, or other special
|
||||
files. Also, a difference of file format between the sender and receiver
|
||||
is always considered to be important enough for an update, no matter what
|
||||
date is on the objects. In other words, if the source has a directory
|
||||
@@ -853,6 +866,11 @@ Implies bf(--inplace),
|
||||
but does not conflict with bf(--sparse) (since it is always extending a
|
||||
file's length).
|
||||
|
||||
The use of bf(--append) can be dangerous if you aren't 100% sure that the files
|
||||
that are longer have only grown by the appending of data onto the end. You
|
||||
should thus use include/exclude/filter rules to ensure that such a transfer is
|
||||
only affecting files that you know to be growing via appended data.
|
||||
|
||||
dit(bf(--append-verify)) This works just like the bf(--append) option, but
|
||||
the existing data on the receiving side is included in the full-file
|
||||
checksum verification step, which will cause a file to be resent if the
|
||||
@@ -1167,6 +1185,17 @@ it is preserving modification times (see bf(--times)). If NFS is sharing
|
||||
the directories on the receiving side, it is a good idea to use bf(-O).
|
||||
This option is inferred if you use bf(--backup) without bf(--backup-dir).
|
||||
|
||||
This option also has the side-effect of avoiding early creation of directories
|
||||
in incremental recursion copies. The default bf(--inc-recursive) copying
|
||||
normally does an early-create pass of all the sub-directories in a parent
|
||||
directory in order for it to be able to then set the modify time of the parent
|
||||
directory right away (without having to delay that until a bunch of recursive
|
||||
copying has finished). This early-create idiom is not necessary if directory
|
||||
modify times are not being preserved, so it is skipped. Since early-create
|
||||
directories don't have accurate mode, mtime, or ownership, the use of this
|
||||
option can help when someone wants to avoid these partially-finished
|
||||
directories.
|
||||
|
||||
dit(bf(-J, --omit-link-times)) This tells rsync to omit symlinks when
|
||||
it is preserving modification times (see bf(--times)).
|
||||
|
||||
@@ -1726,6 +1755,9 @@ dit(bf(-T, --temp-dir=DIR)) This option instructs rsync to use DIR as a
|
||||
scratch directory when creating temporary copies of the files transferred
|
||||
on the receiving side. The default behavior is to create each temporary
|
||||
file in the same directory as the associated destination file.
|
||||
Beginning with rsync 3.1.1, the temp-file names inside the specified DIR will
|
||||
not be prefixed with an extra dot (though they will still have a random suffix
|
||||
added).
|
||||
|
||||
This option is most often used when the receiving disk partition does not
|
||||
have enough free space to hold a copy of the largest file in the transfer.
|
||||
@@ -1856,7 +1888,20 @@ being transmitted -- something that is useful over a slow connection.
|
||||
Note that this option typically achieves better compression ratios than can
|
||||
be achieved by using a compressing remote shell or a compressing transport
|
||||
because it takes advantage of the implicit information in the matching data
|
||||
blocks that are not explicitly sent over the connection.
|
||||
blocks that are not explicitly sent over the connection. This matching-data
|
||||
compression comes at a cost of CPU, though, and can be disabled by repeating
|
||||
the bf(-z) option, but only if both sides are at least version 3.1.1.
|
||||
|
||||
Note that if your version of rsync was compiled with an external zlib (instead
|
||||
of the zlib that comes packaged with rsync) then it will not support the
|
||||
old-style compression, only the new-style (repeated-option) compression. In
|
||||
the future this new-style compression will likely become the default.
|
||||
|
||||
The client rsync requests new-style compression on the server via the
|
||||
bf(--new-compress) option, so if you see that option rejected it means that
|
||||
the server is not new enough to support bf(-zz). Rsync also accepts the
|
||||
bf(--old-compress) option for a future time when new-style compression
|
||||
becomes the default.
|
||||
|
||||
See the bf(--skip-compress) option for the default list of file suffixes
|
||||
that will not be compressed.
|
||||
@@ -2411,7 +2456,7 @@ transfer that may be interrupted.
|
||||
|
||||
There is also a bf(--info=progress2) option that outputs statistics based
|
||||
on the whole transfer, rather than individual files. Use this flag without
|
||||
outputting a filename (e.g. avoid bf(-v) or specify bf(--info=name0) if you
|
||||
outputting a filename (e.g. avoid bf(-v) or specify bf(--info=name0)) if you
|
||||
want to see how the transfer is doing without scrolling the screen with a
|
||||
lot of names. (You don't need to specify the bf(--progress) option in
|
||||
order to use bf(--info=progress2).)
|
||||
@@ -2743,6 +2788,10 @@ itemization(
|
||||
it() a '[' introduces a character class, such as [a-z] or [[:alpha:]].
|
||||
it() in a wildcard pattern, a backslash can be used to escape a wildcard
|
||||
character, but it is matched literally when no wildcards are present.
|
||||
This means that there is an extra level of backslash removal when a
|
||||
pattern contains wildcard characters compared to a pattern that has none.
|
||||
e.g. if you add a wildcard to "foo\bar" (which matches the backslash) you
|
||||
would need to use "foo\\bar*" to avoid the "\b" becoming just "b".
|
||||
it() if the pattern contains a / (not counting a trailing /) or a "**",
|
||||
then it is matched against the full pathname, including any leading
|
||||
directories. If the pattern doesn't contain a / or a "**", then it is
|
||||
@@ -3361,7 +3410,7 @@ url(http://rsync.samba.org/)(http://rsync.samba.org/)
|
||||
|
||||
manpagesection(VERSION)
|
||||
|
||||
This man page is current for version 3.1.0 of rsync.
|
||||
This man page is current for version 3.1.2 of rsync.
|
||||
|
||||
manpagesection(INTERNAL OPTIONS)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mailto(rsync-bugs@samba.org)
|
||||
manpage(rsyncd.conf)(5)(28 Sep 2013)()()
|
||||
manpage(rsyncd.conf)(5)(21 Dec 2015)()()
|
||||
manpagename(rsyncd.conf)(configuration file for rsync in daemon mode)
|
||||
manpagesynopsis()
|
||||
|
||||
@@ -74,6 +74,8 @@ manpagesection(GLOBAL PARAMETERS)
|
||||
|
||||
The first parameters in the file (before a [module] header) are the
|
||||
global parameters.
|
||||
Rsync also allows for the use of a "[global]" module name to indicate the
|
||||
start of one or more global-parameter sections (the name must be lower case).
|
||||
|
||||
You may also include any module parameters in the global part of the
|
||||
config file in which case the supplied value will override the
|
||||
@@ -136,6 +138,8 @@ The module name cannot contain a slash or a closing square bracket. If the
|
||||
name contains whitespace, each internal sequence of whitespace will be
|
||||
changed into a single space, while leading or trailing whitespace will be
|
||||
discarded.
|
||||
Also, the name cannot be "global" as that exact name indicates that
|
||||
global parameters follow (see above).
|
||||
|
||||
As with GLOBAL PARAMETERS, you may use references to environment variables in
|
||||
the values of parameters. See the GLOBAL PARAMETERS section for more details.
|
||||
@@ -193,22 +197,16 @@ args if rsync believes they would escape the module hierarchy.
|
||||
The default for "use chroot" is true, and is the safer choice (especially
|
||||
if the module is not read-only).
|
||||
|
||||
When this parameter is enabled, rsync will not attempt to map users and groups
|
||||
by name (by default), but instead copy IDs as though bf(--numeric-ids) had
|
||||
been specified. In order to enable name-mapping, rsync needs to be able to
|
||||
use the standard library functions for looking up names and IDs (i.e.
|
||||
code(getpwuid()), code(getgrgid()), code(getpwname()), and code(getgrnam())).
|
||||
This means the rsync
|
||||
process in the chroot hierarchy will need to have access to the resources
|
||||
used by these library functions (traditionally /etc/passwd and
|
||||
/etc/group, but perhaps additional dynamic libraries as well).
|
||||
When this parameter is enabled, the "numeric-ids" option will also default to
|
||||
being enabled (disabling name lookups). See below for what a chroot needs in
|
||||
order for name lookups to succeed.
|
||||
|
||||
If you copy the necessary resources into the module's chroot area, you
|
||||
If you copy library resources into the module's chroot area, you
|
||||
should protect them through your OS's normal user/group or ACL settings (to
|
||||
prevent the rsync module's user from being able to change them), and then
|
||||
hide them from the user's view via "exclude" (see how in the discussion of
|
||||
that parameter). At that point it will be safe to enable the mapping of users
|
||||
and groups by name using the "numeric ids" daemon parameter (see below).
|
||||
and groups by name using this "numeric ids" daemon parameter.
|
||||
|
||||
Note also that you are free to setup custom user/group information in the
|
||||
chroot area that is different from your normal system. For example, you
|
||||
@@ -220,11 +218,16 @@ the daemon from trying to load any user/group-related files or libraries.
|
||||
This enabling makes the transfer behave as if the client had passed
|
||||
the bf(--numeric-ids) command-line option. By default, this parameter is
|
||||
enabled for chroot modules and disabled for non-chroot modules.
|
||||
Also keep in mind that uid/gid preservation requires the module to be
|
||||
running as root (see "uid") or for "fake super" to be configured.
|
||||
|
||||
A chroot-enabled module should not have this parameter enabled unless you've
|
||||
taken steps to ensure that the module has the necessary resources it needs
|
||||
to translate names, and that it is not possible for a user to change those
|
||||
resources.
|
||||
resources. That includes being the code being able to call functions like
|
||||
code(getpwuid()), code(getgrgid()), code(getpwname()), and code(getgrnam())).
|
||||
You should test what libraries and config files are required for your OS
|
||||
and get those setup before starting to test name mapping in rsync.
|
||||
|
||||
dit(bf(munge symlinks)) This parameter tells rsync to modify
|
||||
all symlinks in the same way as the (non-daemon-affecting)
|
||||
@@ -318,6 +321,13 @@ the maximum amount of verbose information that you'll allow the daemon to
|
||||
generate (since the information goes into the log file). The default is 1,
|
||||
which allows the client to request one level of verbosity.
|
||||
|
||||
This also affects the user's ability to request higher levels of bf(--info) and
|
||||
bf(--debug) logging. If the max value is 2, then no info and/or debug value
|
||||
that is higher than what would be set by bf(-vv) will be honored by the daemon
|
||||
in its logging. To see how high of a verbosity level you need to accept for a
|
||||
particular info/debug level, refer to "rsync --info=help" and "rsync --debug=help".
|
||||
For instance, it takes max-verbosity 4 to be able to output debug TIME2 and FLIST3.
|
||||
|
||||
dit(bf(lock file)) This parameter specifies the file to use to
|
||||
support the "max connections" parameter. The rsync daemon uses record
|
||||
locking on this file to ensure that the max connections limit is not
|
||||
@@ -894,7 +904,7 @@ url(http://rsync.samba.org/)(http://rsync.samba.org/)
|
||||
|
||||
manpagesection(VERSION)
|
||||
|
||||
This man page is current for version 3.1.0 of rsync.
|
||||
This man page is current for version 3.1.2 of rsync.
|
||||
|
||||
manpagesection(CREDITS)
|
||||
|
||||
|
||||
19
sender.c
19
sender.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -29,6 +29,7 @@ extern int inc_recurse;
|
||||
extern int log_before_transfer;
|
||||
extern int stdout_format_has_i;
|
||||
extern int logfile_format_has_i;
|
||||
extern int want_xattr_optim;
|
||||
extern int csum_length;
|
||||
extern int append_mode;
|
||||
extern int io_error;
|
||||
@@ -142,12 +143,13 @@ void successful_send(int ndx)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (st.st_size != F_LENGTH(file) || st.st_mtime != file->modtime
|
||||
if (S_ISREG(file->mode) /* Symlinks & devices don't need this check: */
|
||||
&& (st.st_size != F_LENGTH(file) || st.st_mtime != file->modtime
|
||||
#ifdef ST_MTIME_NSEC
|
||||
|| (NSEC_BUMP(file) && (uint32)st.ST_MTIME_NSEC != F_MOD_NSEC(file))
|
||||
#endif
|
||||
) {
|
||||
rprintf(FERROR, "ERROR: Skipping sender remove for changed file: %s\n", fname);
|
||||
)) {
|
||||
rprintf(FERROR_XFER, "ERROR: Skipping sender remove for changed file: %s\n", fname);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -157,7 +159,7 @@ void successful_send(int ndx)
|
||||
if (errno == ENOENT)
|
||||
rprintf(FINFO, "sender file already removed: %s\n", fname);
|
||||
else
|
||||
rsyserr(FERROR, errno, "sender failed to %s %s", failed_op, fname);
|
||||
rsyserr(FERROR_XFER, errno, "sender failed to %s %s", failed_op, fname);
|
||||
} else {
|
||||
if (INFO_GTE(REMOVE, 1))
|
||||
rprintf(FINFO, "sender removed %s\n", fname);
|
||||
@@ -178,7 +180,7 @@ static void write_ndx_and_attrs(int f_out, int ndx, int iflags,
|
||||
write_vstring(f_out, buf, len);
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers
|
||||
&& (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
|
||||
&& !(want_xattr_optim && BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
|
||||
send_xattr_request(fname, file, f_out);
|
||||
#endif
|
||||
}
|
||||
@@ -260,7 +262,7 @@ void send_files(int f_in, int f_out)
|
||||
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers
|
||||
&& (protocol_version < 31 || !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
|
||||
&& !(want_xattr_optim && BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)))
|
||||
recv_xattr_request(file, f_in);
|
||||
#endif
|
||||
|
||||
@@ -318,8 +320,7 @@ void send_files(int f_in, int f_out)
|
||||
stats.xferred_files++;
|
||||
stats.total_transferred_size += F_LENGTH(file);
|
||||
|
||||
if (!log_before_transfer)
|
||||
remember_initial_stats();
|
||||
remember_initial_stats();
|
||||
|
||||
if (!do_xfers) { /* log the transfer */
|
||||
log_item(FCLIENT, file, iflags, NULL);
|
||||
|
||||
6
socket.c
6
socket.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1992-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -161,7 +161,7 @@ int try_bind_local(int s, int ai_family, int ai_socktype,
|
||||
}
|
||||
|
||||
/* connect() timeout handler based on alarm() */
|
||||
static RETSIGTYPE contimeout_handler(UNUSED(int val))
|
||||
static void contimeout_handler(UNUSED(int val))
|
||||
{
|
||||
connect_timeout = -1;
|
||||
}
|
||||
@@ -529,7 +529,7 @@ int is_a_socket(int fd)
|
||||
}
|
||||
|
||||
|
||||
static RETSIGTYPE sigchld_handler(UNUSED(int val))
|
||||
static void sigchld_handler(UNUSED(int val))
|
||||
{
|
||||
#ifdef WNOHANG
|
||||
while (waitpid(-1, NULL, WNOHANG) > 0) {}
|
||||
|
||||
@@ -15,11 +15,21 @@ use constant RSYNC => '/usr/bin/rsync';
|
||||
use constant LOGFILE => 'rrsync.log';
|
||||
|
||||
my $Usage = <<EOM;
|
||||
Use 'command="$0 [-ro] SUBDIR"'
|
||||
Use 'command="$0 [-ro|-wo] SUBDIR"'
|
||||
in front of lines in $ENV{HOME}/.ssh/authorized_keys
|
||||
EOM
|
||||
|
||||
our $ro = (@ARGV && $ARGV[0] eq '-ro') ? shift : ''; # -ro = Read-Only
|
||||
# Handle the -ro and -wo options.
|
||||
our $only = '';
|
||||
while (@ARGV && $ARGV[0] =~ /^-([rw])o$/) {
|
||||
my $r_or_w = $1;
|
||||
if ($only && $only ne $r_or_w) {
|
||||
die "$0: the -ro and -wo options conflict.\n";
|
||||
}
|
||||
$only = $r_or_w;
|
||||
shift;
|
||||
}
|
||||
|
||||
our $subdir = shift;
|
||||
die "$0: No subdirectory specified\n$Usage" unless defined $subdir;
|
||||
$subdir = abs_path($subdir);
|
||||
@@ -31,7 +41,7 @@ die "$0: Restricted directory does not exist!\n" if $subdir ne '/' && !-d $subdi
|
||||
# command="rrsync logs/client" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAzGhEeNlPr...
|
||||
# command="rrsync -ro results" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAmkHG1WCjC...
|
||||
#
|
||||
# Format of the envrionment variables set by sshd:
|
||||
# Format of the environment variables set by sshd:
|
||||
# SSH_ORIGINAL_COMMAND=rsync --server -vlogDtpr --partial . ARG # push
|
||||
# SSH_ORIGINAL_COMMAND=rsync --server --sender -vlogDtpr --partial . ARGS # pull
|
||||
# SSH_CONNECTION=client_addr client_port server_port
|
||||
@@ -41,7 +51,8 @@ die "$0: Not invoked via sshd\n$Usage" unless defined $command;
|
||||
die "$0: SSH_ORIGINAL_COMMAND='$command' is not rsync\n" unless $command =~ s/^rsync\s+//;
|
||||
die "$0: --server option is not first\n" unless $command =~ /^--server\s/;
|
||||
our $am_sender = $command =~ /^--server\s+--sender\s/; # Restrictive on purpose!
|
||||
die "$0 -ro: sending to read-only server not allowed\n" if $ro && !$am_sender;
|
||||
die "$0 sending to read-only server not allowed\n" if $only eq 'r' && !$am_sender;
|
||||
die "$0 reading from write-only server not allowed\n" if $only eq 'w' && $am_sender;
|
||||
|
||||
### START of options data produced by the cull_options script. ###
|
||||
|
||||
@@ -51,7 +62,7 @@ die "$0 -ro: sending to read-only server not allowed\n" if $ro && !$am_sender;
|
||||
# To disable a short-named option, add its letter to this string:
|
||||
our $short_disabled = 's';
|
||||
|
||||
our $short_no_arg = 'ACDEHIKLORSWXbcdgklmnoprstuvxz'; # DO NOT REMOVE ANY
|
||||
our $short_no_arg = 'ACDEHIJKLORSWXbcdgklmnoprstuvxyz'; # DO NOT REMOVE ANY
|
||||
our $short_with_num = 'B'; # DO NOT REMOVE ANY
|
||||
|
||||
# To disable a long-named option, change its value to a -1. The values mean:
|
||||
@@ -60,6 +71,7 @@ our $short_with_num = 'B'; # DO NOT REMOVE ANY
|
||||
our %long_opt = (
|
||||
'append' => 0,
|
||||
'backup-dir' => 2,
|
||||
'block-size' => 1,
|
||||
'bwlimit' => 1,
|
||||
'checksum-seed' => 1,
|
||||
'compare-dest' => 2,
|
||||
@@ -67,6 +79,7 @@ our %long_opt = (
|
||||
'copy-dest' => 2,
|
||||
'copy-unsafe-links' => 0,
|
||||
'daemon' => -1,
|
||||
'debug' => 1,
|
||||
'delay-updates' => 0,
|
||||
'delete' => 0,
|
||||
'delete-after' => 0,
|
||||
@@ -81,13 +94,18 @@ our %long_opt = (
|
||||
'force' => 0,
|
||||
'from0' => 0,
|
||||
'fuzzy' => 0,
|
||||
'group' => 0,
|
||||
'groupmap' => 1,
|
||||
'hard-links' => 0,
|
||||
'iconv' => 1,
|
||||
'ignore-errors' => 0,
|
||||
'ignore-existing' => 0,
|
||||
'ignore-missing-args' => 0,
|
||||
'ignore-times' => 0,
|
||||
'info' => 1,
|
||||
'inplace' => 0,
|
||||
'link-dest' => 2,
|
||||
'links' => 0,
|
||||
'list-only' => 0,
|
||||
'log-file' => 3,
|
||||
'log-format' => 1,
|
||||
@@ -95,16 +113,22 @@ our %long_opt = (
|
||||
'max-size' => 1,
|
||||
'min-size' => 1,
|
||||
'modify-window' => 1,
|
||||
'new-compress' => 0,
|
||||
'no-implied-dirs' => 0,
|
||||
'no-r' => 0,
|
||||
'no-relative' => 0,
|
||||
'no-specials' => 0,
|
||||
'numeric-ids' => 0,
|
||||
'one-file-system' => 0,
|
||||
'only-write-batch' => 1,
|
||||
'owner' => 0,
|
||||
'partial' => 0,
|
||||
'partial-dir' => 2,
|
||||
'remove-sent-files' => $ro ? -1 : 0,
|
||||
'remove-source-files' => $ro ? -1 : 0,
|
||||
'perms' => 0,
|
||||
'preallocate' => 0,
|
||||
'recursive' => 0,
|
||||
'remove-sent-files' => $only eq 'r' ? -1 : 0,
|
||||
'remove-source-files' => $only eq 'r' ? -1 : 0,
|
||||
'safe-links' => 0,
|
||||
'sender' => 0,
|
||||
'server' => 0,
|
||||
@@ -116,6 +140,7 @@ our %long_opt = (
|
||||
'super' => 0,
|
||||
'temp-dir' => 2,
|
||||
'timeout' => 1,
|
||||
'times' => 0,
|
||||
'use-qsort' => 0,
|
||||
'usermap' => 1,
|
||||
);
|
||||
|
||||
15
support/rsync-no-vanished
Executable file
15
support/rsync-no-vanished
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
IGNOREEXIT=24
|
||||
IGNOREOUT='^(file has vanished: |rsync warning: some files vanished before they could be transferred)'
|
||||
|
||||
set -o pipefail
|
||||
|
||||
rsync "${@}" 2>&1 | (egrep -v "$IGNOREOUT" || true)
|
||||
ret=$?
|
||||
|
||||
if [[ $ret == $IGNOREEXIT ]]; then
|
||||
ret=0
|
||||
fi
|
||||
|
||||
exit $ret
|
||||
14
syscall.c
14
syscall.c
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright (C) 1998 Andrew Tridgell
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -147,13 +147,13 @@ int do_mknod(const char *pathname, mode_t mode, dev_t dev)
|
||||
if (S_ISSOCK(mode)) {
|
||||
int sock;
|
||||
struct sockaddr_un saddr;
|
||||
unsigned int len = strlcpy(saddr.sun_path, pathname, sizeof saddr.sun_path);
|
||||
if (len >= sizeof saddr.sun_path) {
|
||||
errno = ENAMETOOLONG;
|
||||
return -1;
|
||||
}
|
||||
#ifdef HAVE_SOCKADDR_UN_LEN
|
||||
unsigned int len =
|
||||
#endif
|
||||
strlcpy(saddr.sun_path, pathname, sizeof saddr.sun_path);
|
||||
#ifdef HAVE_SOCKADDR_UN_LEN
|
||||
saddr.sun_len = len >= sizeof saddr.sun_path
|
||||
? sizeof saddr.sun_path : len + 1;
|
||||
saddr.sun_len = len + 1;
|
||||
#endif
|
||||
saddr.sun_family = AF_UNIX;
|
||||
|
||||
|
||||
2
t_stub.c
2
t_stub.c
@@ -3,7 +3,7 @@
|
||||
* functions, so that module test harnesses can run standalone.
|
||||
*
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Test harness for unsafe_symlink(). Not linked into rsync itself.
|
||||
*
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
|
||||
# Build some hardlinks
|
||||
|
||||
mygrps="`rsync_getgroups`" || fail "Can't get groups"
|
||||
mygrps="`rsync_getgroups`" || test_fail "Can't get groups"
|
||||
mkdir "$fromdir"
|
||||
|
||||
for g in $mygrps
|
||||
do
|
||||
name="$fromdir/foo-$g"
|
||||
date > "$name"
|
||||
chgrp "$g" "$name" || fail "Can't chgrp"
|
||||
chgrp "$g" "$name" || test_fail "Can't chgrp"
|
||||
done
|
||||
sleep 2
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ hands_setup
|
||||
# Build chkdir with a normal rsync and an --exclude.
|
||||
$RSYNC -av --exclude=foobar.baz "$fromdir/" "$chkdir/"
|
||||
|
||||
checkit "$RSYNC -avvvvz localhost::test-from/ '$todir/'" "$chkdir" "$todir"
|
||||
checkit "$RSYNC -avvvvzz localhost::test-from/ '$todir/'" "$chkdir" "$todir"
|
||||
|
||||
# The script would have aborted on error, so getting here means we've won.
|
||||
exit 0
|
||||
|
||||
@@ -25,7 +25,7 @@ hands_setup
|
||||
# Build chkdir with a normal rsync and an --exclude.
|
||||
$RSYNC -av --exclude=foobar.baz "$fromdir/" "$chkdir/"
|
||||
|
||||
checkit "'$ignore23' $RSYNC -avvvvz '$fromdir/' localhost::test-to/" "$chkdir" "$todir"
|
||||
checkit "'$ignore23' $RSYNC -avvvvzz '$fromdir/' localhost::test-to/" "$chkdir" "$todir"
|
||||
|
||||
# The script would have aborted on error, so getting here means we've won.
|
||||
exit 0
|
||||
|
||||
@@ -27,7 +27,7 @@ mkdir "$fromdir"
|
||||
name1="$fromdir/name1"
|
||||
name2="$fromdir/name2"
|
||||
echo "This is the file" > "$name1"
|
||||
ln -s "$name1" "$name2" || fail "can't create symlink"
|
||||
ln -s "$name1" "$name2" || test_fail "can't create symlink"
|
||||
|
||||
outfile="$scratchdir/rsync.out"
|
||||
|
||||
|
||||
@@ -29,8 +29,8 @@ name3="$fromdir/name3"
|
||||
name4="$fromdir/name4"
|
||||
echo "This is the file" > "$name1"
|
||||
ln "$name1" "$name2" || test_skipped "Can't create hardlink"
|
||||
ln "$name2" "$name3" || fail "Can't create hardlink"
|
||||
cp "$name2" "$name4" || fail "Can't copy file"
|
||||
ln "$name2" "$name3" || test_fail "Can't create hardlink"
|
||||
cp "$name2" "$name4" || test_fail "Can't copy file"
|
||||
cat $srcdir/*.c >"$fromdir/text"
|
||||
|
||||
checkit "$RSYNC -aHivv --debug=HLINK5 '$fromdir/' '$todir/'" "$fromdir" "$todir"
|
||||
@@ -67,7 +67,7 @@ checkit "$RSYNC -aHivv --debug=HLINK5 --copy-dest='$todir' '$fromdir/' '$chkdir/
|
||||
|
||||
# Create a hard link that has only one part in the hierarchy.
|
||||
echo "This is another file" >"$fromdir/solo"
|
||||
ln "$fromdir/solo" "$chkdir/solo" || fail "Can't create hardlink"
|
||||
ln "$fromdir/solo" "$chkdir/solo" || test_fail "Can't create hardlink"
|
||||
|
||||
# Make sure that the checksum data doesn't slide due to an HLINK_BUMP() change.
|
||||
$RSYNC -aHivc --debug=HLINK5 "$fromdir/" "$chkdir/" | tee "$outfile"
|
||||
|
||||
@@ -33,6 +33,8 @@ runtest "basic relative" 'checkit "$RSYNC -avR ./$deepstr \"$todir\"" "$chkdir"
|
||||
|
||||
ln $deepstr/filelist $deepstr/dir
|
||||
ln ../chk/$deepstr/filelist ../chk/$deepstr/dir
|
||||
# Work around time rounding/truncating issue by touching both dirs.
|
||||
touch -r $deepstr/dir $deepstr/dir ../chk/$deepstr/dir
|
||||
runtest "hard links" 'checkit "$RSYNC -avHR ./$deepstr/ \"$todir\"" "$chkdir" "$todir"'
|
||||
|
||||
cp "$deepdir/text" "$todir/$deepstr/ThisShouldGo"
|
||||
|
||||
2
tls.c
2
tls.c
@@ -2,7 +2,7 @@
|
||||
* Trivial ls for comparing two directories after running an rsync.
|
||||
*
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
40
token.c
40
token.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -23,10 +23,6 @@
|
||||
#include "itypes.h"
|
||||
#include <zlib.h>
|
||||
|
||||
#ifndef Z_INSERT_ONLY
|
||||
#define Z_INSERT_ONLY Z_SYNC_FLUSH
|
||||
#endif
|
||||
|
||||
extern int do_compression;
|
||||
extern int protocol_version;
|
||||
extern int module_id;
|
||||
@@ -406,9 +402,10 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset,
|
||||
if (token == -1) {
|
||||
/* end of file - clean up */
|
||||
write_byte(f, END_FLAG);
|
||||
} else if (token != -2) {
|
||||
} else if (token != -2 && do_compression == 1) {
|
||||
/* Add the data in the current block to the compressor's
|
||||
* history and hash table. */
|
||||
#ifndef EXTERNAL_ZLIB
|
||||
do {
|
||||
/* Break up long sections in the same way that
|
||||
* see_deflate_token() does. */
|
||||
@@ -418,17 +415,20 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset,
|
||||
tx_strm.avail_in = n1;
|
||||
if (protocol_version >= 31) /* Newer protocols avoid a data-duplicating bug */
|
||||
offset += n1;
|
||||
do {
|
||||
tx_strm.next_out = (Bytef *) obuf;
|
||||
tx_strm.avail_out = AVAIL_OUT_SIZE(CHUNK_SIZE);
|
||||
r = deflate(&tx_strm, Z_INSERT_ONLY);
|
||||
if (r != Z_OK) {
|
||||
rprintf(FERROR, "deflate on token returned %d (%d bytes left)\n",
|
||||
r, tx_strm.avail_in);
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
}
|
||||
} while (tx_strm.avail_in != 0);
|
||||
tx_strm.next_out = (Bytef *) obuf;
|
||||
tx_strm.avail_out = AVAIL_OUT_SIZE(CHUNK_SIZE);
|
||||
r = deflate(&tx_strm, Z_INSERT_ONLY);
|
||||
if (r != Z_OK || tx_strm.avail_in != 0) {
|
||||
rprintf(FERROR, "deflate on token returned %d (%d bytes left)\n",
|
||||
r, tx_strm.avail_in);
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
}
|
||||
} while (toklen > 0);
|
||||
#else
|
||||
toklen++;
|
||||
rprintf(FERROR, "Impossible error in external-zlib code (1).\n");
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -579,6 +579,7 @@ static int32 recv_deflated_token(int f, char **data)
|
||||
*/
|
||||
static void see_deflate_token(char *buf, int32 len)
|
||||
{
|
||||
#ifndef EXTERNAL_ZLIB
|
||||
int r;
|
||||
int32 blklen;
|
||||
unsigned char hdr[5];
|
||||
@@ -616,6 +617,11 @@ static void see_deflate_token(char *buf, int32 len)
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
}
|
||||
} while (len || rx_strm.avail_out == 0);
|
||||
#else
|
||||
buf++; len++;
|
||||
rprintf(FERROR, "Impossible error in external-zlib code (2).\n");
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -655,6 +661,6 @@ int32 recv_token(int f, char **data)
|
||||
*/
|
||||
void see_token(char *data, int32 toklen)
|
||||
{
|
||||
if (do_compression)
|
||||
if (do_compression == 1)
|
||||
see_deflate_token(data, toklen);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Simple utility used only by the test harness.
|
||||
*
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
59
uidlist.c
59
uidlist.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2004-2013 Wayne Davison
|
||||
* Copyright (C) 2004-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -473,12 +473,15 @@ void parse_name_map(char *map, BOOL usernames)
|
||||
usernames ? "user" : "group", cp);
|
||||
exit_cleanup(RERR_SYNTAX);
|
||||
}
|
||||
if (dash)
|
||||
if (dash) {
|
||||
*dash = '\0';
|
||||
noiu.max_id = id_parse(dash+1);
|
||||
else
|
||||
} else
|
||||
noiu.max_id = 0;
|
||||
flags = 0;
|
||||
id1 = id_parse(cp);
|
||||
if (dash)
|
||||
*dash = '-';
|
||||
} else if (strpbrk(cp, "*[?")) {
|
||||
flags = NFLAGS_WILD_NAME_MATCH;
|
||||
noiu.name = cp;
|
||||
@@ -521,25 +524,49 @@ void parse_name_map(char *map, BOOL usernames)
|
||||
}
|
||||
|
||||
#ifdef HAVE_GETGROUPLIST
|
||||
const char *getallgroups(uid_t uid, gid_t *gid_list, int *size_ptr)
|
||||
const char *getallgroups(uid_t uid, item_list *gid_list)
|
||||
{
|
||||
struct passwd *pw;
|
||||
gid_t *gid_array;
|
||||
int size;
|
||||
|
||||
if ((pw = getpwuid(uid)) == NULL)
|
||||
return "getpwuid failed";
|
||||
|
||||
gid_list->count = 0; /* We're overwriting any items in the list */
|
||||
EXPAND_ITEM_LIST(gid_list, gid_t, 32);
|
||||
size = gid_list->malloced;
|
||||
|
||||
/* Get all the process's groups, with the pw_gid group first. */
|
||||
if (getgrouplist(pw->pw_name, pw->pw_gid, gid_list, size_ptr) < 0)
|
||||
return "getgrouplist failed";
|
||||
/* Paranoia: is the default group not first in the list? */
|
||||
if (gid_list[0] != pw->pw_gid) {
|
||||
int j;
|
||||
for (j = 0; j < *size_ptr; j++) {
|
||||
if (gid_list[j] == pw->pw_gid) {
|
||||
gid_list[j] = gid_list[0];
|
||||
gid_list[0] = pw->pw_gid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (getgrouplist(pw->pw_name, pw->pw_gid, gid_list->items, &size) < 0) {
|
||||
if (size > (int)gid_list->malloced) {
|
||||
gid_list->count = gid_list->malloced;
|
||||
EXPAND_ITEM_LIST(gid_list, gid_t, size);
|
||||
if (getgrouplist(pw->pw_name, pw->pw_gid, gid_list->items, &size) < 0)
|
||||
size = -1;
|
||||
} else
|
||||
size = -1;
|
||||
if (size < 0)
|
||||
return "getgrouplist failed";
|
||||
}
|
||||
gid_list->count = size;
|
||||
gid_array = gid_list->items;
|
||||
|
||||
/* Paranoia: is the default group not first in the list? */
|
||||
if (gid_array[0] != pw->pw_gid) {
|
||||
int j;
|
||||
for (j = 1; j < size; j++) {
|
||||
if (gid_array[j] == pw->pw_gid)
|
||||
break;
|
||||
}
|
||||
if (j == size) { /* The default group wasn't found! */
|
||||
EXPAND_ITEM_LIST(gid_list, gid_t, size+1);
|
||||
gid_array = gid_list->items;
|
||||
}
|
||||
gid_array[j] = gid_array[0];
|
||||
gid_array[0] = pw->pw_gid;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
75
util.c
75
util.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "itypes.h"
|
||||
#include "inums.h"
|
||||
|
||||
extern int dry_run;
|
||||
extern int module_id;
|
||||
extern int protect_args;
|
||||
extern int modify_window;
|
||||
@@ -189,7 +190,7 @@ int make_path(char *fname, int flags)
|
||||
|
||||
if (flags & MKP_DROP_NAME) {
|
||||
end = strrchr(fname, '/');
|
||||
if (!end)
|
||||
if (!end || end == fname)
|
||||
return 0;
|
||||
*end = '\0';
|
||||
} else
|
||||
@@ -197,23 +198,35 @@ int make_path(char *fname, int flags)
|
||||
|
||||
/* Try to find an existing dir, starting from the deepest dir. */
|
||||
for (p = end; ; ) {
|
||||
if (do_mkdir(fname, ACCESSPERMS) == 0) {
|
||||
if (dry_run) {
|
||||
STRUCT_STAT st;
|
||||
if (do_stat(fname, &st) == 0) {
|
||||
if (S_ISDIR(st.st_mode))
|
||||
errno = EEXIST;
|
||||
else
|
||||
errno = ENOTDIR;
|
||||
}
|
||||
} else if (do_mkdir(fname, ACCESSPERMS) == 0) {
|
||||
ret++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (errno != ENOENT) {
|
||||
if (errno != EEXIST)
|
||||
STRUCT_STAT st;
|
||||
if (errno != EEXIST || (do_stat(fname, &st) == 0 && !S_ISDIR(st.st_mode)))
|
||||
ret = -ret - 1;
|
||||
break;
|
||||
}
|
||||
while (1) {
|
||||
if (p == fname) {
|
||||
ret = -ret - 1;
|
||||
/* We got a relative path that doesn't exist, so assume that '.'
|
||||
* is there and just break out and create the whole thing. */
|
||||
p = NULL;
|
||||
goto double_break;
|
||||
}
|
||||
if (*--p == '/') {
|
||||
if (p == fname) {
|
||||
ret = -ret - 1; /* impossible... */
|
||||
/* We reached the "/" dir, which we assume is there. */
|
||||
goto double_break;
|
||||
}
|
||||
*p = '\0';
|
||||
@@ -225,7 +238,10 @@ int make_path(char *fname, int flags)
|
||||
|
||||
/* Make all the dirs that we didn't find on the way here. */
|
||||
while (p != end) {
|
||||
*p = '/';
|
||||
if (p)
|
||||
*p = '/';
|
||||
else
|
||||
p = fname;
|
||||
p += strlen(p);
|
||||
if (ret < 0) /* Skip mkdir on error, but keep restoring the path. */
|
||||
continue;
|
||||
@@ -858,7 +874,7 @@ int count_dir_elements(const char *p)
|
||||
* CFN_KEEP_TRAILING_SLASH is flagged, and will also collapse ".." elements
|
||||
* (except at the start) if CFN_COLLAPSE_DOT_DOT_DIRS is flagged. If the
|
||||
* resulting name would be empty, returns ".". */
|
||||
unsigned int clean_fname(char *name, int flags)
|
||||
int clean_fname(char *name, int flags)
|
||||
{
|
||||
char *limit = name - 1, *t = name, *f = name;
|
||||
int anchored;
|
||||
@@ -866,6 +882,8 @@ unsigned int clean_fname(char *name, int flags)
|
||||
if (!name)
|
||||
return 0;
|
||||
|
||||
#define DOT_IS_DOT_DOT_DIR(bp) (bp[1] == '.' && (bp[2] == '/' || !bp[2]))
|
||||
|
||||
if ((anchored = *f == '/') != 0) {
|
||||
*t++ = *f++;
|
||||
#ifdef __CYGWIN__
|
||||
@@ -878,7 +896,8 @@ unsigned int clean_fname(char *name, int flags)
|
||||
} else if (flags & CFN_KEEP_DOT_DIRS && *f == '.' && f[1] == '/') {
|
||||
*t++ = *f++;
|
||||
*t++ = *f++;
|
||||
}
|
||||
} else if (flags & CFN_REFUSE_DOT_DOT_DIRS && *f == '.' && DOT_IS_DOT_DOT_DIR(f))
|
||||
return -1;
|
||||
while (*f) {
|
||||
/* discard extra slashes */
|
||||
if (*f == '/') {
|
||||
@@ -894,9 +913,10 @@ unsigned int clean_fname(char *name, int flags)
|
||||
if (f[1] == '\0' && flags & CFN_DROP_TRAILING_DOT_DIR)
|
||||
break;
|
||||
/* collapse ".." dirs */
|
||||
if (flags & CFN_COLLAPSE_DOT_DOT_DIRS
|
||||
&& f[1] == '.' && (f[2] == '/' || !f[2])) {
|
||||
if (flags & (CFN_COLLAPSE_DOT_DOT_DIRS|CFN_REFUSE_DOT_DOT_DIRS) && DOT_IS_DOT_DOT_DIR(f)) {
|
||||
char *s = t - 1;
|
||||
if (flags & CFN_REFUSE_DOT_DOT_DIRS)
|
||||
return -1;
|
||||
if (s == name && anchored) {
|
||||
f += 2;
|
||||
continue;
|
||||
@@ -919,6 +939,8 @@ unsigned int clean_fname(char *name, int flags)
|
||||
*t++ = '.';
|
||||
*t = '\0';
|
||||
|
||||
#undef DOT_IS_DOT_DOT_DIR
|
||||
|
||||
return t - name;
|
||||
}
|
||||
|
||||
@@ -1305,16 +1327,17 @@ char *timestring(time_t t)
|
||||
int cmp_time(time_t file1, time_t file2)
|
||||
{
|
||||
if (file2 > file1) {
|
||||
if (file2 - file1 <= modify_window)
|
||||
return 0;
|
||||
return -1;
|
||||
/* The final comparison makes sure that modify_window doesn't overflow a
|
||||
* time_t, which would mean that file2 must be in the equality window. */
|
||||
if (!modify_window || (file2 > file1 + modify_window && file1 + modify_window > file1))
|
||||
return -1;
|
||||
} else if (file1 > file2) {
|
||||
if (!modify_window || (file1 > file2 + modify_window && file2 + modify_window > file2))
|
||||
return 1;
|
||||
}
|
||||
if (file1 - file2 <= modify_window)
|
||||
return 0;
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __INSURE__XX
|
||||
#include <dlfcn.h>
|
||||
|
||||
@@ -1582,6 +1605,14 @@ int flist_ndx_pop(flist_ndx_list *lp)
|
||||
return ndx;
|
||||
}
|
||||
|
||||
/* Make sure there is room for one more item in the item list. If there
|
||||
* is not, expand the list as indicated by the value of "incr":
|
||||
* - if incr < 0 then increase the malloced size by -1 * incr
|
||||
* - if incr >= 0 then either make the malloced size equal to "incr"
|
||||
* or (if that's not large enough) double the malloced size
|
||||
* After the size check, the list's count is incremented by 1 and a pointer
|
||||
* to the "new" list item is returned.
|
||||
*/
|
||||
void *expand_item_list(item_list *lp, size_t item_size,
|
||||
const char *desc, int incr)
|
||||
{
|
||||
@@ -1592,10 +1623,12 @@ void *expand_item_list(item_list *lp, size_t item_size,
|
||||
if (incr < 0)
|
||||
new_size += -incr; /* increase slowly */
|
||||
else if (new_size < (size_t)incr)
|
||||
new_size += incr;
|
||||
else
|
||||
new_size = incr;
|
||||
else if (new_size)
|
||||
new_size *= 2;
|
||||
if (new_size < lp->malloced)
|
||||
else
|
||||
new_size = 1;
|
||||
if (new_size <= lp->malloced)
|
||||
overflow_exit("expand_item_list");
|
||||
/* Using _realloc_array() lets us pass the size, not a type. */
|
||||
new_ptr = _realloc_array(lp->items, item_size, new_size);
|
||||
|
||||
10
util2.c
10
util2.c
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -35,6 +35,9 @@ extern int checksum_len;
|
||||
**/
|
||||
int msleep(int t)
|
||||
{
|
||||
#ifdef HAVE_USLEEP
|
||||
usleep(t*1000);
|
||||
#else
|
||||
int tdiff = 0;
|
||||
struct timeval tval, t1, t2;
|
||||
|
||||
@@ -48,11 +51,12 @@ int msleep(int t)
|
||||
select(0,NULL,NULL, NULL, &tval);
|
||||
|
||||
gettimeofday(&t2, NULL);
|
||||
if (t2.tv_sec < t1.tv_sec)
|
||||
t1 = t2; /* Time went backwards, so start over. */
|
||||
tdiff = (t2.tv_sec - t1.tv_sec)*1000 +
|
||||
(t2.tv_usec - t1.tv_usec)/1000;
|
||||
if (tdiff < 0)
|
||||
t1 = t2; /* Time went backwards, so start over. */
|
||||
}
|
||||
#endif
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Test suite for the wildmatch code.
|
||||
*
|
||||
* Copyright (C) 2003-2013 Wayne Davison
|
||||
* Copyright (C) 2003-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
16
xattrs.c
16
xattrs.c
@@ -3,7 +3,7 @@
|
||||
* Written by Jay Fenlason, vaguely based on the ACLs patch.
|
||||
*
|
||||
* Copyright (C) 2004 Red Hat, Inc.
|
||||
* Copyright (C) 2006-2013 Wayne Davison
|
||||
* Copyright (C) 2006-2015 Wayne Davison
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -308,7 +308,8 @@ int get_xattr(const char *fname, stat_x *sxp)
|
||||
if (!preserve_devices)
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
} else if (IS_MISSING_FILE(sxp->st))
|
||||
return 0;
|
||||
|
||||
if (rsync_xal_get(fname, sxp->xattr) < 0) {
|
||||
free_xattr(sxp);
|
||||
@@ -451,7 +452,7 @@ int send_xattr(int f, stat_x *sxp)
|
||||
if (rxa->datum_len > MAX_FULL_DATUM)
|
||||
write_buf(f, rxa->datum + 1, MAX_DIGEST_LEN);
|
||||
else
|
||||
write_buf(f, rxa->datum, rxa->datum_len);
|
||||
write_bigbuf(f, rxa->datum, rxa->datum_len);
|
||||
}
|
||||
ndx = rsync_xal_l.count; /* pre-incremented count */
|
||||
rsync_xal_store(sxp->xattr); /* adds item to rsync_xal_l */
|
||||
@@ -579,7 +580,7 @@ void send_xattr_request(const char *fname, struct file_struct *file, int f_out)
|
||||
}
|
||||
|
||||
write_varint(f_out, len); /* length might have changed! */
|
||||
write_buf(f_out, ptr, len);
|
||||
write_bigbuf(f_out, ptr, len);
|
||||
free(ptr);
|
||||
}
|
||||
}
|
||||
@@ -610,9 +611,10 @@ int recv_xattr_request(struct file_struct *file, int f_in)
|
||||
num = 0;
|
||||
while ((rel_pos = read_varint(f_in)) != 0) {
|
||||
num += rel_pos;
|
||||
while (cnt && rxa->num < num) {
|
||||
rxa++;
|
||||
cnt--;
|
||||
/* Note that the sender-related num values may not be in order on the receiver! */
|
||||
while (cnt && (am_sender ? rxa->num < num : rxa->num != num)) {
|
||||
rxa++;
|
||||
cnt--;
|
||||
}
|
||||
if (!cnt || rxa->num != num) {
|
||||
rprintf(FERROR, "[%s] could not find xattr #%d for %s\n",
|
||||
|
||||
Reference in New Issue
Block a user