X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/2cda2560883268627b997daee6d0c677093b26d2..bc63ae3f13e01874e375bb5cc606775889ed5afa:/generator.c diff --git a/generator.c b/generator.c index 3552887e..0dd8e7ed 100644 --- a/generator.c +++ b/generator.c @@ -52,12 +52,19 @@ static int skip_file(char *fname, return 0; } if (link_dest) { - if((st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT)) { + extern int preserve_perms; + extern int preserve_uid; + extern int preserve_gid; + + if(preserve_perms + && (st->st_mode & ~_S_IFMT) != (file->mode & ~_S_IFMT)) return 0; - } - if (st->st_uid != file->uid || st->st_gid != file->gid) { + + if (preserve_uid && st->st_uid != file->uid) + return 0; + + if (preserve_gid && st->st_gid != file->gid) return 0; - } } /* if always checksum is set then we use the checksum instead @@ -509,19 +516,16 @@ void generate_files(int f,struct file_list *flist,char *local_name,int f_recv) write_int(f,-1); - if (remote_version >= 13) { - /* in newer versions of the protocol the files can cycle through - the system more than once to catch initial checksum errors */ - for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) { - struct file_struct *file = flist->files[i]; - recv_generator(local_name?local_name:f_name(file), - flist,i,f); - } + /* files can cycle through the system more than once + * to catch initial checksum errors */ + for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) { + struct file_struct *file = flist->files[i]; + recv_generator(local_name?local_name:f_name(file), flist,i,f); + } - phase++; - if (verbose > 2) - rprintf(FINFO,"generate_files phase=%d\n",phase); + phase++; + if (verbose > 2) + rprintf(FINFO,"generate_files phase=%d\n",phase); - write_int(f,-1); - } + write_int(f,-1); }