github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/piperutils/ioUtils.go (about) 1 package piperutils 2 3 import ( 4 "fmt" 5 "io" 6 7 "github.com/pkg/errors" 8 ) 9 10 // CopyData transfers the bytes from src to dst without doing close handling implicitly. 11 func CopyData(dst io.Writer, src io.Reader) (int64, error) { 12 tmp := make([]byte, 256) 13 bytesRead := int64(0) 14 bytesWritten := int64(0) 15 done := false 16 17 for { 18 nr, err := src.Read(tmp) 19 bytesRead += int64(nr) 20 if err != nil { 21 if err != io.EOF { 22 return bytesRead, errors.Wrap(err, "read error") 23 } 24 done = true 25 } 26 nw, err := dst.Write(tmp[:nr]) 27 bytesWritten += int64(nw) 28 if err != nil { 29 return bytesWritten, errors.Wrap(err, "write error") 30 } 31 if done { 32 break 33 } 34 } 35 if bytesRead != bytesWritten { 36 return bytesRead, errors.New(fmt.Sprintf("transfer error: read %v bytes but wrote %v bytes", bytesRead, bytesWritten)) 37 } 38 return bytesWritten, nil 39 }