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);
            }
        }
Exemple #2
0
 public unsafe new byte *toBp(ReadOnlySpan <byte> path)
 {
     return(RawDirs.ToBytePtr(path.ToArray()));
 }