mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-05-28 08:46:46 -04:00
Compare commits
22 Commits
v3.0.1pre2
...
v3.0.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ba802f3b4 | ||
|
|
e53f49d1af | ||
|
|
0917f581bc | ||
|
|
1fe2a3533f | ||
|
|
237e9a178f | ||
|
|
0668bfe077 | ||
|
|
214af6ad83 | ||
|
|
2551c47eb7 | ||
|
|
83d22fd7f9 | ||
|
|
325c243210 | ||
|
|
4e90cfbfed | ||
|
|
6fd2c27f38 | ||
|
|
19173d224a | ||
|
|
5b83829669 | ||
|
|
8cd3c6dccf | ||
|
|
29a89172f7 | ||
|
|
2089375179 | ||
|
|
f8949e7647 | ||
|
|
84ecaa0eca | ||
|
|
3f2d8d683a | ||
|
|
fd2598022c | ||
|
|
b05c58cce6 |
132
NEWS
132
NEWS
@@ -1,136 +1,18 @@
|
||||
NEWS for rsync 3.0.1 (UNRELEASED)
|
||||
NEWS for rsync 3.0.2 (8 Apr 2008)
|
||||
Protocol: 30 (unchanged)
|
||||
Changes since 3.0.0:
|
||||
|
||||
NOTABLE CHANGES IN BEHAVIOR:
|
||||
|
||||
- Added the 'c'-flag to the itemizing of non-regular files so that the
|
||||
itemized output doesn't get hidden if there were no attribute changes,
|
||||
and also so that the itemizing of a --copy-links run will distinguish
|
||||
between copying an identical non-regular file and the creation of a
|
||||
revised version with a new value (e.g. a changed symlink referent, a
|
||||
new device number, etc.).
|
||||
Changes since 3.0.1:
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
- Fixed a crash bug when a single-use rsync daemon (via remote shell) was
|
||||
run without specifying a --config=FILE option.
|
||||
|
||||
- Fixed a crash when backing up a directory that has a default ACL.
|
||||
|
||||
- Fixed a bug in the handling of xattr values that could cause rsync to
|
||||
not think that a file's extended attributes are up-to-date.
|
||||
|
||||
- Fixed the working of --fake-super with --link-dest and --xattrs.
|
||||
|
||||
- Fixed a hang when combining --dry-run with --remove-source-files.
|
||||
|
||||
- Fixed a bug with --iconv's handling of files that cannot be converted:
|
||||
a failed name can no longer cause a transfer failure.
|
||||
|
||||
- Fixed the building of the rounding.h file on systems that need custom
|
||||
CPPFLAGS to be used. Also improved the error reporting if the building
|
||||
of rounding.h fails.
|
||||
|
||||
- Fixed the use of the --protect-args (-s) option when talking to a daemon.
|
||||
|
||||
- Fixed the --ignore-existing option's protection of files on the receiver
|
||||
that are non-regular files on the sender (e.g. if a symlink or a dir on
|
||||
the sender is trying to replace a file on the receiver). The reverse
|
||||
protection (protecting a dir/symlink/device from being replaced by a
|
||||
file) was already working.
|
||||
|
||||
- Fixed an assert failure if --hard-links is combined with an option that
|
||||
can skip a file in a set of hard-linked files (i.e. --ignore-existing,
|
||||
--append, etc.), without skipping all the files in the set.
|
||||
|
||||
- Avoid setting the modify time on a directory that already has the right
|
||||
modify time set. This avoids tweaking the dir's ctime.
|
||||
|
||||
- Improved the daemon-exclude handling to do a better job of applying the
|
||||
exclude rules to path entries. It also sends the user an error just as
|
||||
if the files were actually missing (instead of silently ignoring the
|
||||
user's args), and avoids sending the user the filter-action messages
|
||||
for these non-user-initiated rules.
|
||||
|
||||
- Fixed some glitches with the dry-run code's missing-directory
|
||||
handling, including a problem when combined with --fuzzy.
|
||||
|
||||
- Fixed some glitches with the skipped-directory handling.
|
||||
|
||||
- Fixed the 'T'-flag itemizing of symlinks when --time isn't preserved.
|
||||
|
||||
- Fixed a glitch in the itemizing of permissions with the -E option.
|
||||
|
||||
- The --append option's restricting of transfers to those that add data no
|
||||
longer prevents the updating of non-content changes to otherwise up-to-
|
||||
date files (i.e. those with the same content but differing permissions,
|
||||
ownership, xattrs, etc.).
|
||||
|
||||
- Don't allow --fake-super to be specified with -XX (double --xattrs)
|
||||
because the options conflict. If a daemon has "fake super" enabled,
|
||||
it automatically downgrades a -XX request to -X.
|
||||
|
||||
- Fixed a couple bugs in the parsing of daemon-config excludes that could
|
||||
make a floating exclude rule get treated as matching an absolute path.
|
||||
|
||||
- A daemon doesn't try to auto-refuse the "iconv" option if iconv-support
|
||||
wasn't compiled in to the daemon (avoiding a warning in the logs).
|
||||
|
||||
- Fixed the inclusion of per-dir merge files from implied dirs.
|
||||
|
||||
- Fixed the support/rrsync script to work with the latest options that
|
||||
rsync sends (including its flag-specifying use of -e to the server).
|
||||
- Fixed a potential buffer overflow in the xattr code.
|
||||
|
||||
ENHANCEMENTS:
|
||||
|
||||
- Added the --old-dirs (--old-d) option to make it easier for a user to
|
||||
ask for file-listings with older rsync versions (this is easier than
|
||||
having to type "-r --exclude='/*/*'" manually).
|
||||
|
||||
- When getting an error while asking an older rsync daemon for a file
|
||||
listing, rsync will try to notice if the error is a rejection of the
|
||||
--dirs (-d) option and let the user know how to work around the issue.
|
||||
|
||||
- Added a few more --no-OPTION overrides.
|
||||
|
||||
- Improved the documentation of the --append option.
|
||||
|
||||
- Improved the documentation of the filter/exclude/include daemon
|
||||
parameters.
|
||||
|
||||
INTERNAL:
|
||||
|
||||
- Fixed a couple minor bugs in the included popt library (ones which I
|
||||
sent to the official popt project for inclusion in the 1.14 release).
|
||||
|
||||
- Fixed a stat() call that should have been do_stat() so that the proper
|
||||
normal/64-bit stat() function gets called. (Was in an area that should
|
||||
not have caused problems, though.)
|
||||
|
||||
- Changed the file-glob code to do a directory scan without using the
|
||||
"glob" and "glob.h". This lets us do the globbing with less memory
|
||||
churn, and also avoid adding daemon-excluded items to the returned
|
||||
args.
|
||||
- None.
|
||||
|
||||
DEVELOPER RELATED:
|
||||
|
||||
- The configure script tries to get the user's compiler to not warn about
|
||||
unused function parameters if the build is not including one or more of
|
||||
the ACL/xattrs/iconv features.
|
||||
- The RPM spec file was improved to install more useful files.
|
||||
|
||||
- The configure script now has better checks for figuring out if the
|
||||
included popt code should be used or not.
|
||||
|
||||
- Fixed two testsuite glitches: avoid a failure if someone's "cd" command
|
||||
outputs the current directory when cd-ing to a relative path, and made
|
||||
the itemized test query how rsync was built to determine if it should
|
||||
expect hard-linked symlinks or not.
|
||||
|
||||
- Updated the testsuite to verify that various bug fixes remain fixed.
|
||||
|
||||
- The RPM spec file was updated to have: (1) comments for how to use the
|
||||
rsync-patch tar file, and (2) an /etc/xinetd.d/rsync file.
|
||||
|
||||
- Updated the build scripts to work with a revised FTP directory
|
||||
structure.
|
||||
- A few developer-oriented scripts were moved from the support dir
|
||||
to the packaging dir.
|
||||
|
||||
141
OLDNEWS
141
OLDNEWS
@@ -1,3 +1,141 @@
|
||||
NEWS for rsync 3.0.1 (3 Apr 2008)
|
||||
Protocol: 30 (unchanged)
|
||||
Changes since 3.0.0:
|
||||
|
||||
NOTABLE CHANGES IN BEHAVIOR:
|
||||
|
||||
- Added the 'c'-flag to the itemizing of non-regular files so that the
|
||||
itemized output doesn't get hidden if there were no attribute changes,
|
||||
and also so that the itemizing of a --copy-links run will distinguish
|
||||
between copying an identical non-regular file and the creation of a
|
||||
revised version with a new value (e.g. a changed symlink referent, a
|
||||
new device number, etc.).
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
- Fixed a crash bug when a single-use rsync daemon (via remote shell) was
|
||||
run without specifying a --config=FILE option.
|
||||
|
||||
- Fixed a crash when backing up a directory that has a default ACL.
|
||||
|
||||
- Fixed a bug in the handling of xattr values that could cause rsync to
|
||||
not think that a file's extended attributes are up-to-date.
|
||||
|
||||
- Fixed the working of --fake-super with --link-dest and --xattrs.
|
||||
|
||||
- Fixed a hang when combining --dry-run with --remove-source-files.
|
||||
|
||||
- Fixed a bug with --iconv's handling of files that cannot be converted:
|
||||
a failed name can no longer cause a transfer failure.
|
||||
|
||||
- Fixed the building of the rounding.h file on systems that need custom
|
||||
CPPFLAGS to be used. Also improved the error reporting if the building
|
||||
of rounding.h fails.
|
||||
|
||||
- Fixed the use of the --protect-args (-s) option when talking to a daemon.
|
||||
|
||||
- Fixed the --ignore-existing option's protection of files on the receiver
|
||||
that are non-regular files on the sender (e.g. if a symlink or a dir on
|
||||
the sender is trying to replace a file on the receiver). The reverse
|
||||
protection (protecting a dir/symlink/device from being replaced by a
|
||||
file) was already working.
|
||||
|
||||
- Fixed an assert failure if --hard-links is combined with an option that
|
||||
can skip a file in a set of hard-linked files (i.e. --ignore-existing,
|
||||
--append, etc.), without skipping all the files in the set.
|
||||
|
||||
- Avoid setting the modify time on a directory that already has the right
|
||||
modify time set. This avoids tweaking the dir's ctime.
|
||||
|
||||
- Improved the daemon-exclude handling to do a better job of applying the
|
||||
exclude rules to path entries. It also sends the user an error just as
|
||||
if the files were actually missing (instead of silently ignoring the
|
||||
user's args), and avoids sending the user the filter-action messages
|
||||
for these non-user-initiated rules.
|
||||
|
||||
- Fixed some glitches with the dry-run code's missing-directory
|
||||
handling, including a problem when combined with --fuzzy.
|
||||
|
||||
- Fixed some glitches with the skipped-directory handling.
|
||||
|
||||
- Fixed the 'T'-flag itemizing of symlinks when --time isn't preserved.
|
||||
|
||||
- Fixed a glitch in the itemizing of permissions with the -E option.
|
||||
|
||||
- The --append option's restricting of transfers to those that add data no
|
||||
longer prevents the updating of non-content changes to otherwise up-to-
|
||||
date files (i.e. those with the same content but differing permissions,
|
||||
ownership, xattrs, etc.).
|
||||
|
||||
- Don't allow --fake-super to be specified with -XX (double --xattrs)
|
||||
because the options conflict. If a daemon has "fake super" enabled,
|
||||
it automatically downgrades a -XX request to -X.
|
||||
|
||||
- Fixed a couple bugs in the parsing of daemon-config excludes that could
|
||||
make a floating exclude rule get treated as matching an absolute path.
|
||||
|
||||
- A daemon doesn't try to auto-refuse the "iconv" option if iconv-support
|
||||
wasn't compiled in to the daemon (avoiding a warning in the logs).
|
||||
|
||||
- Fixed the inclusion of per-dir merge files from implied dirs.
|
||||
|
||||
- Fixed the support/rrsync script to work with the latest options that
|
||||
rsync sends (including its flag-specifying use of -e to the server).
|
||||
|
||||
ENHANCEMENTS:
|
||||
|
||||
- Added the --old-dirs (--old-d) option to make it easier for a user to
|
||||
ask for file-listings with older rsync versions (this is easier than
|
||||
having to type "-r --exclude='/*/*'" manually).
|
||||
|
||||
- When getting an error while asking an older rsync daemon for a file
|
||||
listing, rsync will try to notice if the error is a rejection of the
|
||||
--dirs (-d) option and let the user know how to work around the issue.
|
||||
|
||||
- Added a few more --no-OPTION overrides.
|
||||
|
||||
- Improved the documentation of the --append option.
|
||||
|
||||
- Improved the documentation of the filter/exclude/include daemon
|
||||
parameters.
|
||||
|
||||
INTERNAL:
|
||||
|
||||
- Fixed a couple minor bugs in the included popt library (ones which I
|
||||
sent to the official popt project for inclusion in the 1.14 release).
|
||||
|
||||
- Fixed a stat() call that should have been do_stat() so that the proper
|
||||
normal/64-bit stat() function gets called. (Was in an area that should
|
||||
not have caused problems, though.)
|
||||
|
||||
- Changed the file-glob code to do a directory scan without using the
|
||||
"glob" and "glob.h". This lets us do the globbing with less memory
|
||||
churn, and also avoid adding daemon-excluded items to the returned
|
||||
args.
|
||||
|
||||
DEVELOPER RELATED:
|
||||
|
||||
- The configure script tries to get the user's compiler to not warn about
|
||||
unused function parameters if the build is not including one or more of
|
||||
the ACL/xattrs/iconv features.
|
||||
|
||||
- The configure script now has better checks for figuring out if the
|
||||
included popt code should be used or not.
|
||||
|
||||
- Fixed two testsuite glitches: avoid a failure if someone's "cd" command
|
||||
outputs the current directory when cd-ing to a relative path, and made
|
||||
the itemized test query how rsync was built to determine if it should
|
||||
expect hard-linked symlinks or not.
|
||||
|
||||
- Updated the testsuite to verify that various bug fixes remain fixed.
|
||||
|
||||
- The RPM spec file was updated to have: (1) comments for how to use the
|
||||
rsync-patch tar file, and (2) an /etc/xinetd.d/rsync file.
|
||||
|
||||
- Updated the build scripts to work with a revised FTP directory
|
||||
structure.
|
||||
|
||||
|
||||
NEWS for rsync 3.0.0 (1 Mar 2008)
|
||||
Protocol: 30 (changed)
|
||||
Changes since 2.6.9:
|
||||
@@ -2587,7 +2725,8 @@ Changes since 2.4.6:
|
||||
|
||||
Partial Protocol History
|
||||
RELEASE DATE VER. DATE OF COMMIT* PROTOCOL
|
||||
?? ??? 2008 3.0.1 30
|
||||
08 Apr 2008 3.0.2 30
|
||||
03 Apr 2008 3.0.1 30
|
||||
01 Mar 2008 3.0.0 11 Nov 2006 30
|
||||
06 Nov 2006 2.6.9 29
|
||||
22 Apr 2006 2.6.8 29
|
||||
|
||||
@@ -509,15 +509,15 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
|
||||
out_of_memory("rsync_module");
|
||||
}
|
||||
|
||||
/* We do a push_dir() that doesn't actually call chdir()
|
||||
/* We do a change_dir() that doesn't actually call chdir()
|
||||
* just to make a relative path absolute. */
|
||||
strlcpy(line, curr_dir, sizeof line);
|
||||
if (!push_dir(module_dir, 1))
|
||||
if (!change_dir(module_dir, CD_SKIP_CHDIR))
|
||||
goto chdir_failed;
|
||||
if (strcmp(curr_dir, module_dir) != 0
|
||||
&& (module_dir = strdup(curr_dir)) == NULL)
|
||||
out_of_memory("rsync_module");
|
||||
push_dir(line, 1); /* Restore curr_dir. */
|
||||
change_dir(line, CD_SKIP_CHDIR); /* Restore curr_dir. */
|
||||
|
||||
if (use_chroot) {
|
||||
chroot_path = module_dir;
|
||||
@@ -673,12 +673,12 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
|
||||
io_printf(f_out, "@ERROR: chroot failed\n");
|
||||
return -1;
|
||||
}
|
||||
if (!push_dir(module_dir, 0))
|
||||
if (!change_dir(module_dir, CD_NORMAL))
|
||||
goto chdir_failed;
|
||||
if (module_dirlen)
|
||||
sanitize_paths = 1;
|
||||
} else {
|
||||
if (!push_dir(module_dir, 0)) {
|
||||
if (!change_dir(module_dir, CD_NORMAL)) {
|
||||
chdir_failed:
|
||||
rsyserr(FLOG, errno, "chdir %s failed\n", module_dir);
|
||||
io_printf(f_out, "@ERROR: chdir failed\n");
|
||||
|
||||
@@ -5,7 +5,7 @@ AC_CONFIG_SRCDIR([byteorder.h])
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_PREREQ(2.59)
|
||||
|
||||
RSYNC_VERSION=3.0.1pre2
|
||||
RSYNC_VERSION=3.0.2
|
||||
AC_SUBST(RSYNC_VERSION)
|
||||
AC_MSG_NOTICE([Configuring rsync $RSYNC_VERSION])
|
||||
|
||||
|
||||
180
flist.c
180
flist.c
@@ -97,7 +97,7 @@ int flist_eof = 0; /* all the file-lists are now known */
|
||||
|
||||
#define NORMAL_NAME 0
|
||||
#define SLASH_ENDING_NAME 1
|
||||
#define DOT_NAME 2
|
||||
#define DOTDIR_NAME 2
|
||||
|
||||
/* Starting from protocol version 26, we always use 64-bit ino_t and dev_t
|
||||
* internally, even if this platform does not allow files to have 64-bit inums.
|
||||
@@ -244,7 +244,7 @@ static inline int is_daemon_excluded(const char *fname, int is_dir)
|
||||
|
||||
static inline int path_is_daemon_excluded(char *path, int ignore_filename)
|
||||
{
|
||||
if (daemon_filter_list.head && path) {
|
||||
if (daemon_filter_list.head) {
|
||||
char *slash = path;
|
||||
|
||||
while ((slash = strchr(slash+1, '/')) != NULL) {
|
||||
@@ -277,17 +277,6 @@ static int is_excluded(const char *fname, int is_dir, int filter_level)
|
||||
if (filter_level == NO_FILTERS)
|
||||
return 0;
|
||||
#endif
|
||||
if (fname) {
|
||||
/* never exclude '.', even if somebody does --exclude '*' */
|
||||
if (fname[0] == '.' && !fname[1])
|
||||
return 0;
|
||||
/* Handle the -R version of the '.' dir. */
|
||||
if (fname[0] == '/') {
|
||||
int len = strlen(fname);
|
||||
if (fname[len-1] == '.' && fname[len-2] == '/')
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (is_daemon_excluded(fname, is_dir))
|
||||
return 1;
|
||||
if (filter_level != ALL_FILTERS)
|
||||
@@ -304,7 +293,6 @@ static void send_directory(int f, struct file_list *flist,
|
||||
static const char *pathname, *orig_dir;
|
||||
static int pathname_len;
|
||||
|
||||
|
||||
/* Make sure flist can hold at least flist->used + extra entries. */
|
||||
static void flist_expand(struct file_list *flist, int extra)
|
||||
{
|
||||
@@ -350,29 +338,50 @@ static void flist_done_allocating(struct file_list *flist)
|
||||
flist->pool_boundary = ptr;
|
||||
}
|
||||
|
||||
int push_pathname(const char *dir, int len)
|
||||
/* Call this with EITHER (1) "file, NULL, 0" to chdir() to the file's
|
||||
* F_PATHNAME(), or (2) "NULL, dir, dirlen" to chdir() to the supplied dir,
|
||||
* with dir == NULL taken to be the starting directory, and dirlen < 0
|
||||
* indicating that strdup(dir) should be called and then the -dirlen length
|
||||
* value checked to ensure that it is not daemon-excluded. */
|
||||
int change_pathname(struct file_struct *file, const char *dir, int dirlen)
|
||||
{
|
||||
if (dir == pathname)
|
||||
return 1;
|
||||
|
||||
if (!orig_dir)
|
||||
orig_dir = strdup(curr_dir);
|
||||
|
||||
if (pathname && !pop_dir(orig_dir)) {
|
||||
rsyserr(FERROR, errno, "pop_dir %s failed",
|
||||
full_fname(orig_dir));
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
|
||||
if (dir && !push_dir(dir, 0)) {
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR, errno, "push_dir %s failed in %s",
|
||||
full_fname(dir), curr_dir);
|
||||
return 0;
|
||||
if (dirlen < 0) {
|
||||
char *cpy = strdup(dir);
|
||||
if (*cpy != '/')
|
||||
change_dir(orig_dir, CD_SKIP_CHDIR);
|
||||
if (path_is_daemon_excluded(cpy, 0))
|
||||
goto chdir_error;
|
||||
dir = cpy;
|
||||
dirlen = -dirlen;
|
||||
} else {
|
||||
if (file) {
|
||||
if (pathname == F_PATHNAME(file))
|
||||
return 1;
|
||||
dir = F_PATHNAME(file);
|
||||
if (dir)
|
||||
dirlen = strlen(dir);
|
||||
} else if (pathname == dir)
|
||||
return 1;
|
||||
if (dir && *dir != '/')
|
||||
change_dir(orig_dir, CD_SKIP_CHDIR);
|
||||
}
|
||||
|
||||
pathname = dir;
|
||||
pathname_len = len >= 0 ? len : dir ? (int)strlen(dir) : 0;
|
||||
pathname_len = dirlen;
|
||||
|
||||
if (!dir)
|
||||
dir = orig_dir;
|
||||
|
||||
if (!change_dir(dir, CD_NORMAL)) {
|
||||
chdir_error:
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR, errno, "change_dir %s failed", full_fname(dir));
|
||||
if (dir != orig_dir)
|
||||
change_dir(orig_dir, CD_NORMAL);
|
||||
pathname = NULL;
|
||||
pathname_len = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -429,28 +438,24 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
|
||||
}
|
||||
} else if (protocol_version < 28)
|
||||
rdev = MAKEDEV(0, 0);
|
||||
if (preserve_uid) {
|
||||
if ((uid_t)F_OWNER(file) == uid && *lastname)
|
||||
xflags |= XMIT_SAME_UID;
|
||||
else {
|
||||
uid = F_OWNER(file);
|
||||
if (!numeric_ids) {
|
||||
user_name = add_uid(uid);
|
||||
if (inc_recurse && user_name)
|
||||
xflags |= XMIT_USER_NAME_FOLLOWS;
|
||||
}
|
||||
if (!preserve_uid || ((uid_t)F_OWNER(file) == uid && *lastname))
|
||||
xflags |= XMIT_SAME_UID;
|
||||
else {
|
||||
uid = F_OWNER(file);
|
||||
if (!numeric_ids) {
|
||||
user_name = add_uid(uid);
|
||||
if (inc_recurse && user_name)
|
||||
xflags |= XMIT_USER_NAME_FOLLOWS;
|
||||
}
|
||||
}
|
||||
if (preserve_gid) {
|
||||
if ((gid_t)F_GROUP(file) == gid && *lastname)
|
||||
xflags |= XMIT_SAME_GID;
|
||||
else {
|
||||
gid = F_GROUP(file);
|
||||
if (!numeric_ids) {
|
||||
group_name = add_gid(gid);
|
||||
if (inc_recurse && group_name)
|
||||
xflags |= XMIT_GROUP_NAME_FOLLOWS;
|
||||
}
|
||||
if (!preserve_gid || ((gid_t)F_GROUP(file) == gid && *lastname))
|
||||
xflags |= XMIT_SAME_GID;
|
||||
else {
|
||||
gid = F_GROUP(file);
|
||||
if (!numeric_ids) {
|
||||
group_name = add_gid(gid);
|
||||
if (inc_recurse && group_name)
|
||||
xflags |= XMIT_GROUP_NAME_FOLLOWS;
|
||||
}
|
||||
}
|
||||
if (file->modtime == modtime)
|
||||
@@ -467,15 +472,14 @@ static void send_file_entry(int f, const char *fname, struct file_struct *file,
|
||||
np->data = (void*)(long)(first_ndx + ndx + 1);
|
||||
xflags |= XMIT_HLINK_FIRST;
|
||||
}
|
||||
xflags |= XMIT_HLINKED;
|
||||
} else {
|
||||
if (tmp_dev == dev) {
|
||||
if (protocol_version >= 28)
|
||||
xflags |= XMIT_SAME_DEV_pre30;
|
||||
} else
|
||||
dev = tmp_dev;
|
||||
xflags |= XMIT_HLINKED;
|
||||
}
|
||||
xflags |= XMIT_HLINKED;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1019,6 +1023,7 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
|
||||
const char *basename;
|
||||
alloc_pool_t *pool;
|
||||
STRUCT_STAT st;
|
||||
int excl_ret;
|
||||
char *bp;
|
||||
|
||||
if (strlcpy(thisname, fname, sizeof thisname) >= sizeof thisname) {
|
||||
@@ -1101,7 +1106,17 @@ struct file_struct *make_file(const char *fname, struct file_list *flist,
|
||||
} else
|
||||
flags &= ~FLAG_CONTENT_DIR;
|
||||
|
||||
if (is_excluded(thisname, S_ISDIR(st.st_mode) != 0, filter_level)) {
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
if (flags & FLAG_DOTDIR_NAME) {
|
||||
/* A "." fname (or "/." fname in relative mode) is
|
||||
* never excluded. No other trailing-dotdir names
|
||||
* are possible. */
|
||||
excl_ret = 0;
|
||||
} else
|
||||
excl_ret = is_excluded(thisname, 1, filter_level);
|
||||
} else
|
||||
excl_ret = is_excluded(thisname, 0, filter_level);
|
||||
if (excl_ret) {
|
||||
if (ignore_perishable)
|
||||
non_perishable_cnt++;
|
||||
return NULL;
|
||||
@@ -1672,10 +1687,8 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist)
|
||||
f_name(file, fbuf);
|
||||
dlen = strlen(fbuf);
|
||||
|
||||
if (F_PATHNAME(file) != pathname) {
|
||||
if (!push_pathname(F_PATHNAME(file), -1))
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
if (!change_pathname(file, NULL, 0))
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
|
||||
change_local_filter_dir(fbuf, dlen, send_dir_depth);
|
||||
|
||||
@@ -1840,7 +1853,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
int64 start_write;
|
||||
int use_ff_fd = 0;
|
||||
int disable_buffering;
|
||||
int flags = recurse ? FLAG_CONTENT_DIR : 0;
|
||||
int arg_flags, flags = recurse ? FLAG_CONTENT_DIR : 0;
|
||||
int reading_remotely = filesfrom_host != NULL;
|
||||
int rl_flags = (reading_remotely ? 0 : RL_DUMP_COMMENTS)
|
||||
#ifdef ICONV_OPTION
|
||||
@@ -1858,6 +1871,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
start_write = stats.total_written;
|
||||
gettimeofday(&start_tv, NULL);
|
||||
|
||||
if (!orig_dir)
|
||||
orig_dir = strdup(curr_dir);
|
||||
|
||||
if (relative_paths && protocol_version >= 30)
|
||||
implied_dirs = 1; /* We send flagged implied dirs */
|
||||
|
||||
@@ -1875,9 +1891,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
|
||||
disable_buffering = io_start_buffering_out(f);
|
||||
if (filesfrom_fd >= 0) {
|
||||
if (argv[0] && !push_dir(argv[0], 0)) {
|
||||
rsyserr(FERROR_XFER, errno, "push_dir %s failed in %s",
|
||||
full_fname(argv[0]), curr_dir);
|
||||
if (argv[0] && !change_dir(argv[0], CD_NORMAL)) {
|
||||
rsyserr(FERROR_XFER, errno, "change_dir %s failed",
|
||||
full_fname(argv[0]));
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
use_ff_fd = 1;
|
||||
@@ -1912,7 +1928,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
fbuf[len++] = '.';
|
||||
fbuf[len] = '\0';
|
||||
}
|
||||
name_type = DOT_NAME;
|
||||
name_type = DOTDIR_NAME;
|
||||
} else if (len > 1 && fbuf[len-1] == '.' && fbuf[len-2] == '.'
|
||||
&& (len == 2 || fbuf[len-3] == '/')) {
|
||||
if (len + 2 >= MAXPATHLEN)
|
||||
@@ -1920,9 +1936,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
fbuf[len++] = '/';
|
||||
fbuf[len++] = '.';
|
||||
fbuf[len] = '\0';
|
||||
name_type = DOT_NAME;
|
||||
name_type = DOTDIR_NAME;
|
||||
} else if (fbuf[len-1] == '.' && (len == 1 || fbuf[len-2] == '/'))
|
||||
name_type = DOT_NAME;
|
||||
name_type = DOTDIR_NAME;
|
||||
else
|
||||
name_type = NORMAL_NAME;
|
||||
|
||||
@@ -1970,13 +1986,13 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
if (fn[0] == '/') {
|
||||
fn = "/.";
|
||||
len = 2;
|
||||
name_type = DOT_NAME;
|
||||
name_type = DOTDIR_NAME;
|
||||
} else if (fn[0] == '.')
|
||||
name_type = DOT_NAME;
|
||||
name_type = DOTDIR_NAME;
|
||||
} else if (fn[len-1] == '/') {
|
||||
fn[--len] = '\0';
|
||||
if (len == 1 && *fn == '.')
|
||||
name_type = DOT_NAME;
|
||||
name_type = DOTDIR_NAME;
|
||||
else
|
||||
name_type = SLASH_ENDING_NAME;
|
||||
}
|
||||
@@ -1995,29 +2011,23 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
if (!*fn) {
|
||||
len = 1;
|
||||
fn = ".";
|
||||
name_type = DOT_NAME;
|
||||
name_type = DOTDIR_NAME;
|
||||
}
|
||||
|
||||
dirlen = dir ? strlen(dir) : 0;
|
||||
if (dirlen != lastdir_len || memcmp(lastdir, dir, dirlen) != 0) {
|
||||
if (path_is_daemon_excluded(dir, 0)) {
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR, errno, "push_dir %s failed in %s",
|
||||
full_fname(dir), curr_dir);
|
||||
continue;
|
||||
}
|
||||
if (!push_pathname(dir ? strdup(dir) : NULL, dirlen))
|
||||
if (!change_pathname(NULL, dir, -dirlen))
|
||||
continue;
|
||||
lastdir = pathname;
|
||||
lastdir_len = pathname_len;
|
||||
} else if (!push_pathname(lastdir, lastdir_len))
|
||||
} else if (!change_pathname(NULL, lastdir, lastdir_len))
|
||||
continue;
|
||||
|
||||
if (fn != fbuf)
|
||||
memmove(fbuf, fn, len + 1);
|
||||
|
||||
if (link_stat(fbuf, &st, copy_dirlinks || name_type != NORMAL_NAME) != 0
|
||||
|| is_daemon_excluded(fbuf, S_ISDIR(st.st_mode) != 0)
|
||||
|| (name_type != DOTDIR_NAME && is_daemon_excluded(fbuf, S_ISDIR(st.st_mode)))
|
||||
|| (relative_paths && path_is_daemon_excluded(fbuf, 1))) {
|
||||
io_error |= IOERR_GENERAL;
|
||||
rsyserr(FERROR_XFER, errno, "link_stat %s failed",
|
||||
@@ -2050,15 +2060,17 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
if (one_file_system)
|
||||
filesystem_dev = st.st_dev;
|
||||
|
||||
arg_flags = name_type == DOTDIR_NAME ? FLAG_DOTDIR_NAME : 0;
|
||||
|
||||
if (recurse || (xfer_dirs && name_type != NORMAL_NAME)) {
|
||||
struct file_struct *file;
|
||||
int top_flags = FLAG_TOP_DIR | FLAG_CONTENT_DIR | flags;
|
||||
arg_flags |= FLAG_TOP_DIR | FLAG_CONTENT_DIR;
|
||||
file = send_file_name(f, flist, fbuf, &st,
|
||||
top_flags, ALL_FILTERS);
|
||||
arg_flags | flags, ALL_FILTERS);
|
||||
if (!file)
|
||||
continue;
|
||||
if (inc_recurse) {
|
||||
if (name_type == DOT_NAME) {
|
||||
if (name_type == DOTDIR_NAME) {
|
||||
if (send_dir_depth < 0) {
|
||||
send_dir_depth = 0;
|
||||
change_local_filter_dir(fbuf, len, send_dir_depth);
|
||||
@@ -2068,7 +2080,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
|
||||
} else
|
||||
send_if_directory(f, flist, file, fbuf, len, flags);
|
||||
} else
|
||||
send_file_name(f, flist, fbuf, &st, flags, ALL_FILTERS);
|
||||
send_file_name(f, flist, fbuf, &st, arg_flags | flags, ALL_FILTERS);
|
||||
}
|
||||
|
||||
gettimeofday(&end_tv, NULL);
|
||||
|
||||
@@ -1488,7 +1488,6 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
|
||||
delete_in_dir(fname, file, &real_sx.st.st_dev);
|
||||
else
|
||||
change_local_filter_dir(fname, strlen(fname), F_DEPTH(file));
|
||||
|
||||
}
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
25
main.c
25
main.c
@@ -519,8 +519,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
|
||||
if ((statret = do_stat(dest_path, &st)) == 0) {
|
||||
/* If the destination is a dir, enter it and use mode 1. */
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
if (!push_dir(dest_path, 0)) {
|
||||
rsyserr(FERROR, errno, "push_dir#1 %s failed",
|
||||
if (!change_dir(dest_path, CD_NORMAL)) {
|
||||
rsyserr(FERROR, errno, "change_dir#1 %s failed",
|
||||
full_fname(dest_path));
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
@@ -579,8 +579,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
|
||||
dry_run++;
|
||||
}
|
||||
|
||||
if (!push_dir(dest_path, dry_run > 1)) {
|
||||
rsyserr(FERROR, errno, "push_dir#2 %s failed",
|
||||
if (!change_dir(dest_path, dry_run > 1 ? CD_SKIP_CHDIR : CD_NORMAL)) {
|
||||
rsyserr(FERROR, errno, "change_dir#2 %s failed",
|
||||
full_fname(dest_path));
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
@@ -599,8 +599,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path)
|
||||
dest_path = "/";
|
||||
|
||||
*cp = '\0';
|
||||
if (!push_dir(dest_path, 0)) {
|
||||
rsyserr(FERROR, errno, "push_dir#3 %s failed",
|
||||
if (!change_dir(dest_path, CD_NORMAL)) {
|
||||
rsyserr(FERROR, errno, "change_dir#3 %s failed",
|
||||
full_fname(dest_path));
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
@@ -692,8 +692,8 @@ static void do_server_sender(int f_in, int f_out, int argc, char *argv[])
|
||||
}
|
||||
|
||||
if (!relative_paths) {
|
||||
if (!push_dir(dir, 0)) {
|
||||
rsyserr(FERROR, errno, "push_dir#3 %s failed",
|
||||
if (!change_dir(dir, CD_NORMAL)) {
|
||||
rsyserr(FERROR, errno, "change_dir#3 %s failed",
|
||||
full_fname(dir));
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
@@ -862,8 +862,8 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
|
||||
char *dir = argv[0];
|
||||
argc--;
|
||||
argv++;
|
||||
if (!am_daemon && !push_dir(dir, 0)) {
|
||||
rsyserr(FERROR, errno, "push_dir#4 %s failed",
|
||||
if (!am_daemon && !change_dir(dir, CD_NORMAL)) {
|
||||
rsyserr(FERROR, errno, "change_dir#4 %s failed",
|
||||
full_fname(dir));
|
||||
exit_cleanup(RERR_FILESELECT);
|
||||
}
|
||||
@@ -1428,11 +1428,11 @@ int main(int argc,char *argv[])
|
||||
SIGACTION(SIGXFSZ, SIG_IGN);
|
||||
#endif
|
||||
|
||||
/* Initialize push_dir here because on some old systems getcwd
|
||||
/* Initialize change_dir() here because on some old systems getcwd
|
||||
* (implemented by forking "pwd" and reading its output) doesn't
|
||||
* work when there are other child processes. Also, on all systems
|
||||
* that implement getcwd that way "pwd" can't be found after chroot. */
|
||||
push_dir(NULL, 0);
|
||||
change_dir(NULL, CD_NORMAL);
|
||||
|
||||
init_flist();
|
||||
|
||||
@@ -1456,7 +1456,6 @@ int main(int argc,char *argv[])
|
||||
read_stream_flags(batch_fd);
|
||||
else
|
||||
write_stream_flags(batch_fd);
|
||||
|
||||
}
|
||||
if (write_batch < 0)
|
||||
dry_run = 1;
|
||||
|
||||
@@ -1275,7 +1275,7 @@ int parse_arguments(int *argc_p, const char ***argv_p)
|
||||
}
|
||||
}
|
||||
|
||||
if (human_readable && argc == 2) {
|
||||
if (human_readable && argc == 2 && !am_server) {
|
||||
/* Allow the old meaning of 'h' (--help) on its own. */
|
||||
usage(FINFO);
|
||||
exit_cleanup(0);
|
||||
@@ -1387,7 +1387,7 @@ int parse_arguments(int *argc_p, const char ***argv_p)
|
||||
xfer_dirs = 1;
|
||||
}
|
||||
|
||||
if (argc < 2 && !read_batch)
|
||||
if (argc < 2 && !read_batch && !am_server)
|
||||
list_only |= 1;
|
||||
|
||||
if (xfer_dirs >= 4) {
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
Summary: A fast, versatile, remote (and local) file-copying tool
|
||||
Name: rsync
|
||||
Version: 3.0.1
|
||||
%define fullversion %{version}pre2
|
||||
Release: 0.1.pre2
|
||||
Version: 3.0.2
|
||||
%define fullversion %{version}
|
||||
Release: 1
|
||||
%define srcdir src
|
||||
Group: Applications/Internet
|
||||
Source0: http://rsync.samba.org/ftp/rsync/%{name}-%{fullversion}.tar.gz
|
||||
Source1: http://rsync.samba.org/ftp/rsync/%{name}-patches-%{fullversion}.tar.gz
|
||||
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}
|
||||
@@ -25,15 +26,20 @@ improved copy command for everyday use.
|
||||
|
||||
%prep
|
||||
# Choose one -- setup source only, or setup source + rsync-patches:
|
||||
%setup -q -n %{name}-%{fullversion}
|
||||
#%setup -q -n %{name}-%{fullversion} -b1
|
||||
%setup -q -n rsync-%{fullversion}
|
||||
#%setup -q -b1 -n rsync-%{fullversion}
|
||||
|
||||
# If you you used "%setup -q -b1", choose the patches you wish to apply:
|
||||
#patch -p1 <patches/acls.diff
|
||||
#patch -p1 <patches/xattrs.diff
|
||||
#patch -p1 <patches/checksum-reading.diff
|
||||
#patch -p1 <patches/remote-option.diff
|
||||
#patch -p1 <patches/db.diff
|
||||
|
||||
# Avoid extra perl dependencies for scripts going into doc dir.
|
||||
chmod -x support/*
|
||||
|
||||
%build
|
||||
#./prepare-source
|
||||
%configure
|
||||
|
||||
make
|
||||
@@ -46,20 +52,22 @@ rm -rf $RPM_BUILD_ROOT
|
||||
mkdir -p $RPM_BUILD_ROOT/etc/xinetd.d
|
||||
install -m 644 packaging/lsb/rsync.xinetd $RPM_BUILD_ROOT/etc/xinetd.d/rsync
|
||||
|
||||
#install -p -m 755 support/rsyncdb $RPM_BUILD_ROOT/usr/bin/rsyncdb
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc COPYING README tech_report.tex
|
||||
%doc COPYING NEWS OLDNEWS README support/ tech_report.tex
|
||||
%config(noreplace) /etc/xinetd.d/rsync
|
||||
%{_prefix}/bin/rsync
|
||||
%{_prefix}/bin/rsync*
|
||||
%{_mandir}/man1/rsync.1*
|
||||
%{_mandir}/man5/rsyncd.conf.5*
|
||||
|
||||
%changelog
|
||||
* Wed Mar 26 2008 Wayne Davison <wayned@samba.org>
|
||||
Released 3.0.1pre2.
|
||||
* Tue Apr 08 2008 Wayne Davison <wayned@samba.org>
|
||||
Released 3.0.2.
|
||||
|
||||
* Fri Mar 21 2008 Wayne Davison <wayned@samba.org>
|
||||
Added installation of /etc/xinetd.d/rsync file and some commented-out
|
||||
|
||||
@@ -151,7 +151,8 @@ $_ = <STDIN>;
|
||||
|
||||
(my $finalversion = $version) =~ s/pre\d+//;
|
||||
my %specvars = ( 'Version:' => $finalversion, 'Release:' => $release,
|
||||
'%define fullversion' => "\%{version}$pre", 'Released' => "$version." );
|
||||
'%define fullversion' => "\%{version}$pre", 'Released' => "$version.",
|
||||
'%define srcdir' => $srcdir );
|
||||
my @tweak_files = ( glob('packaging/*.spec'), glob('packaging/*/*.spec'), glob('*.yo'),
|
||||
qw( configure.in rsync.h NEWS OLDNEWS options.c ) );
|
||||
|
||||
@@ -231,11 +232,11 @@ my $ans = <STDIN>;
|
||||
system "git commit -a -m 'Preparing for release of $version'" and exit 1;
|
||||
|
||||
print "Updating files in \"patches\" dir ...\n";
|
||||
system "support/patch-update";
|
||||
system "packaging/patch-update";
|
||||
|
||||
if ($ans =~ /^y/i) {
|
||||
print "\nVisiting all \"patch/*\" branches ...\n";
|
||||
system "support/patch-update --shell";
|
||||
system "packaging/patch-update --shell";
|
||||
}
|
||||
|
||||
print $break, <<EOT;
|
||||
@@ -304,7 +305,7 @@ system "fakeroot tar czf $srctar_file rsync-$version; rm -rf rsync-$version";
|
||||
print "Updating files in \"rsync-$version/patches\" dir ...\n";
|
||||
mkdir("rsync-$version", 0755);
|
||||
mkdir("rsync-$version/patches", 0755);
|
||||
system "support/patch-update --skip-check --gen=rsync-$version/patches";
|
||||
system "packaging/patch-update --skip-check --gen=rsync-$version/patches";
|
||||
|
||||
print "Creating $pattar_file ...\n";
|
||||
system "fakeroot tar chzf $pattar_file rsync-$version/patches; rm -rf rsync-$version";
|
||||
@@ -326,7 +327,7 @@ foreach my $fn ($srctar_file, $pattar_file, $diff_file) {
|
||||
}
|
||||
|
||||
if (!$pre) {
|
||||
system "rm $dest/rsync-*{.tar.gz,.asc,-NEWS} $dest/src-preview/rsync-*diffs.gz";
|
||||
system "rm $dest/rsync-*.gz $dest/rsync-*.asc $dest/rsync-*-NEWS $dest/src-previews/rsync-*diffs.gz*";
|
||||
|
||||
foreach my $fn ($srctar_file, "$srctar_file.asc",
|
||||
$pattar_file, "$pattar_file.asc",
|
||||
|
||||
4
rsync.h
4
rsync.h
@@ -83,6 +83,7 @@
|
||||
/* These flags are passed to functions but not stored. */
|
||||
|
||||
#define FLAG_DIVERT_DIRS (1<<16)/* sender */
|
||||
#define FLAG_DOTDIR_NAME (1<<17)/* sender */
|
||||
|
||||
#define BITS_SET(val,bits) (((val) & (bits)) == (bits))
|
||||
#define BITS_SETnUNSET(val,onbits,offbits) (((val) & ((onbits)|(offbits))) == (onbits))
|
||||
@@ -198,6 +199,9 @@
|
||||
#define SP_DEFAULT 0
|
||||
#define SP_KEEP_DOT_DIRS (1<<0)
|
||||
|
||||
#define CD_NORMAL 0
|
||||
#define CD_SKIP_CHDIR 1
|
||||
|
||||
/* Log-message categories. FLOG only goes to the log file, not the client;
|
||||
* FCLIENT is the opposite. */
|
||||
enum logcode {
|
||||
|
||||
4
rsync.yo
4
rsync.yo
@@ -1,5 +1,5 @@
|
||||
mailto(rsync-bugs@samba.org)
|
||||
manpage(rsync)(1)(26 Mar 2008)()()
|
||||
manpage(rsync)(1)(8 Apr 2008)()()
|
||||
manpagename(rsync)(a fast, versatile, remote (and local) file-copying tool)
|
||||
manpagesynopsis()
|
||||
|
||||
@@ -2876,7 +2876,7 @@ url(http://rsync.samba.org/)(http://rsync.samba.org/)
|
||||
|
||||
manpagesection(VERSION)
|
||||
|
||||
This man page is current for version 3.0.1pre2 of rsync.
|
||||
This man page is current for version 3.0.2 of rsync.
|
||||
|
||||
manpagesection(INTERNAL OPTIONS)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mailto(rsync-bugs@samba.org)
|
||||
manpage(rsyncd.conf)(5)(26 Mar 2008)()()
|
||||
manpage(rsyncd.conf)(5)(8 Apr 2008)()()
|
||||
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.1pre2 of rsync.
|
||||
This man page is current for version 3.0.2 of rsync.
|
||||
|
||||
manpagesection(CREDITS)
|
||||
|
||||
|
||||
4
sender.c
4
sender.c
@@ -135,7 +135,7 @@ void successful_send(int ndx)
|
||||
}
|
||||
|
||||
file = flist->files[ndx - flist->ndx_start];
|
||||
if (!push_pathname(F_PATHNAME(file), -1))
|
||||
if (!change_pathname(file, NULL, 0))
|
||||
return;
|
||||
f_name(file, fname);
|
||||
|
||||
@@ -221,7 +221,7 @@ void send_files(int f_in, int f_out)
|
||||
} else {
|
||||
path = slash = "";
|
||||
}
|
||||
if (!push_pathname(F_PATHNAME(file), -1))
|
||||
if (!change_pathname(file, NULL, 0))
|
||||
continue;
|
||||
f_name(file, fname);
|
||||
|
||||
|
||||
@@ -38,9 +38,20 @@ echo "extra extra" >>"$todir/name1"
|
||||
checkit "$RSYNC -aHivv --no-whole-file '$fromdir/' '$todir/'" "$fromdir" "$todir"
|
||||
|
||||
# Add a new link in a new subdirectory to test that we don't try to link
|
||||
# the files before the directory gets created.
|
||||
mkdir "$fromdir/subdir"
|
||||
ln "$name1" "$fromdir/subdir/new-file"
|
||||
# the files before the directory gets created. We also create a bunch of
|
||||
# extra files to ensure that an incremental-recursion transfer works across
|
||||
# distant files.
|
||||
makepath "$fromdir/subdir/down/deep"
|
||||
|
||||
files=''
|
||||
for x in 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z; do
|
||||
for y in 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z; do
|
||||
files="$files $x$y"
|
||||
done
|
||||
done
|
||||
(cd "$fromdir/subdir"; touch $files)
|
||||
|
||||
ln "$name1" "$fromdir/subdir/down/deep/new-file"
|
||||
rm "$todir/text"
|
||||
|
||||
checkit "$RSYNC -aHivv '$fromdir/' '$todir/'" "$fromdir" "$todir"
|
||||
|
||||
61
util.c
61
util.c
@@ -943,7 +943,7 @@ char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth,
|
||||
/* Like chdir(), but it keeps track of the current directory (in the
|
||||
* global "curr_dir"), and ensures that the path size doesn't overflow.
|
||||
* Also cleans the path using the clean_fname() function. */
|
||||
int push_dir(const char *dir, int set_path_only)
|
||||
int change_dir(const char *dir, int set_path_only)
|
||||
{
|
||||
static int initialised;
|
||||
unsigned int len;
|
||||
@@ -961,21 +961,26 @@ int push_dir(const char *dir, int set_path_only)
|
||||
if (len == 1 && *dir == '.')
|
||||
return 1;
|
||||
|
||||
if ((*dir == '/' ? len : curr_dir_len + 1 + len) >= sizeof curr_dir) {
|
||||
errno = ENAMETOOLONG;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!set_path_only && chdir(dir))
|
||||
return 0;
|
||||
|
||||
if (*dir == '/') {
|
||||
if (len >= sizeof curr_dir) {
|
||||
errno = ENAMETOOLONG;
|
||||
return 0;
|
||||
}
|
||||
if (!set_path_only && chdir(dir))
|
||||
return 0;
|
||||
memcpy(curr_dir, dir, len + 1);
|
||||
curr_dir_len = len;
|
||||
} else {
|
||||
curr_dir[curr_dir_len++] = '/';
|
||||
memcpy(curr_dir + curr_dir_len, dir, len + 1);
|
||||
curr_dir_len += len;
|
||||
if (curr_dir_len + 1 + len >= sizeof curr_dir) {
|
||||
errno = ENAMETOOLONG;
|
||||
return 0;
|
||||
}
|
||||
curr_dir[curr_dir_len] = '/';
|
||||
memcpy(curr_dir + curr_dir_len + 1, dir, len + 1);
|
||||
|
||||
if (!set_path_only && chdir(curr_dir)) {
|
||||
curr_dir[curr_dir_len] = '\0';
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
curr_dir_len = clean_fname(curr_dir, CFN_COLLAPSE_DOT_DOT_DIRS);
|
||||
@@ -986,28 +991,7 @@ int push_dir(const char *dir, int set_path_only)
|
||||
}
|
||||
|
||||
if (verbose >= 5 && !set_path_only)
|
||||
rprintf(FINFO, "[%s] push_dir(%s)\n", who_am_i(), curr_dir);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse a push_dir() call. You must pass in an absolute path
|
||||
* that was copied from a prior value of "curr_dir".
|
||||
**/
|
||||
int pop_dir(const char *dir)
|
||||
{
|
||||
if (chdir(dir))
|
||||
return 0;
|
||||
|
||||
curr_dir_len = strlcpy(curr_dir, dir, sizeof curr_dir);
|
||||
if (curr_dir_len >= sizeof curr_dir)
|
||||
curr_dir_len = sizeof curr_dir - 1;
|
||||
if (sanitize_paths)
|
||||
curr_dir_depth = count_dir_elements(curr_dir + module_dirlen);
|
||||
|
||||
if (verbose >= 5)
|
||||
rprintf(FINFO, "[%s] pop_dir(%s)\n", who_am_i(), curr_dir);
|
||||
rprintf(FINFO, "[%s] change_dir(%s)\n", who_am_i(), curr_dir);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -1345,7 +1329,7 @@ void *_new_array(unsigned long num, unsigned int size, int use_calloc)
|
||||
return use_calloc ? calloc(num, size) : malloc(num * size);
|
||||
}
|
||||
|
||||
void *_realloc_array(void *ptr, unsigned int size, unsigned long num)
|
||||
void *_realloc_array(void *ptr, unsigned int size, size_t num)
|
||||
{
|
||||
if (num >= MALLOC_MAX/size)
|
||||
return NULL;
|
||||
@@ -1566,7 +1550,10 @@ void *expand_item_list(item_list *lp, size_t item_size,
|
||||
new_size += incr;
|
||||
else
|
||||
new_size *= 2;
|
||||
new_ptr = realloc_array(lp->items, char, new_size * item_size);
|
||||
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);
|
||||
if (verbose >= 4) {
|
||||
rprintf(FINFO, "[%s] expand %s to %.0f bytes, did%s move\n",
|
||||
who_am_i(), desc, (double)new_size * item_size,
|
||||
|
||||
Reference in New Issue
Block a user