// Write public override int Create(ReadOnlySpan <byte> path, mode_t mode, ref FuseFileInfo fi, Guid fileGuid) { path = base.TransformPath(path); if (debug) { Console.WriteLine($"NeoFS::Create()"); } fi.fh = 0; var res = LibC.open(toBp(path), fi.flags, mode); if (res < 0) { return(-LibC.errno); } fi.fh = (ulong)res; // Make these settable (these actually come in on the Init method, which TDMS isn't handling yet) var uid = (uid_t)10010; var gid = (gid_t)10010; res = LibC.chown(toBp(path), uid, gid); return(0); }
public override void Release(ReadOnlySpan <byte> path, ref FuseFileInfo fi, Guid fileGuid) { path = base.TransformPath(path); if (debug) { Console.WriteLine($"NeoFS::Release({RawDirs.HR(path)})"); } if (FileContexts.TryGetValue(fi.fh, out var context)) { if (context.ExtAssetSha1 != null) // Asset Mode { base.AssetRelease(path, ref fi, fileGuid); } FileContexts.Remove(fi.fh); } if (fi.fh > 0) { LibC.close((int)fi.fh); } fi.fh = 0; }
public override int Open(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { string name = Encoding.UTF8.GetString(path); Console.WriteLine($"Open -> {name}"); if (name == "") { return(-ENOENT); } if ((fi.flags & O_ACCMODE) == O_RDONLY) { if (name == "/stats") { return(0); } ulong fd = FindFreeFd(); fi.fh = fd; fi.direct_io = true; FileData f = new FileData() { FileName = name, FileStream = fs.OpenFile(FileSystemPath.Parse(name), FileAccess.Read) }; _openFiles.Add(fd, f); return(0); } else { return(-EACCES); } }
internal int AssetOpen(ReadOnlySpan <byte> path, ref FuseFileInfo fi, Guid fileGuid) { if (FileContexts.TryGetValue(fi.fh, out var context)) { // Lazy load these, but just once if (bakedAssets == null) { bakedAssets = NeoMongo.NeoDb.BakedAssets(); } if (bakedVolumes == null) { bakedVolumes = NeoMongo.NeoDb.BakedVolumes(); } //Console.WriteLine($"AssetOpen({RawDirs.HR(path)})"); // "Open" the file -- mostly just setup var assetLink = new AssetFileSystem.AssetFile.UnbakeForFuse(NeoMongo.NeoDb, bakedAssets, bakedVolumes, context.ExtAssetSha1); context.AssetLink = assetLink; // Save in file context -- mostly needed by read //Console.WriteLine($"Attach AssetLink to {fi.fh}"); return(0); // No error } else { Console.WriteLine($"AssetOpen no context? fh={fi.fh}"); } return(0); }
public override int Open(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { if (verbosity > 5) { Console.WriteLine($"Open {path.GetString()} Flags={flagString(fi.flags)}"); } int error = 0, level = 0; var procs = ProcPath(path, ref error, ref level, mustExist: true, isADir: false); if (error != 0) { Console.WriteLine($"Path gets error {error}"); return(-LibC.ENOENT); } var newFile = procs.Pop(); if (newFile.Item2 == null) { return(-LibC.ENOENT); } var fileRec = newFile.Item2; var oldFile = fileRec; var parentRec = procs.Pop(); if (parentRec.Item2 == null) { return(-LibC.ENOENT); } var par = parentRec.Item2; if (par.MaintLevel) { return(-LibC.EPERM); } // O_TRUNC deletes the file, so we should delete it. if ((fi.flags & LibC.O_TRUNC) != 0) { // Must delete the file Console.WriteLine($"File Deleted: {newFile.Item2.Name.GetString()} id={newFile.Item2._id} Version={newFile.Item2.Version}"); fileDelete(newFile.Item2, DeleteTypes.TRUNC); fileRec = NeoAssets.Mongo.NeoVirtFS.CreateNewFile(par._id, par.VolumeId, newFile.Item1, path, (mode_t)(uint)oldFile.Stat.st_mode); fileRec.Version = oldFile.Version + 1; NeoVirtFSCol.InsertOne(fileRec); fi.flags |= LibC.O_CREAT; // Otherwise it won't create the file again } fi.fh = storeHandler(FileDescriptor.FileHandlerFactory(fileRec, db, bac, bvol)); var fds = DescriptorStore[fi.fh]; return(fds.Handler.Open(fds, fi.flags)); }
// We're just handling the root (/) // All the fileopen stuff should be up the mount level public override int OpenDir(ReadOnlySpan <byte> path, ref FuseFileInfo fi, Guid fileGuid) { if (debug) { Console.WriteLine($"TopLevel::ReadDir({RawDirs.HR(path)})"); } return(0); }
public override int ReleaseDir(ReadOnlySpan <byte> path, ref FuseFileInfo fi, Guid fileGuid) { if (debug) { Console.WriteLine($"NeoFS::ReleaseDir({RawDirs.HR(path)})"); } path = base.TransformPath(path); return(0); }
public override int FSyncDir(ReadOnlySpan <byte> path, bool onlyData, ref FuseFileInfo fi) { if (verbosity > 0) { Console.WriteLine($"FSyncDir {path.GetString()}"); } return(base.FSyncDir(path, onlyData, ref fi)); }
public override int FSync(ReadOnlySpan <byte> path, ref FuseFileInfo fi, Guid fileGuid) { path = base.TransformPath(path); if (debug) { Console.WriteLine($"NeoFS::FSync()"); } return(0); // base.FSync(path, ref fi); }
public override int FSyncDir(ReadOnlySpan <byte> path, bool onlyData, ref FuseFileInfo fi, Guid fileGuid) { path = base.TransformPath(path); if (debug) { Console.WriteLine($"NeoFS::FSyncDir()"); } LibC.sync(); return(0); // base.FSyncDir(readOnlySpan, onlyData, ref fi); }
public override void Release(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { if (verbosity > 10) { Console.WriteLine($"Release {path.GetString()}"); } var fds = DescriptorStore[fi.fh]; fds.Handler.Release(fds); releaseHandler(fds); }
public override int Open(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { if (!path.SequenceEqual(_helloFilePath)) { return(-ENOENT); } if ((fi.flags & O_ACCMODE) != O_RDONLY) { return(-EACCES); } return(0); }
public override int FSync(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { if (verbosity > 0) { Console.WriteLine($"FSync {path.GetString()}"); } int error = 0, level = 0; var procs = ProcPath(path, ref error, ref level); if (error != 0) { return(-LibC.ENOENT); } return(0); }
public override int ReleaseDir(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { if (verbosity > 5) { Console.WriteLine($"ReleaseDir {path.GetString()} - NoOp"); } return(0); int error = 0, level = 0; var procs = ProcPath(path, ref error, ref level, isADir: true); if (error != 0) { return(-LibC.ENOENT); } return(base.ReleaseDir(path, ref fi)); }
public override int Create(ReadOnlySpan <byte> path, mode_t mode, ref FuseFileInfo fi) { string name = Encoding.UTF8.GetString(path); Console.WriteLine($"Create -> {name}"); ulong fd = FindFreeFd(); fi.fh = fd; TempFile f = new TempFile(); FileData file = new FileData() { FileName = name, TFile = f, FileStream = new FileStream(f.Path, FileMode.OpenOrCreate) }; _openFiles.Add(fd, file); fi.direct_io = true; return(0); }
internal void AssetRelease(ReadOnlySpan <byte> path, ref FuseFileInfo fi, Guid fileGuid) { if (FileContexts.TryGetValue(fi.fh, out var context)) { if (context.AssetLink != null) { //Console.WriteLine($"AssetRelease({RawDirs.HR(path)})"); var assetLink = context.AssetLink; assetLink.Release(); // Internally clear buffers and such } else { Console.WriteLine($"AssetLink is null? {RawDirs.HR(path)}"); } context.AssetLink = null; // Let this go out of scope context.ExtAssetSha1 = null; } else { Console.WriteLine($"AssetRelease no context? fh={fi.fh}"); } }
/*public override int Flush(ReadOnlySpan<byte> path, ref FuseFileInfo fi) * { * //return base.Flush(path, ref fi); * * _openFiles[fi.fh].Flush(); * if (_openFiles[fi.fh].TFile != null) * _openFiles[fi.fh].TFile.Dispose(); * return 0; * }*/ public override void Release(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { string name = Encoding.UTF8.GetString(path); Console.WriteLine("Release -> " + name); FileData f = _openFiles[fi.fh]; if (f.TFile != null) { f.FileStream.Position = 0; byte[] data = f.FileStream.ReadAllBytes(); using (Stream fstream = fs.CreateFile(FileSystemPath.Parse(f.FileName))) { fstream.Write(data, 0, data.Length); } fs.FlushTempFile(); dbfile.Flush(); f.TFile.Dispose(); } _openFiles.Remove(fi.fh); }
public override int Flush(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { return(base.Flush(path, ref fi)); }
public override void Release(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { base.Release(path, ref fi); }
public override int Read(ReadOnlySpan <byte> path, ulong offset, Span <byte> buffer, ref FuseFileInfo fi) { return(base.Read(path, offset, buffer, ref fi)); }
// Simple read file functions public override int Open(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { return(base.Open(path, ref fi)); }
public override int ReleaseDir(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { return(base.ReleaseDir(path, ref fi)); }
public override int FSyncDir(ReadOnlySpan <byte> readOnlySpan, bool onlyData, ref FuseFileInfo fi) { return(base.FSyncDir(readOnlySpan, onlyData, ref fi)); }
public override int ReadDir(ReadOnlySpan <byte> path, ulong offset, ReadDirFlags flags, DirectoryContent content, ref FuseFileInfo fi) { return(base.ReadDir(path, offset, flags, content, ref fi)); }
// Directory Functions public override int OpenDir(ReadOnlySpan <byte> path, ref FuseFileInfo fi) { var di = fs.DirectoryInfo(new VfsLinuxPath(path)); return(base.OpenDir(path, ref fi)); }
public override int FAllocate(ReadOnlySpan <byte> path, int mode, ulong offset, long length, ref FuseFileInfo fi) { return(base.FAllocate(path, mode, offset, length, ref fi)); }
public override int Write(ReadOnlySpan <byte> path, ulong off, ReadOnlySpan <byte> span, ref FuseFileInfo fi) { return(base.Write(path, off, span, ref fi)); }
// File Write operations public override int Create(ReadOnlySpan <byte> path, mode_t mode, ref FuseFileInfo fi) { return(base.Create(path, mode, ref fi)); }
public override int ReadDir(ReadOnlySpan <byte> path, ulong offset, ReadDirFlags flags, DirectoryContent content, ref FuseFileInfo fi) { if (!path.SequenceEqual(RootPath)) { return(-ENOENT); } content.AddEntry("."); content.AddEntry(".."); content.AddEntry("hello"); return(0); }
public override int Read(ReadOnlySpan <byte> path, ulong offset, Span <byte> buffer, ref FuseFileInfo fi) { if (offset > (ulong)_helloFileContent.Length) { return(0); } int intOffset = (int)offset; int length = (int)Math.Min(_helloFileContent.Length - intOffset, buffer.Length); _helloFileContent.AsSpan().Slice(intOffset, length).CopyTo(buffer); return(length); }