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
Updated to reflect new 2.6.7cvs status.
[rsync/rsync.git]
/
flist.c
diff --git
a/flist.c
b/flist.c
index
a830868
..
30e88ab
100644
(file)
--- a/
flist.c
+++ b/
flist.c
@@
-69,6
+69,7
@@
int io_error;
dev_t filesystem_dev; /* used to implement -x */
static char empty_sum[MD4_SUM_LENGTH];
dev_t filesystem_dev; /* used to implement -x */
static char empty_sum[MD4_SUM_LENGTH];
+static int flist_count_offset;
static unsigned int file_struct_len;
static struct file_list *sorting_flist;
static unsigned int file_struct_len;
static struct file_list *sorting_flist;
@@
-98,16
+99,16
@@
static void start_filelist_progress(char *kind)
}
}
-static void emit_filelist_progress(
const struct file_list *flis
t)
+static void emit_filelist_progress(
int coun
t)
{
{
- rprintf(FINFO, " %d files...\r",
flist->
count);
+ rprintf(FINFO, " %d files...\r", count);
}
}
-static void maybe_emit_filelist_progress(
const struct file_list *flis
t)
+static void maybe_emit_filelist_progress(
int coun
t)
{
{
- if (do_progress && show_filelist_p() && (
flist->
count % 100) == 0)
- emit_filelist_progress(
flis
t);
+ if (do_progress && show_filelist_p() && (count % 100) == 0)
+ emit_filelist_progress(
coun
t);
}
}
@@
-545,7
+546,7
@@
static struct file_struct *receive_file_entry(struct file_list *flist,
rprintf(FERROR,
"overflow: flags=0x%x l1=%d l2=%d lastname=%s\n",
flags, l1, l2, safe_fname(lastname));
rprintf(FERROR,
"overflow: flags=0x%x l1=%d l2=%d lastname=%s\n",
flags, l1, l2, safe_fname(lastname));
- overflow("receive_file_entry");
+ overflow
_exit
("receive_file_entry");
}
strlcpy(thisname, lastname, l1 + 1);
}
strlcpy(thisname, lastname, l1 + 1);
@@
-610,7
+611,7
@@
static struct file_struct *receive_file_entry(struct file_list *flist,
if (linkname_len <= 0 || linkname_len > MAXPATHLEN) {
rprintf(FERROR, "overflow: linkname_len=%d\n",
linkname_len - 1);
if (linkname_len <= 0 || linkname_len > MAXPATHLEN) {
rprintf(FERROR, "overflow: linkname_len=%d\n",
linkname_len - 1);
- overflow("receive_file_entry");
+ overflow
_exit
("receive_file_entry");
}
}
else
}
}
else
@@
-654,6
+655,9
@@
static struct file_struct *receive_file_entry(struct file_list *flist,
if (flags & XMIT_TOP_DIR) {
in_del_hier = 1;
del_hier_name_len = file->dir.depth == 0 ? 0 : l1 + l2;
if (flags & XMIT_TOP_DIR) {
in_del_hier = 1;
del_hier_name_len = file->dir.depth == 0 ? 0 : l1 + l2;
+ if (relative_paths && del_hier_name_len > 2
+ && basename_len == 1+1 && *basename == '.')
+ del_hier_name_len -= 2;
file->flags |= FLAG_TOP_DIR | FLAG_DEL_HERE;
} else if (in_del_hier) {
if (!relative_paths || !del_hier_name_len
file->flags |= FLAG_TOP_DIR | FLAG_DEL_HERE;
} else if (in_del_hier) {
if (!relative_paths || !del_hier_name_len
@@
-971,7
+975,7
@@
static struct file_struct *send_file_name(int f, struct file_list *flist,
if (!file)
return NULL;
if (!file)
return NULL;
- maybe_emit_filelist_progress(flist);
+ maybe_emit_filelist_progress(flist
->count + flist_count_offset
);
flist_expand(flist);
flist_expand(flist);
@@
-1007,7
+1011,7
@@
static void send_if_directory(int f, struct file_list *flist,
/* This function is normally called by the sender, but the receiving side also
/* This function is normally called by the sender, but the receiving side also
- * calls it from
delete_in_dir
() with f set to -1 so that we just construct the
+ * 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()
* might call this with f set to -2, which also indicates that local filter
* rules should be ignored. */
* file list in memory without sending it over the wire. Also, get_dirlist()
* might call this with f set to -2, which also indicates that local filter
* rules should be ignored. */
@@
-1116,11
+1120,21
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
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';
- } else if (l < MAXPATHLEN) {
+ } else {
+ if (l + 1 >= MAXPATHLEN)
+ overflow_exit("send_file_list");
fname[l++] = '.';
fname[l] = '\0';
}
is_dot_dir = 1;
fname[l++] = '.';
fname[l] = '\0';
}
is_dot_dir = 1;
+ } else if (l > 1 && fname[l-1] == '.' && fname[l-2] == '.'
+ && (l == 2 || fname[l-3] == '/')) {
+ if (l + 2 >= MAXPATHLEN)
+ overflow_exit("send_file_list");
+ fname[l++] = '/';
+ fname[l++] = '.';
+ fname[l] = '\0';
+ is_dot_dir = 1;
} else {
is_dot_dir = fname[l-1] == '.'
&& (l == 1 || fname[l-2] == '/');
} else {
is_dot_dir = fname[l-1] == '.'
&& (l == 1 || fname[l-2] == '/');
@@
-1145,7
+1159,7
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
if (!relative_paths) {
p = strrchr(fname, '/');
if (p) {
if (!relative_paths) {
p = strrchr(fname, '/');
if (p) {
- *p =
0
;
+ *p =
'\0'
;
if (p == fname)
dir = "/";
else
if (p == fname)
dir = "/";
else
@@
-1153,10
+1167,10
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
fname = p + 1;
}
} else if (implied_dirs && (p=strrchr(fname,'/')) && p != fname) {
fname = p + 1;
}
} else if (implied_dirs && (p=strrchr(fname,'/')) && p != fname) {
- /*
this ensures we send the intermediate directories,
-
thus getting their permissions right
*/
+ /*
Send the implied directories at the start of the
+
* source spec, so we get their permissions right.
*/
char *lp = lastpath, *fn = fname, *slash = fname;
char *lp = lastpath, *fn = fname, *slash = fname;
- *p =
0
;
+ *p =
'\0'
;
/* Skip any initial directories in our path that we
* have in common with lastpath. */
while (*fn && *lp == *fn) {
/* Skip any initial directories in our path that we
* have in common with lastpath. */
while (*fn && *lp == *fn) {
@@
-1171,13
+1185,13
@@
struct file_list *send_file_list(int f, int argc, char *argv[])
copy_links = copy_unsafe_links;
xfer_dirs = 1;
while ((slash = strchr(slash+1, '/')) != 0) {
copy_links = copy_unsafe_links;
xfer_dirs = 1;
while ((slash = strchr(slash+1, '/')) != 0) {
- *slash =
0
;
+ *slash =
'\0'
;
send_file_name(f, flist, fname, 0);
*slash = '/';
}
copy_links = save_copy_links;
xfer_dirs = save_xfer_dirs;
send_file_name(f, flist, fname, 0);
*slash = '/';
}
copy_links = save_copy_links;
xfer_dirs = save_xfer_dirs;
- *p =
0
;
+ *p =
'\0'
;
strlcpy(lastpath, fname, sizeof lastpath);
*p = '/';
}
strlcpy(lastpath, fname, sizeof lastpath);
*p = '/';
}
@@
-1309,7
+1323,7
@@
struct file_list *recv_file_list(int f)
flist->files[flist->count++] = file;
flist->files[flist->count++] = file;
- maybe_emit_filelist_progress(flist);
+ maybe_emit_filelist_progress(flist
->count
);
if (verbose > 2) {
rprintf(FINFO, "recv_file_name(%s)\n",
if (verbose > 2) {
rprintf(FINFO, "recv_file_name(%s)\n",
@@
-1457,8
+1471,12
@@
static void clean_flist(struct file_list *flist, int strip_root, int no_dups)
{
int i, prev_i = 0;
{
int i, prev_i = 0;
- if (!flist
|| flist->count == 0
)
+ if (!flist)
return;
return;
+ if (flist->count == 0) {
+ flist->high = -1;
+ return;
+ }
sorting_flist = flist;
qsort(flist->files, flist->count,
sorting_flist = flist;
qsort(flist->files, flist->count,
@@
-1510,8
+1528,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 top directory. */
}
/* Make sure that if we unduplicate '.', that we don't
* lose track of a user-specified top directory. */
- if (flist->files[drop]->flags & FLAG_TOP_DIR)
-
flist->files[keep]->flags |= FLAG_TOP_DIR
;
+ flist->files[keep]->flags |= flist->files[drop]->flags
+
& (FLAG_TOP_DIR|FLAG_DEL_HERE)
;
clear_file(drop, flist);
clear_file(drop, flist);
@@
-1666,8
+1684,13
@@
int f_name_cmp(struct file_struct *f1, struct file_struct *f2)
break;
case s_SLASH:
type1 = S_ISDIR(f1->mode) ? t_path : t_ITEM;
break;
case s_SLASH:
type1 = S_ISDIR(f1->mode) ? t_path : t_ITEM;
- state1 = s_BASE;
c1 = (uchar*)f1->basename;
c1 = (uchar*)f1->basename;
+ if (type1 == t_PATH && *c1 == '.' && !c1[1]) {
+ type1 = t_ITEM;
+ state1 = s_TRAILING;
+ c1 = (uchar*)"";
+ } else
+ state1 = s_BASE;
break;
case s_BASE:
state1 = s_TRAILING;
break;
case s_BASE:
state1 = s_TRAILING;
@@
-1691,8
+1714,13
@@
int f_name_cmp(struct file_struct *f1, struct file_struct *f2)
break;
case s_SLASH:
type2 = S_ISDIR(f2->mode) ? t_path : t_ITEM;
break;
case s_SLASH:
type2 = S_ISDIR(f2->mode) ? t_path : t_ITEM;
- state2 = s_BASE;
c2 = (uchar*)f2->basename;
c2 = (uchar*)f2->basename;
+ if (type2 == t_PATH && *c2 == '.' && !c2[1]) {
+ type2 = t_ITEM;
+ state2 = s_TRAILING;
+ c2 = (uchar*)"";
+ } else
+ state2 = s_BASE;
break;
case s_BASE:
state2 = s_TRAILING;
break;
case s_BASE:
state2 = s_TRAILING;
@@
-1772,6
+1800,8
@@
struct file_list *get_dirlist(char *dirname, int dlen,
recurse = 0;
send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirname, dlen);
recurse = save_recurse;
recurse = 0;
send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirname, dlen);
recurse = save_recurse;
+ if (do_progress)
+ flist_count_offset += dirlist->count;
clean_flist(dirlist, 0, 0);
clean_flist(dirlist, 0, 0);