X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d74a2e3ed5e75d0b0c0be752c879eb537cd0f591..d89a3a313ace4f2c8f743ad5f8fc8f181bf71633:/receiver.c diff --git a/receiver.c b/receiver.c index 152c9858..aa3c659a 100644 --- a/receiver.c +++ b/receiver.c @@ -59,7 +59,7 @@ static int delete_already_done(struct file_list *flist,int j) for (i=0;ifiles[i]->mode; delete_one(f, S_ISDIR(mode) != 0); - deletion_count++; } + deletion_count++; } } flist_free(local_file_list); @@ -206,14 +206,15 @@ static int get_tmpname(char *fnametmp, char *fname) length = strlen(fnametmp); fnametmp[length++] = '/'; fnametmp[length] = '\0'; /* always NULL terminated */ - } + } - if ((f = strrchr(fname, '/'))) { /* extra () for gcc */ + if ((f = strrchr(fname, '/')) != NULL) { ++f; if (!tmpdir) { length = f - fname; + /* copy up to and including the slash */ strlcpy(fnametmp, fname, length + 1); - } /* copy up to and including the slash */ + } } else { f = fname; } @@ -222,8 +223,7 @@ static int get_tmpname(char *fnametmp, char *fname) maxname = MIN(MAXPATHLEN - 7 - length, NAME_MAX - 8); - if (maxname < 1) - { + if (maxname < 1) { rprintf(FERROR, "temporary filename too long: %s\n", fname); fnametmp[0] = '\0'; return 0; @@ -419,13 +419,25 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) 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,"%s : is a directory (recv_files)\n", + 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,7 +478,15 @@ 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) { - rprintf(FERROR,"mkstemp %s failed: %s\n",fnametmp,strerror(errno)); + 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)); receive_data(f_in,buf,-1,NULL,file->length); if (buf) unmap_file(buf); if (fd1 != -1) close(fd1);