X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/37f9805dabba76b7a00bd2a0227762f6f239b598..f855a7d01ab8401a307bb02cdcdee546df3e2423:/flist.c diff --git a/flist.c b/flist.c index caca010f..b8b4c666 100644 --- a/flist.c +++ b/flist.c @@ -23,8 +23,6 @@ extern struct stats stats; -extern int csum_length; - extern int verbose; extern int am_server; extern int always_checksum; @@ -44,9 +42,12 @@ extern int preserve_gid; extern int preserve_times; extern int relative_paths; extern int copy_links; +extern int copy_unsafe_links; extern int remote_version; extern int io_error; +static char topsrcname[MAXPATHLEN]; + static struct exclude_struct **local_exclude_list; static void clean_flist(struct file_list *flist, int strip_root); @@ -58,6 +59,10 @@ static void list_file_entry(struct file_struct *f) char *perm_map = "rwxrwxrwx"; int i; + if (!f->basename) + /* this can happen if duplicate names were removed */ + return; + for (i=0;i<9;i++) { if (f->mode & (1<st_mode)) { + int l; + if ((l = readlink(Path,Linkbuf,MAXPATHLEN-1)) == -1) { + return -1; + } + Linkbuf[l] = 0; + if (copy_unsafe_links && (topsrcname[0] != '\0') && + unsafe_symlink(Linkbuf, topsrcname)) { + return do_stat(Path, Buffer); + } + } + return 0; +#else + return do_stat(Path, Buffer); +#endif +} + int link_stat(const char *Path, STRUCT_STAT *Buffer) { #if SUPPORT_LINKS @@ -221,7 +252,11 @@ static void send_file_entry(struct file_struct *file,int f,unsigned base_flags) #endif if (always_checksum) { - write_buf(f,file->sum,csum_length); + if (remote_version < 21) { + write_buf(f,file->sum,2); + } else { + write_buf(f,file->sum,MD4_SUM_LENGTH); + } } last_mode = file->mode; @@ -320,7 +355,11 @@ static void receive_file_entry(struct file_struct **fptr, if (always_checksum) { file->sum = (char *)malloc(MD4_SUM_LENGTH); if (!file->sum) out_of_memory("md4 sum"); - read_buf(f,file->sum,csum_length); + if (remote_version < 21) { + read_buf(f,file->sum,2); + } else { + read_buf(f,file->sum,MD4_SUM_LENGTH); + } } last_mode = file->mode; @@ -362,13 +401,15 @@ static int skip_filesystem(char *fname, STRUCT_STAT *st) return (st2.st_dev != filesystem_dev); } -static struct file_struct *make_file(char *fname) +static struct file_struct *make_file(int f, char *fname) { struct file_struct *file; STRUCT_STAT st; char sum[SUM_LENGTH]; char *p; char cleaned_name[MAXPATHLEN]; + char linkbuf[MAXPATHLEN]; + extern int delete_excluded; strlcpy(cleaned_name, fname, MAXPATHLEN); cleaned_name[MAXPATHLEN-1] = 0; @@ -377,7 +418,7 @@ static struct file_struct *make_file(char *fname) memset(sum,0,SUM_LENGTH); - if (link_stat(fname,&st) != 0) { + if (readlink_stat(fname,&st,linkbuf) != 0) { io_error = 1; rprintf(FERROR,"%s: %s\n", fname,strerror(errno)); @@ -394,11 +435,12 @@ static struct file_struct *make_file(char *fname) return NULL; } - if (!match_file_name(fname,&st)) + /* f is set to -1 when calculating deletion file list */ + if (((f != -1) || !delete_excluded) && !match_file_name(fname,&st)) return NULL; if (verbose > 2) - rprintf(FINFO,"make_file(%s)\n",fname); + rprintf(FINFO,"make_file(%d,%s)\n",f,fname); file = (struct file_struct *)malloc(sizeof(*file)); if (!file) out_of_memory("make_file"); @@ -433,16 +475,7 @@ static struct file_struct *make_file(char *fname) #if SUPPORT_LINKS if (S_ISLNK(st.st_mode)) { - int l; - char lnk[MAXPATHLEN]; - if ((l=readlink(fname,lnk,MAXPATHLEN-1)) == -1) { - io_error=1; - rprintf(FERROR,"readlink %s : %s\n", - fname,strerror(errno)); - return NULL; - } - lnk[l] = 0; - file->link = strdup(lnk); + file->link = strdup(linkbuf); } #endif @@ -484,7 +517,7 @@ void send_file_name(int f,struct file_list *flist,char *fname, { struct file_struct *file; - file = make_file(fname); + file = make_file(f,fname); if (!file) return; @@ -605,14 +638,22 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) } for (i=0;i