Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }