X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0c2ef5f42dfb71f2af99e58cd9934fb365f079fb..06c28400fa4ce46406d4a0bbf417b9b07df0a29a:/receiver.c diff --git a/receiver.c b/receiver.c index 00160640..18b0795a 100644 --- a/receiver.c +++ b/receiver.c @@ -23,7 +23,7 @@ extern int verbose; extern int recurse; extern int delete_mode; -extern int remote_version; +extern int protocol_version; extern int csum_length; extern struct stats stats; extern int dry_run; @@ -59,7 +59,7 @@ static int delete_already_done(struct file_list *flist,int j) for (i=0;ifiles[j]->mode) || !(flist->files[j]->flags & FLAG_DELETE)) continue; - if (remote_version < 19 && + if (protocol_version < 19 && delete_already_done(flist, j)) continue; name = strdup(f_name(flist->files[j])); @@ -152,7 +153,7 @@ void delete_files(struct file_list *flist) for (i=local_file_list->count-1;i>=0;i--) { if (max_delete && deletion_count > max_delete) break; if (!local_file_list->files[i]->basename) continue; - if (remote_version < 19 && + if (protocol_version < 19 && S_ISDIR(local_file_list->files[i]->mode)) add_delete_entry(local_file_list->files[i]); if (-1 == flist_find(flist,local_file_list->files[i])) { @@ -271,7 +272,8 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname, sum_update(data,i); if (fd != -1 && write_file(fd,data,i) != i) { - rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno)); + rprintf(FERROR, "write failed on %s: %s\n", + full_fname(fname), strerror(errno)); exit_cleanup(RERR_FILEIO); } offset += i; @@ -298,8 +300,8 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname, } if (fd != -1 && write_file(fd,map,len) != (int) len) { - rprintf(FERROR,"write failed on %s : %s\n", - fname,strerror(errno)); + rprintf(FERROR, "write failed on %s: %s\n", + full_fname(fname), strerror(errno)); exit_cleanup(RERR_FILEIO); } offset += len; @@ -309,8 +311,8 @@ static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname, end_progress(total_size); if (fd != -1 && offset > 0 && sparse_end(fd) != 0) { - rprintf(FERROR,"write failed on %s : %s\n", - fname,strerror(errno)); + rprintf(FERROR, "write failed on %s: %s\n", + full_fname(fname), strerror(errno)); exit_cleanup(RERR_FILEIO); } @@ -413,19 +415,32 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) } if (fd1 != -1 && do_fstat(fd1,&st) != 0) { - rprintf(FERROR,"fstat %s : %s\n",fnamecmp,strerror(errno)); + rprintf(FERROR, "fstat %s failed: %s\n", + full_fname(fnamecmp), strerror(errno)); receive_data(f_in,NULL,-1,NULL,file->length); close(fd1); continue; } - if (fd1 != -1 && !S_ISREG(st.st_mode)) { - rprintf(FERROR,"%s : not a regular file (recv_files)\n",fnamecmp); - receive_data(f_in,NULL,-1,NULL,file->length); + if (fd1 != -1 && S_ISDIR(st.st_mode) && fnamecmp == fname) { + /* this special handling for directories + * wouldn't be necessary if robust_rename() + * and the underlying robust_unlink could cope + * with directories + */ + rprintf(FERROR,"recv_files: %s is a directory\n", + full_fname(fnamecmp)); + receive_data(f_in, NULL, -1, NULL, file->length); close(fd1); continue; } + if (fd1 != -1 && !S_ISREG(st.st_mode)) { + close(fd1); + fd1 = -1; + buf = NULL; + } + if (fd1 != -1 && !preserve_perms) { /* if the file exists already and we aren't preserving permissions then act as though the remote end sent @@ -466,15 +481,8 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) fd2 = do_mkstemp(fnametmp, file->mode & INITACCESSPERMS); } if (fd2 == -1) { - extern char curr_dir[]; - char *p1, *p2; - if (*fnametmp == '.') { - p1 = curr_dir; - p2 = "/"; - } else - p1 = p2 = ""; - rprintf(FERROR, "mkstemp %s%s%s failed: %s\n", - p1, p2, fnametmp, strerror(errno)); + rprintf(FERROR, "mkstemp %s failed: %s\n", + full_fname(fnametmp), strerror(errno)); receive_data(f_in,buf,-1,NULL,file->length); if (buf) unmap_file(buf); if (fd1 != -1) close(fd1); @@ -508,7 +516,7 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) if (!recv_ok) { if (csum_length == SUM_LENGTH) { rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n", - fname); + full_fname(fname)); } else { if (verbose > 1) rprintf(FINFO,"redoing %s(%d)\n",fname,i);