+/* This is only called when we aren't preserving permissions. Figure out what
+ * the permissions should be and return them merged back into the mode. */
+mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int dflt_perms,
+ int exists)
+{
+ int new_mode;
+ /* If the file already exists, we'll return the local permissions,
+ * possibly tweaked by the --executability option. */
+ if (exists) {
+ new_mode = (flist_mode & ~CHMOD_BITS) | (stat_mode & CHMOD_BITS);
+ if (preserve_executability && S_ISREG(flist_mode)) {
+ /* If the source file is executable, grant execute
+ * rights to everyone who can read, but ONLY if the
+ * file isn't already executable. */
+ if (!(flist_mode & 0111))
+ new_mode &= ~0111;
+ else if (!(stat_mode & 0111))
+ new_mode |= (new_mode & 0444) >> 2;
+ }
+ } else {
+ /* Apply destination default permissions and turn
+ * off special permissions. */
+ new_mode = flist_mode & (~CHMOD_BITS | dflt_perms);
+ }
+ return new_mode;
+}
+
+int set_file_attrs(const char *fname, struct file_struct *file, statx *sxp,
+ const char *fnamecmp, int flags)