summaryrefslogtreecommitdiff
path: root/flist.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-07-23 03:09:14 +0000
committerAndrew Tridgell <tridge@samba.org>1998-07-23 03:09:14 +0000
commit0199b05f25ec271a4d306ec46218ba4fcb8ad85a (patch)
treefe8cfcfacca3a2d88f5e6ae0a5babd7e0c73682a /flist.c
parente2d1033d5d65375dc49e31470d68ac22568fcceb (diff)
downloadrsync-0199b05f25ec271a4d306ec46218ba4fcb8ad85a.tar.gz
rsync-0199b05f25ec271a4d306ec46218ba4fcb8ad85a.tar.bz2
rsync-0199b05f25ec271a4d306ec46218ba4fcb8ad85a.zip
fixed the relative paths bug pointed out by Alberto Accomazzi
Diffstat (limited to 'flist.c')
-rw-r--r--flist.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/flist.c b/flist.c
index c33323ed..cb14d70a 100644
--- a/flist.c
+++ b/flist.c
@@ -49,6 +49,8 @@ extern int io_error;
static struct exclude_struct **local_exclude_list;
+static void clean_flist(struct file_list *flist, int strip_root);
+
int link_stat(const char *Path, STRUCT_STAT *Buffer)
{
#if SUPPORT_LINKS
@@ -225,12 +227,6 @@ static void receive_file_entry(struct file_struct **fptr,
clean_fname(thisname);
- if (relative_paths && thisname[0] == '/') {
- /* strip / off absolute paths in destination */
- memmove(thisname, thisname+1, strlen(thisname));
- if (!thisname[0]) strcpy(thisname,".");
- }
-
if ((p = strrchr(thisname,'/'))) {
static char *lastdir;
*p = 0;
@@ -647,7 +643,7 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
if (verbose && recurse && !am_server && f != -1)
rprintf(FINFO,"done\n");
- clean_flist(flist);
+ clean_flist(flist, 0);
/* now send the uid/gid list. This was introduced in protocol
version 15 */
@@ -728,7 +724,7 @@ struct file_list *recv_file_list(int f)
if (verbose > 2)
rprintf(FINFO,"received %d names\n",flist->count);
- clean_flist(flist);
+ clean_flist(flist, relative_paths);
if (verbose && recurse && !am_server) {
rprintf(FINFO,"done\n");
@@ -826,7 +822,7 @@ void flist_free(struct file_list *flist)
* This routine ensures we don't have any duplicate names in our file list.
* duplicate names can cause corruption because of the pipelining
*/
-void clean_flist(struct file_list *flist)
+static void clean_flist(struct file_list *flist, int strip_root)
{
int i;
@@ -848,6 +844,37 @@ void clean_flist(struct file_list *flist)
free_file(flist->files[i]);
}
}
+
+ if (strip_root) {
+ /* we need to strip off the root directory in the case
+ of relative paths, but this must be done _after_
+ the sorting phase */
+ for (i=0;i<flist->count;i++) {
+ if (flist->files[i]->dirname &&
+ flist->files[i]->dirname[0] == '/') {
+ memmove(&flist->files[i]->dirname[0],
+ &flist->files[i]->dirname[1],
+ strlen(flist->files[i]->dirname));
+ }
+
+ if (flist->files[i]->dirname &&
+ !flist->files[i]->dirname[0]) {
+ flist->files[i]->dirname = NULL;
+ }
+ }
+ }
+
+
+ if (verbose <= 3) return;
+
+ for (i=0;i<flist->count;i++) {
+ rprintf(FINFO,"[%d] i=%d %s %s mode=0%o len=%d\n",
+ getpid(), i,
+ flist->files[i]->dirname,
+ flist->files[i]->basename,
+ flist->files[i]->mode,
+ flist->files[i]->length);
+ }
}