protected override Errno OnGetPathStatus(string path, out Stat stat) { stat = new Stat(); if (path == "/") { DirectoryInfo di = new DirectoryInfo(Source); stat.st_mode = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0666"); stat.st_size = (4096 * (long)Math.Ceiling(walker.RootNode.Nodes.Count * 0.1)); stat.st_mtime = NativeConvert.FromDateTime(di.LastWriteTime); stat.st_nlink = 2 + (ulong)Helpers.GetEntriesCount(walker.RootNode, new EntryKind[] { EntryKind.Directory, EntryKind.ZipFile, EntryKind.ZipDirectoryEntry }); } else { try { Entry fsEntry = walker.SearchEntry(path.Substring(1)); if (fsEntry == null) { return(Errno.ENOENT); } Helpers.SetStatInfo(fsEntry, ref stat); } catch (DirectoryNotFoundException) { return(Errno.ENOTDIR); } catch (IOException) { return(Errno.EIO); } } return(0); }
static internal void SetStatInfo(Entry entry, ref Stat stat) { stat.st_mode = NativeConvert.FromOctalPermissionString("0444"); switch (entry.Kind) { case EntryKind.Directory: case EntryKind.ZipDirectoryEntry: case EntryKind.ZipFile: stat.st_mode |= FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0222"); stat.st_nlink = 2 + ((entry.Node != null) ? (ulong)GetEntriesCount(entry.Node, new EntryKind[] { EntryKind.Directory, EntryKind.ZipFile, EntryKind.ZipDirectoryEntry }) : 0); break; case EntryKind.File: stat.st_mode |= FilePermissions.S_IFLNK | NativeConvert.FromOctalPermissionString("0777"); stat.st_nlink = 1; break; case EntryKind.ZipFileEntry: stat.st_mode |= FilePermissions.S_IFREG; stat.st_nlink = 1; break; } stat.st_size = entry.Size; stat.st_mtime = NativeConvert.FromDateTime(entry.LastWriteTime); }
internal DirectoryEntry MakeDirectoryEntry(string name, DateTime writeTime, long size) { DirectoryEntry dirEntry = new DirectoryEntry(name); dirEntry.Stat.st_mode = NativeConvert.FromOctalPermissionString("0666") | FilePermissions.S_IFDIR; dirEntry.Stat.st_size = size; dirEntry.Stat.st_mtime = NativeConvert.FromDateTime(writeTime); return(dirEntry); }