private readlink_cache_entry LinkGetEntry(FileInfo link) { string rpath = link.InternalPath; readlink_cache_entry entry; if (readlink_cache.TryGetValue(rpath, out entry)) { if (link.LastWriteTime <= entry.informationTime) { return(entry); } } else { entry = new readlink_cache_entry(); entry.informationTime = System.DateTime.MinValue; readlink_cache[rpath] = entry; } session.Message.Write(1, "$ readlink {0}", rpath); entry.targetPath = session.Sftp.noglob_readlink(rpath); entry.informationTime = System.DateTime.Now; entry.cyglink_data = null; return(entry); }
internal byte[] LinkGetCyglinkData(FileInfo link) { readlink_cache_entry entry = LinkGetEntry(link); if (entry.cyglink_data == null) { string content = entry.targetPath; if (content.Length > 0 && content[0] == '/' && content.StartsWith(this.RootDirectory)) { content = Unix.UnixPath.GetRelativePathTo(content, Unix.UnixPath.GetDirectoryPath(link.InternalPath)); } byte[] data = new byte[System.Text.Encoding.Unicode.GetByteCount(content) + 14]; System.Text.Encoding.ASCII.GetBytes("!<symlink>", 0, 10, data, 0); data[10] = (byte)'\xFF'; data[11] = (byte)'\xFE'; System.Text.Encoding.Unicode.GetBytes(content, 0, content.Length, data, 12); data[data.Length - 2] = (byte)'\0'; data[data.Length - 1] = (byte)'\0'; entry.cyglink_data = data; } return(entry.cyglink_data); }