public unsafe override int GetAttr(ReadOnlySpan <byte> path, ref stat stat, FuseFileInfoRef fiRef) { try { if (verbosity > 10) { Console.WriteLine($"GetAttr {path.GetString()}"); } int error = 0, level = 0; var procs = ProcPath(path, ref error, ref level, mustExist: true); if (error != 0) { return(-LibC.ENOENT); } var last = procs.Pop(); //Console.WriteLine($" getAttr - last {last.Item1.GetString()} error {last.Item3}"); if (last.Item2 == null) { return(-last.Item3); } //Console.WriteLine($" return: {last.Item2.Stat.st_mode.ModMask()}"); last.Item2.GetStat(ref stat); var physFile = last.Item2.GetStatPhysical(); if (physFile != null) { var nstat = new stat(); var lc = LibC.lstat(RawDirs.ToBytePtr(physFile.ToArray()), &nstat); if (lc < 0) { return(-LibC.errno); } // Real stat is kept in a physical backing file (mostly st_size) // Not trying to keep this syned in the database yet last.Item2.GetStat(ref stat, nstat); } //Console.WriteLine($"Length Stat={stat.st_size}"); return(0); } catch (Exception ex) { Console.WriteLine($"Error GetAttr: {ex.Message} {ex.StackTrace}"); return(-LibC.EIO); } }
public unsafe new byte *toBp(ReadOnlySpan <byte> path) { return(RawDirs.ToBytePtr(path.ToArray())); }