Commit | Line | Data |
---|---|---|
7b675ff5 WD |
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 * | |
81486408 WD |
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); | |
1931a970 | 12 | if (ret < 0) { |
7b675ff5 | 13 | @@ -246,7 +249,8 @@ void finish_transfer(char *fname, char * |
81486408 | 14 | ret == -2 ? "copy" : "rename", |
fe6407b5 | 15 | full_fname(fnametmp), fname); |
81486408 WD |
16 | do_unlink(fnametmp); |
17 | - } else { | |
81486408 WD |
18 | + } else if (ret == 1) { |
19 | + /* The file got copied, so set the permissions again. */ | |
7f2baf27 WD |
20 | set_perms(fname, file, NULL, |
21 | ok_to_set_time ? 0 : PERMS_SKIP_MTIME); | |
81486408 | 22 | } |
fe6407b5 | 23 | --- t_stub.c 15 May 2004 19:31:05 -0000 1.8 |
7b675ff5 | 24 | +++ t_stub.c 21 May 2004 08:58:01 -0000 |
81486408 WD |
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; | |
54691942 | 32 | struct exclude_list_struct server_exclude_list; |
7b675ff5 WD |
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 @@ | |
81486408 WD |
36 | |
37 | extern int verbose; | |
7b675ff5 | 38 | extern int dry_run; |
81486408 | 39 | +extern int am_root; |
7b675ff5 WD |
40 | extern int module_id; |
41 | extern int modify_window; | |
54691942 | 42 | extern struct exclude_list_struct server_exclude_list; |
7b675ff5 | 43 | @@ -263,6 +264,8 @@ int copy_file(char *source, char *dest, |
81486408 WD |
44 | return -1; |
45 | } | |
46 | ||
fbcc0c79 WD |
47 | + if (!am_root && !(mode & S_IWUSR)) |
48 | + mode |= S_IWUSR; | |
81486408 WD |
49 | ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode); |
50 | if (ofd == -1) { | |
fe6407b5 | 51 | rsyserr(FERROR, errno, "open %s", full_fname(dest)); |
7b675ff5 | 52 | @@ -361,8 +364,8 @@ int robust_unlink(char *fname) |
81486408 WD |
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; | |
7b675ff5 | 63 | @@ -379,10 +382,12 @@ int robust_rename(char *from, char *to, |
81486408 WD |
64 | break; |
65 | #endif | |
66 | case EXDEV: | |
fbcc0c79 WD |
67 | + if (!am_root && !(mode & S_IRUSR)) |
68 | + do_chmod(from, (mode & CHMOD_BITS) | S_IRUSR); | |
81486408 WD |
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 | } |