More work on porting the SSH kitten

This commit is contained in:
Kovid Goyal
2023-02-23 20:20:26 +05:30
parent 6b71b58997
commit 9870c94007
9 changed files with 515 additions and 46 deletions

View File

@@ -3,13 +3,13 @@
package ssh
import (
"bytes"
"archive/tar"
_ "embed"
"encoding/binary"
"errors"
"fmt"
"io"
"kitty/tools/utils"
"strconv"
"strings"
"path/filepath"
)
var _ = fmt.Print
@@ -17,21 +17,48 @@ var _ = fmt.Print
//go:embed data_generated.bin
var embedded_data string
type Container = map[string][]byte
type Entry struct {
metadata *tar.Header
data []byte
}
type Container map[string]Entry
var Data = (&utils.Once[Container]{Run: func() Container {
raw := utils.ReadCompressedEmbeddedData(embedded_data)
num_of_entries := binary.LittleEndian.Uint32(raw)
raw = raw[4:]
ans := make(Container, num_of_entries)
idx := bytes.IndexByte(raw, '\n')
text := utils.UnsafeBytesToString(raw[:idx])
raw = raw[idx+1:]
for _, record := range strings.Split(text, ",") {
parts := strings.Split(record, " ")
offset, _ := strconv.Atoi(parts[1])
size, _ := strconv.Atoi(parts[2])
ans[parts[0]] = raw[offset : offset+size]
tr := tar.NewReader(utils.ReaderForCompressedEmbeddedData(embedded_data))
ans := make(Container, 64)
for {
hdr, err := tr.Next()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
panic(err)
}
data, err := utils.ReadAll(tr, int(hdr.Size))
if err != nil {
panic(err)
}
ans[hdr.Name] = Entry{hdr, data}
}
return ans
}}).Get
func (self Container) files_matching(include_pattern string, exclude_patterns ...string) []string {
ans := make([]string, 0, len(self))
for name := range self {
if matched, err := filepath.Match(include_pattern, name); matched && err == nil {
excluded := false
for _, pat := range exclude_patterns {
if matched, err := filepath.Match(pat, name); matched && err == nil {
excluded = true
break
}
}
if !excluded {
ans = append(ans, name)
}
}
}
return ans
}