// 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);
        }
Пример #12
0
        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));
 }
Пример #29
0
 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);
 }
Пример #30
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);
        }