Beispiel #1
0
        // Ioctl(u32 fd, u32 request, u32 bufcount, buffer<unknown, 0x21, 0>, buffer<unknown, 0x21, 0>, buffer<unknown, 0x21, 0>, buffer<unknown, 0x21, 0>) -> (i32 ret, u32 bsd_errno, buffer<unknown, 0x22, 0>, buffer<unknown, 0x22, 0>, buffer<unknown, 0x22, 0>, buffer<unknown, 0x22, 0>)
        public ResultCode Ioctl(ServiceCtx context)
        {
            int      socketFd    = context.RequestData.ReadInt32();
            BsdIoctl cmd         = (BsdIoctl)context.RequestData.ReadInt32();
            int      bufferCount = context.RequestData.ReadInt32();

            LinuxError errno  = LinuxError.EBADF;
            ISocket    socket = _context.RetrieveSocket(socketFd);

            if (socket != null)
            {
                switch (cmd)
                {
                case BsdIoctl.AtMark:
                    errno = LinuxError.SUCCESS;

                    (ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x22();

                    // FIXME: OOB not implemented.
                    context.Memory.Write(bufferPosition, 0);
                    break;

                default:
                    errno = LinuxError.EOPNOTSUPP;

                    Logger.Warning?.Print(LogClass.ServiceBsd, $"Unsupported Ioctl Cmd: {cmd}");
                    break;
                }
            }

            return(WriteBsdResult(context, 0, errno));
        }
Beispiel #2
0
        // Ioctl(u32 fd, u32 request, u32 bufcount, buffer<unknown, 0x21, 0>, buffer<unknown, 0x21, 0>, buffer<unknown, 0x21, 0>, buffer<unknown, 0x21, 0>) -> (i32 ret, u32 bsd_errno, buffer<unknown, 0x22, 0>, buffer<unknown, 0x22, 0>, buffer<unknown, 0x22, 0>, buffer<unknown, 0x22, 0>)
        public long Ioctl(ServiceCtx Context)
        {
            int      SocketFd    = Context.RequestData.ReadInt32();
            BsdIoctl Cmd         = (BsdIoctl)Context.RequestData.ReadInt32();
            int      BufferCount = Context.RequestData.ReadInt32();

            LinuxError Errno  = LinuxError.EBADF;
            BsdSocket  Socket = RetrieveSocket(SocketFd);

            if (Socket != null)
            {
                switch (Cmd)
                {
                case BsdIoctl.AtMark:
                    Errno = LinuxError.SUCCESS;

                    (long BufferPosition, long BufferSize) = Context.Request.GetBufferType0x22();

                    // FIXME: OOB not implemented.
                    Context.Memory.WriteInt32(BufferPosition, 0);
                    break;

                default:
                    Errno = LinuxError.EOPNOTSUPP;

                    Logger.PrintWarning(LogClass.ServiceBsd, $"Unsupported Ioctl Cmd: {Cmd}");
                    break;
                }
            }

            return(WriteBsdResult(Context, 0, Errno));
        }