mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-03-13 11:56:14 -04:00
fixed the relative paths bug pointed out by Alberto Accomazzi
This commit is contained in:
@@ -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;
|
||||
|
||||
45
flist.c
45
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user