X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/86692050b54b16e5b289ddeacbb59f890455cca7..3d19b4c83edab707de2ddf91b1469befc12de54e:/rsync.c diff --git a/rsync.c b/rsync.c index 178dc523..5a02979e 100644 --- a/rsync.c +++ b/rsync.c @@ -30,7 +30,6 @@ extern int preserve_uid; extern int preserve_gid; extern int preserve_perms; extern int make_backups; -extern char *backup_suffix; /* @@ -57,7 +56,7 @@ int delete_file(char *fname) int ret; extern int recurse; - if (do_unlink(fname) == 0 || errno == ENOENT) return 0; + if (robust_unlink(fname) == 0 || errno == ENOENT) return 0; #if SUPPORT_LINKS ret = do_lstat(fname, &st); @@ -115,10 +114,10 @@ int delete_file(char *fname) static int is_in_group(gid_t gid) { -#ifdef HAVE_GETGROUPS +#ifdef GETGROUPS_T static gid_t last_in = (gid_t) -2, last_out; static int ngroups = -2; - static gid_t *gidset; + static GETGROUPS_T *gidset; int n; if (gid == last_in) @@ -127,7 +126,7 @@ static int is_in_group(gid_t gid) /* treat failure (-1) as if not member of any group */ ngroups = getgroups(0, 0); if (ngroups > 0) { - gidset = (gid_t *) malloc(ngroups * sizeof(gid_t)); + gidset = (GETGROUPS_T *) malloc(ngroups * sizeof(GETGROUPS_T)); ngroups = getgroups(ngroups, gidset); } } @@ -200,14 +199,19 @@ int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st, } #ifdef HAVE_CHMOD - if (preserve_perms && !S_ISLNK(st->st_mode) && - (st->st_mode != file->mode || - (updated && (file->mode & ~ACCESSPERMS)))) { - updated = 1; - if (do_chmod(fname,file->mode) != 0) { - rprintf(FERROR,"failed to set permissions on %s : %s\n", - fname,strerror(errno)); - return 0; + if (!S_ISLNK(st->st_mode)) { + int file_mode; + if (preserve_perms) + file_mode = file->mode; + else + file_mode = file->mode & ACCESSPERMS; + if (st->st_mode != file->mode) { + updated = 1; + if (do_chmod(fname,file_mode) != 0) { + rprintf(FERROR,"failed to set permissions on %s : %s\n", + fname,strerror(errno)); + return 0; + } } } #endif @@ -227,26 +231,6 @@ void sig_int(void) exit_cleanup(RERR_SIGNAL); } -int make_backup(char *fname) -{ - char fnamebak[MAXPATHLEN]; - if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) { - rprintf(FERROR,"backup filename too long\n"); - return 0; - } - - slprintf(fnamebak,sizeof(fnamebak),"%s%s",fname,backup_suffix); - if (do_rename(fname,fnamebak) != 0) { - if (errno != ENOENT) { - rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno)); - return 0; - } - } else if (verbose > 1) { - rprintf(FINFO,"backed up %s to %s\n",fname,fnamebak); - } - return 1; -} - /* finish off a file transfer, renaming the file and setting the permissions and ownership */ @@ -256,22 +240,21 @@ void finish_transfer(char *fname, char *fnametmp, struct file_struct *file) return; /* move tmp file over real file */ - if (do_rename(fnametmp,fname) != 0) { + if (robust_rename(fnametmp,fname) != 0) { if (errno == EXDEV) { /* rename failed on cross-filesystem link. Copy the file instead. */ - if (copy_file(fnametmp,fname, file->mode & ACCESSPERMS)) { + if (copy_file(fnametmp,fname, file->mode & INITACCESSPERMS)) { rprintf(FERROR,"copy %s -> %s : %s\n", fnametmp,fname,strerror(errno)); } else { set_perms(fname,file,NULL,0); } - do_unlink(fnametmp); } else { rprintf(FERROR,"rename %s -> %s : %s\n", fnametmp,fname,strerror(errno)); - do_unlink(fnametmp); } + do_unlink(fnametmp); } else { set_perms(fname,file,NULL,0); }