Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
 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);
 }