diff --git a/pkg/pipe/buffer.go b/pkg/pipe/buffer.go index 2a37475..2ffb366 100644 --- a/pkg/pipe/buffer.go +++ b/pkg/pipe/buffer.go @@ -28,9 +28,11 @@ func NewPipe(writer io.Writer, n int64) (<-chan struct{}, *os.File, error) { } done := make(chan struct{}) go func() { - defer close(done) - defer r.Close() io.CopyN(writer, r, int64(n)) + close(done) + // ensure no blocking / SIGPIPE on the other end + discardRead(r) + r.Close() }() return done, w, nil } diff --git a/pkg/pipe/discard.go b/pkg/pipe/discard.go new file mode 100644 index 0000000..6f0d814 --- /dev/null +++ b/pkg/pipe/discard.go @@ -0,0 +1,19 @@ +package pipe + +import ( + "io" + "os" +) + +var _ io.Writer = discardWriter{} + +type discardWriter struct { +} + +func (w discardWriter) Write(b []byte) (int, error) { + return len(b), nil +} + +func discardRead(f *os.File) (int64, error) { + return io.Copy(discardWriter{}, f) +}