public static int Access(Thread current, ref Arch.ExceptionRegisters regs, UserPtr filenamePtr, int mode) { // XXX: This is vfs related, now let's assume that we're dealing with pass through fs. var buf = Globals.AllocateAlignedCompletionBuffer(PATH_MAX); if (!buf.isValid) return -ErrorCode.ENOMEM; var ret = filenamePtr.ReadString(current, buf); var accessCompletion = new BridgeCompletion(current, buf); ret = Arch.IPCStubs.AccessAsync(current.Parent.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), mode); if (ret < 0) { accessCompletion.Dispose(); return ret; } Globals.CompletionQueue.Enqueue(accessCompletion); current.SaveState(ref regs); current.AsyncReturn = true; return 0; }
private static void HandleBridgeCompletion(BridgeCompletion c, int ret) { var current = c.thr; c.Dispose(); current.ReturnFromCompletion(ret); }
public static int Access(Thread current, ref Arch.ExceptionRegisters regs, UserPtr filenamePtr, int mode) { // XXX: This is vfs related, now let's assume that we're dealing with pass through fs. var buf = Globals.AllocateAlignedCompletionBuffer(PATH_MAX); if (!buf.isValid) { return(-ErrorCode.ENOMEM); } var ret = filenamePtr.ReadString(current, buf); var accessCompletion = new BridgeCompletion(current, buf); ret = Arch.IPCStubs.AccessAsync(current.Parent.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), mode); if (ret < 0) { accessCompletion.Dispose(); return(ret); } Globals.CompletionQueue.Enqueue(accessCompletion); current.SaveState(ref regs); current.AsyncReturn = true; return(0); }
private static int BindOrConnect(int type, Thread current, ref Arch.ExceptionRegisters regs, int sockfd, UserPtr sockaddr, int addrlen) { Contract.Requires(type == SYS_BIND || type == SYS_CONNECT); var proc = current.Parent; var file = proc.LookupFile(sockfd); if (file == null) { return(-ErrorCode.EBADF); } if (file.inode.kind != GenericINode.INodeKind.SocketINodeKind) { return(-ErrorCode.ENOTSOCK); } if (addrlen > Globals.LinuxIPCBuffer.Length) { return(-ErrorCode.EINVAL); } var buf = Globals.AllocateAlignedCompletionBuffer(addrlen); if (!buf.isValid) { return(-ErrorCode.ENOMEM); } var completion = new BridgeCompletion(current, buf); if (sockaddr.Read(current, buf, addrlen) != 0) { completion.Dispose(); return(-ErrorCode.EFAULT); } if (type == SYS_BIND) { Arch.IPCStubs.BindAsync(proc.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), file.inode.LinuxFd, addrlen); } else if (type == SYS_CONNECT) { Arch.IPCStubs.ConnectAsync(proc.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), file.inode.LinuxFd, addrlen); } Globals.CompletionQueue.Enqueue(completion); current.SaveState(ref regs); current.AsyncReturn = true; return(0); }
private static int Setsockopt(Thread current, ref Arch.ExceptionRegisters regs, int sockfd, int level, int optname, UserPtr optval, int optlen) { var proc = current.Parent; var file = proc.LookupFile(sockfd); if (file == null) { return(-ErrorCode.EBADF); } if (file.inode.kind != GenericINode.INodeKind.SocketINodeKind) { return(-ErrorCode.ENOTSOCK); } if (optlen > Globals.LinuxIPCBuffer.Length) { return(-ErrorCode.EINVAL); } var buf = Globals.AllocateAlignedCompletionBuffer(optlen); if (!buf.isValid) { return(-ErrorCode.ENOMEM); } var completion = new BridgeCompletion(current, buf); if (optval.Read(current, buf, optlen) != 0) { completion.Dispose(); return(-ErrorCode.EFAULT); } Arch.IPCStubs.SetSockoptAsync(proc.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), file.inode.LinuxFd, level, optname, optlen); Globals.CompletionQueue.Enqueue(completion); current.SaveState(ref regs); current.AsyncReturn = true; return(0); }
private static int Setsockopt(Thread current, ref Arch.ExceptionRegisters regs, int sockfd, int level, int optname, UserPtr optval, int optlen) { var proc = current.Parent; var file = proc.LookupFile(sockfd); if (file == null) return -ErrorCode.EBADF; if (file.inode.kind != GenericINode.INodeKind.SocketINodeKind) return -ErrorCode.ENOTSOCK; if (optlen > Globals.LinuxIPCBuffer.Length) return -ErrorCode.EINVAL; var buf = Globals.AllocateAlignedCompletionBuffer(optlen); if (!buf.isValid) return -ErrorCode.ENOMEM; var completion = new BridgeCompletion(current, buf); if (optval.Read(current, buf, optlen) != 0) { completion.Dispose(); return -ErrorCode.EFAULT; } Arch.IPCStubs.SetSockoptAsync(proc.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), file.inode.LinuxFd, level, optname, optlen); Globals.CompletionQueue.Enqueue(completion); current.SaveState(ref regs); current.AsyncReturn = true; return 0; }
private static int BindOrConnect(int type, Thread current, ref Arch.ExceptionRegisters regs, int sockfd, UserPtr sockaddr, int addrlen) { Contract.Requires(type == SYS_BIND || type == SYS_CONNECT); var proc = current.Parent; var file = proc.LookupFile(sockfd); if (file == null) return -ErrorCode.EBADF; if (file.inode.kind != GenericINode.INodeKind.SocketINodeKind) return -ErrorCode.ENOTSOCK; if (addrlen > Globals.LinuxIPCBuffer.Length) return -ErrorCode.EINVAL; var buf = Globals.AllocateAlignedCompletionBuffer(addrlen); if (!buf.isValid) return -ErrorCode.ENOMEM; var completion = new BridgeCompletion(current, buf); if (sockaddr.Read(current, buf, addrlen) != 0) { completion.Dispose(); return -ErrorCode.EFAULT; } if (type == SYS_BIND) { Arch.IPCStubs.BindAsync(proc.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), file.inode.LinuxFd, addrlen); } else if (type == SYS_CONNECT) { Arch.IPCStubs.ConnectAsync(proc.helperPid, current.impl._value.thread._value, new Pointer(buf.Location), file.inode.LinuxFd, addrlen); } Globals.CompletionQueue.Enqueue(completion); current.SaveState(ref regs); current.AsyncReturn = true; return 0; }