internal override StorageSecurity GetSecurity(string absolutePath) { if (0 != Syscall.stat(absolutePath, out var stat)) { throw new LinuxIOException(Syscall.GetLastError()); } var uid = stat.st_uid; var uname = LinuxHelpers.GetUserName(uid); var gid = stat.st_gid; var gname = LinuxHelpers.GetGroupName(gid); var publicPermissions = LinuxHelpers.GetOtherPermissions(stat.st_mode); var userPermissions = LinuxHelpers.GetOwnerPermissions(stat.st_mode); var groupPermissions = LinuxHelpers.GetGroupPermissions(stat.st_mode); var builder = ImmutableDictionary.CreateBuilder <StorageActor, StoragePermissions>(); builder.Add(StorageActor.Public, publicPermissions); builder.Add(StorageActor.User(uname), userPermissions); builder.Add(StorageActor.Group(gname), groupPermissions); return(new StorageSecurity(builder.ToImmutable())); }
internal override void SetSecurity(string absolutePath, IStorageSecurity security) { if (0 != Syscall.stat(absolutePath, out var stat)) { throw new LinuxIOException(Syscall.GetLastError()); } var uid = stat.st_uid; var uname = LinuxHelpers.GetUserName(uid); var gid = stat.st_gid; var gname = LinuxHelpers.GetGroupName(gid); var ps = default(FilePermissions); // FIXME: emit warnings foreach (var kv in security) { var actor = kv.Key; var sp = kv.Value; switch (actor.ActorType) { case StorageActorType.Public: ps |= LinuxHelpers.FromOtherPermissions(sp); break; case StorageActorType.User when actor.Id == uname: ps |= LinuxHelpers.FromOwnerPermissions(sp); break; case StorageActorType.Group when actor.Id == gname: ps |= LinuxHelpers.FromGroupPermissions(sp); break; default: // warn break; } } if (0 != Syscall.chmod(absolutePath, ps)) { throw new LinuxIOException(Syscall.GetLastError()); } }