shithub: snarflog

Download patch

ref: dbe70e0ee435c2cced5537c72cd9270a2d80a0bb
parent: 262a17be0ea3508423ecc9be5dbd5479d91a39a9
author: penny <penny@limitedideas.org>
date: Mon Dec 1 11:59:17 EST 2025

fix long snarfs

--- a/main.go
+++ b/main.go
@@ -16,28 +16,44 @@
 type snarfile struct {
 	fs.BaseFile
 	snarfStream fs.Stream
-	mu sync.Mutex
+	mu          sync.Mutex
+	writemap    map[uint64][]byte
 }
 
 func (f *snarfile) Write(fid uint64, offset uint64, data []byte) (uint32, error) {
 	f.mu.Lock()
 	defer f.mu.Unlock()
-	realwrite, err := os.OpenFile("/mnt/snarflog/rsnarf", os.O_WRONLY, 0644)
-	if err != nil {
-		fmt.Printf("Coudn't open snarf for writing: %s\n", err)
-		return 0, err
-	}
+	f.writemap[fid] = append(f.writemap[fid], data...)
+	return uint32(len(data)), nil
+}
 
-	defer realwrite.Close()
-	realwrite.Write(data)
-	_, err = f.snarfStream.Write(data)
-	if err != nil {
-		return 0, err
+func (f *snarfile) Close(fid uint64) error {
+	f.mu.Lock()
+	defer f.mu.Unlock()
+
+	if data, ok := f.writemap[fid]; ok {
+		realwrite, err := os.OpenFile("/mnt/snarflog/rsnarf", os.O_WRONLY, 0644)
+		if err != nil {
+			fmt.Printf("Coudn't open snarf for writing: %s\n", err)
+			delete(f.writemap, fid)
+			return err
+		}
+		defer realwrite.Close()
+		_, err = f.snarfStream.Write(data)
+		if err != nil {
+			return err
+		}
+		if len(data) > 0 && data[len(data)-1] != '\n' {
+			f.snarfStream.Write([]byte{'\n'})
+		}
+
+		if _, err := realwrite.Write(data); err != nil {
+			delete(f.writemap, fid)
+			return err
+		}
+		delete(f.writemap, fid)
 	}
-	if len(data) > 0 && data[len(data)-1] != '\n' {
-		f.snarfStream.Write([]byte{'\n'})
-	}
-	return uint32(len(data)), nil
+	return nil
 }
 
 func (f *snarfile) Read(fid uint64, offset uint64, count uint64) ([]byte, error) {
@@ -58,8 +74,9 @@
 func newSnarf(fsys *fs.FS, name, uid, gid string, perm uint32, stream fs.Stream) *snarfile {
 	stat := fsys.NewStat(name, uid, gid, perm)
 	return &snarfile{
-		BaseFile: *fs.NewBaseFile(stat),
+		BaseFile:    *fs.NewBaseFile(stat),
 		snarfStream: stream,
+		writemap:    make(map[uint64][]byte),
 	}
 }
 
--