From ff3f8c881976aacaa8b14f9c5df4163b70077584 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Mon, 3 Aug 2026 18:04:12 +0200 Subject: [PATCH] fix: ollie-9p write/rdwr propagate clunk errors The 9P protocol returns write handler errors via Rclunk, not Rwrite. cmdWrite and cmdRdwr were using defer fid.Close() which discarded the error. Now they check fid.Close() return value and exit non-zero on failure, allowing the GUI to detect rename errors. --- cmd/ollie-9p/main.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cmd/ollie-9p/main.go b/cmd/ollie-9p/main.go index 696f8c2..40584a1 100644 --- a/cmd/ollie-9p/main.go +++ b/cmd/ollie-9p/main.go @@ -193,10 +193,15 @@ func cmdWrite(path string) { if err != nil { fatalf("open %s: %v", path, err) } - defer fid.Close() if _, err := io.Copy(fid, os.Stdin); err != nil { + fid.Close() fatalf("write %s: %v", path, err) } + // Close flushes buffered writes; errors (e.g., validation failures) + // are returned via Rclunk. + if err := fid.Close(); err != nil { + fatalf("close %s: %v", path, err) + } } func cmdRdwr(path string) { @@ -205,24 +210,30 @@ func cmdRdwr(path string) { if err != nil { fatalf("open %s: %v", path, err) } - defer fid.Close() // Write stdin data, err := io.ReadAll(os.Stdin) if err != nil { + fid.Close() fatalf("read stdin: %v", err) } if _, err := fid.Write(data); err != nil { + fid.Close() fatalf("write %s: %v", path, err) } // Seek back to 0 and read response if _, err := fid.Seek(0, 0); err != nil { + fid.Close() fatalf("seek %s: %v", path, err) } if _, err := io.Copy(os.Stdout, fid); err != nil { + fid.Close() fatalf("read %s: %v", path, err) } + if err := fid.Close(); err != nil { + fatalf("close %s: %v", path, err) + } } func cmdStat(path string) {