internal static OpenFileCompletion OpenAndReadPagesAsync(Thread current, byte[] filename, int flags, int mode) { Contract.Requires(filename.Length < READ_AHEAD_PAGES * Arch.ArchDefinition.PageSize); Utils.Assert(filename[filename.Length - 1] == 0); var size = READ_AHEAD_PAGES * Arch.ArchDefinition.PageSize; var buf = Globals.AllocateAlignedCompletionBuffer(size); if (!buf.isValid) return null; buf.CopyFrom(0, filename); var completion = new OpenFileCompletion(current, GenericINode.INodeKind.SecureFSINodeKind, buf, flags, mode); Arch.IPCStubs.OpenAndReadPagesAsync(current.Parent.helperPid, current.impl._value.thread._value, new Pointer(completion.buf.Location), buf.Length / Arch.ArchDefinition.PageSize, flags, mode); return completion; }
internal static OpenFileCompletion OpenAndReadPagesAsync(Thread current, byte[] filename, int flags, int mode) { Contract.Requires(filename.Length < READ_AHEAD_PAGES * Arch.ArchDefinition.PageSize); Utils.Assert(filename[filename.Length - 1] == 0); var size = READ_AHEAD_PAGES * Arch.ArchDefinition.PageSize; var buf = Globals.AllocateAlignedCompletionBuffer(size); if (!buf.isValid) { return(null); } buf.CopyFrom(0, filename); var completion = new OpenFileCompletion(current, GenericINode.INodeKind.SecureFSINodeKind, buf, flags, mode); Arch.IPCStubs.OpenAndReadPagesAsync(current.Parent.helperPid, current.impl._value.thread._value, new Pointer(completion.buf.Location), buf.Length / Arch.ArchDefinition.PageSize, flags, mode); return(completion); }
internal static void HandleOpenFileCompletion(OpenFileCompletion c, int linux_fd, int size) { var current = c.thr; var proc = current.Parent; GenericINode inode = null; int ret = linux_fd; if (ret < 0) { c.Dispose(); current.ReturnFromCompletion(ret); return; } switch (c.fileKind) { case GenericINode.INodeKind.ArchINodeKind: inode = new Arch.ArchINode(linux_fd, (uint)size, proc.helperPid); break; case GenericINode.INodeKind.SecureFSINodeKind: inode = SecureFS.HandleOpenFileCompletion(c, linux_fd, size, ref ret); break; default: break; } if (inode != null) { var file = new File(proc, inode, c.flags, c.mode); ret = proc.GetUnusedFd(); proc.InstallFd(ret, file); } c.Dispose(); current.ReturnFromCompletion(ret); return; }
internal static GenericINode HandleOpenFileCompletion(OpenFileCompletion completion, int linux_fd, int size, ref int p_ret) { var current = completion.thr; return(SecureFSInode.Create(current, completion.buf, linux_fd, size, ref p_ret)); }
internal static GenericINode HandleOpenFileCompletion(OpenFileCompletion completion, int linux_fd, int size, ref int p_ret) { var current = completion.thr; return SecureFSInode.Create(current, completion.buf, linux_fd, size, ref p_ret); }