// 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)); }
// 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)); }