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); }
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); }