Exemplo n.º 1
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;
        }
Exemplo n.º 2
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;
        }