From: Andrew Tridgell Date: Thu, 23 Jul 1998 03:09:14 +0000 (+0000) Subject: fixed the relative paths bug pointed out by Alberto Accomazzi X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/0199b05f25ec271a4d306ec46218ba4fcb8ad85a fixed the relative paths bug pointed out by Alberto Accomazzi --- diff --git a/clientserver.c b/clientserver.c index eaa61ad1..3266da57 100644 --- a/clientserver.c +++ b/clientserver.c @@ -267,8 +267,10 @@ static int rsync_module(int fd, int i) free(request); } +#if !TRIDGE /* don't allow the logs to be flooded too fast */ if (verbose > 1) verbose = 1; +#endif argc -= optind; argp = argv + optind; 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;icount;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;icount;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); + } }