Change Permission to Parameter

This commit is contained in:
Ac_K 2019-07-10 16:05:36 +02:00
commit 2897a29400
4 changed files with 20 additions and 22 deletions

View file

@ -8,8 +8,8 @@ using System.Text;
namespace Ryujinx.HLE.HOS.Services.Bsd namespace Ryujinx.HLE.HOS.Services.Bsd
{ {
[Service("bsd:s", true, (int)BsdServicePermissionLevel.System)] [Service("bsd:s", true)]
[Service("bsd:u", true, (int)BsdServicePermissionLevel.User)] [Service("bsd:u", false)]
class IClient : IpcService class IClient : IpcService
{ {
private static Dictionary<WsaError, LinuxError> _errorMap = new Dictionary<WsaError, LinuxError> private static Dictionary<WsaError, LinuxError> _errorMap = new Dictionary<WsaError, LinuxError>
@ -96,7 +96,7 @@ namespace Ryujinx.HLE.HOS.Services.Bsd
{0, 0} {0, 0}
}; };
private BsdServicePermissionLevel _permissionLevel; private bool _isPrivileged;
private List<BsdSocket> _sockets = new List<BsdSocket>(); private List<BsdSocket> _sockets = new List<BsdSocket>();
@ -104,7 +104,7 @@ namespace Ryujinx.HLE.HOS.Services.Bsd
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IClient(ServiceCtx context, int permission) public IClient(ServiceCtx context, bool isPrivileged)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {
@ -138,7 +138,7 @@ namespace Ryujinx.HLE.HOS.Services.Bsd
{ 27, DuplicateSocket } { 27, DuplicateSocket }
}; };
_permissionLevel = (BsdServicePermissionLevel)permission; _isPrivileged = isPrivileged;
} }
private LinuxError ConvertError(WsaError errorCode) private LinuxError ConvertError(WsaError errorCode)
@ -207,7 +207,7 @@ namespace Ryujinx.HLE.HOS.Services.Bsd
{ {
return WriteBsdResult(context, -1, LinuxError.EPROTONOSUPPORT); return WriteBsdResult(context, -1, LinuxError.EPROTONOSUPPORT);
} }
else if ((type == SocketType.Seqpacket || type == SocketType.Raw) && _permissionLevel == BsdServicePermissionLevel.User) else if ((type == SocketType.Seqpacket || type == SocketType.Raw) && !_isPrivileged)
{ {
if (domain != AddressFamily.InterNetwork || type != SocketType.Raw || protocol != ProtocolType.Icmp) if (domain != AddressFamily.InterNetwork || type != SocketType.Raw || protocol != ProtocolType.Icmp)
{ {
@ -1173,7 +1173,7 @@ namespace Ryujinx.HLE.HOS.Services.Bsd
LinuxError errno = LinuxError.ENOENT; LinuxError errno = LinuxError.ENOENT;
int newSockFd = -1; int newSockFd = -1;
if (_permissionLevel == BsdServicePermissionLevel.System) if (_isPrivileged)
{ {
errno = LinuxError.EBADF; errno = LinuxError.EBADF;

View file

@ -7,11 +7,11 @@ using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.HOS.Services.Friend namespace Ryujinx.HLE.HOS.Services.Friend
{ {
[Service("friend:a", true, (int)FriendServicePermissionLevel.Admin)] [Service("friend:a", FriendServicePermissionLevel.Admin)]
[Service("friend:m", true, (int)FriendServicePermissionLevel.Manager)] [Service("friend:m", FriendServicePermissionLevel.Manager)]
[Service("friend:s", true, (int)FriendServicePermissionLevel.System)] [Service("friend:s", FriendServicePermissionLevel.System)]
[Service("friend:u", true, (int)FriendServicePermissionLevel.User)] [Service("friend:u", FriendServicePermissionLevel.User)]
[Service("friend:v", true, (int)FriendServicePermissionLevel.Overlay)] [Service("friend:v", FriendServicePermissionLevel.Overlay)]
class IServiceCreator : IpcService class IServiceCreator : IpcService
{ {
private FriendServicePermissionLevel _permissionLevel; private FriendServicePermissionLevel _permissionLevel;
@ -20,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Services.Friend
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IServiceCreator(ServiceCtx context, int permission) public IServiceCreator(ServiceCtx context, FriendServicePermissionLevel permissionLevel)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {
@ -29,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Friend
{ 2, CreateDaemonSuspendSessionService }, // 4.0.0+ { 2, CreateDaemonSuspendSessionService }, // 4.0.0+
}; };
_permissionLevel = (FriendServicePermissionLevel)permission; _permissionLevel = permissionLevel;
} }
// CreateFriendService() -> object<nn::friends::detail::ipc::IFriendService> // CreateFriendService() -> object<nn::friends::detail::ipc::IFriendService>

View file

@ -6,14 +6,12 @@ namespace Ryujinx.HLE.HOS.Services
public class ServiceAttribute : Attribute public class ServiceAttribute : Attribute
{ {
public readonly string Name; public readonly string Name;
public readonly bool UsePermission; public readonly object Parameter;
public readonly int Permission;
public ServiceAttribute(string name, bool usePermission = false, int permission = 0) public ServiceAttribute(string name, object parameter = null)
{ {
Name = name; Name = name;
UsePermission = usePermission; Parameter = parameter;
Permission = permission;
} }
} }
} }

View file

@ -90,8 +90,8 @@ namespace Ryujinx.HLE.HOS.Services.Sm
{ {
ServiceAttribute serviceAttribute = (ServiceAttribute)type.GetCustomAttributes().First(service => ((ServiceAttribute)service).Name == name); ServiceAttribute serviceAttribute = (ServiceAttribute)type.GetCustomAttributes().First(service => ((ServiceAttribute)service).Name == name);
session.ClientSession.Service = serviceAttribute.UsePermission ? (IpcService)Activator.CreateInstance(type, context, serviceAttribute.Permission) session.ClientSession.Service = serviceAttribute.Parameter != null ? (IpcService)Activator.CreateInstance(type, context, serviceAttribute.Parameter)
: (IpcService)Activator.CreateInstance(type, context); : (IpcService)Activator.CreateInstance(type, context);
} }
else else
{ {