7a480ed7985ca18bafe9b10d534a17da64005e65
[rsync/rsync-patches.git] / early-chmod.diff
1 --- rsync.c     21 May 2004 08:43:03 -0000      1.140
2 +++ rsync.c     21 May 2004 08:58:01 -0000
3 @@ -239,6 +239,9 @@ void finish_transfer(char *fname, char *
4         if (make_backups && !make_backup(fname))
5                 return;
6  
7 +       /* Change permissions before putting the file into place. */
8 +       set_perms(fnametmp, file, NULL, 0);
9 +
10         /* move tmp file over real file */
11         ret = robust_rename(fnametmp, fname, file->mode & INITACCESSPERMS);
12         if (ret < 0) {
13 @@ -246,7 +249,8 @@ void finish_transfer(char *fname, char *
14                     ret == -2 ? "copy" : "rename",
15                     full_fname(fnametmp), fname);
16                 do_unlink(fnametmp);
17 -       } else {
18 +       } else if (ret == 1) {
19 +               /* The file got copied, so set the permissions again. */
20                 set_perms(fname, file, NULL,
21                           ok_to_set_time ? 0 : PERMS_SKIP_MTIME);
22         }
23 --- t_stub.c    15 May 2004 19:31:05 -0000      1.8
24 +++ t_stub.c    21 May 2004 08:58:01 -0000
25 @@ -26,6 +26,7 @@
26   * functions, so that module test harnesses can run standalone.
27   **/
28  
29 +int am_root = 0;
30  int modify_window = 0;
31  int module_id = -1;
32  struct exclude_list_struct server_exclude_list;
33 --- util.c      21 May 2004 08:40:25 -0000      1.144
34 +++ util.c      21 May 2004 08:58:01 -0000
35 @@ -29,6 +29,7 @@
36  
37  extern int verbose;
38  extern int dry_run;
39 +extern int am_root;
40  extern int module_id;
41  extern int modify_window;
42  extern struct exclude_list_struct server_exclude_list;
43 @@ -263,6 +264,8 @@ int copy_file(char *source, char *dest, 
44                 return -1;
45         }
46  
47 +       if (!am_root && !(mode & S_IWUSR))
48 +               mode |= S_IWUSR;
49         ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode);
50         if (ofd == -1) {
51                 rsyserr(FERROR, errno, "open %s", full_fname(dest));
52 @@ -361,8 +364,8 @@ int robust_unlink(char *fname)
53  #endif
54  }
55  
56 -/* Returns 0 on success, -1 on most errors, and -2 if we got an error
57 - * trying to copy the file across file systems. */
58 +/* Returns 0 on successful rename, 1 if we successfully copied the file
59 + * across filesystems, -2 if copy_file() failed, and -1 on other errors. */
60  int robust_rename(char *from, char *to, int mode)
61  {
62         int tries = 4;
63 @@ -379,10 +382,12 @@ int robust_rename(char *from, char *to, 
64                         break;
65  #endif
66                 case EXDEV:
67 +                       if (!am_root && !(mode & S_IRUSR))
68 +                               do_chmod(from, (mode & CHMOD_BITS) | S_IRUSR);
69                         if (copy_file(from, to, mode) != 0)
70                                 return -2;
71                         do_unlink(from);
72 -                       return 0;
73 +                       return 1;
74                 default:
75                         return -1;
76                 }