Index: backup.c =================================================================== RCS file: /cvsroot/rsync/backup.c,v retrieving revision 1.52 diff -u -r1.52 backup.c --- backup.c 30 Jan 2006 07:18:03 -0000 1.52 +++ backup.c 23 Feb 2006 23:42:33 -0000 @@ -112,7 +112,7 @@ } if (*p == '/') { *p = '\0'; - if (do_mkdir(fullpath, 0777 & ~orig_umask) == 0) + if (do_mkdir_defmode(fullpath) == 0) break; if (errno != ENOENT) { rsyserr(FERROR, errno, @@ -141,7 +141,7 @@ p += strlen(p); if (p == end) break; - if (do_mkdir(fullpath, 0777 & ~orig_umask) < 0) { + if (do_mkdir_defmode(fullpath) < 0) { rsyserr(FERROR, errno, "make_bak_dir mkdir %s failed", full_fname(fullpath)); goto failure; Index: generator.c =================================================================== RCS file: /cvsroot/rsync/generator.c,v retrieving revision 1.261 diff -u -r1.261 generator.c --- generator.c 23 Feb 2006 20:29:55 -0000 1.261 +++ generator.c 23 Feb 2006 23:42:34 -0000 @@ -834,7 +834,7 @@ char *dn = file->dirname ? file->dirname : "."; if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) { if (relative_paths && !implied_dirs && stat(dn, &st) < 0 - && create_directory_path(fname, orig_umask) < 0) { + && create_directory_path(fname) < 0) { rsyserr(FERROR, errno, "recv_generator: mkdir %s failed", full_fname(dn)); @@ -896,7 +896,7 @@ } if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) { if (!relative_paths || errno != ENOENT - || create_directory_path(fname, orig_umask) < 0 + || create_directory_path(fname) < 0 || (do_mkdir(fname, file->mode) < 0 && errno != EEXIST)) { rsyserr(FERROR, errno, "recv_generator: mkdir %s failed", Index: main.c =================================================================== RCS file: /cvsroot/rsync/main.c,v retrieving revision 1.296 diff -u -r1.296 main.c --- main.c 23 Feb 2006 00:38:34 -0000 1.296 +++ main.c 23 Feb 2006 23:42:35 -0000 @@ -491,13 +491,11 @@ if (cp && !cp[1]) *cp = '\0'; - umask(orig_umask); - if (do_mkdir(dest_path, 0777) != 0) { + if (do_mkdir_defmode(dest_path) != 0) { rsyserr(FERROR, errno, "mkdir %s failed", full_fname(dest_path)); exit_cleanup(RERR_FILEIO); } - umask(0); if (verbose) rprintf(FINFO, "created directory %s\n", dest_path); Index: proto.h =================================================================== RCS file: /cvsroot/rsync/proto.h,v retrieving revision 1.297 diff -u -r1.297 proto.h --- proto.h 20 Feb 2006 17:15:06 -0000 1.297 +++ proto.h 23 Feb 2006 23:42:35 -0000 @@ -280,7 +280,8 @@ void out_of_memory(char *str); void overflow_exit(char *str); int set_modtime(char *fname, time_t modtime, mode_t mode); -int create_directory_path(char *fname, int base_umask); +int do_mkdir_defmode(char *fname); +int create_directory_path(char *fname); int full_write(int desc, char *ptr, size_t len); int copy_file(const char *source, const char *dest, mode_t mode); int robust_unlink(const char *fname); Index: receiver.c =================================================================== RCS file: /cvsroot/rsync/receiver.c,v retrieving revision 1.171 diff -u -r1.171 receiver.c --- receiver.c 7 Feb 2006 18:15:51 -0000 1.171 +++ receiver.c 23 Feb 2006 23:42:35 -0000 @@ -580,7 +580,7 @@ * because their information should have been previously * transferred, but that may not be the case with -R */ if (fd2 == -1 && relative_paths && errno == ENOENT - && create_directory_path(fnametmp, orig_umask) == 0) { + && create_directory_path(fnametmp) == 0) { /* Get back to name with XXXXXX in it. */ get_tmpname(fnametmp, fname); fd2 = do_mkstemp(fnametmp, file->mode & INITACCESSPERMS); Index: util.c =================================================================== RCS file: /cvsroot/rsync/util.c,v retrieving revision 1.196 diff -u -r1.196 util.c --- util.c 8 Feb 2006 16:52:51 -0000 1.196 +++ util.c 23 Feb 2006 23:42:36 -0000 @@ -33,6 +33,7 @@ extern int modify_window; extern int relative_paths; extern int human_readable; +extern int orig_umask; extern char *partial_dir; extern struct filter_list_struct server_filter_list; @@ -169,12 +170,21 @@ } } +int do_mkdir_defmode(char *fname) +{ + int result; + umask(orig_umask); + result = do_mkdir(fname, 0777); + umask(0); + return result; +} + /** Create any necessary directories in fname. Unfortunately we don't know what perms to give the directory when this is called so we need to rely on the umask **/ -int create_directory_path(char *fname, int base_umask) +int create_directory_path(char *fname) { char *p; @@ -186,7 +196,7 @@ p = fname; while ((p = strchr(p,'/')) != NULL) { *p = 0; - do_mkdir(fname, 0777 & ~base_umask); + do_mkdir_defmode(fname); *p = '/'; p++; }