shithub: snarflog

ref: 6e608f0e569550ffb3797896f16528c1fb5ba349
dir: /main.go/

View raw version
package main

import (
	"fmt"
	"os"
	"io"
	"sync"

	"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
	snarfStream fs.Stream
	mu sync.Mutex
}

func (f *snarfile) Write(fid uint64, offset uint64, data []byte) (uint32, error) {
	f.mu.Lock()
	defer f.mu.Unlock()

	f.realwrite.Write(data)
	_, err := f.snarfStream.Write(data)
	if err != nil {
		fmt.Printf("Error writing to snarfStream: %v\n", err)
	}
	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, stream fs.Stream) *snarfile {
	stat := fsys.NewStat(name, uid, gid, perm)
	return &snarfile{
		BaseFile: *fs.NewBaseFile(stat),
		real: real,
		realwrite: realwrite,
		snarfStream: stream,
	}
}

func main() {
	fid, dir := fs.NewFS("penny", "penny", proto.DMDIR|0644)

	snarfStream := fs.NewSkippingStream(1024) // Buffer size 1024 bytes
	snarfLogStat := fid.NewStat("snarflog", "penny", "penny", 0644)
	snarfLogFile := fs.NewStreamFile(snarfLogStat, snarfStream)

	if err := dir.AddChild(snarfLogFile); err != nil {
		fmt.Printf("Err adding snarflog: %s\n", err)
		return
	}

	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, snarfStream)

	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
	}
}