diff --git a/cmd/p9/export.go b/cmd/p9/export.go index 464af52..1efe96b 100644 --- a/cmd/p9/export.go +++ b/cmd/p9/export.go @@ -54,7 +54,12 @@ func (cmd *exportCmd) Run(options GlobalOptions, args []string) error { if err != nil { return util.Errorf("listen: %w", err) } - defer lis.Close() + defer func() { + err := lis.Close() + if err != nil { + _, _ = fmt.Fprintf(fset.Output(), "Error closing listener: %v", err) + } + }() errC := make(chan error, 1) go func() { diff --git a/cmd/p9/ls.go b/cmd/p9/ls.go index b51a46e..4ce8a54 100644 --- a/cmd/p9/ls.go +++ b/cmd/p9/ls.go @@ -55,7 +55,12 @@ func (cmd *lsCmd) Run(options GlobalOptions, args []string) error { if err != nil { return util.Errorf("open %q: %w", arg, err) } - defer d.Close() + defer func(d *p9.Remote) { + err := d.Close() + if err != nil { + _, _ = fmt.Fprintf(fset.Output(), "Error closing remote %q: %v\n", arg, err) + } + }(d) fi, err := d.Stat("") if err != nil { @@ -96,7 +101,9 @@ func (cmd *lsCmd) printEntries(entries []p9.DirEntry) { ' ', 0, ) - defer w.Flush() + defer func() { + _ = w.Flush() + }() for _, entry := range entries { if cmd.showDetails { diff --git a/cmd/p9/p9.go b/cmd/p9/p9.go index c4102df..b01222a 100644 --- a/cmd/p9/p9.go +++ b/cmd/p9/p9.go @@ -106,7 +106,12 @@ func attach(options GlobalOptions, f func(*p9.Remote) error) error { if err != nil { return err } - defer c.Close() + defer func() { + err := c.Close() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Error closing connection: %v", err) + } + }() _, err = c.Handshake(uint32(options.MSize)) if err != nil { @@ -117,7 +122,12 @@ func attach(options GlobalOptions, f func(*p9.Remote) error) error { if err != nil { return util.Errorf("attach %q: %w", options.AName, err) } - defer a.Close() + defer func() { + err := a.Close() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Error closing remote: %v\n", err) + } + }() return f(a) } @@ -160,7 +170,11 @@ func main() { flag.Parse() if p9.IsNamespaceAddr(options.Address) { - os.MkdirAll(p9.NamespaceDir(), 0700) + err := os.MkdirAll(p9.NamespaceDir(), 0700) + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Error creating namespace directory: %v\n", err) + return + } } options.Network, options.Address = p9.ParseAddr(options.Address) diff --git a/cmd/p9/read.go b/cmd/p9/read.go index ad42e1b..4bd22f3 100644 --- a/cmd/p9/read.go +++ b/cmd/p9/read.go @@ -48,7 +48,12 @@ func (cmd *readCmd) Run(options GlobalOptions, args []string) error { } writeFile := func(arg string, f *p9.Remote) error { - defer f.Close() + defer func() { + err := f.Close() + if err != nil { + _, _ = fmt.Fprintf(fset.Output(), "Error closing remote: %v", err) + } + }() _, err = io.Copy(os.Stdout, f) if err != nil { @@ -60,10 +65,20 @@ func (cmd *readCmd) Run(options GlobalOptions, args []string) error { if cmd.tar { out := tar.NewWriter(os.Stdout) - defer out.Close() + defer func() { + err := out.Close() + if err != nil { + _, _ = fmt.Fprintf(fset.Output(), "Error closing tar writer: %v", err) + } + }() writeFile = func(arg string, f *p9.Remote) error { - defer f.Close() + defer func() { + err := f.Close() + if err != nil { + _, _ = fmt.Fprintf(fset.Output(), "Error closing remote: %v", err) + } + }() fi, err := f.Stat("") if err != nil { diff --git a/cmd/p9/stat.go b/cmd/p9/stat.go index 93532c8..03cba57 100644 --- a/cmd/p9/stat.go +++ b/cmd/p9/stat.go @@ -100,7 +100,9 @@ func (cmd *statCmd) printText(fi p9.DirEntry) { ' ', 0, ) - defer w.Flush() + defer func() { + _ = w.Flush() + }() const timeFormat = "03:04 PM, January 2, 2006" diff --git a/cmd/p9/write.go b/cmd/p9/write.go index f04c719..b3ba9a0 100644 --- a/cmd/p9/write.go +++ b/cmd/p9/write.go @@ -68,7 +68,12 @@ func (cmd *writeCmd) Run(options GlobalOptions, args []string) error { if err != nil { return util.Errorf("open %q: %v", args[0], err) } - defer f.Close() + defer func() { + err := f.Close() + if err != nil { + _, _ = fmt.Fprintf(fset.Output(), "Error closing remote %q: %v\n", args[0], err) + } + }() if *app { _, err := f.Seek(0, io.SeekEnd) diff --git a/cmd/p9w/p9w.go b/cmd/p9w/p9w.go index f4c95c2..3b00340 100644 --- a/cmd/p9w/p9w.go +++ b/cmd/p9w/p9w.go @@ -9,6 +9,7 @@ import ( "io" "log" "net/http" + "os" "path/filepath" "strings" @@ -57,7 +58,12 @@ func AttachHandler(h http.Handler) http.Handler { Error(rw, err, http.StatusBadRequest) return } - defer c.Close() + defer func() { + err := c.Close() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Error closing connection: %v", err) + } + }() _, err = c.Handshake(4096) if err != nil { @@ -70,7 +76,12 @@ func AttachHandler(h http.Handler) http.Handler { Error(rw, err, http.StatusBadRequest) return } - defer a.Close() + defer func() { + err := a.Close() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Error closing remote: %v\n", err) + } + }() ctx := req.Context() ctx = context.WithValue(ctx, AddrKey, addr) @@ -132,7 +143,12 @@ func handleLS(rw http.ResponseWriter, req *http.Request) { Error(rw, err, http.StatusBadRequest) return } - defer f.Close() + defer func() { + err := f.Close() + if err != nil { + log.Printf("Error closing remote: %v\n", err) + } + }() entries, err := f.Readdir() if err != nil { @@ -158,7 +174,12 @@ func handleRead(rw http.ResponseWriter, req *http.Request) { Error(rw, err, http.StatusBadRequest) return } - defer f.Close() + defer func() { + err := f.Close() + if err != nil { + log.Printf("Error closing remote: %v\n", err) + } + }() _, err = io.Copy(rw, f) if err != nil { diff --git a/fs.go b/fs.go index a2dff95..23473ff 100644 --- a/fs.go +++ b/fs.go @@ -6,6 +6,7 @@ import ( "encoding/binary" "fmt" "io" + "os" "path" "sync" "time" @@ -720,7 +721,11 @@ func (h *fsHandler) Close() error { h.fids.Range(func(k, v any) bool { file := v.(*fsFile) if file.file != nil { - file.file.Close() + err := file.file.Close() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Error closing file: %v\n", err) + return false + } } return true }) diff --git a/proto/server.go b/proto/server.go index c4c5d18..cb1dcf2 100644 --- a/proto/server.go +++ b/proto/server.go @@ -22,7 +22,12 @@ func Serve(lis net.Listener, p Proto, connHandler ConnHandler) (err error) { } go func() { - defer c.Close() + defer func(c net.Conn) { + err := c.Close() + if err != nil { + log.Printf("Error closing connection: %v", err) + } + }(c) if h, ok := connHandler.(handleConn); ok { h.HandleConn(c) @@ -33,7 +38,12 @@ func Serve(lis net.Listener, p Proto, connHandler ConnHandler) (err error) { mh := connHandler.MessageHandler() if c, ok := mh.(io.Closer); ok { - defer c.Close() + defer func(c io.Closer) { + err := c.Close() + if err != nil { + log.Printf("Error closing connection: %v", err) + } + }(c) } handleMessages(c, p, mh) diff --git a/remote.go b/remote.go index 4527558..b276b5d 100644 --- a/remote.go +++ b/remote.go @@ -3,7 +3,9 @@ package p9 import ( "bufio" "errors" + "fmt" "io" + "os" "path" "strings" "sync" @@ -313,7 +315,12 @@ func (file *Remote) Stat(p string) (DirEntry, error) { if err != nil { return DirEntry{}, err } - defer file.Close() + defer func() { + err := file.Close() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Error closing file %q: %v", p, err) + } + }() return file.Stat("") } diff --git a/stat.go b/stat.go index b107662..0895965 100644 --- a/stat.go +++ b/stat.go @@ -318,7 +318,7 @@ type StatChanges struct { } func (c StatChanges) Mode() (FileMode, bool) { - return c.DirEntry.FileMode, c.DirEntry.FileMode != 0xFFFFFFFF + return c.FileMode, c.FileMode != 0xFFFFFFFF } func (c StatChanges) ATime() (time.Time, bool) { @@ -334,7 +334,7 @@ func (c StatChanges) Length() (uint64, bool) { } func (c StatChanges) Name() (string, bool) { - return c.DirEntry.EntryName, c.DirEntry.EntryName != "" + return c.EntryName, c.EntryName != "" } func (c StatChanges) UID() (string, bool) {