示例#1
0
        protected override Errno OnGetPathStatus(string path, out Stat stat)
        {
            stat = new Stat();

            string[] pieces = _vfs.SplitPath(path);

            if (pieces.Length == 0)
            {
                stat.st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0555");
                stat.st_nlink = 2;

                return(0);
            }

            long romSetId = _vfs.GetRomSetId(pieces[0]);

            if (romSetId <= 0)
            {
                if (pieces[0] != ".fuse_umount" ||
                    _umountToken == null)
                {
                    return(Errno.ENOENT);
                }

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(DateTime.UtcNow),
                    st_mtime   = NativeConvert.ToTimeT(DateTime.UtcNow),
                    st_blksize = 0,
                    st_blocks  = 0,
                    st_ino     = 0,
                    st_size    = 0
                };

                return(0);
            }

            RomSet romSet = _vfs.GetRomSet(romSetId);

            if (romSet == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 1)
            {
                stat.st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0555");
                stat.st_nlink = 2;
                stat.st_ctime = NativeConvert.ToTimeT(romSet.CreatedOn.ToUniversalTime());
                stat.st_mtime = NativeConvert.ToTimeT(romSet.UpdatedOn.ToUniversalTime());

                return(0);
            }

            CachedMachine machine = _vfs.GetMachine(romSetId, pieces[1]);

            if (machine == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 2)
            {
                stat = new Stat
                {
                    st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0555"),
                    st_nlink = 2,
                    st_ctime = NativeConvert.ToTimeT(machine.CreationDate.ToUniversalTime()),
                    st_mtime = NativeConvert.ToTimeT(machine.ModificationDate.ToUniversalTime())
                };

                return(0);
            }

            CachedFile file = _vfs.GetFile(machine.Id, pieces[2]);

            if (file != null)
            {
                if (pieces.Length != 3)
                {
                    return(Errno.ENOSYS);
                }

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(file.CreatedOn.ToUniversalTime()),
                    st_mtime   = NativeConvert.ToTimeT(file.FileLastModification?.ToUniversalTime() ?? file.UpdatedOn.ToUniversalTime()),
                    st_blksize = 512,
                    st_blocks  = (long)(file.Size / 512),
                    st_ino     = file.Id,
                    st_size    = (long)file.Size
                };

                return(0);
            }

            CachedDisk disk = _vfs.GetDisk(machine.Id, pieces[2]);

            if (disk != null)
            {
                if (pieces.Length != 3)
                {
                    return(Errno.ENOSYS);
                }

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(disk.CreatedOn.ToUniversalTime()),
                    st_mtime   = NativeConvert.ToTimeT(disk.UpdatedOn.ToUniversalTime()),
                    st_blksize = 512,
                    st_blocks  = (long)(disk.Size / 512),
                    st_ino     = disk.Id,
                    st_size    = (long)disk.Size
                };

                return(0);
            }

            CachedMedia media = _vfs.GetMedia(machine.Id, pieces[2]);

            if (media == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length != 3)
            {
                return(Errno.ENOSYS);
            }

            stat = new Stat
            {
                st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                st_nlink   = 1,
                st_ctime   = NativeConvert.ToTimeT(media.CreatedOn.ToUniversalTime()),
                st_mtime   = NativeConvert.ToTimeT(media.UpdatedOn.ToUniversalTime()),
                st_blksize = 512,
                st_blocks  = (long)(media.Size / 512),
                st_ino     = media.Id,
                st_size    = (long)media.Size
            };

            return(0);
        }
示例#2
0
        protected override Errno OnOpenHandle(string path, OpenedPathInfo info)
        {
            string[] pieces = _vfs.SplitPath(path);

            if (pieces.Length == 0)
            {
                return(Errno.EISDIR);
            }

            long romSetId = _vfs.GetRomSetId(pieces[0]);

            if (romSetId <= 0)
            {
                return(Errno.ENOENT);
            }

            RomSet romSet = _vfs.GetRomSet(romSetId);

            if (romSet == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 1)
            {
                return(Errno.EISDIR);
            }

            CachedMachine machine = _vfs.GetMachine(romSetId, pieces[1]);

            if (machine == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 2)
            {
                return(Errno.EISDIR);
            }

            long handle = 0;
            Stat stat;

            CachedFile file = _vfs.GetFile(machine.Id, pieces[2]);

            if (file != null)
            {
                if (pieces.Length > 3)
                {
                    return(Errno.ENOSYS);
                }

                if (file.Sha384 == null)
                {
                    return(Errno.ENOENT);
                }

                if (info.OpenAccess.HasFlag(OpenFlags.O_APPEND) ||
                    info.OpenAccess.HasFlag(OpenFlags.O_CREAT) ||
                    info.OpenAccess.HasFlag(OpenFlags.O_EXCL) ||
                    info.OpenAccess.HasFlag(OpenFlags.O_TRUNC))
                {
                    return(Errno.EROFS);
                }

                handle = _vfs.Open(file.Sha384, (long)file.Size);

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(file.CreatedOn.ToUniversalTime()),
                    st_mtime   = NativeConvert.ToTimeT(file.FileLastModification?.ToUniversalTime() ?? file.UpdatedOn.ToUniversalTime()),
                    st_blksize = 512,
                    st_blocks  = (long)(file.Size / 512),
                    st_ino     = file.Id,
                    st_size    = (long)file.Size
                };
            }
            else
            {
                CachedDisk disk = _vfs.GetDisk(machine.Id, pieces[2]);

                if (disk != null)
                {
                    if (pieces.Length > 3)
                    {
                        return(Errno.ENOSYS);
                    }

                    if (disk.Sha1 == null &&
                        disk.Md5 == null)
                    {
                        return(Errno.ENOENT);
                    }

                    if (info.OpenAccess.HasFlag(OpenFlags.O_APPEND) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_CREAT) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_EXCL) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_TRUNC))
                    {
                        return(Errno.EROFS);
                    }

                    handle = _vfs.OpenDisk(disk.Sha1, disk.Md5);

                    stat = new Stat
                    {
                        st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                        st_nlink   = 1,
                        st_ctime   = NativeConvert.ToTimeT(disk.CreatedOn.ToUniversalTime()),
                        st_mtime   = NativeConvert.ToTimeT(disk.UpdatedOn.ToUniversalTime()),
                        st_blksize = 512,
                        st_blocks  = (long)(disk.Size / 512),
                        st_ino     = disk.Id,
                        st_size    = (long)disk.Size
                    };
                }
                else
                {
                    CachedMedia media = _vfs.GetMedia(machine.Id, pieces[2]);

                    if (media == null)
                    {
                        return(Errno.ENOENT);
                    }

                    if (pieces.Length > 3)
                    {
                        return(Errno.ENOSYS);
                    }

                    if (media.Sha256 == null &&
                        media.Sha1 == null &&
                        media.Md5 == null)
                    {
                        return(Errno.ENOENT);
                    }

                    if (info.OpenAccess.HasFlag(OpenFlags.O_APPEND) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_CREAT) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_EXCL) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_TRUNC))
                    {
                        return(Errno.EROFS);
                    }

                    handle = _vfs.OpenMedia(media.Sha256, media.Sha1, media.Md5);

                    stat = new Stat
                    {
                        st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                        st_nlink   = 1,
                        st_ctime   = NativeConvert.ToTimeT(media.CreatedOn.ToUniversalTime()),
                        st_mtime   = NativeConvert.ToTimeT(media.UpdatedOn.ToUniversalTime()),
                        st_blksize = 512,
                        st_blocks  = (long)(media.Size / 512),
                        st_ino     = media.Id,
                        st_size    = (long)media.Size
                    };
                }
            }

            if (handle <= 0)
            {
                return(Errno.ENOENT);
            }

            info.Handle = new IntPtr(handle);

            _fileStatHandleCache[handle] = stat;

            return(0);
        }