MCPcopy Create free account
hub / github.com/RsyncProject/rsync / set_rsync_acl

Function set_rsync_acl

acls.c:936–1003  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

934#endif
935
936static 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) {

Callers 1

set_aclFunction · 0.85

Calls 8

del_def_xattr_aclFunction · 0.85
sys_acl_delete_def_fileFunction · 0.85
SIVALFunction · 0.85
set_xattr_aclFunction · 0.85
pack_smb_aclFunction · 0.85
sys_acl_set_fileFunction · 0.85
str_acl_typeFunction · 0.85
rsyserrFunction · 0.70

Tested by

no test coverage detected