Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Check the "keep_dirs" var instead of "recurse" to decide if
[rsync/rsync.git]
/
flist.c
diff --git
a/flist.c
b/flist.c
index
ddf52ec
..
013c104
100644
(file)
--- a/
flist.c
+++ b/
flist.c
@@
-317,7
+317,7
@@
void flist_expand(struct file_list *flist)
new_ptr = realloc_array(flist->files, struct file_struct *,
flist->malloced);
new_ptr = realloc_array(flist->files, struct file_struct *,
flist->malloced);
- if (verbose >= 2) {
+ if (verbose >= 2
&& flist->malloced != FLIST_START
) {
rprintf(FINFO, "[%s] expand file_list to %.0f bytes, did%s move\n",
who_am_i(),
(double)sizeof flist->files[0] * flist->malloced,
rprintf(FINFO, "[%s] expand file_list to %.0f bytes, did%s move\n",
who_am_i(),
(double)sizeof flist->files[0] * flist->malloced,
@@
-335,7
+335,7
@@
void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
unsigned short flags;
static time_t modtime;
static mode_t mode;
unsigned short flags;
static time_t modtime;
static mode_t mode;
- static
u
int64 dev;
+ static int64 dev;
static dev_t rdev;
static uint32 rdev_major;
static uid_t uid;
static dev_t rdev;
static uint32 rdev_major;
static uid_t uid;
@@
-422,11
+422,11
@@
void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
/* We must make sure we don't send a zero flag byte or the
* other end will terminate the flist transfer. Note that
/* We must make sure we don't send a zero flag byte or the
* other end will terminate the flist transfer. Note that
- * the use of XMIT_
TOP_DIR
on a non-dir has no meaning, so
+ * the use of XMIT_
DEL_START
on a non-dir has no meaning, so
* it's harmless way to add a bit to the first flag byte. */
if (protocol_version >= 28) {
if (!flags && !S_ISDIR(mode))
* it's harmless way to add a bit to the first flag byte. */
if (protocol_version >= 28) {
if (!flags && !S_ISDIR(mode))
- flags |= XMIT_
TOP_DIR
;
+ flags |= XMIT_
DEL_START
;
if ((flags & 0xFF00) || !flags) {
flags |= XMIT_EXTENDED_FLAGS;
write_byte(f, flags);
if ((flags & 0xFF00) || !flags) {
flags |= XMIT_EXTENDED_FLAGS;
write_byte(f, flags);
@@
-435,7
+435,7
@@
void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
write_byte(f, flags);
} else {
if (!(flags & 0xFF) && !S_ISDIR(mode))
write_byte(f, flags);
} else {
if (!(flags & 0xFF) && !S_ISDIR(mode))
- flags |= XMIT_
TOP_DIR
;
+ flags |= XMIT_
DEL_START
;
if (!(flags & 0xFF))
flags |= XMIT_LONG_NAME;
write_byte(f, flags);
if (!(flags & 0xFF))
flags |= XMIT_LONG_NAME;
write_byte(f, flags);
@@
-527,7
+527,7
@@
void receive_file_entry(struct file_struct **fptr, unsigned short flags,
{
static time_t modtime;
static mode_t mode;
{
static time_t modtime;
static mode_t mode;
- static
u
int64 dev;
+ static int64 dev;
static dev_t rdev;
static uint32 rdev_major;
static uid_t uid;
static dev_t rdev;
static uint32 rdev_major;
static uid_t uid;
@@
-645,7
+645,7
@@
void receive_file_entry(struct file_struct **fptr, unsigned short flags,
memset(bp, 0, file_struct_len);
bp += file_struct_len;
memset(bp, 0, file_struct_len);
bp += file_struct_len;
- file->flags = flags & XMIT_
TOP_DIR ? FLAG_TOP_DIR
: 0;
+ file->flags = flags & XMIT_
DEL_START ? FLAG_DEL_START
: 0;
file->modtime = modtime;
file->length = file_length;
file->mode = mode;
file->modtime = modtime;
file->length = file_length;
file->mode = mode;
@@
-684,7
+684,7
@@
void receive_file_entry(struct file_struct **fptr, unsigned short flags,
if (preserve_hard_links && protocol_version < 28 && S_ISREG(mode))
flags |= XMIT_HAS_IDEV_DATA;
if (flags & XMIT_HAS_IDEV_DATA) {
if (preserve_hard_links && protocol_version < 28 && S_ISREG(mode))
flags |= XMIT_HAS_IDEV_DATA;
if (flags & XMIT_HAS_IDEV_DATA) {
-
u
int64 inode;
+ int64 inode;
if (protocol_version < 26) {
dev = read_int(f);
inode = read_int(f);
if (protocol_version < 26) {
dev = read_int(f);
inode = read_int(f);
@@
-996,6
+996,8
@@
void send_file_name(int f, struct file_list *flist, char *fname,
}
}
+/* Note that the "recurse" value either contains -1, for infinite recursion,
+ * or a number >= 0 indicating how many levels of recursion we will allow. */
static void send_directory(int f, struct file_list *flist, char *dir)
{
DIR *d;
static void send_directory(int f, struct file_list *flist, char *dir)
{
DIR *d;
@@
-1044,7
+1046,8
@@
static void send_directory(int f, struct file_list *flist, char *dir)
|| (dname[1] == '.' && dname[2] == '\0')))
continue;
if (strlcpy(p, dname, MAXPATHLEN - offset) < MAXPATHLEN - offset) {
|| (dname[1] == '.' && dname[2] == '\0')))
continue;
if (strlcpy(p, dname, MAXPATHLEN - offset) < MAXPATHLEN - offset) {
- send_file_name(f, flist, fname, recurse, 0);
+ int do_subdirs = recurse >= 1 ? recurse-- : recurse;
+ send_file_name(f, flist, fname, do_subdirs, 0);
} else {
io_error |= IOERR_GENERAL;
rprintf(FINFO,
} else {
io_error |= IOERR_GENERAL;
rprintf(FINFO,
@@
-1085,7
+1088,7
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
start_write = stats.total_written;
flist = flist_new(f == -1 ? WITHOUT_HLINK : WITH_HLINK,
start_write = stats.total_written;
flist = flist_new(f == -1 ? WITHOUT_HLINK : WITH_HLINK,
- "send_file_list");
+
"send_file_list");
if (f != -1) {
io_start_buffering_out();
if (f != -1) {
io_start_buffering_out();
@@
-1102,6
+1105,7
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
while (1) {
char fname2[MAXPATHLEN];
char *fname = fname2;
while (1) {
char fname2[MAXPATHLEN];
char *fname = fname2;
+ int do_subdirs;
if (use_ff_fd) {
if (read_filesfrom_line(filesfrom_fd, fname) == 0)
if (use_ff_fd) {
if (read_filesfrom_line(filesfrom_fd, fname) == 0)
@@
-1116,7
+1120,7
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
}
l = strlen(fname);
}
l = strlen(fname);
- if (fname[l - 1] == '/') {
+ if (
!l ||
fname[l - 1] == '/') {
if (l == 2 && fname[0] == '.') {
/* Turn "./" into just "." rather than "./." */
fname[1] = '\0';
if (l == 2 && fname[0] == '.') {
/* Turn "./" into just "." rather than "./." */
fname[1] = '\0';
@@
-1125,6
+1129,11
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
fname[l] = '\0';
}
}
fname[l] = '\0';
}
}
+ if (fname[l-1] == '.' && (l == 1 || fname[l-2] == '/')) {
+ if (!recurse && keep_dirs)
+ recurse = 1; /* allow one level */
+ } else if (recurse > 0)
+ recurse = 0;
if (link_stat(fname, &st, keep_dirlinks) != 0) {
if (f != -1) {
if (link_stat(fname, &st, keep_dirlinks) != 0) {
if (f != -1) {
@@
-1212,7
+1221,8
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
if (one_file_system)
set_filesystem(fname);
if (one_file_system)
set_filesystem(fname);
- send_file_name(f, flist, fname, recurse, XMIT_TOP_DIR);
+ do_subdirs = recurse >= 1 ? recurse-- : recurse;
+ send_file_name(f, flist, fname, do_subdirs, XMIT_DEL_START);
if (olddir[0]) {
flist_dir = NULL;
if (olddir[0]) {
flist_dir = NULL;
@@
-1475,8
+1485,8
@@
static void clean_flist(struct file_list *flist, int strip_root, int no_dups)
/* Make sure that if we unduplicate '.', that we don't
* lose track of a user-specified starting point (or
* else deletions will mysteriously fail with -R). */
/* Make sure that if we unduplicate '.', that we don't
* lose track of a user-specified starting point (or
* else deletions will mysteriously fail with -R). */
- if (flist->files[i]->flags & FLAG_
TOP_DIR
)
- flist->files[prev_i]->flags |= FLAG_
TOP_DIR
;
+ if (flist->files[i]->flags & FLAG_
DEL_START
)
+ flist->files[prev_i]->flags |= FLAG_
DEL_START
;
clear_file(i, flist);
} else
clear_file(i, flist);
} else