/* Set the security descriptor @desc of size @desc_size on the NTFS inode @ni. */ static int ntfs_3g_set_security_descriptor(ntfs_inode *ni, const void *desc, size_t desc_size) { struct SECURITY_CONTEXT sec_ctx; u8 *desc_fixed; int ret = 0; memset(&sec_ctx, 0, sizeof(sec_ctx)); sec_ctx.vol = ni->vol; desc_fixed = sd_fixup(desc, &desc_size); if (ntfs_set_ntfs_acl(&sec_ctx, ni, desc_fixed, desc_size, 0)) ret = WIMLIB_ERR_SET_SECURITY; if (desc_fixed != desc) FREE(desc_fixed); return ret; }
int ntfs_xattr_system_setxattr(struct SECURITY_CONTEXT *scx, enum SYSTEMXATTRS attr, ntfs_inode *ni, ntfs_inode *dir_ni, const char *value, size_t size, int flags) { int res; int i; char buf[4*sizeof(u64)]; #if POSIXACLS #if __BYTE_ORDER == __BIG_ENDIAN struct POSIX_ACL *acl; #endif #endif switch (attr) { case XATTR_NTFS_ACL : res = ntfs_set_ntfs_acl(scx, ni, value, size, flags); break; #if POSIXACLS #if __BYTE_ORDER == __BIG_ENDIAN case XATTR_POSIX_ACC : acl = (struct POSIX_ACL*)ntfs_malloc(size); if (acl) { if (!le_acl_to_cpu((const struct LE_POSIX_ACL*)value, size, acl)) { res = ntfs_set_posix_acl(scx ,ni , nf_ns_xattr_posix_access, (char*)acl, size, flags); } else res = -errno; free(acl); } else res = -errno; break; case XATTR_POSIX_DEF : acl = (struct POSIX_ACL*)ntfs_malloc(size); if (acl) { if (!le_acl_to_cpu((const struct LE_POSIX_ACL*)value, size, acl)) { res = ntfs_set_posix_acl(scx ,ni , nf_ns_xattr_posix_default, (char*)acl, size, flags); } else res = -errno; free(acl); } else res = -errno; break; #else case XATTR_POSIX_ACC : res = ntfs_set_posix_acl(scx ,ni , nf_ns_xattr_posix_access, value, size, flags); break; case XATTR_POSIX_DEF : res = ntfs_set_posix_acl(scx, ni, nf_ns_xattr_posix_default, value, size, flags); break; #endif #endif case XATTR_NTFS_ATTRIB : res = ntfs_set_ntfs_attrib(ni, value, size, flags); break; case XATTR_NTFS_ATTRIB_BE : if (value && (size >= 4)) { memcpy(buf,value,4); fix_big_endian(buf,4); res = ntfs_set_ntfs_attrib(ni, buf, 4, flags); } else res = ntfs_set_ntfs_attrib(ni, value, size, flags); break; case XATTR_NTFS_EFSINFO : if (ni->vol->efs_raw) res = ntfs_set_efs_info(ni, value, size, flags); else res = -EPERM; break; case XATTR_NTFS_REPARSE_DATA : res = ntfs_set_ntfs_reparse_data(ni, value, size, flags); break; case XATTR_NTFS_OBJECT_ID : res = ntfs_set_ntfs_object_id(ni, value, size, flags); break; case XATTR_NTFS_DOS_NAME: if (dir_ni) /* warning : this closes both inodes */ res = ntfs_set_ntfs_dos_name(ni, dir_ni, value, size, flags); else res = -errno; break; case XATTR_NTFS_TIMES: res = ntfs_inode_set_times(ni, value, size, flags); break; case XATTR_NTFS_TIMES_BE: if (value && (size > 0) && (size <= 4*sizeof(u64))) { memcpy(buf,value,size); for (i=0; (i+1)*sizeof(u64)<=size; i++) fix_big_endian(&buf[i*sizeof(u64)], sizeof(u64)); res = ntfs_inode_set_times(ni, buf, size, flags); } else res = ntfs_inode_set_times(ni, value, size, flags); break; case XATTR_NTFS_CRTIME: res = ntfs_inode_set_times(ni, value, (size >= sizeof(u64) ? sizeof(u64) : size), flags); break; case XATTR_NTFS_CRTIME_BE: if (value && (size >= sizeof(u64))) { memcpy(buf,value,sizeof(u64)); fix_big_endian(buf,sizeof(u64)); res = ntfs_inode_set_times(ni, buf, sizeof(u64), flags); } else res = ntfs_inode_set_times(ni, value, size, flags); break; case XATTR_NTFS_EA : res = ntfs_set_ntfs_ea(ni, value, size, flags); break; default : errno = ENOTSUP; res = -errno; break; } return (res); }