X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/16417f8b9d1947f4efbe540ee6983feba2ebc21c..067669dac74abfa2acaaef6b1d078d861814e100:/receiver.c diff --git a/receiver.c b/receiver.c index 3e248800..be433ae1 100644 --- a/receiver.c +++ b/receiver.c @@ -36,7 +36,9 @@ extern char *tmpdir; extern char *compare_dest; extern int make_backups; extern int do_progress; +extern char *backup_dir; extern char *backup_suffix; +extern int backup_suffix_len; static struct delete_list { DEV64_T dev; @@ -57,7 +59,7 @@ static int delete_already_done(struct file_list *flist,int j) for (i=0;imode)) { - if (robust_unlink(f_name(f)) != 0) { - rprintf(FERROR,"delete_one: unlink %s: %s\n",f_name(f),strerror(errno)); + if (!is_dir) { + if (robust_unlink(fn) != 0) { + rprintf(FERROR, "delete_one: unlink %s: %s\n", + fn, strerror(errno)); } else if (verbose) { - rprintf(FINFO,"deleting %s\n",f_name(f)); + rprintf(FINFO, "deleting %s\n", fn); } } else { - if (do_rmdir(f_name(f)) != 0) { - if (errno != ENOTEMPTY && errno != EEXIST) - rprintf(FERROR,"delete_one: rmdir %s: %s\n", - f_name(f), strerror(errno)); + if (do_rmdir(fn) != 0) { + if (errno != ENOTEMPTY && errno != EEXIST) { + rprintf(FERROR, "delete_one: rmdir %s: %s\n", + fn, strerror(errno)); + } } else if (verbose) { - rprintf(FINFO,"deleting directory %s\n",f_name(f)); + rprintf(FINFO, "deleting directory %s\n", fn); } } } +static int is_backup_file(char *fn) +{ + int k = strlen(fn) - backup_suffix_len; + return k > 0 && strcmp(fn+k, backup_suffix) == 0; +} /* this deletes any files on the receiving side that are not present @@ -148,15 +157,15 @@ void delete_files(struct file_list *flist) add_delete_entry(local_file_list->files[i]); if (-1 == flist_find(flist,local_file_list->files[i])) { char *f = f_name(local_file_list->files[i]); - int k = strlen(f) - strlen(backup_suffix); -/* Hi Andrew, do we really need to play with backup_suffix here? */ - if (make_backups && ((k <= 0) || - (strcmp(f+k,backup_suffix) != 0))) { + if (make_backups && (backup_dir || !is_backup_file(f))) { (void) make_backup(f); + if (verbose) + rprintf(FINFO, "deleting %s\n", f); } else { - deletion_count++; - delete_one(local_file_list->files[i]); + int mode = local_file_list->files[i]->mode; + delete_one(f, S_ISDIR(mode) != 0); } + deletion_count++; } } flist_free(local_file_list); @@ -197,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; } @@ -213,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; @@ -457,7 +466,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);