mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-05-27 08:22:52 -04:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6622816eff | ||
|
|
3f137ce0e2 | ||
|
|
d616bff57f | ||
|
|
40b3a59fc8 | ||
|
|
4640ae85fe | ||
|
|
24f739c118 | ||
|
|
996824825f | ||
|
|
bbef6566cd | ||
|
|
9be5093726 | ||
|
|
feb8dacc14 | ||
|
|
ff908116ef | ||
|
|
ea53d161be | ||
|
|
7875e6fe63 | ||
|
|
8e2771aa6e | ||
|
|
386f22cec6 | ||
|
|
272adea36b | ||
|
|
a69b165524 | ||
|
|
bf350d7b31 | ||
|
|
70a9cd5752 | ||
|
|
42560e2e53 | ||
|
|
d058d0aecd | ||
|
|
af00666a40 | ||
|
|
2517f5440d | ||
|
|
f2522e3f53 | ||
|
|
8fba76d5c3 | ||
|
|
782b96d3e2 | ||
|
|
1f6b697f28 | ||
|
|
919491948e | ||
|
|
0ea6f486d9 | ||
|
|
9493048c10 | ||
|
|
4dea1a9492 | ||
|
|
650bca3770 | ||
|
|
794f38099a | ||
|
|
8250d8a1c6 | ||
|
|
1fb6163c51 | ||
|
|
7f51d0e849 | ||
|
|
ece2d0e415 | ||
|
|
445640e803 | ||
|
|
5ea7c8aae3 |
16
Makefile.in
16
Makefile.in
@@ -59,7 +59,7 @@ CHECK_OBJS=tls.o getgroups.o getfsdev.o t_stub.o t_unsafe.o trimslash.o wildtest
|
||||
$(CC) -I. -I$(srcdir) $(CFLAGS) $(CPPFLAGS) -c $< @CC_SHOBJ_FLAG@
|
||||
@OBJ_RESTORE@
|
||||
|
||||
all: conf_stop make_stop rsync$(EXEEXT) @MAKE_MAN@
|
||||
all: Makefile rsync$(EXEEXT) @MAKE_MAN@
|
||||
|
||||
install: all
|
||||
-mkdir -p ${DESTDIR}${bindir}
|
||||
@@ -123,8 +123,6 @@ gensend: gen
|
||||
conf:
|
||||
cd $(srcdir) && $(MAKE) -f prepare-source.mak conf
|
||||
|
||||
conf_stop: configure.sh config.h.in
|
||||
|
||||
configure.sh config.h.in: configure.in 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
|
||||
@@ -156,17 +154,19 @@ reconfigure: configure.sh
|
||||
./config.status --recheck
|
||||
./config.status
|
||||
|
||||
make_stop: Makefile
|
||||
|
||||
Makefile: Makefile.in config.status
|
||||
Makefile: Makefile.in config.status configure.sh config.h.in
|
||||
@if test -f Makefile; then cp -p Makefile Makefile.old; else touch Makefile.old; fi
|
||||
@./config.status
|
||||
@if diff Makefile Makefile.old >/dev/null 2>&1; then \
|
||||
echo "Makefile is unchanged."; \
|
||||
rm Makefile.old; \
|
||||
else \
|
||||
echo "Makefile updated -- rerun your make command."; \
|
||||
exit 1; \
|
||||
if test "$(MAKECMDGOALS)" = reconfigure; then \
|
||||
echo 'Continuing with "make reconfigure".'; \
|
||||
else \
|
||||
echo "Makefile updated -- rerun your make command."; \
|
||||
exit 1; \
|
||||
fi \
|
||||
fi
|
||||
|
||||
proto: proto.h-tstamp
|
||||
|
||||
73
NEWS
73
NEWS
@@ -1,62 +1,55 @@
|
||||
NEWS for rsync 3.0.5 (28 Dec 2008)
|
||||
NEWS for rsync 3.0.6 (8 May 2009)
|
||||
Protocol: 30 (unchanged)
|
||||
Changes since 3.0.4:
|
||||
Changes since 3.0.5:
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
- Initialize xattr data in a couple spots in the hlink code, which avoids a
|
||||
crash when the xattr pointer's memory happens to start out non-zero.
|
||||
Also fixed the itemizing of an alt-dest file's xattrs when hard-linking.
|
||||
- Fixed a --read-batch hang when rsync is reading a batch file that was
|
||||
created from an incremental-recursion transfer.
|
||||
|
||||
- Don't send a bogus "-" option to an older server if there were no short
|
||||
options specified.
|
||||
- Fixed the daemon's socket code to handle the simultaneous arrival of
|
||||
multiple connections.
|
||||
|
||||
- Fixed skipping of unneeded updates in a batch file when incremental
|
||||
recursion is active. Added a test for this. Made batch-mode handle
|
||||
"redo" files properly (and without hanging).
|
||||
- Fix --safe-links/--copy-unsafe-links to properly handle symlinks that
|
||||
have consecutive slashes in the value.
|
||||
|
||||
- Fix the %P logfile escape when the daemon logs from inside a chroot.
|
||||
- Fixed the parsing of an [IPv6_LITERAL_ADDR] when a USER@ is prefixed.
|
||||
|
||||
- Fixed the use of -s (--protect-args) when used with a remote source or
|
||||
destination that had an empty path (e.g. "host:"). Also fixed a problem
|
||||
when -s was used when accessing a daemon via a remote-shell.
|
||||
- The sender now skips a (bogus) symlink that has a 0-length value, which
|
||||
avoids a transfer error in the receiver.
|
||||
|
||||
- Fixed the use of a dot-dir path (e.g. foo/./bar) inside a --files-from
|
||||
file when the root of the transfer isn't the current directory.
|
||||
- Fixed a case where the sender could die with a tag-0 error if there was
|
||||
an I/O during the sending of the file list.
|
||||
|
||||
- Fixed a bug with "-K --delete" removing symlinks to directories when
|
||||
incremental recursion is active.
|
||||
- Fixed the rrsync script to avoid a server-side problem when -e is at the
|
||||
start of the short options.
|
||||
|
||||
- Fixed a hard to trigger hang when using --remove-source-files.
|
||||
- Fixed a problem where a vanished directory could turn into an exit code
|
||||
23 instead of the proper exit code 24.
|
||||
|
||||
- Got rid of an annoying delay when accessing a daemon via a remote-shell.
|
||||
- Fixed the --iconv conversion of symlinks when doing a local copy.
|
||||
|
||||
- Properly ignore (superfluous) source args on a --read-batch command.
|
||||
- Fixed a problem where --one-file-system was not stopping deletions on the
|
||||
receiving side when a mount-point directory did not match a directory in
|
||||
the transfer.
|
||||
|
||||
- Improved the manpage's description of the '*' wildcard to remove the
|
||||
confusing "non-empty" qualifier.
|
||||
- Fixed the dropping of an ACL mask when no named ACL values were present.
|
||||
|
||||
- Fixed reverse lookups in the compatibility-library version of
|
||||
getnameinfo().
|
||||
- Fixed an ACL/xattr corruption issue where the --backup option could cause
|
||||
rsync to associate the wrong ACL/xattr information with received files.
|
||||
|
||||
- Fixed a bug when using --sparse on a sparse file that has over 2GB of
|
||||
consecutive sparse data.
|
||||
- Fixed the use of --xattrs with --only-write-batch.
|
||||
|
||||
- Avoid a hang when using at least 3 --verbose options on a transfer with a
|
||||
client sender (which includes local copying).
|
||||
- Fixed the use of --dry-run with --read-batch.
|
||||
|
||||
- Fixed a problem with --delete-delay reporting an error when it was ready
|
||||
to remove a directory that was now gone.
|
||||
- Fixed configure's erroneous use of target.
|
||||
|
||||
- Got rid of a bunch of "warn_unused_result" compiler warnings.
|
||||
- Fixed configure's --disable-debug option.
|
||||
|
||||
- If an ftruncate() on a received file fails, it now causes a partial-
|
||||
transfer warning.
|
||||
- Fixed a run-time issue for systems that can't find iconv_open() by adding
|
||||
the --disable-iconv-open configure option.
|
||||
|
||||
- Allow a path with a leading "//" to be preserved (CYGWIN only).
|
||||
- Complain and die if the user tries to combine --remove-source-files (or
|
||||
the deprecated --remove-sent-files) with --read-batch.
|
||||
|
||||
ENHANCEMENTS:
|
||||
|
||||
- Made the support/atomic-rsync script able to perform a fully atomic
|
||||
update of the copied hierarchy when the destination is setup using a
|
||||
particular symlink idiom.
|
||||
- Fixed an failure transferring special files from Solaris to Linux.
|
||||
|
||||
65
OLDNEWS
65
OLDNEWS
@@ -1,3 +1,67 @@
|
||||
NEWS for rsync 3.0.5 (28 Dec 2008)
|
||||
Protocol: 30 (unchanged)
|
||||
Changes since 3.0.4:
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
- Initialize xattr data in a couple spots in the hlink code, which avoids a
|
||||
crash when the xattr pointer's memory happens to start out non-zero.
|
||||
Also fixed the itemizing of an alt-dest file's xattrs when hard-linking.
|
||||
|
||||
- Don't send a bogus "-" option to an older server if there were no short
|
||||
options specified.
|
||||
|
||||
- Fixed skipping of unneeded updates in a batch file when incremental
|
||||
recursion is active. Added a test for this. Made batch-mode handle
|
||||
"redo" files properly (and without hanging).
|
||||
|
||||
- Fix the %P logfile escape when the daemon logs from inside a chroot.
|
||||
|
||||
- Fixed the use of -s (--protect-args) when used with a remote source or
|
||||
destination that had an empty path (e.g. "host:"). Also fixed a problem
|
||||
when -s was used when accessing a daemon via a remote-shell.
|
||||
|
||||
- Fixed the use of a dot-dir path (e.g. foo/./bar) inside a --files-from
|
||||
file when the root of the transfer isn't the current directory.
|
||||
|
||||
- Fixed a bug with "-K --delete" removing symlinks to directories when
|
||||
incremental recursion is active.
|
||||
|
||||
- Fixed a hard to trigger hang when using --remove-source-files.
|
||||
|
||||
- Got rid of an annoying delay when accessing a daemon via a remote-shell.
|
||||
|
||||
- Properly ignore (superfluous) source args on a --read-batch command.
|
||||
|
||||
- Improved the manpage's description of the '*' wildcard to remove the
|
||||
confusing "non-empty" qualifier.
|
||||
|
||||
- Fixed reverse lookups in the compatibility-library version of
|
||||
getnameinfo().
|
||||
|
||||
- Fixed a bug when using --sparse on a sparse file that has over 2GB of
|
||||
consecutive sparse data.
|
||||
|
||||
- Avoid a hang when using at least 3 --verbose options on a transfer with a
|
||||
client sender (which includes local copying).
|
||||
|
||||
- Fixed a problem with --delete-delay reporting an error when it was ready
|
||||
to remove a directory that was now gone.
|
||||
|
||||
- Got rid of a bunch of "warn_unused_result" compiler warnings.
|
||||
|
||||
- If an ftruncate() on a received file fails, it now causes a partial-
|
||||
transfer warning.
|
||||
|
||||
- Allow a path with a leading "//" to be preserved (CYGWIN only).
|
||||
|
||||
ENHANCEMENTS:
|
||||
|
||||
- Made the support/atomic-rsync script able to perform a fully atomic
|
||||
update of the copied hierarchy when the destination is setup using a
|
||||
particular symlink idiom.
|
||||
|
||||
|
||||
NEWS for rsync 3.0.4 (6 Sep 2008)
|
||||
Protocol: 30 (unchanged)
|
||||
Changes since 3.0.3:
|
||||
@@ -2907,6 +2971,7 @@ Changes since 2.4.6:
|
||||
|
||||
Partial Protocol History
|
||||
RELEASE DATE VER. DATE OF COMMIT* PROTOCOL
|
||||
08 May 2009 3.0.6 30
|
||||
28 Dec 2008 3.0.5 30
|
||||
06 Sep 2008 3.0.4 30
|
||||
29 Jun 2008 3.0.3 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-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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
|
||||
|
||||
52
acls.c
52
acls.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2006-2008 Wayne Davison
|
||||
* Copyright (C) 2006-2009 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
|
||||
@@ -88,6 +88,9 @@ static const rsync_acl empty_rsync_acl = {
|
||||
static item_list access_acl_list = EMPTY_ITEM_LIST;
|
||||
static item_list default_acl_list = EMPTY_ITEM_LIST;
|
||||
|
||||
static size_t prior_access_count = (size_t)-1;
|
||||
static size_t prior_default_count = (size_t)-1;
|
||||
|
||||
/* === Calculations on ACL types === */
|
||||
|
||||
static const char *str_acl_type(SMB_ACL_TYPE_T type)
|
||||
@@ -137,7 +140,8 @@ static void rsync_acl_strip_perms(rsync_acl *racl)
|
||||
else {
|
||||
if (racl->group_obj == racl->mask_obj)
|
||||
racl->group_obj = NO_ENTRY;
|
||||
racl->mask_obj = NO_ENTRY;
|
||||
if (racl->names.count != 0)
|
||||
racl->mask_obj = NO_ENTRY;
|
||||
}
|
||||
racl->other_obj = NO_ENTRY;
|
||||
}
|
||||
@@ -749,14 +753,7 @@ static int recv_rsync_acl(item_list *racl_list, SMB_ACL_TYPE_T type, int f)
|
||||
/* If we received a superfluous mask, throw it away. */
|
||||
duo_item->racl.mask_obj = NO_ENTRY;
|
||||
#else
|
||||
if (!duo_item->racl.names.count) {
|
||||
/* If we received a superfluous mask, throw it away. */
|
||||
if (duo_item->racl.mask_obj != NO_ENTRY) {
|
||||
/* Mask off the group perms with it first. */
|
||||
duo_item->racl.group_obj &= duo_item->racl.mask_obj | NO_ENTRY;
|
||||
duo_item->racl.mask_obj = NO_ENTRY;
|
||||
}
|
||||
} else if (duo_item->racl.mask_obj == NO_ENTRY) /* Must be non-empty with lists. */
|
||||
if (duo_item->racl.names.count && duo_item->racl.mask_obj == NO_ENTRY) /* Must be non-empty with lists. */
|
||||
duo_item->racl.mask_obj = (computed_mask_bits | duo_item->racl.group_obj) & ~NO_ENTRY;
|
||||
#endif
|
||||
|
||||
@@ -794,17 +791,50 @@ static int cache_rsync_acl(rsync_acl *racl, SMB_ACL_TYPE_T type, item_list *racl
|
||||
|
||||
/* Turn the ACL data in stat_x into cached ACL data, setting the index
|
||||
* values in the file struct. */
|
||||
void cache_acl(struct file_struct *file, stat_x *sxp)
|
||||
void cache_tmp_acl(struct file_struct *file, stat_x *sxp)
|
||||
{
|
||||
if (prior_access_count == (size_t)-1)
|
||||
prior_access_count = access_acl_list.count;
|
||||
|
||||
F_ACL(file) = cache_rsync_acl(sxp->acc_acl,
|
||||
SMB_ACL_TYPE_ACCESS, &access_acl_list);
|
||||
|
||||
if (S_ISDIR(sxp->st.st_mode)) {
|
||||
if (prior_default_count == (size_t)-1)
|
||||
prior_default_count = default_acl_list.count;
|
||||
F_DIR_DEFACL(file) = cache_rsync_acl(sxp->def_acl,
|
||||
SMB_ACL_TYPE_DEFAULT, &default_acl_list);
|
||||
}
|
||||
}
|
||||
|
||||
static void uncache_duo_acls(item_list *duo_list, size_t start)
|
||||
{
|
||||
acl_duo *duo_item = duo_list->items;
|
||||
acl_duo *duo_start = duo_item + start;
|
||||
|
||||
duo_item += duo_list->count;
|
||||
duo_list->count = start;
|
||||
|
||||
while (duo_item-- > duo_start) {
|
||||
rsync_acl_free(&duo_item->racl);
|
||||
if (duo_item->sacl)
|
||||
sys_acl_free_acl(duo_item->sacl);
|
||||
}
|
||||
}
|
||||
|
||||
void uncache_tmp_acls(void)
|
||||
{
|
||||
if (prior_access_count != (size_t)-1) {
|
||||
uncache_duo_acls(&access_acl_list, prior_access_count);
|
||||
prior_access_count = (size_t)-1;
|
||||
}
|
||||
|
||||
if (prior_default_count != (size_t)-1) {
|
||||
uncache_duo_acls(&default_acl_list, prior_default_count);
|
||||
prior_default_count = (size_t)-1;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef HAVE_OSX_ACLS
|
||||
static mode_t change_sacl_perms(SMB_ACL_T sacl, rsync_acl *racl, mode_t old_mode, mode_t mode)
|
||||
{
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Support rsync daemon authentication.
|
||||
*
|
||||
* Copyright (C) 1998-2000 Andrew Tridgell
|
||||
* Copyright (C) 2002-2008 Wayne Davison
|
||||
* Copyright (C) 2002-2009 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
|
||||
|
||||
36
backup.c
36
backup.c
@@ -2,7 +2,7 @@
|
||||
* Backup handling code.
|
||||
*
|
||||
* Copyright (C) 1999 Andrew Tridgell
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
@@ -148,19 +148,25 @@ int make_bak_dir(const char *fullpath)
|
||||
#ifdef SUPPORT_ACLS
|
||||
if (preserve_acls && !S_ISLNK(file->mode)) {
|
||||
get_acl(rel, &sx);
|
||||
cache_acl(file, &sx);
|
||||
cache_tmp_acl(file, &sx);
|
||||
free_acl(&sx);
|
||||
}
|
||||
#endif
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs) {
|
||||
get_xattr(rel, &sx);
|
||||
cache_xattr(file, &sx);
|
||||
cache_tmp_xattr(file, &sx);
|
||||
free_xattr(&sx);
|
||||
}
|
||||
#endif
|
||||
set_file_attrs(fbuf, file, NULL, NULL, 0);
|
||||
unmake_file(file);
|
||||
#ifdef SUPPORT_ACLS
|
||||
uncache_tmp_acls();
|
||||
#endif
|
||||
#ifdef SUPPORT_XATTRS
|
||||
uncache_tmp_xattrs();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
*p = '/';
|
||||
@@ -223,20 +229,26 @@ static int keep_backup(const char *fname)
|
||||
|
||||
if (!(buf = get_backup_name(fname))) {
|
||||
unmake_file(file);
|
||||
#ifdef SUPPORT_ACLS
|
||||
uncache_tmp_acls();
|
||||
#endif
|
||||
#ifdef SUPPORT_XATTRS
|
||||
uncache_tmp_xattrs();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef SUPPORT_ACLS
|
||||
if (preserve_acls && !S_ISLNK(file->mode)) {
|
||||
get_acl(fname, &sx);
|
||||
cache_acl(file, &sx);
|
||||
cache_tmp_acl(file, &sx);
|
||||
free_acl(&sx);
|
||||
}
|
||||
#endif
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs) {
|
||||
get_xattr(fname, &sx);
|
||||
cache_xattr(file, &sx);
|
||||
cache_tmp_xattr(file, &sx);
|
||||
free_xattr(&sx);
|
||||
}
|
||||
#endif
|
||||
@@ -295,7 +307,7 @@ static int keep_backup(const char *fname)
|
||||
#ifdef SUPPORT_LINKS
|
||||
if (!kept && preserve_links && S_ISLNK(file->mode)) {
|
||||
const char *sl = F_SYMLINK(file);
|
||||
if (safe_symlinks && unsafe_symlink(sl, buf)) {
|
||||
if (safe_symlinks && unsafe_symlink(sl, fname)) {
|
||||
if (verbose) {
|
||||
rprintf(FINFO, "ignoring unsafe symlink %s -> %s\n",
|
||||
full_fname(buf), sl);
|
||||
@@ -326,6 +338,12 @@ static int keep_backup(const char *fname)
|
||||
rprintf(FINFO, "make_bak: skipping non-regular file %s\n",
|
||||
fname);
|
||||
unmake_file(file);
|
||||
#ifdef SUPPORT_ACLS
|
||||
uncache_tmp_acls();
|
||||
#endif
|
||||
#ifdef SUPPORT_XATTRS
|
||||
uncache_tmp_xattrs();
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -344,6 +362,12 @@ static int keep_backup(const char *fname)
|
||||
set_file_attrs(buf, file, NULL, fname, 0);
|
||||
preserve_xattrs = save_preserve_xattrs;
|
||||
unmake_file(file);
|
||||
#ifdef SUPPORT_ACLS
|
||||
uncache_tmp_acls();
|
||||
#endif
|
||||
#ifdef SUPPORT_XATTRS
|
||||
uncache_tmp_xattrs();
|
||||
#endif
|
||||
|
||||
if (verbose > 1) {
|
||||
rprintf(FINFO, "backed up %s to %s\n",
|
||||
|
||||
2
batch.c
2
batch.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1999 Weiss
|
||||
* Copyright (C) 2004 Chris Shoemaker
|
||||
* Copyright (C) 2004-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2004-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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
chmod.c
2
chmod.c
@@ -2,7 +2,7 @@
|
||||
* Implement the core of the --chmod option.
|
||||
*
|
||||
* Copyright (C) 2002 Scott Howard
|
||||
* Copyright (C) 2005-2008 Wayne Davison
|
||||
* Copyright (C) 2005-2009 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-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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) 1992-2001 Andrew Tridgell <tridge@samba.org>
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2002-2008 Wayne Davison
|
||||
* Copyright (C) 2002-2009 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-2008 Wayne Davison
|
||||
* Copyright (C) 2002-2009 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
compat.c
4
compat.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) Andrew Tridgell 1996
|
||||
* Copyright (C) Paul Mackerras 1996
|
||||
* Copyright (C) 2004-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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
|
||||
@@ -271,7 +271,7 @@ void setup_protocol(int f_out,int f_in)
|
||||
#endif
|
||||
#ifdef ICONV_OPTION
|
||||
sender_symlink_iconv = iconv_opt && (am_server
|
||||
? strchr(client_info, 's') != NULL
|
||||
? local_server || strchr(client_info, 's') != NULL
|
||||
: !!(compat_flags & CF_SYMLINK_ICONV));
|
||||
#endif
|
||||
if (inc_recurse && !allow_inc_recurse) {
|
||||
|
||||
57
configure.in
57
configure.in
@@ -5,7 +5,7 @@ AC_CONFIG_SRCDIR([byteorder.h])
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_PREREQ(2.59)
|
||||
|
||||
RSYNC_VERSION=3.0.5
|
||||
RSYNC_VERSION=3.0.6
|
||||
AC_SUBST(RSYNC_VERSION)
|
||||
AC_MSG_NOTICE([Configuring rsync $RSYNC_VERSION])
|
||||
|
||||
@@ -13,7 +13,26 @@ AC_DEFINE_UNQUOTED(RSYNC_VERSION, ["$RSYNC_VERSION"], [rsync release version])
|
||||
|
||||
LDFLAGS=${LDFLAGS-""}
|
||||
|
||||
AC_CANONICAL_TARGET([])
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
# We must decide this before testing the compiler.
|
||||
|
||||
# Please allow this to default to yes, so that your users have more
|
||||
# chance of getting a useful stack trace if problems occur.
|
||||
|
||||
AC_MSG_CHECKING([whether to include debugging symbols])
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--disable-debug],
|
||||
[disable debugging symbols and features]))
|
||||
|
||||
if test x"$enable_debug" = x"no"; then
|
||||
AC_MSG_RESULT(no)
|
||||
ac_cv_prog_cc_g=no
|
||||
else
|
||||
AC_MSG_RESULT([yes])
|
||||
dnl AC_DEFINE(DEBUG, 1, [Define to turn on debugging code that may slow normal operation])
|
||||
# leave ac_cv_prog_cc_g alone; AC_PROG_CC will try to include -g if it can
|
||||
fi
|
||||
|
||||
dnl Checks for programs.
|
||||
AC_PROG_CC
|
||||
@@ -30,27 +49,6 @@ if test x"$ac_cv_prog_cc_stdc" = x"no"; then
|
||||
AC_MSG_WARN([rsync requires an ANSI C compiler and you don't seem to have one])
|
||||
fi
|
||||
|
||||
# We must decide this before testing the compiler.
|
||||
|
||||
# Please allow this to default to yes, so that your users have more
|
||||
# chance of getting a useful stack trace if problems occur.
|
||||
|
||||
AC_MSG_CHECKING([whether to include debugging symbols])
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--disable-debug],
|
||||
[disable debugging symbols and features]))
|
||||
|
||||
if test x"$enable_debug" = x"no"; then
|
||||
AC_MSG_RESULT(no)
|
||||
CFLAGS=${CFLAGS-"-O"}
|
||||
else
|
||||
AC_MSG_RESULT([yes])
|
||||
# leave CFLAGS alone; AC_PROG_CC will try to include -g if it can
|
||||
dnl AC_DEFINE(DEBUG, 1, [Define to turn on debugging code that may slow normal operation])
|
||||
dnl CFLAGS=${CFLAGS-"-g"}
|
||||
fi
|
||||
|
||||
|
||||
AC_ARG_ENABLE(profile,
|
||||
AC_HELP_STRING([--enable-profile],
|
||||
[turn on CPU profiling]))
|
||||
@@ -566,10 +564,19 @@ if test $ac_cv_func_getpgrp = yes; then
|
||||
AC_FUNC_GETPGRP
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(iconv-open,
|
||||
AC_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
|
||||
AC_DEFINE(USE_ICONV_OPEN, 1, [Define to 1 if you want rsync to make use of iconv_open()])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(iconv,
|
||||
AC_HELP_STRING([--disable-iconv],
|
||||
[disable rsync's --iconv option]),
|
||||
[], [enable_iconv=$ac_cv_func_iconv_open])
|
||||
[], [enable_iconv=$enable_iconv_open])
|
||||
AH_TEMPLATE([ICONV_OPTION],
|
||||
[Define if you want the --iconv option. Specifing a value will set the
|
||||
default iconv setting (a NULL means no --iconv processing by default).])
|
||||
@@ -762,7 +769,7 @@ 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 $target_os in
|
||||
case $host_os in
|
||||
hpux*)
|
||||
dnl HP-UX has a broken mkstemp() implementation they refuse to fix,
|
||||
dnl so we noisily skip using it. See HP change request JAGaf34426
|
||||
|
||||
@@ -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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
fileio.c
2
fileio.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1998 Andrew Tridgell
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2004-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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
flist.c
68
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-2008 Wayne Davison
|
||||
* Copyright (C) 2002-2009 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
|
||||
@@ -425,8 +425,7 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
|
||||
else
|
||||
mode = file->mode;
|
||||
|
||||
if ((preserve_devices && IS_DEVICE(mode))
|
||||
|| (preserve_specials && IS_SPECIAL(mode))) {
|
||||
if (preserve_devices && IS_DEVICE(mode)) {
|
||||
if (protocol_version < 28) {
|
||||
if (tmp_rdev == rdev)
|
||||
xflags |= XMIT_SAME_RDEV_pre28;
|
||||
@@ -441,6 +440,17 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
|
||||
if (protocol_version < 30 && (uint32)minor(rdev) <= 0xFFu)
|
||||
xflags |= XMIT_RDEV_MINOR_8_pre30;
|
||||
}
|
||||
} else if (preserve_specials && IS_SPECIAL(mode)) {
|
||||
/* Special files don't need an rdev number, so just make
|
||||
* the historical transmission of the value efficient. */
|
||||
if (protocol_version < 28)
|
||||
xflags |= XMIT_SAME_RDEV_pre28;
|
||||
else {
|
||||
rdev = MAKEDEV(major(rdev), 0);
|
||||
xflags |= XMIT_SAME_RDEV_MAJOR;
|
||||
if (protocol_version < 30)
|
||||
xflags |= XMIT_RDEV_MINOR_8_pre30;
|
||||
}
|
||||
} else if (protocol_version < 28)
|
||||
rdev = MAKEDEV(0, 0);
|
||||
if (!preserve_uid || ((uid_t)F_OWNER(file) == uid && *lastname))
|
||||
@@ -725,8 +735,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist,
|
||||
uid = F_OWNER(first);
|
||||
if (preserve_gid)
|
||||
gid = F_GROUP(first);
|
||||
if ((preserve_devices && IS_DEVICE(mode))
|
||||
|| (preserve_specials && IS_SPECIAL(mode))) {
|
||||
if (preserve_devices && IS_DEVICE(mode)) {
|
||||
uint32 *devp = F_RDEV_P(first);
|
||||
rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
|
||||
extra_len += DEV_EXTRA_CNT * EXTRA_LEN;
|
||||
@@ -801,7 +810,8 @@ static struct file_struct *recv_file_entry(struct file_list *flist,
|
||||
rdev_minor = read_int(f);
|
||||
rdev = MAKEDEV(rdev_major, rdev_minor);
|
||||
}
|
||||
extra_len += DEV_EXTRA_CNT * EXTRA_LEN;
|
||||
if (IS_DEVICE(mode))
|
||||
extra_len += DEV_EXTRA_CNT * EXTRA_LEN;
|
||||
file_length = 0;
|
||||
} else if (protocol_version < 28)
|
||||
rdev = MAKEDEV(0, 0);
|
||||
@@ -942,8 +952,7 @@ static struct file_struct *recv_file_entry(struct file_list *flist,
|
||||
}
|
||||
}
|
||||
|
||||
if ((preserve_devices && IS_DEVICE(mode))
|
||||
|| (preserve_specials && IS_SPECIAL(mode))) {
|
||||
if (preserve_devices && IS_DEVICE(mode)) {
|
||||
uint32 *devp = F_RDEV_P(file);
|
||||
DEV_MAJOR(devp) = major(rdev);
|
||||
DEV_MINOR(devp) = minor(rdev);
|
||||
@@ -1257,10 +1266,11 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRUCT_STAT_ST_RDEV
|
||||
if (IS_DEVICE(st.st_mode) || IS_SPECIAL(st.st_mode)) {
|
||||
if (IS_DEVICE(st.st_mode)) {
|
||||
tmp_rdev = st.st_rdev;
|
||||
st.st_size = 0;
|
||||
}
|
||||
} else if (IS_SPECIAL(st.st_mode))
|
||||
st.st_size = 0;
|
||||
#endif
|
||||
|
||||
file->flags = flags;
|
||||
@@ -1342,6 +1352,14 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
|
||||
if (preserve_links && S_ISLNK(file->mode)) {
|
||||
symlink_name = F_SYMLINK(file);
|
||||
symlink_len = strlen(symlink_name);
|
||||
if (symlink_len == 0) {
|
||||
io_error |= IOERR_GENERAL;
|
||||
f_name(file, fbuf);
|
||||
rprintf(FERROR_XFER,
|
||||
"skipping symlink with 0-length value: %s\n",
|
||||
full_fname(fbuf));
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
symlink_name = NULL;
|
||||
symlink_len = 0;
|
||||
@@ -1578,6 +1596,19 @@ static void add_dirs_to_tree(int parent_ndx, struct file_list *from_flist,
|
||||
DIR_NEXT_SIBLING(dp) = -1;
|
||||
}
|
||||
|
||||
static void interpret_stat_error(const char *fname, int is_dir)
|
||||
{
|
||||
if (errno == ENOENT) {
|
||||
io_error |= IOERR_VANISHED;
|
||||
rprintf(FWARNING, "%s has vanished: %s\n",
|
||||
is_dir ? "directory" : "file", full_fname(fname));
|
||||
} else {
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR_XFER, errno, "link_stat %s failed",
|
||||
full_fname(fname));
|
||||
}
|
||||
}
|
||||
|
||||
/* This function is normally called by the sender, but the receiving side also
|
||||
* calls it from get_dirlist() with f set to -1 so that we just construct the
|
||||
* file list in memory without sending it over the wire. Also, get_dirlist()
|
||||
@@ -1597,8 +1628,11 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
|
||||
assert(flist != NULL);
|
||||
|
||||
if (!(d = opendir(fbuf))) {
|
||||
if (errno == ENOENT)
|
||||
if (errno == ENOENT) {
|
||||
if (am_sender) /* Can abuse this for vanished error w/ENOENT: */
|
||||
interpret_stat_error(fbuf, True);
|
||||
return;
|
||||
}
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR_XFER, errno, "opendir %s failed", full_fname(fbuf));
|
||||
return;
|
||||
@@ -1770,9 +1804,7 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist)
|
||||
if (one_file_system) {
|
||||
STRUCT_STAT st;
|
||||
if (link_stat(fbuf, &st, copy_dirlinks) != 0) {
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR_XFER, errno, "link_stat %s failed",
|
||||
full_fname(fbuf));
|
||||
interpret_stat_error(fbuf, True);
|
||||
return;
|
||||
}
|
||||
filesystem_dev = st.st_dev;
|
||||
@@ -1807,9 +1839,7 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist)
|
||||
if (name_type != NORMAL_NAME) {
|
||||
STRUCT_STAT st;
|
||||
if (link_stat(fbuf, &st, 1) != 0) {
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR_XFER, errno, "link_stat %s failed",
|
||||
full_fname(fbuf));
|
||||
interpret_stat_error(fbuf, True);
|
||||
continue;
|
||||
}
|
||||
send_file_name(f, flist, fbuf, &st, FLAG_TOP_DIR | flags, ALL_FILTERS);
|
||||
@@ -2202,6 +2232,8 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
if (numeric_ids <= 0 && !inc_recurse)
|
||||
send_id_list(f);
|
||||
|
||||
set_msg_fd_in(-1);
|
||||
|
||||
/* send the io_error flag */
|
||||
if (protocol_version < 30)
|
||||
write_int(f, ignore_errors ? 0 : io_error);
|
||||
@@ -2985,7 +3017,7 @@ struct file_list *get_dirlist(char *dirname, int dlen, int ignore_filter_rules)
|
||||
|
||||
recurse = 0;
|
||||
xfer_dirs = 1;
|
||||
send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirname, dlen, 0);
|
||||
send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirname, dlen, FLAG_CONTENT_DIR);
|
||||
xfer_dirs = save_xfer_dirs;
|
||||
recurse = save_recurse;
|
||||
if (do_progress)
|
||||
|
||||
24
generator.c
24
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
@@ -700,7 +700,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
|
||||
if (iflags & ITEM_XNAME_FOLLOWS)
|
||||
write_vstring(sock_f_out, xname, strlen(xname));
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs && !dry_run
|
||||
if (preserve_xattrs && do_xfers
|
||||
&& iflags & (ITEM_REPORT_XATTR|ITEM_TRANSFER)) {
|
||||
send_xattr_request(NULL, file,
|
||||
iflags & ITEM_REPORT_XATTR ? sock_f_out : -1);
|
||||
@@ -1124,8 +1124,8 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx,
|
||||
}
|
||||
switch (type) {
|
||||
case TYPE_DIR:
|
||||
break;
|
||||
case TYPE_SPECIAL:
|
||||
break;
|
||||
case TYPE_DEVICE:
|
||||
devp = F_RDEV_P(file);
|
||||
if (sxp->st.st_rdev != MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp)))
|
||||
@@ -1613,8 +1613,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
|
||||
if ((am_root && preserve_devices && IS_DEVICE(file->mode))
|
||||
|| (preserve_specials && IS_SPECIAL(file->mode))) {
|
||||
uint32 *devp = F_RDEV_P(file);
|
||||
dev_t rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
|
||||
dev_t rdev;
|
||||
if (IS_DEVICE(file->mode)) {
|
||||
uint32 *devp = F_RDEV_P(file);
|
||||
rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
|
||||
} else
|
||||
rdev = 0;
|
||||
if (statret == 0) {
|
||||
int del_for_flag;
|
||||
if (IS_DEVICE(file->mode)) {
|
||||
@@ -1628,7 +1632,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
}
|
||||
if (statret == 0
|
||||
&& BITS_EQUAL(sx.st.st_mode, file->mode, _S_IFMT)
|
||||
&& sx.st.st_rdev == rdev) {
|
||||
&& (IS_SPECIAL(sx.st.st_mode) || sx.st.st_rdev == rdev)) {
|
||||
/* The device or special file is identical. */
|
||||
set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT);
|
||||
if (itemizing)
|
||||
@@ -2137,10 +2141,9 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo)
|
||||
if (first_flist->in_progress || first_flist->to_redo)
|
||||
break;
|
||||
|
||||
if (!read_batch) {
|
||||
write_ndx(sock_f_out, NDX_DONE);
|
||||
write_ndx(sock_f_out, NDX_DONE);
|
||||
if (!read_batch)
|
||||
maybe_flush_socket(1);
|
||||
}
|
||||
|
||||
if (delete_during == 2 || !dir_tweaking) {
|
||||
/* Skip directory touch-up. */
|
||||
@@ -2285,9 +2288,6 @@ void generate_files(int f_out, const char *local_name)
|
||||
}
|
||||
} while ((cur_flist = cur_flist->next) != NULL);
|
||||
|
||||
if (read_batch && inc_recurse)
|
||||
write_ndx(f_out, NDX_DONE);
|
||||
|
||||
if (delete_during)
|
||||
delete_in_dir(NULL, NULL, &dev_zero);
|
||||
phase++;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Routines to provide a memory-efficient hashtable.
|
||||
*
|
||||
* Copyright (C) 2007-2008 Wayne Davison
|
||||
* Copyright (C) 2007-2009 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
hlink.c
2
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-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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
|
||||
|
||||
28
io.c
28
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
@@ -1418,6 +1418,22 @@ static void sleep_for_bwlimit(int bytes_written)
|
||||
total_written = (sleep_usec - elapsed_usec) * bwlimit / (ONE_SEC/1024);
|
||||
}
|
||||
|
||||
static const char *what_fd_is(int fd)
|
||||
{
|
||||
static char buf[20];
|
||||
|
||||
if (fd == sock_f_out)
|
||||
return "socket";
|
||||
else if (fd == msg_fd_out)
|
||||
return "message fd";
|
||||
else if (fd == batch_fd)
|
||||
return "batch file";
|
||||
else {
|
||||
snprintf(buf, sizeof buf, "fd %d", fd);
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
/* Write len bytes to the file descriptor fd, looping as necessary to get
|
||||
* the job done and also (in certain circumstances) reading any data on
|
||||
* msg_fd_in to avoid deadlock.
|
||||
@@ -1496,8 +1512,8 @@ static void writefd_unbuffered(int fd, const char *buf, size_t len)
|
||||
if (am_server && fd == msg_fd_out)
|
||||
exit_cleanup(RERR_STREAMIO);
|
||||
rsyserr(FERROR, errno,
|
||||
"writefd_unbuffered failed to write %ld bytes [%s]",
|
||||
(long)len, who_am_i());
|
||||
"writefd_unbuffered failed to write %ld bytes to %s [%s]",
|
||||
(long)len, what_fd_is(fd), who_am_i());
|
||||
/* If the other side is sending us error messages, try
|
||||
* to grab any messages they sent before they died. */
|
||||
while (!am_server && fd == sock_f_out && io_multiplexing_in) {
|
||||
@@ -1555,10 +1571,8 @@ static void writefd(int fd, const char *buf, size_t len)
|
||||
if (fd == sock_f_out)
|
||||
stats.total_written += len;
|
||||
|
||||
if (fd == write_batch_monitor_out) {
|
||||
if ((size_t)write(batch_fd, buf, len) != len)
|
||||
exit_cleanup(RERR_FILEIO);
|
||||
}
|
||||
if (fd == write_batch_monitor_out)
|
||||
writefd_unbuffered(batch_fd, buf, len);
|
||||
|
||||
if (!iobuf_out || fd != iobuf_f_out) {
|
||||
writefd_unbuffered(fd, buf, len);
|
||||
|
||||
10
loadparm.c
10
loadparm.c
@@ -1,6 +1,3 @@
|
||||
/* This is based on loadparm.c from Samba, written by Andrew Tridgell
|
||||
and Karl Auer */
|
||||
|
||||
/*
|
||||
* 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,13 +13,14 @@
|
||||
* with this program; if not, visit the http://fsf.org website.
|
||||
*/
|
||||
|
||||
/* some fixes
|
||||
/* This is based on loadparm.c from Samba, written by Andrew Tridgell
|
||||
* and Karl Auer. Some of the changes are:
|
||||
*
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2009 Wayne Davison <wayned@samba.org>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Load parameters.
|
||||
/* Load parameters.
|
||||
*
|
||||
* This module provides suitable callback functions for the params
|
||||
* module. It builds the internal table of service details which is
|
||||
|
||||
2
log.c
2
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
main.c
3
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
@@ -1016,7 +1016,6 @@ 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_out);
|
||||
flist = send_file_list(f_out, argc, argv);
|
||||
set_msg_fd_in(-1);
|
||||
if (verbose > 3)
|
||||
rprintf(FINFO,"file list sent\n");
|
||||
|
||||
|
||||
2
match.c
2
match.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
|
||||
130
options.c
130
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-2008 Wayne Davison
|
||||
* Copyright (C) 2002-2009 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
|
||||
@@ -261,7 +261,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-2008 by Andrew Tridgell, Wayne Davison, and others.\n");
|
||||
rprintf(f, "Copyright (C) 1996-2009 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",
|
||||
@@ -1357,6 +1357,12 @@ int parse_arguments(int *argc_p, const char ***argv_p)
|
||||
"--read-batch cannot be used with --files-from\n");
|
||||
return 0;
|
||||
}
|
||||
if (read_batch && remove_source_files) {
|
||||
snprintf(err_buf, sizeof err_buf,
|
||||
"--read-batch cannot be used with --remove-%s-files\n",
|
||||
remove_source_files == 1 ? "source" : "sent");
|
||||
return 0;
|
||||
}
|
||||
if (batch_name && strlen(batch_name) > MAX_BATCH_NAME_LEN) {
|
||||
snprintf(err_buf, sizeof err_buf,
|
||||
"the batch-file name must be %d characters or less.\n",
|
||||
@@ -2075,6 +2081,62 @@ void server_options(char **args, int *argc_p)
|
||||
out_of_memory("server_options");
|
||||
}
|
||||
|
||||
/* If str points to a valid hostspec, return allocated memory containing the
|
||||
* [USER@]HOST part of the string, and set the path_start_ptr to the part of
|
||||
* the string after the host part. Otherwise, return NULL. If port_ptr is
|
||||
* non-NULL, we must be parsing an rsync:// URL hostname, and we will set
|
||||
* *port_ptr if a port number is found. Note that IPv6 IPs will have their
|
||||
* (required for parsing) [ and ] chars elided from the returned string. */
|
||||
static char *parse_hostspec(char *str, char **path_start_ptr, int *port_ptr)
|
||||
{
|
||||
char *s, *host_start = str;
|
||||
int hostlen = 0, userlen = 0;
|
||||
char *ret;
|
||||
|
||||
for (s = str; ; s++) {
|
||||
if (!*s) {
|
||||
/* It is only OK if we run out of string with rsync:// */
|
||||
if (!port_ptr)
|
||||
return NULL;
|
||||
if (!hostlen)
|
||||
hostlen = s - host_start;
|
||||
break;
|
||||
}
|
||||
if (*s == ':' || *s == '/') {
|
||||
if (!hostlen)
|
||||
hostlen = s - host_start;
|
||||
if (*s++ == '/') {
|
||||
if (!port_ptr)
|
||||
return NULL;
|
||||
} else if (port_ptr) {
|
||||
*port_ptr = atoi(s);
|
||||
while (isDigit(s)) s++;
|
||||
if (*s && *s++ != '/')
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (*s == '@') {
|
||||
userlen = s - str + 1;
|
||||
host_start = s + 1;
|
||||
} else if (*s == '[') {
|
||||
if (s != host_start++)
|
||||
return NULL;
|
||||
while (*s && *s != ']' && *s != '/') s++; /*SHARED ITERATOR*/
|
||||
hostlen = s - host_start;
|
||||
if (*s != ']' || (s[1] && s[1] != '/' && s[1] != ':') || !hostlen)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
*path_start_ptr = s;
|
||||
ret = new_array(char, userlen + hostlen + 1);
|
||||
if (userlen)
|
||||
strlcpy(ret, str, userlen + 1);
|
||||
strlcpy(ret + userlen, host_start, hostlen + 1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Look for a HOST specfication of the form "HOST:PATH", "HOST::PATH", or
|
||||
* "rsync://HOST:PORT/PATH". If found, *host_ptr will be set to some allocated
|
||||
* memory with the HOST. If a daemon-accessing spec was specified, the value
|
||||
@@ -2084,68 +2146,28 @@ void server_options(char **args, int *argc_p)
|
||||
* "[::ffff:127.0.0.1]") which is returned without the '[' and ']'. */
|
||||
char *check_for_hostspec(char *s, char **host_ptr, int *port_ptr)
|
||||
{
|
||||
char *p;
|
||||
int not_host;
|
||||
int hostlen;
|
||||
char *path;
|
||||
|
||||
if (port_ptr && strncasecmp(URL_PREFIX, s, strlen(URL_PREFIX)) == 0) {
|
||||
char *path;
|
||||
s += strlen(URL_PREFIX);
|
||||
if ((p = strchr(s, '/')) != NULL) {
|
||||
hostlen = p - s;
|
||||
path = p + 1;
|
||||
} else {
|
||||
hostlen = strlen(s);
|
||||
path = "";
|
||||
*host_ptr = parse_hostspec(s + strlen(URL_PREFIX), &path, port_ptr);
|
||||
if (*host_ptr) {
|
||||
if (!*port_ptr)
|
||||
*port_ptr = RSYNC_PORT;
|
||||
return path;
|
||||
}
|
||||
if (*s == '[' && (p = strchr(s, ']')) != NULL) {
|
||||
s++;
|
||||
hostlen = p - s;
|
||||
if (p[1] == ':')
|
||||
*port_ptr = atoi(p+2);
|
||||
} else {
|
||||
if ((p = strchr(s, ':')) != NULL && p < s + hostlen) {
|
||||
hostlen = p - s;
|
||||
*port_ptr = atoi(p+1);
|
||||
}
|
||||
}
|
||||
if (!*port_ptr)
|
||||
*port_ptr = RSYNC_PORT;
|
||||
*host_ptr = new_array(char, hostlen + 1);
|
||||
strlcpy(*host_ptr, s, hostlen + 1);
|
||||
return path;
|
||||
}
|
||||
|
||||
if (*s == '[' && (p = strchr(s, ']')) != NULL && p[1] == ':') {
|
||||
s++;
|
||||
hostlen = p - s;
|
||||
*p = '\0';
|
||||
not_host = strchr(s, '/') || !strchr(s, ':');
|
||||
*p = ']';
|
||||
if (not_host)
|
||||
return NULL;
|
||||
p++;
|
||||
} else {
|
||||
if (!(p = strchr(s, ':')))
|
||||
return NULL;
|
||||
hostlen = p - s;
|
||||
*p = '\0';
|
||||
not_host = strchr(s, '/') != NULL;
|
||||
*p = ':';
|
||||
if (not_host)
|
||||
return NULL;
|
||||
}
|
||||
*host_ptr = parse_hostspec(s, &path, NULL);
|
||||
if (!*host_ptr)
|
||||
return NULL;
|
||||
|
||||
*host_ptr = new_array(char, hostlen + 1);
|
||||
strlcpy(*host_ptr, s, hostlen + 1);
|
||||
|
||||
if (p[1] == ':') {
|
||||
if (*path == ':') {
|
||||
if (port_ptr && !*port_ptr)
|
||||
*port_ptr = RSYNC_PORT;
|
||||
return p + 2;
|
||||
return path + 1;
|
||||
}
|
||||
if (port_ptr)
|
||||
*port_ptr = 0;
|
||||
|
||||
return p + 1;
|
||||
return path;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Summary: A fast, versatile, remote (and local) file-copying tool
|
||||
Name: rsync
|
||||
Version: 3.0.5
|
||||
Version: 3.0.6
|
||||
%define fullversion %{version}
|
||||
Release: 1
|
||||
%define srcdir src
|
||||
@@ -66,8 +66,8 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%{_mandir}/man5/rsyncd.conf.5*
|
||||
|
||||
%changelog
|
||||
* Sun Dec 28 2008 Wayne Davison <wayned@samba.org>
|
||||
Released 3.0.5.
|
||||
* Fri May 08 2009 Wayne Davison <wayned@samba.org>
|
||||
Released 3.0.6.
|
||||
|
||||
* Fri Mar 21 2008 Wayne Davison <wayned@samba.org>
|
||||
Added installation of /etc/xinetd.d/rsync file and some commented-out
|
||||
|
||||
@@ -10,6 +10,7 @@ use Getopt::Long;
|
||||
|
||||
my $patches_dir = 'patches';
|
||||
my $tmp_dir = "patches.$$";
|
||||
my $make_gen_cmd = 'make -f prepare-source.mak conf && ./config.status && make gen';
|
||||
|
||||
&Getopt::Long::Configure('bundling');
|
||||
&usage if !&GetOptions(
|
||||
@@ -50,7 +51,7 @@ close IN;
|
||||
if ($incl_generated_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 "./config.status Makefile && make gen && rsync -a @extra_files $tmp_dir/master/" and exit 1;
|
||||
system "$make_gen_cmd && rsync -a @extra_files $tmp_dir/master/" and exit 1;
|
||||
}
|
||||
our $last_touch = time;
|
||||
|
||||
@@ -158,7 +159,7 @@ sub update_patch
|
||||
print OUT $description{$patch}, "\n";
|
||||
|
||||
if ($incl_generated_files) {
|
||||
system "./config.status Makefile && make gen && rsync -a @extra_files $tmp_dir/$patch/" and exit 1;
|
||||
system "$make_gen_cmd && rsync -a @extra_files $tmp_dir/$patch/" and exit 1;
|
||||
}
|
||||
$last_touch = time;
|
||||
|
||||
|
||||
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-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
|
||||
45
receiver.c
45
receiver.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996-2000 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
@@ -360,7 +360,7 @@ static void no_batched_update(int ndx, BOOL is_redo)
|
||||
rprintf(FERROR_XFER, "(No batched update for%s \"%s\")\n",
|
||||
is_redo ? " resend of" : "", f_name(file, NULL));
|
||||
|
||||
if (inc_recurse)
|
||||
if (inc_recurse && !dry_run)
|
||||
send_msg_int(MSG_NO_SEND, ndx);
|
||||
}
|
||||
|
||||
@@ -386,15 +386,23 @@ static int we_want_redo(int desired_ndx)
|
||||
static int gen_wants_ndx(int desired_ndx)
|
||||
{
|
||||
static int next_ndx = -1;
|
||||
static BOOL got_eof = 0;
|
||||
static int done_cnt = 0;
|
||||
static BOOL got_eof = False;
|
||||
int flist_num = first_flist->flist_num;
|
||||
|
||||
if (got_eof)
|
||||
return 0;
|
||||
|
||||
while (next_ndx < desired_ndx) {
|
||||
if (inc_recurse && flist_num <= done_cnt)
|
||||
return 0;
|
||||
if (next_ndx >= 0)
|
||||
no_batched_update(next_ndx, False);
|
||||
if ((next_ndx = read_int(batch_gen_fd)) < 0) {
|
||||
if (inc_recurse) {
|
||||
done_cnt++;
|
||||
continue;
|
||||
}
|
||||
got_eof = True;
|
||||
return 0;
|
||||
}
|
||||
@@ -475,14 +483,14 @@ int recv_files(int f_in, char *local_name)
|
||||
rprintf(FINFO, "recv_files(%s)\n", fname);
|
||||
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (iflags & ITEM_REPORT_XATTR && !dry_run)
|
||||
if (iflags & ITEM_REPORT_XATTR && do_xfers)
|
||||
recv_xattr_request(file, f_in);
|
||||
#endif
|
||||
|
||||
if (!(iflags & ITEM_TRANSFER)) {
|
||||
maybe_log_item(file, iflags, itemizing, xname);
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && !dry_run)
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers)
|
||||
set_file_attrs(fname, file, NULL, fname, 0);
|
||||
#endif
|
||||
continue;
|
||||
@@ -529,6 +537,21 @@ int recv_files(int f_in, char *local_name)
|
||||
exit_cleanup(RERR_PROTOCOL);
|
||||
}
|
||||
|
||||
if (read_batch) {
|
||||
int wanted = redoing
|
||||
? we_want_redo(ndx)
|
||||
: gen_wants_ndx(ndx);
|
||||
if (!wanted) {
|
||||
rprintf(FINFO,
|
||||
"(Skipping batched update for%s \"%s\")\n",
|
||||
redoing ? " resend of" : "",
|
||||
fname);
|
||||
discard_receive_data(f_in, F_LENGTH(file));
|
||||
file->flags |= FLAG_FILE_SENT;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!do_xfers) { /* log the transfer */
|
||||
log_item(FCLIENT, file, &stats, iflags, NULL);
|
||||
if (read_batch)
|
||||
@@ -542,18 +565,6 @@ int recv_files(int f_in, char *local_name)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (read_batch) {
|
||||
if (!(redoing ? we_want_redo(ndx) : gen_wants_ndx(ndx))) {
|
||||
rprintf(FINFO,
|
||||
"(Skipping batched update for%s \"%s\")\n",
|
||||
redoing ? " resend of" : "",
|
||||
fname);
|
||||
discard_receive_data(f_in, F_LENGTH(file));
|
||||
file->flags |= FLAG_FILE_SENT;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
partialptr = partial_dir ? partial_dir_fname(fname) : fname;
|
||||
|
||||
if (protocol_version >= 29) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* A pre-compilation helper program to aid in the creation of rounding.h.
|
||||
*
|
||||
* Copyright (C) 2007-2008 Wayne Davison
|
||||
* Copyright (C) 2007-2009 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
rsync.c
2
rsync.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
rsync.h
2
rsync.h
@@ -396,7 +396,7 @@ enum msgcode {
|
||||
# include <limits.h>
|
||||
#endif
|
||||
|
||||
#if defined HAVE_ICONV_OPEN && defined HAVE_ICONV_H
|
||||
#if defined USE_ICONV_OPEN && defined HAVE_ICONV_H
|
||||
#include <iconv.h>
|
||||
#ifndef ICONV_CONST
|
||||
#define ICONV_CONST
|
||||
|
||||
142
rsync.yo
142
rsync.yo
@@ -1,5 +1,5 @@
|
||||
mailto(rsync-bugs@samba.org)
|
||||
manpage(rsync)(1)(28 Dec 2008)()()
|
||||
manpage(rsync)(1)(8 May 2009)()()
|
||||
manpagename(rsync)(a fast, versatile, remote (and local) file-copying tool)
|
||||
manpagesynopsis()
|
||||
|
||||
@@ -518,7 +518,7 @@ dit(bf(-c, --checksum)) This changes the way rsync checks if the files have
|
||||
been changed and are in need of a transfer. Without this option, rsync
|
||||
uses a "quick check" that (by default) checks if each file's size and time
|
||||
of last modification match between the sender and receiver. This option
|
||||
changes this to compare a 128-bit MD4 checksum for each file that has a
|
||||
changes this to compare a 128-bit checksum for each file that has a
|
||||
matching size. Generating the checksums means that both sides will expend
|
||||
a lot of disk I/O reading all the data in the files in the transfer (and
|
||||
this is prior to any reading that will be done to transfer changed files),
|
||||
@@ -536,6 +536,9 @@ checksum that is generated as the file is transferred, but that
|
||||
automatic after-the-transfer verification has nothing to do with this
|
||||
option's before-the-transfer "Does this file need to be updated?" check.
|
||||
|
||||
For protocol 30 and beyond (first supported in 3.0.0), the checksum used is
|
||||
MD5. For older protocols, the checksum used is MD4.
|
||||
|
||||
dit(bf(-a, --archive)) This is equivalent to bf(-rlptgoD). It is a quick
|
||||
way of saying you want recursion and want to preserve almost
|
||||
everything (with -H being a notable omission).
|
||||
@@ -701,6 +704,10 @@ date is on the objects. In other words, if the source has a directory
|
||||
where the destination has a file, the transfer would occur regardless of
|
||||
the timestamps.
|
||||
|
||||
This option is a transfer rule, not an exclude, so it doesn't affect the
|
||||
data that goes into the file-lists, and thus it doesn't affect deletions.
|
||||
It just limits the files that the receiver requests to be transferred.
|
||||
|
||||
dit(bf(--inplace)) This option changes how rsync transfers a file when the
|
||||
file's data needs to be updated: instead of the default method of creating
|
||||
a new copy of the file and moving it into place when it is complete, rsync
|
||||
@@ -1011,7 +1018,7 @@ all groups (not just the current user's groups) via the bf(--groups)
|
||||
option, and copying devices via the bf(--devices) option. This is useful
|
||||
for systems that allow such activities without being the super-user, and
|
||||
also for ensuring that you will get errors if the receiving side isn't
|
||||
being running as the super-user. To turn off super-user activities, the
|
||||
being run as the super-user. To turn off super-user activities, the
|
||||
super-user can use bf(--no-super).
|
||||
|
||||
dit(bf(--fake-super)) When this option is enabled, rsync simulates
|
||||
@@ -1099,10 +1106,18 @@ yet on the destination. If this option is
|
||||
combined with the bf(--ignore-existing) option, no files will be updated
|
||||
(which can be useful if all you want to do is delete extraneous files).
|
||||
|
||||
This option is a transfer rule, not an exclude, so it doesn't affect the
|
||||
data that goes into the file-lists, and thus it doesn't affect deletions.
|
||||
It just limits the files that the receiver requests to be transferred.
|
||||
|
||||
dit(bf(--ignore-existing)) This tells rsync to skip updating files that
|
||||
already exist on the destination (this does em(not) ignore existing
|
||||
directories, or nothing would get done). See also bf(--existing).
|
||||
|
||||
This option is a transfer rule, not an exclude, so it doesn't affect the
|
||||
data that goes into the file-lists, and thus it doesn't affect deletions.
|
||||
It just limits the files that the receiver requests to be transferred.
|
||||
|
||||
This option can be useful for those doing backups using the bf(--link-dest)
|
||||
option when they need to continue a backup run that got interrupted. Since
|
||||
a bf(--link-dest) run is copied into a new directory hierarchy (when it is
|
||||
@@ -1225,6 +1240,10 @@ file that is larger than the specified SIZE. The SIZE value can be
|
||||
suffixed with a string to indicate a size multiplier, and
|
||||
may be a fractional value (e.g. "bf(--max-size=1.5m)").
|
||||
|
||||
This option is a transfer rule, not an exclude, so it doesn't affect the
|
||||
data that goes into the file-lists, and thus it doesn't affect deletions.
|
||||
It just limits the files that the receiver requests to be transferred.
|
||||
|
||||
The suffixes are as follows: "K" (or "KiB") is a kibibyte (1024),
|
||||
"M" (or "MiB") is a mebibyte (1024*1024), and "G" (or "GiB") is a
|
||||
gibibyte (1024*1024*1024).
|
||||
@@ -1239,7 +1258,7 @@ Examples: --max-size=1.5mb-1 is 1499999 bytes, and --max-size=2g+1 is
|
||||
dit(bf(--min-size=SIZE)) This tells rsync to avoid transferring any
|
||||
file that is smaller than the specified SIZE, which can help in not
|
||||
transferring small, junk files.
|
||||
See the bf(--max-size) option for a description of SIZE.
|
||||
See the bf(--max-size) option for a description of SIZE and other information.
|
||||
|
||||
dit(bf(-B, --block-size=BLOCKSIZE)) This forces the block size used in
|
||||
rsync's delta-transfer algorithm to a fixed value. It is normally selected based on
|
||||
@@ -1780,6 +1799,9 @@ specify an empty string, updated files will not be mentioned in the log file.
|
||||
For a list of the possible escape characters, see the "log format" setting
|
||||
in the rsyncd.conf manpage.
|
||||
|
||||
The default FORMAT used if bf(--log-file) is specified and this option is not
|
||||
is '%i %n%L'.
|
||||
|
||||
dit(bf(--stats)) This tells rsync to print a verbose set of statistics
|
||||
on the file transfer, allowing you to tell how effective rsync's delta-transfer
|
||||
algorithm is for your data.
|
||||
@@ -1929,11 +1951,16 @@ creation of a bunch of useless directories when the sending rsync is
|
||||
recursively scanning a hierarchy of files using include/exclude/filter
|
||||
rules.
|
||||
|
||||
Note that the use of transfer rules, such as the bf(--min-size) option, does
|
||||
not affect what goes into the file list, and thus does not leave directories
|
||||
empty, even if none of the files in a directory match the transfer rule.
|
||||
|
||||
Because the file-list is actually being pruned, this option also affects
|
||||
what directories get deleted when a delete is active. However, keep in
|
||||
mind that excluded files and directories can prevent existing items from
|
||||
being deleted (because an exclude hides source files and protects
|
||||
destination files).
|
||||
being deleted due to an exclude both hiding source files and protecting
|
||||
destination files. See the perishable filter-rule option for how to avoid
|
||||
this.
|
||||
|
||||
You can prevent the pruning of certain empty directories from the file-list
|
||||
by using a global "protect" filter. For instance, this option would ensure
|
||||
@@ -2102,9 +2129,9 @@ If rsync was complied without support for IPv6, the bf(--ipv6) option
|
||||
will have no effect. The bf(--version) output will tell you if this
|
||||
is the case.
|
||||
|
||||
dit(bf(--checksum-seed=NUM)) Set the MD4 checksum seed to the integer
|
||||
dit(bf(--checksum-seed=NUM)) Set the checksum seed to the integer
|
||||
NUM. This 4 byte checksum seed is included in each block and file
|
||||
MD4 checksum calculation. By default the checksum seed is generated
|
||||
checksum calculation. By default the checksum seed is generated
|
||||
by the server and defaults to the current code(time()). This option
|
||||
is used to set a specific checksum seed, which is useful for
|
||||
applications that want repeatable block and file checksums, or
|
||||
@@ -2353,6 +2380,39 @@ itemization(
|
||||
explicitly included or it would be excluded by the "*")
|
||||
)
|
||||
|
||||
The following modifiers are accepted after a "+" or "-":
|
||||
|
||||
itemization(
|
||||
it() A bf(/) specifies that the include/exclude rule should be matched
|
||||
against the absolute pathname of the current item. For example,
|
||||
"-/ /etc/passwd" would exclude the passwd file any time the transfer
|
||||
was sending files from the "/etc" directory, and "-/ subdir/foo"
|
||||
would always exclude "foo" when it is in a dir named "subdir", even
|
||||
if "foo" is at the root of the current transfer.
|
||||
it() A bf(!) specifies that the include/exclude should take effect if
|
||||
the pattern fails to match. For instance, "-! */" would exclude all
|
||||
non-directories.
|
||||
it() A bf(C) is used to indicate that all the global CVS-exclude rules
|
||||
should be inserted as excludes in place of the "-C". No arg should
|
||||
follow.
|
||||
it() An bf(s) is used to indicate that the rule applies to the sending
|
||||
side. When a rule affects the sending side, it prevents files from
|
||||
being transferred. The default is for a rule to affect both sides
|
||||
unless bf(--delete-excluded) was specified, in which case default rules
|
||||
become sender-side only. See also the hide (H) and show (S) rules,
|
||||
which are an alternate way to specify sending-side includes/excludes.
|
||||
it() An bf(r) is used to indicate that the rule applies to the receiving
|
||||
side. When a rule affects the receiving side, it prevents files from
|
||||
being deleted. See the bf(s) modifier for more info. See also the
|
||||
protect (P) and risk (R) rules, which are an alternate way to
|
||||
specify receiver-side includes/excludes.
|
||||
it() A bf(p) indicates that a rule is perishable, meaning that it is
|
||||
ignored in directories that are being deleted. For instance, the bf(-C)
|
||||
option's default rules that exclude things like "CVS" and "*.o" are
|
||||
marked as perishable, and will not prevent a directory that was removed
|
||||
on the source from being deleted on the destination.
|
||||
)
|
||||
|
||||
manpagesection(MERGE-FILE FILTER RULES)
|
||||
|
||||
You can merge whole files into your filter rules by specifying either a
|
||||
@@ -2401,46 +2461,13 @@ itemization(
|
||||
"- foo + bar" is parsed as two rules (assuming that prefix-parsing wasn't
|
||||
also disabled).
|
||||
it() You may also specify any of the modifiers for the "+" or "-" rules
|
||||
(below) in order to have the rules that are read in from the file
|
||||
(above) in order to have the rules that are read in from the file
|
||||
default to having that modifier set. For instance, "merge,-/ .excl" would
|
||||
treat the contents of .excl as absolute-path excludes,
|
||||
while "dir-merge,s .filt" and ":sC" would each make all their
|
||||
per-directory rules apply only on the sending side.
|
||||
)
|
||||
|
||||
The following modifiers are accepted after a "+" or "-":
|
||||
|
||||
itemization(
|
||||
it() A bf(/) specifies that the include/exclude rule should be matched
|
||||
against the absolute pathname of the current item. For example,
|
||||
"-/ /etc/passwd" would exclude the passwd file any time the transfer
|
||||
was sending files from the "/etc" directory, and "-/ subdir/foo"
|
||||
would always exclude "foo" when it is in a dir named "subdir", even
|
||||
if "foo" is at the root of the current transfer.
|
||||
it() A bf(!) specifies that the include/exclude should take effect if
|
||||
the pattern fails to match. For instance, "-! */" would exclude all
|
||||
non-directories.
|
||||
it() A bf(C) is used to indicate that all the global CVS-exclude rules
|
||||
should be inserted as excludes in place of the "-C". No arg should
|
||||
follow.
|
||||
it() An bf(s) is used to indicate that the rule applies to the sending
|
||||
side. When a rule affects the sending side, it prevents files from
|
||||
being transferred. The default is for a rule to affect both sides
|
||||
unless bf(--delete-excluded) was specified, in which case default rules
|
||||
become sender-side only. See also the hide (H) and show (S) rules,
|
||||
which are an alternate way to specify sending-side includes/excludes.
|
||||
it() An bf(r) is used to indicate that the rule applies to the receiving
|
||||
side. When a rule affects the receiving side, it prevents files from
|
||||
being deleted. See the bf(s) modifier for more info. See also the
|
||||
protect (P) and risk (R) rules, which are an alternate way to
|
||||
specify receiver-side includes/excludes.
|
||||
it() A bf(p) indicates that a rule is perishable, meaning that it is
|
||||
ignored in directories that are being deleted. For instance, the bf(-C)
|
||||
option's default rules that exclude things like "CVS" and "*.o" are
|
||||
marked as perishable, and will not prevent a directory that was removed
|
||||
on the source from being deleted on the destination.
|
||||
)
|
||||
|
||||
Per-directory rules are inherited in all subdirectories of the directory
|
||||
where the merge-file was found unless the 'n' modifier was used. Each
|
||||
subdirectory's rules are prefixed to the inherited per-directory rules
|
||||
@@ -2650,27 +2677,26 @@ of the destination trees. The write-batch option causes the rsync
|
||||
client to store in a "batch file" all the information needed to repeat
|
||||
this operation against other, identical destination trees.
|
||||
|
||||
To apply the recorded changes to another destination tree, run rsync
|
||||
with the read-batch option, specifying the name of the same batch
|
||||
file, and the destination tree. Rsync updates the destination tree
|
||||
using the information stored in the batch file.
|
||||
|
||||
For convenience, one additional file is creating when the write-batch
|
||||
option is used. This file's name is created by appending
|
||||
".sh" to the batch filename. The .sh file contains
|
||||
a command-line suitable for updating a destination tree using that
|
||||
batch file. It can be executed using a Bourne (or Bourne-like) shell,
|
||||
optionally
|
||||
passing in an alternate destination tree pathname which is then used
|
||||
instead of the original path. This is useful when the destination tree
|
||||
path differs from the original destination tree path.
|
||||
|
||||
Generating the batch file once saves having to perform the file
|
||||
status, checksum, and data block generation more than once when
|
||||
updating multiple destination trees. Multicast transport protocols can
|
||||
be used to transfer the batch update files in parallel to many hosts
|
||||
at once, instead of sending the same data to every host individually.
|
||||
|
||||
To apply the recorded changes to another destination tree, run rsync
|
||||
with the read-batch option, specifying the name of the same batch
|
||||
file, and the destination tree. Rsync updates the destination tree
|
||||
using the information stored in the batch file.
|
||||
|
||||
For your convenience, a script file is also created when the write-batch
|
||||
option is used: it will be named the same as the batch file with ".sh"
|
||||
appended. This script file contains a command-line suitable for updating a
|
||||
destination tree using the associated batch file. It can be executed using
|
||||
a Bourne (or Bourne-like) shell, optionally passing in an alternate
|
||||
destination tree pathname which is then used instead of the original
|
||||
destination path. This is useful when the destination tree path on the
|
||||
current host differs from the one used to create the batch file.
|
||||
|
||||
Examples:
|
||||
|
||||
quote(
|
||||
@@ -2898,7 +2924,7 @@ url(http://rsync.samba.org/)(http://rsync.samba.org/)
|
||||
|
||||
manpagesection(VERSION)
|
||||
|
||||
This man page is current for version 3.0.5 of rsync.
|
||||
This man page is current for version 3.0.6 of rsync.
|
||||
|
||||
manpagesection(INTERNAL OPTIONS)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mailto(rsync-bugs@samba.org)
|
||||
manpage(rsyncd.conf)(5)(28 Dec 2008)()()
|
||||
manpage(rsyncd.conf)(5)(8 May 2009)()()
|
||||
manpagename(rsyncd.conf)(configuration file for rsync in daemon mode)
|
||||
manpagesynopsis()
|
||||
|
||||
@@ -700,7 +700,7 @@ url(http://rsync.samba.org/)(http://rsync.samba.org/)
|
||||
|
||||
manpagesection(VERSION)
|
||||
|
||||
This man page is current for version 3.0.5 of rsync.
|
||||
This man page is current for version 3.0.6 of rsync.
|
||||
|
||||
manpagesection(CREDITS)
|
||||
|
||||
|
||||
7
sender.c
7
sender.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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,7 +22,6 @@
|
||||
#include "rsync.h"
|
||||
|
||||
extern int verbose;
|
||||
extern int dry_run;
|
||||
extern int do_xfers;
|
||||
extern int am_server;
|
||||
extern int am_daemon;
|
||||
@@ -153,7 +152,7 @@ static void write_ndx_and_attrs(int f_out, int ndx, int iflags,
|
||||
if (iflags & ITEM_XNAME_FOLLOWS)
|
||||
write_vstring(f_out, buf, len);
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && !dry_run)
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers)
|
||||
send_xattr_request(fname, file, f_out);
|
||||
#endif
|
||||
}
|
||||
@@ -223,7 +222,7 @@ void send_files(int f_in, int f_out)
|
||||
rprintf(FINFO, "send_files(%d, %s%s%s)\n", ndx, path,slash,fname);
|
||||
|
||||
#ifdef SUPPORT_XATTRS
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && !dry_run)
|
||||
if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers)
|
||||
recv_xattr_request(file, f_in);
|
||||
#endif
|
||||
|
||||
|
||||
4
socket.c
4
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
@@ -578,7 +578,7 @@ void start_accept_loop(int port, int (*fn)(int, int))
|
||||
fds = deffds;
|
||||
#endif
|
||||
|
||||
if (select(maxfd + 1, &fds, NULL, NULL, NULL) != 1)
|
||||
if (select(maxfd + 1, &fds, NULL, NULL, NULL) < 1)
|
||||
continue;
|
||||
|
||||
for (i = 0, fd = -1; sp[i] >= 0; i++) {
|
||||
|
||||
@@ -143,7 +143,8 @@ while ($command =~ /((?:[^\s\\]+|\\.[^\s\\]*)+)/g) {
|
||||
if ($_ eq '.') {
|
||||
$in_options = 0;
|
||||
} else {
|
||||
next if /^-$short_no_arg+(e\d*\.\w*)?$/o || /^-$short_with_num\d+$/o;
|
||||
die "$0: invalid option: '-'\n" if $_ eq '-';
|
||||
next if /^-$short_no_arg*(e\d*\.\w*)?$/o || /^-$short_with_num\d+$/o;
|
||||
|
||||
my($opt,$arg) = /^--([^=]+)(?:=(.*))?$/;
|
||||
my $disabled;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright (C) 1998 Andrew Tridgell
|
||||
* Copyright (C) 2002 Martin Pool
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
|
||||
@@ -18,7 +18,7 @@ if test x"$rsync_enable_ssh_tests" = xyes; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! [ "`$SSH -o'BatchMode yes' localhost echo yes`" = "yes" ]; then
|
||||
if [ "`$SSH -o'BatchMode yes' localhost echo yes`" != "yes" ]; then
|
||||
test_skipped "Skipping SSH tests because ssh conection to localhost not authorised"
|
||||
fi
|
||||
|
||||
|
||||
@@ -19,33 +19,41 @@ test_unsafe() {
|
||||
fi
|
||||
}
|
||||
|
||||
test_unsafe file from safe
|
||||
test_unsafe dir/file from safe
|
||||
test_unsafe dir/./file from safe
|
||||
test_unsafe dir/. from safe
|
||||
test_unsafe dir/ from safe
|
||||
test_unsafe file from safe
|
||||
test_unsafe dir/file from safe
|
||||
test_unsafe dir/./file from safe
|
||||
test_unsafe dir/. from safe
|
||||
test_unsafe dir/ from safe
|
||||
|
||||
test_unsafe /etc/passwd from unsafe
|
||||
test_unsafe //../etc/passwd from unsafe
|
||||
test_unsafe //./etc/passwd from unsafe
|
||||
test_unsafe /etc/passwd from unsafe
|
||||
test_unsafe //../etc/passwd from unsafe
|
||||
test_unsafe //./etc/passwd from unsafe
|
||||
|
||||
test_unsafe ./foo from safe
|
||||
test_unsafe ../foo from unsafe
|
||||
test_unsafe ../dest from/dir safe
|
||||
test_unsafe ./foo from safe
|
||||
test_unsafe ../foo from unsafe
|
||||
test_unsafe ./../foo from unsafe
|
||||
test_unsafe .//../foo from unsafe
|
||||
test_unsafe ./../foo from/.. unsafe
|
||||
test_unsafe ../dest from/dir safe
|
||||
test_unsafe ../../dest from//dir unsafe
|
||||
test_unsafe ..//../dest from/dir unsafe
|
||||
|
||||
test_unsafe .. from/file safe
|
||||
test_unsafe ../.. from/file unsafe
|
||||
test_unsafe dir/.. from safe
|
||||
test_unsafe dir/../.. from unsafe
|
||||
test_unsafe .. from/file safe
|
||||
test_unsafe ../.. from/file unsafe
|
||||
test_unsafe ..//.. from//file unsafe
|
||||
test_unsafe dir/.. from safe
|
||||
test_unsafe dir/../.. from unsafe
|
||||
test_unsafe dir/..//.. from unsafe
|
||||
|
||||
test_unsafe '' from unsafe
|
||||
test_unsafe '' from unsafe
|
||||
|
||||
# Based on tests from unsafe-links by Vladim<69>r Michl
|
||||
test_unsafe ../../unsafe/unsafefile from/safe unsafe
|
||||
test_unsafe ../files/file1 from/safe safe
|
||||
test_unsafe ../../unsafe/unsafefile from/safe unsafe
|
||||
test_unsafe ..//../unsafe/unsafefile from/safe unsafe
|
||||
test_unsafe ../files/file1 from/safe safe
|
||||
|
||||
test_unsafe ../../unsafe/unsafefile safe unsafe
|
||||
test_unsafe ../files/file1 safe unsafe
|
||||
test_unsafe ../../unsafe/unsafefile safe unsafe
|
||||
test_unsafe ../files/file1 safe unsafe
|
||||
|
||||
test_unsafe ../../unsafe/unsafefile `pwd`/from/safe safe
|
||||
test_unsafe ../files/file1 `pwd`/from/safe safe
|
||||
test_unsafe ../../unsafe/unsafefile `pwd`/from/safe safe
|
||||
test_unsafe ../files/file1 `pwd`/from/safe safe
|
||||
|
||||
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
token.c
2
token.c
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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) 1996 Andrew Tridgell
|
||||
* Copyright (C) 1996 Paul Mackerras
|
||||
* Copyright (C) 2004-2008 Wayne Davison
|
||||
* Copyright (C) 2004-2009 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
util.c
57
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-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
|
||||
@@ -1168,12 +1168,13 @@ int handle_partial_dir(const char *fname, int create)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a symlink points outside the current directory tree.
|
||||
/* Determine if a symlink points outside the current directory tree.
|
||||
* This is considered "unsafe" because e.g. when mirroring somebody
|
||||
* else's machine it might allow them to establish a symlink to
|
||||
* /etc/passwd, and then read it through a web server.
|
||||
*
|
||||
* Returns 1 if unsafe, 0 if safe.
|
||||
*
|
||||
* Null symlinks and absolute symlinks are always unsafe.
|
||||
*
|
||||
* Basically here we are concerned with symlinks whose target contains
|
||||
@@ -1181,17 +1182,11 @@ int handle_partial_dir(const char *fname, int create)
|
||||
* transferred directory. We are not allowed to go back up and
|
||||
* reenter.
|
||||
*
|
||||
* @param dest Target of the symlink in question.
|
||||
* "dest" is the target of the symlink in question.
|
||||
*
|
||||
* @param src Top source directory currently applicable. Basically this
|
||||
* is the first parameter to rsync in a simple invocation, but it's
|
||||
* modified by flist.c in slightly complex ways.
|
||||
*
|
||||
* @retval True if unsafe
|
||||
* @retval False is unsafe
|
||||
*
|
||||
* @sa t_unsafe.c
|
||||
**/
|
||||
* "src" is the top source directory currently applicable at the level
|
||||
* of the referenced symlink. This is usually the symlink's full path
|
||||
* (including its name), as referenced from the root of the transfer. */
|
||||
int unsafe_symlink(const char *dest, const char *src)
|
||||
{
|
||||
const char *name, *slash;
|
||||
@@ -1203,33 +1198,33 @@ int unsafe_symlink(const char *dest, const char *src)
|
||||
|
||||
/* find out what our safety margin is */
|
||||
for (name = src; (slash = strchr(name, '/')) != 0; name = slash+1) {
|
||||
if (strncmp(name, "../", 3) == 0) {
|
||||
depth = 0;
|
||||
} else if (strncmp(name, "./", 2) == 0) {
|
||||
/* nothing */
|
||||
} else {
|
||||
/* ".." segment starts the count over. "." segment is ignored. */
|
||||
if (*name == '.' && (name[1] == '/' || (name[1] == '.' && name[2] == '/'))) {
|
||||
if (name[1] == '.')
|
||||
depth = 0;
|
||||
} else
|
||||
depth++;
|
||||
}
|
||||
while (slash[1] == '/') slash++; /* just in case src isn't clean */
|
||||
}
|
||||
if (strcmp(name, "..") == 0)
|
||||
if (*name == '.' && name[1] == '.' && name[2] == '\0')
|
||||
depth = 0;
|
||||
|
||||
for (name = dest; (slash = strchr(name, '/')) != 0; name = slash+1) {
|
||||
if (strncmp(name, "../", 3) == 0) {
|
||||
/* if at any point we go outside the current directory
|
||||
then stop - it is unsafe */
|
||||
if (--depth < 0)
|
||||
return 1;
|
||||
} else if (strncmp(name, "./", 2) == 0) {
|
||||
/* nothing */
|
||||
} else {
|
||||
if (*name == '.' && (name[1] == '/' || (name[1] == '.' && name[2] == '/'))) {
|
||||
if (name[1] == '.') {
|
||||
/* if at any point we go outside the current directory
|
||||
then stop - it is unsafe */
|
||||
if (--depth < 0)
|
||||
return 1;
|
||||
}
|
||||
} else
|
||||
depth++;
|
||||
}
|
||||
while (slash[1] == '/') slash++;
|
||||
}
|
||||
if (strcmp(name, "..") == 0)
|
||||
if (*name == '.' && name[1] == '.' && name[2] == '\0')
|
||||
depth--;
|
||||
|
||||
return (depth < 0);
|
||||
return depth < 0;
|
||||
}
|
||||
|
||||
#define HUMANIFY(mult) \
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Test suite for the wildmatch code.
|
||||
*
|
||||
* Copyright (C) 2003-2008 Wayne Davison
|
||||
* Copyright (C) 2003-2009 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
xattrs.c
27
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-2008 Wayne Davison
|
||||
* Copyright (C) 2006-2009 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
|
||||
@@ -81,6 +81,8 @@ static char *namebuf = NULL;
|
||||
static item_list empty_xattr = EMPTY_ITEM_LIST;
|
||||
static item_list rsync_xal_l = EMPTY_ITEM_LIST;
|
||||
|
||||
static size_t prior_xattr_count = (size_t)-1;
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
static void rsync_xal_free(item_list *xalp)
|
||||
@@ -724,13 +726,15 @@ void receive_xattr(struct file_struct *file, int f)
|
||||
|
||||
/* Turn the xattr data in stat_x into cached xattr data, setting the index
|
||||
* values in the file struct. */
|
||||
void cache_xattr(struct file_struct *file, stat_x *sxp)
|
||||
void cache_tmp_xattr(struct file_struct *file, stat_x *sxp)
|
||||
{
|
||||
int ndx;
|
||||
|
||||
if (!sxp->xattr)
|
||||
return;
|
||||
|
||||
if (prior_xattr_count == (size_t)-1)
|
||||
prior_xattr_count = rsync_xal_l.count;
|
||||
ndx = find_matching_xattr(sxp->xattr);
|
||||
if (ndx < 0)
|
||||
rsync_xal_store(sxp->xattr); /* adds item to rsync_xal_l */
|
||||
@@ -738,6 +742,21 @@ void cache_xattr(struct file_struct *file, stat_x *sxp)
|
||||
F_XATTR(file) = ndx;
|
||||
}
|
||||
|
||||
void uncache_tmp_xattrs(void)
|
||||
{
|
||||
if (prior_xattr_count != (size_t)-1) {
|
||||
item_list *xattr_item = rsync_xal_l.items;
|
||||
item_list *xattr_start = xattr_item + prior_xattr_count;
|
||||
xattr_item += rsync_xal_l.count;
|
||||
rsync_xal_l.count = prior_xattr_count;
|
||||
while (xattr_item-- > xattr_start) {
|
||||
rsync_xal_free(xattr_item);
|
||||
free(xattr_item);
|
||||
}
|
||||
prior_xattr_count = (size_t)-1;
|
||||
}
|
||||
}
|
||||
|
||||
static int rsync_xal_set(const char *fname, item_list *xalp,
|
||||
const char *fnamecmp, stat_x *sxp)
|
||||
{
|
||||
@@ -970,7 +989,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
|
||||
fst.st_mode &= (_S_IFMT | CHMOD_BITS);
|
||||
fmode = new_mode & (_S_IFMT | CHMOD_BITS);
|
||||
|
||||
if (IS_DEVICE(fmode) || IS_SPECIAL(fmode)) {
|
||||
if (IS_DEVICE(fmode)) {
|
||||
uint32 *devp = F_RDEV_P(file);
|
||||
rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
|
||||
} else
|
||||
@@ -981,7 +1000,7 @@ int set_stat_xattr(const char *fname, struct file_struct *file, mode_t new_mode)
|
||||
| (S_ISDIR(fst.st_mode) ? 0700 : 0600);
|
||||
if (fst.st_mode != mode)
|
||||
do_chmod(fname, mode);
|
||||
if (!IS_DEVICE(fst.st_mode) && !IS_SPECIAL(fst.st_mode))
|
||||
if (!IS_DEVICE(fst.st_mode))
|
||||
fst.st_rdev = 0; /* just in case */
|
||||
|
||||
if (mode == fmode && fst.st_rdev == rdev
|
||||
|
||||
Reference in New Issue
Block a user