| 934 | #endif |
| 935 | |
| 936 | static int set_rsync_acl(const char *fname, acl_duo *duo_item, |
| 937 | SMB_ACL_TYPE_T type, stat_x *sxp, mode_t mode) |
| 938 | { |
| 939 | if (type == SMB_ACL_TYPE_DEFAULT |
| 940 | && duo_item->racl.user_obj == NO_ENTRY) { |
| 941 | int rc; |
| 942 | #ifdef SUPPORT_XATTRS |
| 943 | /* --fake-super support: delete default ACL from xattrs. */ |
| 944 | if (am_root < 0) |
| 945 | rc = del_def_xattr_acl(fname); |
| 946 | else |
| 947 | #endif |
| 948 | rc = sys_acl_delete_def_file(fname); |
| 949 | if (rc < 0) { |
| 950 | rsyserr(FERROR_XFER, errno, "set_acl: sys_acl_delete_def_file(%s)", |
| 951 | fname); |
| 952 | return -1; |
| 953 | } |
| 954 | #ifdef SUPPORT_XATTRS |
| 955 | } else if (am_root < 0) { |
| 956 | /* --fake-super support: store ACLs in an xattr. */ |
| 957 | int cnt = duo_item->racl.names.count; |
| 958 | size_t len = 4*4 + cnt * (4+4); |
| 959 | char *buf = new_array(char, len); |
| 960 | int rc; |
| 961 | |
| 962 | SIVAL(buf, 0, duo_item->racl.user_obj); |
| 963 | SIVAL(buf, 4, duo_item->racl.group_obj); |
| 964 | SIVAL(buf, 8, duo_item->racl.mask_obj); |
| 965 | SIVAL(buf, 12, duo_item->racl.other_obj); |
| 966 | |
| 967 | if (cnt) { |
| 968 | char *bp = buf + 4*4; |
| 969 | id_access *ida = duo_item->racl.names.idas; |
| 970 | for ( ; cnt--; ida++, bp += 4+4) { |
| 971 | SIVAL(bp, 0, ida->id); |
| 972 | SIVAL(bp, 4, ida->access); |
| 973 | } |
| 974 | } |
| 975 | rc = set_xattr_acl(fname, type == SMB_ACL_TYPE_ACCESS, buf, len); |
| 976 | free(buf); |
| 977 | return rc; |
| 978 | #endif |
| 979 | } else { |
| 980 | mode_t cur_mode = sxp->st.st_mode; |
| 981 | if (!duo_item->sacl |
| 982 | && !pack_smb_acl(&duo_item->sacl, &duo_item->racl)) |
| 983 | return -1; |
| 984 | #ifdef HAVE_OSX_ACLS |
| 985 | (void)mode; /* eliminate compiler warning */ |
| 986 | #else |
| 987 | if (type == SMB_ACL_TYPE_ACCESS) { |
| 988 | cur_mode = change_sacl_perms(duo_item->sacl, &duo_item->racl, cur_mode, mode); |
| 989 | if (cur_mode == (mode_t)-1) |
| 990 | return 0; |
| 991 | } |
| 992 | #endif |
| 993 | if (sys_acl_set_file(fname, type, duo_item->sacl) < 0) { |
no test coverage detected