X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/13a1f7929ed05c652dc1b3eb4489ced01c8616f1..cbbe4892087b74fb8ed2aac6078ee933ac02e920:/rsync.c diff --git a/rsync.c b/rsync.c index f66efc63..8d0f3207 100644 --- a/rsync.c +++ b/rsync.c @@ -288,8 +288,8 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out) return; } -#if SUPPORT_LINKS if (preserve_links && S_ISLNK(file->mode)) { +#if SUPPORT_LINKS char lnk[MAXPATHLEN]; int l; if (statret == 0) { @@ -312,9 +312,9 @@ void recv_generator(char *fname,struct file_list *flist,int i,int f_out) fprintf(FINFO,"%s -> %s\n", fname,file->link); } +#endif return; } -#endif #ifdef HAVE_MKNOD if (am_root && preserve_devices && IS_DEVICE(file->mode)) { @@ -548,10 +548,10 @@ static void delete_files(struct file_list *flist) strncmp(flist->files[j].name,last_name, strlen(last_name))==0) continue; last_name = flist->files[j].name; + if (!(local_file_list = send_file_list(-1,1,&last_name))) + continue; if (verbose > 1) fprintf(FINFO,"deleting in %s\n", last_name); - if (!(local_file_list = send_file_list(-1,1,&last_name))) - return; for (i=local_file_list->count-1;i>=0;i--) { if (!local_file_list->files[i].name) continue; @@ -656,6 +656,7 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) /* open tmp file */ if (strlen(fname) > (MAXPATHLEN-8)) { fprintf(FERROR,"filename too long\n"); + close(fd1); continue; } sprintf(fnametmp,"%s.XXXXXX",fname); @@ -667,7 +668,7 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) continue; } fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode); - if (relative_paths && errno == ENOENT && + if (fd2 == -1 && relative_paths && errno == ENOENT && create_directory_path(fnametmp) == 0) { fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode); } @@ -729,16 +730,16 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) } } + if (preserve_hard_links) + do_hard_links(flist); + /* now we need to fix any directory permissions that were modified during the transfer */ - if (!am_root) { - for (i = 0; i < flist->count; i++) { - struct file_struct *file = &flist->files[i]; - if (!file->name || !S_ISDIR(file->mode)) continue; - recv_generator(file->name,flist,i,-1); - } + for (i = 0; i < flist->count; i++) { + struct file_struct *file = &flist->files[i]; + if (!file->name || !S_ISDIR(file->mode)) continue; + recv_generator(file->name,flist,i,-1); } - if (verbose > 2) fprintf(FERROR,"recv_files finished\n"); @@ -817,6 +818,7 @@ off_t send_files(struct file_list *flist,int f_out,int f_in) /* map the local file */ if (fstat(fd,&st) != 0) { fprintf(FERROR,"fstat failed : %s\n",strerror(errno)); + close(fd); return -1; }