From ccc71463b9e44749f2fd07913185a5fd1c4acd58 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Wed, 13 May 2020 14:32:20 +1000 Subject: [PATCH] Expose metainfo.GeneratePieces --- metainfo/info.go | 25 +++---------------------- metainfo/pieces.go | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 metainfo/pieces.go diff --git a/metainfo/info.go b/metainfo/info.go index 3190dfb0..1c2d0b85 100644 --- a/metainfo/info.go +++ b/metainfo/info.go @@ -1,7 +1,6 @@ package metainfo import ( - "crypto/sha1" "errors" "fmt" "io" @@ -85,7 +84,7 @@ func (info *Info) writeFiles(w io.Writer, open func(fi FileInfo) (io.ReadCloser, // Sets Pieces (the block of piece hashes in the Info) by using the passed // function to get at the torrent data. -func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) error { +func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) (err error) { if info.PieceLength == 0 { return errors.New("piece length must be non-zero") } @@ -95,26 +94,8 @@ func (info *Info) GeneratePieces(open func(fi FileInfo) (io.ReadCloser, error)) pw.CloseWithError(err) }() defer pr.Close() - var pieces []byte - for { - hasher := sha1.New() - wn, err := io.CopyN(hasher, pr, info.PieceLength) - if err == io.EOF { - err = nil - } - if err != nil { - return err - } - if wn == 0 { - break - } - pieces = hasher.Sum(pieces) - if wn < info.PieceLength { - break - } - } - info.Pieces = pieces - return nil + info.Pieces, err = GeneratePieces(pr, info.PieceLength, nil) + return } func (info *Info) TotalLength() (ret int64) { diff --git a/metainfo/pieces.go b/metainfo/pieces.go new file mode 100644 index 00000000..812f3f4f --- /dev/null +++ b/metainfo/pieces.go @@ -0,0 +1,22 @@ +package metainfo + +import ( + "crypto/sha1" + "io" +) + +func GeneratePieces(r io.Reader, pieceLength int64, b []byte) ([]byte, error) { + for { + h := sha1.New() + written, err := io.CopyN(h, r, pieceLength) + if written > 0 { + b = h.Sum(b) + } + if err == io.EOF { + return b, nil + } + if err != nil { + return b, err + } + } +} -- 2.44.0