ref: 295d55901af45d32853794745613ae741dab66e8
dir: /main.go/
package main
import (
"fmt"
"os"
"io"
"github.com/knusbaum/go9p/fs"
"github.com/knusbaum/go9p"
"github.com/knusbaum/go9p/proto"
)
type snarfile struct {
fs.BaseFile
real *os.File
realwrite *os.File
}
func (f *snarfile) Write(fid uint64, offset uint64, data []byte) (uint32, error) {
f.realwrite.Write(data)
fmt.Println(string(data))
return uint32(len(data)), nil
}
func (f *snarfile) Read(fid uint64, offset uint64, count uint64) ([]byte, error) {
var reader io.Reader = f.real
content, err := io.ReadAll(reader)
return content, err
}
func newSnarf(fsys *fs.FS, name, uid, gid string, perm uint32, real *os.File, realwrite *os.File) *snarfile {
stat := fsys.NewStat(name, uid, gid, perm)
return &snarfile{
BaseFile: *fs.NewBaseFile(stat),
real: real,
realwrite: realwrite,
}
}
func main() {
fid, dir := fs.NewFS("penny", "penny", proto.DMDIR|0644)
realread, err := os.OpenFile("/dev/snarf", os.O_RDONLY, 0644)
if err != nil {
fmt.Printf("Coudn't open snarf: %s\n", err)
return
}
realwrite, err := os.OpenFile("/dev/snarf", os.O_WRONLY, 0644)
if err != nil {
fmt.Printf("Coudn't open snarf for writing: %s\n", err)
return
}
snarf := newSnarf(fid, "snarf", "penny", "penny", 0644, realread, realwrite)
if err := dir.AddChild(snarf); err != nil {
fmt.Printf("Err: %s\n", err)
return
}
if err := go9p.PostSrv("snarflogger", fid.Server()); err != nil {
fmt.Printf("Failed to post server: %v\n", err)
return
}
}